|
|
...а в Студии соответственно поставить галку "Wrap Relative Jumps" в Project->Project Settings->Code Generation.
Фича состоит в следующем. В теле команды RJMP/RCALL содержится 12-битное поле (11 бит+знак), значение которого в момент исполнения такой команды знаково суммируется с текущим значением програмного счетчика. Результат суммирования записывается обратно в програмный счетчик, который, например, в Меге8 имеет длину 12 бит (4096 слов), т.е. суммирование идет в этом случае по модулю 4096. Если метка перехода отстояла от места ее вызова более чем на -2048/+2047, то ассемблер должен сообщать об ошибке типа "Relative jump too large". Но если разрешить "заворот", то вместо кода, эквивалентного RJMP PC-3456 (что некорректно), будет сгенерирован код RJMP PC+(4096-3456), т.е. RJMP (PC+640)mod 4096, и все будет корректно.
Эту фичу можно разрешать абсолютно безболезненно для всех AVR с длиной Flash 4 КБ и более, а для более мелких она просто не будет иметь смысла. Разумеется, ценность ее обратно пропорциональна длине Flash, т.к. она будет эффективна только в намых нижних и самых верхних 2048 адресах.
E-mail: info@telesys.ru