реклама на сайте
подробности

 
 
> Инструкции JMP и CALL, call k: Unsupported instruction on ATmeg8
svchost
сообщение Aug 23 2009, 16:18
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 31-05-09
Пользователь №: 49 779



Добрый день!

Столкнулся вот с такими непонятками...

1.

Есть абсолютно работающий проект на AVRStudio 4.16 с файлом
C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.inc

просматривая папку AVR Tools обнаружил вот такой файл
C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8def.inc
на первый взгляд он оказался более дополненный именами регистров и битов
решил его включить в проект...

Теперь при компиляции ругается на инструкции JMP и CALL
error: call k: Unsupported instruction on ATmega8
error: jmp k: Unsupported instruction on ATmega8

при замене файла m8def.inc обратно все работает.

нашел на форуме
http://electronix.ru/forum/index.php?showtopic=23748

но никак не пойму что к чему, и если команды больше не поддерживаются почему же программы до сих пор работают?
и теперь для переноса проекта например от mega16 на мега8 надо команды поменять на rjmp и rcall?

2.

Установил пакет AvrStudio417Setup.exe и теперь
а) при запуске файлов проектов *.aps выдается сообщение ОС WinXP отказано в доступе
б) если сделать открыть файл с помощью AvrStudio проект запускается но при включении
появляется окошечко с именем файла и восклицательным знаком

при откане на 4.16 все нормально


В чем трабл не пойму? Объясните пожалуйста.
Спасибо.

Сообщение отредактировал svchost - Aug 23 2009, 17:00
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
_Pasha
сообщение Aug 23 2009, 17:11
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(svchost @ Aug 23 2009, 19:18) *
но никак не пойму что к чему, и если команды больше не поддерживаются почему же программы до сих пор работают?

Они официально не поддерживаются. Значит, начиная с некоторого часа Х, версии асм матюгаются.
Go to the top of the page
 
+Quote Post
svchost
сообщение Aug 23 2009, 17:29
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 31-05-09
Пользователь №: 49 779



что же получается, теперь возможен вариант что покупая новую mega8 и прошивая старый *.hex
мы можем получить неработающее железо ? (поскольку команды jmp и call больше не поддерживаются)

То есть для новых разработок надо использовать библиотеку
C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8def.inc

и ставить для mega8 галочку в настройках ассемблера:
Project-Assembler Options-Wrap Relative Jumps


я использую для передачи параметров в подпрограмму связку
call print
.db 'Текст'.0

с вычислением в подпрограмме адреса возврата и переходом к
команде следующей за параметрами по команде ijmp

и теперь в новых версиях кристалла программы
не будут работать поскольку учитывают длину команды call ... вот засада unsure.gif
хорошо что сейчас проявилось, а то пришлось бы искать иголку в стоге сена...

Сообщение отредактировал svchost - Aug 23 2009, 17:45
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Aug 23 2009, 17:50
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



А собственно что тут печального?
Команда RJMP ходит +/- 2k слов. Или +/- 4k байт. При этом занимает одно слово и выполняется быстрее. В х51 однокристалке всё намного тоскливее было.

А чтобы вас вообще не волновали тонкости конкретного набора команд - переходите на Си. Пусть разработчики компиляторов беспокоятся.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 23 2009, 18:09
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(SasaVitebsk @ Aug 23 2009, 20:50) *
А чтобы вас вообще не волновали тонкости конкретного набора команд - переходите на Си.

Есть еще полумера - задефайнить
Код
#ifdef _MEGA8_
#define jmp rjmp
#define call rcall
#endif

Переписывать не придется. Правда, не верится, что у топикстартера не было проблем с переходом avrasm 1->2
Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение Aug 23 2009, 18:11
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



Цитата(_Pasha @ Aug 23 2009, 20:11) *
Они официально не поддерживаются. Значит, начиная с некоторого часа Х, версии асм матюгаются.


В старых даташитах писали, что поддерживает. Помню, я еще удивлялся: зачем, ведь rjmp всю память покрывает. Сейчас новый посмотрел - и правда нету. Но скорее всего это просто так убрали, чтоб у таких как я лишних вопросов не возникало. Врядли они там специально под восьмую мегу из ядра эту команду выкорчевывали. Другой вопрос зачем эту команду использовать, если rcall на все случаи жизни подходит?
Go to the top of the page
 
+Quote Post
svchost
сообщение Aug 23 2009, 18:17
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 31-05-09
Пользователь №: 49 779



получается для переноса проекта с mega8 на mega16 и выше
опять все переходы и подпрограммы заменять, которые будут выходить за пределы окна

перейти на СИ или на BASCOM для меня принципиально (все противоречит внутри когда
приходиться использовать подпрограммы или инструкции которые не понятно что выполняют, а главное
какое время). Несомненно уменьшают время разработки программ, особенно где приходиться использовать математику.

Сообщение отредактировал svchost - Aug 23 2009, 18:21
Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение Aug 23 2009, 18:26
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



Цитата(svchost @ Aug 23 2009, 21:17) *
также получается для переноса проекта с mega8 на mega16 и выше
опять все переходы и подпрограммы заменять, которые будут выходить за пределы окна


При помощи Find->Replace это делается за 5 секунд. Дай бог, чтоб это была самая большая проблема при портировании, пусть даже на кристалл того же семейства. Кроме того использование rjmp сэкономит немного флеша. Мелочь, а приятно smile.gif.
Go to the top of the page
 
+Quote Post
svchost
сообщение Aug 23 2009, 18:32
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 31-05-09
Пользователь №: 49 779



#ifdef _MEGA8_
#define jmp rjmp
#define call rcall
#endif

не позволяет избавиться от ошибок при компиляции

быстрая замена удобно когда проект состоит из одного файла
а если в проекте из 7-10
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 23 2009, 18:44
Сообщение #10


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(svchost @ Aug 23 2009, 21:32) *
#define
не позволяет избавиться от ошибок при компиляции

Ничего не понял. cranky.gif
Go to the top of the page
 
+Quote Post
svchost
сообщение Aug 23 2009, 20:41
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 31-05-09
Пользователь №: 49 779



#define jmp rjmp
#define call rcall

вставил в файл m8def.inc
компиляция прошла без ошибок

компилятор не ругается на команды JMP и CALL
по идее теперь все переходы и вызовы подпрограмм должны замениться на RJMP и RCALL. Так?


проводим эксперимент с программой в 2 строки...

JMP START ; метка по адресу $200
RJMP start ;
..

получается компилятор должен скомпилировать исходные строки как

RJMP start ;
RJMP start ;
...

но в бинарном файле получаем

940С 0200 ; это чистая команда JMP START
С1FD ; а это RJMP START

получается компилятор ничего не заменил...
блин что за глюки? объясните пожалуйста. Дело уже принципа.
Спасибо.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 23 2009, 22:02
Сообщение #12


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(svchost @ Aug 23 2009, 23:41) *
блин что за глюки?

Так и есть: глюки. По идее, задефайненные слова должны подставляться в текст перед проходом ассемблера, поскольку #define - директива препроцессора.
Вывод: всех в сад. Новые версии асма (которые 2) - мрачно глюкавые.
Я счастлив, что вовремя убежал на Winavr от этого ужаса. Пардон за лирику.
Go to the top of the page
 
+Quote Post
svchost
сообщение Aug 24 2009, 06:14
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 31-05-09
Пользователь №: 49 779



Ответ от компании Atmel...

Dear customer,

ATmega8 is not support JMP and CALL Instructions, so you should replace these instructions using RJMP and RCALL.

For more information, you could refer to the Instruction Set Summary (page 289) which is in the ATmega8’s datasheet.


Best Regards,
Sidney Liang
Atmel Technical Support Team
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 24 2009, 07:35
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(svchost @ Aug 23 2009, 23:41) *
блин что за глюки?
найдите отличия в написании двух слов: jmp и JMP


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Aug 24 2009, 07:59
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(svchost @ Aug 23 2009, 21:17) *
получается для переноса проекта с mega8 на mega16 и выше
опять все переходы и подпрограммы заменять, которые будут выходить за пределы окна

А если с Mega на xMega (к примеру) - прикинь объём работы.
Цитата
перейти на СИ или на BASCOM для меня принципиально (все противоречит внутри когда
приходиться использовать подпрограммы или инструкции которые не понятно что выполняют, а главное
какое время). Несомненно уменьшают время разработки программ, особенно где приходиться использовать математику.

При разработке "с нуля" не уменьшает время. При сопровождении, развитии, портировании - в несколько раз. Если используются библиотеки, то и разработка значительно сокращается (всётаки асмовые библиотеки сложнее в использовании).

Про ваши "противоречия" что-то совсем не понял. Как раз именно в асме приходится заглядывать регулярно в хидеры п/п с целью прояснить что именно делает п/п и какие регисты при этом использует. В Си - всё прозрачно.

Если требуется точное время исполнения п/п, то никто не мешает написать её на ассемблере. Хотя я от этого теперь стараюсь уйти всеми силами.

Подытоживая - вы просто банально боитесь неизвестности. А надо попробовать.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 21:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01719 секунд с 7
ELECTRONIX ©2004-2016