Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR goto my label
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
DigitalM
Мне необходимо прыгнуть на адрес загрузкика. Как в IAR определить свою метку, чтоб по goto mylebel я перешел на загрузчик?
Xenia
Подключите хидер SETJMP.H - там определены функции типа setjmp(), которые вроде бы позволяют это делать. На крайний случай всегда можно прыгнуть с помощью ассеблерной вставки asm("ijmp xxxxx").
Впрочем, все это я применяла только однажды, и сейчас уже точно не помню подробностей.
aaarrr
Цитата(DigitalM @ Feb 14 2010, 17:42) *
Как в IAR определить свою метку, чтоб по goto mylebel я перешел на загрузчик?

Метку - никак. Можно передать управление при помощи указателя на процедуру.
setjmp/longjmp - совсем из другой оперы.
DigitalM
А какой синтаксис у setjmp? Я не понимаю языков высокого уровня.
asm("LDR PC,0"); работает.
Xenia
Определите тогда себе метку в нужном вам месте, вставив туда ассемблерную вставку:
asm ("Label: nop"); // холостая инструкция с меткой
А из другого места прыгайте на нее с помощью:
asm ("ijmp Label"); // переход на метку
smile.gif
demiurg_spb
Пример для AVR:
Код
    (*(void(*)(void))(BOOTLOADER_START_ADDRES/2))();  // div 2 is to convert byte to word addressing mode for icall
DigitalM
Хочу уточнить. У меня AT91SAM7S256. ijmp у него нет. Адрес загрузчика знаю только я. На asm("LDR PC,0x108000"); зависает. Компилятор проверяет диапазон адресов и принимает, но при выполнении что то не так.
Xenia
Цитата(DigitalM @ Feb 14 2010, 20:39) *
Хочу уточнить. У меня AT91SAM7S256. ijmp у него нет. Адрес загрузчика знаю только я. На asm("LDR PC,0x108000"); зависает. Компилятор проверяет диапазон адресов и принимает, но при выполнении что то не так.


А у меня AVR. Но не суть важно IJMP или JMP. Команда JMP (безусловного перехода) в ассемблере вашего МК есть? Или там надо явно модифицировать программый счетчик?
А переход приложения на загрузчик может быть запрещено фузами.
zltigo
Цитата(DigitalM @ Feb 14 2010, 20:39) *
ijmp у него нет.

Глаза на предыдущий пост #6 поднимите. Если не понятно, возьмите букварь. Как Вы думаете, сколько человек на форуме до Вас писали загрузчик?
Цитата
зависает....

Тысячи причин...
Цитата
Компилятор проверяет диапазон адресов и принимает...

Sancta simplicitas sad.gif Куда послали туда и пойдет.
DigitalM
Загрузчик писал я. Программу забирает, но из программы обратно запустить загрузчик пока не получается. JMP не понимает. С прыжком по условию (BNE 0x108000) тоже самое - виснет. SETJMP.H подключил. А че с ним делать?
И программа не знает о существовании загрузчика. Загрузчик определяется через USB как флешка. Копирую на эту флешку свою программу, выкл-вкл питание и уже работает моя программа. Загрузчик находиться в конце ROM. Надо, чтоб при включении питания, если нажата определенная кнопка, происходил прыжок на загрузчик.
aaarrr
Цитата(Xenia @ Feb 14 2010, 19:29) *
Определите тогда себе метку в нужном вам месте, вставив туда ассемблерную вставку...

Ну и способы у вас. Даже если инлайн ассемблер позволяет ставить глобальные метки и модифицировать PC, что бывает далеко не всегда, саму метку поставить не получится, т.к. нужно прыгнуть в другую программу.

Цитата(DigitalM @ Feb 14 2010, 21:50) *
С прыжком по условию (BNE 0x108000) тоже самое - виснет.

Стесняюсь даже спросить, но почему BNE?

Цитата(DigitalM @ Feb 14 2010, 21:50) *
SETJMP.H подключил. А че с ним делать?

Отключить и написать:
Код
(*(void(*)(void))(0x108000))();

Как уже советовали. Так по крайней мере будет уверенность, что процессор пойдет туда, куда послали.
Для зависания действительно есть масса причин - не сброшенный контроллер прерываний, remap, переинициализация PLL и т.д. и т.п.
DigitalM
АААААААААА!
(*(void(*)(void))(0x108000))();
Работает! Спасибо!
Xenia
Цитата(DigitalM @ Feb 14 2010, 22:13) *
АААААААААА!
(*(void(*)(void))(0x108000))();
Работает! Спасибо!


Но это не джамп (JMP), а вход в подпрограмму (CALL)!
Посмотрите, ради интереса, во что компилируется у вас эта С-шная строка.
aaarrr
Цитата(Xenia @ Feb 14 2010, 22:21) *
Но это не джамп (JMP), а вход в подпрограмму (CALL)!

Это не CALL (которого у ARM нет), а Branch and Exchange (BX). И в любом случае это совершенно не важно.
DigitalM
Вот еще один вопрос. Я указываю адрес в оперативке (0x200000) и хочу с нее считать данные в переменную Х. Как я могу это в IAR сделать?
aaarrr
X = *(volatile unsigned int*)0x200000; Ну, или любой другой тип вместо int.
zltigo
Цитата(DigitalM @ Feb 16 2010, 18:33) *
Как я могу это в IAR сделать?

Перестаньте поминать всуе IAR. Возьмите K&R букварь второго издания по 'C'. А то скопипастив ответ (*(void(*)(void))(0x108000))();
даже не попытались понять написанного, иначе следующего вопроса просто не было-бы.
smac
Цитата(DigitalM @ Feb 16 2010, 18:33) *
Вот еще один вопрос. Я указываю адрес в оперативке (0x200000) и хочу с нее считать данные в переменную Х. Как я могу это в IAR сделать?

Даже легче чем прыгнуть
Код
int X;
X = *(int*)0x200000;

В общем смысл в том, что Вы преобразуете адрес в указатель на требуемый тип а затем берете данные по этому указателю.


Модератору: Извините, не заметил вторую страницу прошу удалить пост.
DigitalM
Спасибо всем! Я просто смотрю, как мне быстренько все под ассемблер перевести. Зачем люди исспользуют языки программирования высокого уровня для программирования низкоуровневых устройств, я не понимаю. Разница в программном коде в 10 раз, а в производительности в 2-3 раза. Тоесть, если вы перейдете на ассемблер, то для решения ваших задач сойдет и Tiny2313.
А ссылку на букварь можно?
Сергей Борщ
Цитата(DigitalM @ Feb 19 2010, 12:50) *
А ссылку на букварь можно?
То есть "я нихера не умею, потому что не знаю, но кидаться цифрами с потолка - легко"
Цитата(DigitalM @ Feb 19 2010, 12:50) *
Разница в программном коде в 10 раз, а в производительности в 2-3 раза.
Продолжайте писать на ассемблере, затрачивая в 10 раз больше времени.

P.S. Букварь - Керниган и Ритчи. "Язык программирования С". Гугль в помощь.
ASN
DigitalM
Откуда у Вас такие цифры о том, что между C и asm разница в программном коде в 10 раз, а в производительности в 2-3 раза?
А то мужики-то и не знают как правильно кодировать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.