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

 
 
 
Reply to this topicStart new topic
> Long JMP для AVR, Проблема с реализацией перехода в IAR для AVR
Polaris
сообщение Jun 3 2008, 11:05
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 266
Регистрация: 8-12-05
Пользователь №: 11 964



Доброго всем времени суток!

Пробовал поискать по форуму, но слишком много всего открывается, не получилось найти решения. Проблема в следующем. Для реализация прошивки контроллера новой версией firmware мне необходимо послать команду перехода на загрузчик, который я расположил в самом конце флэш-памяти процессора (по-моему, это нормально). Пока я имел дело с Mega32, все было в порядке и легко реализовывалось следующей командой:
( *( void( * )()) UPDATER_ADDR )();
где UPDATER_ADDR определялось для конкретного процессора (Mega32) как 0x7D00
Теперь адаптирую тот же загрузчик для Mega128. Там такая же конструкция приводит с адресом 0x1FD00 к переходу по адресу 0xFD00, так как упомянутая выше конструкция в ассемблерном листинге приводит к генерации конструкции ICALL, учитывая только два байта.
Судя по всему, конструкция с ссылкой на функцию интерпретируется именно так, и использовать ее в контроллерах с памятью выше 64кб не получится. Пока что я вышел из положения так:
asm("JMP 0x1FD00");
Но решение мне не нравится, так как адрес дается непосредственно в тексте модуля, который к типу контроллера никакого отношения не имеет. Есть ли возможность обойти эту проблему как-то более в духе Си?

Заранее спасибо!!!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 3 2008, 11:42
Сообщение #2


Гуру
******

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



Цитата(Polaris @ Jun 3 2008, 14:05) *
Теперь адаптирую тот же загрузчик для Mega128. Там такая же конструкция приводит с адресом 0x1FD00 к переходу по адресу 0xFD00, так как упомянутая выше конструкция в ассемблерном листинге приводит к генерации конструкции ICALL, учитывая только два байта.
Адрес ICALL измеряется в словах, что дает "дальность" в 128Кбайт.
Цитата(Polaris @ Jun 3 2008, 14:05) *
Но решение мне не нравится, так как адрес дается непосредственно в тексте модуля, который к типу контроллера никакого отношения не имеет. Есть ли возможность обойти эту проблему как-то более в духе Си?
Посмотрите вот это сообщение.


--------------------
На любой вопрос даю любой ответ
"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
Polaris
сообщение Jun 3 2008, 12:48
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 266
Регистрация: 8-12-05
Пользователь №: 11 964



Цитата(Сергей Борщ @ Jun 3 2008, 14:42) *
Адрес ICALL измеряется в словах, что дает "дальность" в 128Кбайт.Посмотрите вот это сообщение.

На вордовый адрес:
void (*update)(void) = 0xFE80;
компилятор ругается следующим образом:
Error[Pe144]: a value of type "unsigned int" cannot be used to initialize an entity of type "void (*)()"

А вот второй способ работает. В листинге вызов такой функции приводит к CALL.

Спасибо за совет! Теперь попробую это как-то систематизировать...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 3 2008, 13:36
Сообщение #4


Гуру
******

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



Цитата(Polaris @ Jun 3 2008, 15:48) *
На вордовый адрес:
void (*update)(void) = 0xFE80;
компилятор ругается следующим образом:
Error[Pe144]: a value of type "unsigned int" cannot be used to initialize an entity of type "void (*)()"
Естественно. Но это не имеет отношения к ICALL, это любой компилятор выругается: void (*update)(void) = (void (*)(void))0xFE80;


--------------------
На любой вопрос даю любой ответ
"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

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

 


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


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