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

 
 
> Простой вопрос по ICC: goto на абсолютный адрес
SKov
сообщение Apr 12 2007, 23:01
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 812
Регистрация: 22-01-05
Из: SPb
Пользователь №: 2 119



Надо из прикладной программы прыгнуть на начало бутлоадера, который уже прошит (его нет в тексте текущей программы.)
Т.е. бутлоадер сначала загружает прикладную программу в младшие адреса, потом прикладная программа начинает работать и в какой-то момент может решить, что ей надо перезагрузиться.
Т.е. ей надо как-то снова передать управление на известный абсолютный адрес, с которого начинается бутлоадер.
Как это на Си в ICC AVR.?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Apr 13 2007, 01:48
Сообщение #2


Гуру
******

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



Цитата(SKov @ Apr 12 2007, 22:01) *
Как это на Си в ICC AVR.?
На любом Си: (void(*)())(0xC00)(); Только надо разобраться в чем ICC хочет адрес - в байтах или словах.


--------------------
На любой вопрос даю любой ответ
"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
Dima_Ag
сообщение Apr 13 2007, 10:07
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 156
Регистрация: 12-09-06
Пользователь №: 20 304



Цитата(Сергей Борщ @ Apr 13 2007, 02:48) *
На любом Си: (void(*)())(0xC00)(); Только надо разобраться в чем ICC хочет адрес - в байтах или словах.



К сожалению, на ICC такая конструкция не работает, поскольку у этого компилятора есть особенности в косвенном вызове функций.
Все косвенные вызовы происходят через обращение к таблице указателей на эти функции,
а число в Вашем примере 0xC00 - это будет адрес не ФУНКЦИИ, а её УКАЗАТЕЛЯ в таблице.
Поэтому такой вызов не сработает.

Данный момент подробно описано в хелпе в разделе Function Pointers.

Для перехода на адрес 0xC00 видимо, кроме ассемблера, вариантов нет.
Go to the top of the page
 
+Quote Post
SKov
сообщение Apr 13 2007, 12:34
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 812
Регистрация: 22-01-05
Из: SPb
Пользователь №: 2 119



Цитата(Dima_Ag @ Apr 13 2007, 11:07) *
...
Для перехода на адрес 0xC00 видимо, кроме ассемблера, вариантов нет.


Всем спасибо. Последний уточняющий вопрос, если можно.
Бутлоадер я писал на WinAVR и там наступил на грабли,
которые сейчас хочется избежать.
Там в make файле адрес начала бутлоадера должен быть указан в байтах
(BOOTBLOCKSTARTADDRESS = 0x1800) для 1к-загрузчика Меги88, а совсем не в словах ,
как , например, при прошивке кода бутлоадера через STK-500 мне надо
было выбрать соответствующий адрес для бутлоадера 0хс00.
К сожалению, на ассемблере писал для AVR-ов очень давно, почти все забыл,
поэтому прошу уточнить адрес для rjmp в моем случае.
Спасибо.
Go to the top of the page
 
+Quote Post



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

 


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


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