Error relative branch out of reach

I'm new on AVR. I have an "Relative branch out of reach" error for the "brne round_loop" line while debugging. Is anyone to help me? Thank you so much for your helps. ; Test if round counter has

I’m new on AVR. I have an «Relative branch out of reach» error for the «brne round_loop» line while debugging. Is anyone to help me? Thank you so much for your helps.

; Test if round counter has reached 14
mov     t4, rc
subi    t4, 14
brne    round_loop

round_loop:

round_loop:
; XOR state and key
eor     s0, k0
eor     s1, k1
eor     s2, k2
eor     s3, k3

asked Jun 17, 2016 at 15:55

hopeTo's user avatar

1

The AVR BRNE instruction is a 16 bit op-code, 7 bits of which are the branch offset. This 7 bit signed operand can have a value k in the range -64 ≤ k ≤ +63. The PC is modified by k +1 (i.e. -63 to +64). If the jump is further then that, a relative branch is unsuitable.

You either need to locate the target closer to the branch, or use an unconditional branch to an unconditional jump (JMP) with a 22bit range, or a relative jump (RJMP) with a 12 bit range.

  mov     t4, rc
  subi    t4, 14

  brne    round_loop_longjmp
  rjmp    no_round_jmp
round_loop_longjmp:
  rjmp    round_loop

no_round_jmp:
  ...

answered Jun 17, 2016 at 20:33

Clifford's user avatar

CliffordClifford

86k12 gold badges85 silver badges160 bronze badges

A relative branch means that the jump occurs by changing the position of the program counter(which instruction is being executed right now) by either adding or subtracting a value from it. That means round_loop in brne is not translated into an absolute address, but a distance from the current instruction. The limit for brne is 7bits, so I believe it should be within +-64 words(each instruction is 1 word so 64 instructions). So the round_loop label should be within 64 instructions of the brne instruction, either before or after it.

If you can’t move round_loop within that range then you’ll have to do a branch to a label that will do a JMP to round_loop.

answered Jun 17, 2016 at 17:35

Artur Kink's user avatar

Artur KinkArtur Kink

4981 gold badge12 silver badges15 bronze badges

2

Форум РадиоКот • Просмотр темы — Ошибка команды относительного перехода brcs.

Сообщения без ответов | Активные темы

ПРЯМО СЕЙЧАС:

Автор Сообщение

Не в сети

Заголовок сообщения: Ошибка команды относительного перехода brcs.

СообщениеДобавлено: Пт июн 15, 2012 20:14:32 

Вымогатель припоя

Карма: -6

Рейтинг сообщений: -47

Зарегистрирован: Чт июн 16, 2011 15:06:10
Сообщений: 507
Откуда: электрощитовая

Рейтинг сообщения: 0

Программа из книжки, я ни одной строчки не дописывал в ней, в чем дело?
Ошибка «Error 7 Relative branch out of reach» на строчке:

Код:


brcs Start                ;

Так понимаю, относительный переход вне досягаемости. Вот полный фрагмент:

Код:


Change:
in store, PortD           ; обновим значение
dec counter               ;
brne LowLoop              ;

ldi temp, 0x0F            ;
ldi temp2, 0x00           ;
cpi delay1, 0xA0          ;
cpc delay2, temp          ;
cpc delay3, temp2         ;
brcs Start                ; если да, переходим к метке

ldi temp, 0x00            ;
ldi temp2, 0x09           ;
ldi temp3, 0x3D           ;
clr lowerbyte             ;
clr upperbyte             ;


_________________
даешь высокое напряжение

Вернуться наверх
 

ПрофильПрофиль

 

Реклама

DX168B

Не в сети

Заголовок сообщения: Re: Ошибка команды относительного перехода brcs.

СообщениеДобавлено: Пт июн 15, 2012 20:34:04 

Друг Кота
Аватар пользователя

Карма: 25

Рейтинг сообщений: 93

Зарегистрирован: Вс янв 24, 2010 19:19:52
Сообщений: 4449
Откуда: Главный Улей России (Moscow)

Рейтинг сообщения: 0

Либо Вы пытаетесь перейти по условию к несуществующей метке, либо она далековато находится.
Относительный переход — это переход не по адресу метки, а переход относительно текущего содержимого счетчика команд PC.
На более низком уровне выглядит как brcs PC+XX или PC-XX
Команды относительного перехода едят меньше памяти, но на них есть такое вот ограничение. Точно не помню, на сколько единиц можно прыгать. То ли +128-127 , то ли меньше.
Ваша метка Start должна быть немного ближе и тогда проблему можно решить.
Если быстродействие не критично, то можно часть кода, находящегося между меткой Start и условием brcs Start вынести в виде подпрограммы.
Можно так же постараться развернуть алгоритм другим способом (реализовать по другому)


_________________
I am DX168B and this is my favourite forum on internet!

Вернуться наверх
Реклама

Vova777

Не в сети

Заголовок сообщения: Re: Ошибка команды относительного перехода brcs.

СообщениеДобавлено: Пт июн 15, 2012 20:38:55 

Карма: -6

Рейтинг сообщений: -47

Зарегистрирован: Чт июн 16, 2011 15:06:10
Сообщений: 507
Откуда: электрощитовая

Рейтинг сообщения: 0

Дело в том, что это программа из книжки, по которой я учусь программировать. Там написано, что эта команда может перейти через не более чем 64 команды. А там их примерно 100. Сократить не могу, потому что: во-первых, не соображаю как это сделать, а во-вторых, если это пример, то он должен быть рабочим.

Может эту команду заменить на rjmp, но мне нужно чтобы флаг С обрабатывался тоже. Как можно сделать, скажите пожалуйста?
Так можно заменить эту команду:

Код:


brcc PC + 2
rjmp Start


_________________
даешь высокое напряжение

Вернуться наверх

ILYAUL

Не в сети

Заголовок сообщения: Re: Ошибка команды относительного перехода brcs.

СообщениеДобавлено: Пт июн 15, 2012 20:46:26 

Держит паяльник хвостом
Аватар пользователя

Карма: 15

Рейтинг сообщений: 70

Зарегистрирован: Ср мар 28, 2012 21:45:24
Сообщений: 904
Откуда: ВО

Рейтинг сообщения: 0

Что за книга? можно

Последний раз редактировалось ILYAUL Пт июн 15, 2012 20:48:08, всего редактировалось 1 раз.

Вернуться наверх
Реклама

Выгодные LED-драйверы для решения любых задач

КОМПЭЛ представляет со склада и под заказ широкий выбор LED-драйверов производства MEAN WELL, MOSO, Snappy, Inventronics, EagleRise. Линейки LED-драйверов этих компаний, выполненные по технологии Tunable White и имеющие возможность непосредственного встраивания в систему умного дома (димминг по шине KNX), перекрывают практически полный спектр применений: от простых световых указателей и декоративной подсветки до диммируемых по различным протоколам светильников внутреннего и наружного освещения.

Подобрать LED-драйвер>>

Vova777

Не в сети

Заголовок сообщения: Re: Ошибка команды относительного перехода brcs.

СообщениеДобавлено: Пт июн 15, 2012 20:47:13 

Карма: -6

Рейтинг сообщений: -47

Зарегистрирован: Чт июн 16, 2011 15:06:10
Сообщений: 507
Откуда: электрощитовая

Рейтинг сообщения: 0

ILYAUL писал(а):

Что за книга?

Джон Мортон Микроконтроллеры AVR


_________________
даешь высокое напряжение

Вернуться наверх
Реклама

Реклама

LIMF – источники питания High-End от MORNSUN со стандартным функционалом на DIN-рейку

На склад Компэл поступили ИП MORNSUN (крепление на DIN-рейку) с выходной мощностью 240 и 480 Вт. Данные источники питания обладают 150% перегрузочной способностью, активной схемой коррекции коэффициента мощности (ККМ; PFC), наличием сухого контакта реле для контроля работоспособности (DC OK) и возможностью подстройки выходного напряжения. Источники питания выполнены в металлическом корпусе, ПП с компонентами покрыта лаком с двух сторон, что делает ее устойчивой к соляному туману и пыли. Изделия соответствуют требованиям ANSI/ISA 71.04-2013 G3 на устойчивость к коррозии, а также нормам ATEX для взрывоопасных зон.

Подробнее>>

DX168B

Не в сети

Заголовок сообщения: Re: Ошибка команды относительного перехода brcs.

СообщениеДобавлено: Пт июн 15, 2012 20:57:57 

Друг Кота
Аватар пользователя

Карма: 25

Рейтинг сообщений: 93

Зарегистрирован: Вс янв 24, 2010 19:19:52
Сообщений: 4449
Откуда: Главный Улей России (Moscow)

Рейтинг сообщения: 0

Возможно, компилятор не понимает, что такое PC+2 (думает, что это метка)
Сделайте так:

Код:


brcc Label
rjmp Start
Label:

По сути, PC+2 это прыжок через rjmp Start
Просто автор книги решил не заморачиваться с метками, и написал так. А компилятор у него другой был. Видать, какой-то из старых TAVRASMов.


_________________
I am DX168B and this is my favourite forum on internet!

Вернуться наверх

ILYAUL

Не в сети

Заголовок сообщения: Re: Ошибка команды относительного перехода brcs.

СообщениеДобавлено: Пт июн 15, 2012 21:02:52 

Держит паяльник хвостом
Аватар пользователя

Карма: 15

Рейтинг сообщений: 70

Зарегистрирован: Ср мар 28, 2012 21:45:24
Сообщений: 904
Откуда: ВО

Рейтинг сообщения: 0

Код:

brcs Start                ; если да, переходим к метке

Там комментарии разнятся с действием

Вернуться наверх

Vova777

Не в сети

Заголовок сообщения: Re: Ошибка команды относительного перехода brcs.

СообщениеДобавлено: Пт июн 15, 2012 21:08:51 

Карма: -6

Рейтинг сообщений: -47

Зарегистрирован: Чт июн 16, 2011 15:06:10
Сообщений: 507
Откуда: электрощитовая

Рейтинг сообщения: 0

ILYAUL писал(а):

Код:

brcs Start                ; если да, переходим к метке

Там комментарии разнятся с действием

Описание команды:

Цитата:

brcs label — проверяет флаг переноса (С) и переходит если он установлен.

Я переписал команду «brcs» сейчас сам на это:

Цитата:

brcc PC + 2 ;
rjmp Start ;

Компилятор это принял, но в Протеусе работает не так.


_________________
даешь высокое напряжение

Вернуться наверх

DX168B

Не в сети

Заголовок сообщения: Re: Ошибка команды относительного перехода brcs.

СообщениеДобавлено: Пт июн 15, 2012 21:17:57 

Друг Кота
Аватар пользователя

Карма: 25

Рейтинг сообщений: 93

Зарегистрирован: Вс янв 24, 2010 19:19:52
Сообщений: 4449
Откуда: Главный Улей России (Moscow)

Рейтинг сообщения: 0

Млин. Чет я тупанул маленько.
В принципе да. Можно и так, RJMP достает дальше.
В книге проверяют, установлен ли флаг С в регистре SREG, и если установлен, то переход к началу программы.
Мы меняем условие. Проверяем состояние флага на сброс и если флаг сброшен, перепрыгиваем переход к началу и идем далее по программе.
А если флаг будет установлен, то условие не выполнится и произойдет переход к началу программы (метка Start)
А на счет Протеуса: Может есть еще ошибки в программе?


_________________
I am DX168B and this is my favourite forum on internet!

Последний раз редактировалось DX168B Пт июн 15, 2012 21:20:52, всего редактировалось 1 раз.

Вернуться наверх

ILYAUL

Не в сети

Заголовок сообщения: Re: Ошибка команды относительного перехода brcs.

СообщениеДобавлено: Пт июн 15, 2012 21:19:54 

Держит паяльник хвостом
Аватар пользователя

Карма: 15

Рейтинг сообщений: 70

Зарегистрирован: Ср мар 28, 2012 21:45:24
Сообщений: 904
Откуда: ВО

Рейтинг сообщения: 0

Всё , что мы тут обсуждали — написано в самой книге при описании программы

Вернуться наверх

Vova777

Не в сети

Заголовок сообщения: Re: Ошибка команды относительного перехода brcs.

СообщениеДобавлено: Пт июн 15, 2012 21:21:26 

Карма: -6

Рейтинг сообщений: -47

Зарегистрирован: Чт июн 16, 2011 15:06:10
Сообщений: 507
Откуда: электрощитовая

Рейтинг сообщения: 0

DX168B писал(а):

Млин. Чет я тупанул маленько.
В принципе да. Можно и так, RJMP достает дальше.
В книге проверяют, установлен ли флаг С в регистре SREG, и если установлен, то переход к началу программы.
Мы меняем условие. Проверяем состояние флага на сброс и если флаг сброшен, перепрыгиваем переход к началу и идем далее по программе.
А если флаг будет установлен, то условие не выполнится и произойдет переход к началу программы (метка Start)

Да, компилятор принимает. Но в Протеусе полная каша получается. Я думаю, это уже по моей вине. Где-то есть мелочи, которые нужно исправлять, схему переделывать. С другой стороны, так даже лучше, чем просто тупо перепечатывать код из книги, надо и мозг напрячь, поискать ошибки.


_________________
даешь высокое напряжение

Вернуться наверх

DX168B

Не в сети

Заголовок сообщения: Re: Ошибка команды относительного перехода brcs.

СообщениеДобавлено: Сб июн 16, 2012 19:43:42 

Друг Кота
Аватар пользователя

Карма: 25

Рейтинг сообщений: 93

Зарегистрирован: Вс янв 24, 2010 19:19:52
Сообщений: 4449
Откуда: Главный Улей России (Moscow)

Рейтинг сообщения: 0

AVR Studio 4 понимает.
Если Вы в протеусе прикрепили к МК исходник, то лучше попробуйте прицепить к нему скомпилированный в AVR Studio файл прошивки (HEX файл) И проверьте исходники на прочие ошибки. В книгах бывают и опечатки.


_________________
I am DX168B and this is my favourite forum on internet!

Вернуться наверх

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

0 / 0 / 0

Регистрация: 15.03.2010

Сообщений: 287

1

Дальний вызов

16.12.2010, 22:41. Показов 8010. Ответов 12


Есть функции:

viod main(viod)
{
f2();
}

начинается по адресу 0x1c00
void f2(void)
{
……………
……………
}

Компилятор ругается : Relative branch out of reach

Все извраты, которые знал — попробывал. Успеха нет.

Что делать ?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



0 / 0 / 0

Регистрация: 07.03.2010

Сообщений: 233

16.12.2010, 22:47

2

http://www.rodyokot.ru/forum/viewtopys.php?t=9156

7. Вопрос:
Не могу понять почему появляется ошибка: «Relative branch out of reach». Компилятор начал ругаться когда я добавил в программе несколько подпрограмм
(даже если они пустые) на brne, breq?
Ответ:
Команды условных переходов brne и breq имеют «дальность работы» от -64 до +63. У Вас расстояние до метки больше, поэтому ассемблер и выдает ошибку.
Используйте RCALL и RJMP, у которых дальность действия составляет от -2047 до +2047. И не строк, а команд (слов по 2 байта).



0



0 / 0 / 0

Регистрация: 23.01.2010

Сообщений: 966

16.12.2010, 22:49

3

Цитата
Сообщение от pmdr_soft

Что делать ?

Ну я бы перестал пользоваться этим компилятором



0



0 / 0 / 0

Регистрация: 29.03.2010

Сообщений: 2,017

16.12.2010, 23:15

4

а что за компилятор хоть?



0



0 / 0 / 0

Регистрация: 24.01.2010

Сообщений: 727

16.12.2010, 23:51

5

спорим cvavr?

Надо знать больше извратов :)
Например #asm(«call _f2»)



0



0 / 0 / 0

Регистрация: 16.08.2010

Сообщений: 1,326

16.12.2010, 23:56

6

Нахер он тогда вообще нужен (cvavr), если требует извратских подходов для элементарного кода?



0



0 / 0 / 0

Регистрация: 24.01.2010

Сообщений: 727

17.12.2010, 00:07

7

Он требует извратских подходов к извратскому коду. Поищи по форуму зачем это надо pmdr_soft



0



0 / 0 / 0

Регистрация: 15.03.2010

Сообщений: 287

19.12.2010, 21:42

8

Цитата
Сообщение от xroymom

Например #asm(«call _f2»)

Это как научите.



0



0 / 0 / 0

Регистрация: 15.03.2010

Сообщений: 287

19.12.2010, 21:43

9

У меня разница в адресах более 2047 слов.



0



0 / 0 / 0

Регистрация: 24.01.2010

Сообщений: 727

19.12.2010, 22:56

10

Цитата
Сообщение от pmdr_soft

Это как научите.

Всмысле как? Он при ассемблировании к именам добавляет «_». По-этому call _<имя>



0



0 / 0 / 0

Регистрация: 15.03.2010

Сообщений: 287

19.12.2010, 23:30

11

Цитата
Сообщение от xroymom

Цитата
Сообщение от pmdr_soft

Это как научите.

Всмысле как? Он при ассемблировании к именам добавляет «_». По-этому call _<имя>

упс. Думал пробела нету.

У меня более 2047 слов разница в адресах. Нужен какой то более извратистый изврат.



0



0 / 0 / 0

Регистрация: 24.01.2010

Сообщений: 727

19.12.2010, 23:36

12

call прыгает 64К или 4М слов, в зависимости от мк



0



0 / 0 / 0

Регистрация: 24.01.2010

Сообщений: 727

20.12.2010, 16:39

13

Кстате, еще одно извращение. Лучше предыдущего — не пишет unreferenced function и можно нормально передавать параметры.
Получается адрес хранится в глобальной переменной. При вызове пихается в Z и делается icall. Т.е. лишние 2 байта флеша, 2 байта оперативки и пару тактов на загрузку и настройку адреса. Мелочи вопщем.

Код

void func(void);
void (*funcPtr)(void)=func;

void main(void)
{
funcPtr();
while(1)
{
}
}

#asm(".org 0x1C00")
void func(void)
{
}



0



Понравилась статья? Поделить с друзьями:
  • Error recvpacket with inject info failed
  • Error relation users does not exist
  • Error relation does not exist line 1
  • Error relation does not exist at character
  • Error reid buried alive feat eliozie