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

 
 
> IAR goto my label, Прыжок на указанный адрес
DigitalM
сообщение Feb 14 2010, 14:42
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 14-02-10
Пользователь №: 55 480



Мне необходимо прыгнуть на адрес загрузкика. Как в IAR определить свою метку, чтоб по goto mylebel я перешел на загрузчик?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
Xenia
сообщение Feb 14 2010, 15:46
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Подключите хидер SETJMP.H - там определены функции типа setjmp(), которые вроде бы позволяют это делать. На крайний случай всегда можно прыгнуть с помощью ассеблерной вставки asm("ijmp xxxxx").
Впрочем, все это я применяла только однажды, и сейчас уже точно не помню подробностей.

Сообщение отредактировал Omen_13 - Feb 14 2010, 21:32
Причина редактирования: Избыточное цитирование
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 14 2010, 15:55
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(DigitalM @ Feb 14 2010, 17:42) *
Как в IAR определить свою метку, чтоб по goto mylebel я перешел на загрузчик?

Метку - никак. Можно передать управление при помощи указателя на процедуру.
setjmp/longjmp - совсем из другой оперы.
Go to the top of the page
 
+Quote Post
DigitalM
сообщение Feb 14 2010, 16:27
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 14-02-10
Пользователь №: 55 480



А какой синтаксис у setjmp? Я не понимаю языков высокого уровня.
asm("LDR PC,0"); работает.

Сообщение отредактировал DigitalM - Feb 14 2010, 16:31
Go to the top of the page
 
+Quote Post
Xenia
сообщение Feb 14 2010, 16:29
Сообщение #5


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Определите тогда себе метку в нужном вам месте, вставив туда ассемблерную вставку:
asm ("Label: nop"); // холостая инструкция с меткой
А из другого места прыгайте на нее с помощью:
asm ("ijmp Label"); // переход на метку
smile.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 14 2010, 16:33
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Пример для AVR:
Код
    (*(void(*)(void))(BOOTLOADER_START_ADDRES/2))();  // div 2 is to convert byte to word addressing mode for icall


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
DigitalM
сообщение Feb 14 2010, 17:39
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 14-02-10
Пользователь №: 55 480



Хочу уточнить. У меня AT91SAM7S256. ijmp у него нет. Адрес загрузчика знаю только я. На asm("LDR PC,0x108000"); зависает. Компилятор проверяет диапазон адресов и принимает, но при выполнении что то не так.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Feb 14 2010, 18:21
Сообщение #8


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(DigitalM @ Feb 14 2010, 20:39) *
Хочу уточнить. У меня AT91SAM7S256. ijmp у него нет. Адрес загрузчика знаю только я. На asm("LDR PC,0x108000"); зависает. Компилятор проверяет диапазон адресов и принимает, но при выполнении что то не так.


А у меня AVR. Но не суть важно IJMP или JMP. Команда JMP (безусловного перехода) в ассемблере вашего МК есть? Или там надо явно модифицировать программый счетчик?
А переход приложения на загрузчик может быть запрещено фузами.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 14 2010, 18:34
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(DigitalM @ Feb 14 2010, 20:39) *
ijmp у него нет.

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

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

Sancta simplicitas sad.gif Куда послали туда и пойдет.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
DigitalM
сообщение Feb 14 2010, 18:50
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 14-02-10
Пользователь №: 55 480



Загрузчик писал я. Программу забирает, но из программы обратно запустить загрузчик пока не получается. JMP не понимает. С прыжком по условию (BNE 0x108000) тоже самое - виснет. SETJMP.H подключил. А че с ним делать?
И программа не знает о существовании загрузчика. Загрузчик определяется через USB как флешка. Копирую на эту флешку свою программу, выкл-вкл питание и уже работает моя программа. Загрузчик находиться в конце ROM. Надо, чтоб при включении питания, если нажата определенная кнопка, происходил прыжок на загрузчик.

Сообщение отредактировал DigitalM - Feb 14 2010, 19:00
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 14 2010, 18:57
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(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 и т.д. и т.п.
Go to the top of the page
 
+Quote Post
DigitalM
сообщение Feb 14 2010, 19:13
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 14-02-10
Пользователь №: 55 480



АААААААААА!
(*(void(*)(void))(0x108000))();
Работает! Спасибо!
Go to the top of the page
 
+Quote Post
Xenia
сообщение Feb 14 2010, 19:21
Сообщение #13


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(DigitalM @ Feb 14 2010, 22:13) *
АААААААААА!
(*(void(*)(void))(0x108000))();
Работает! Спасибо!


Но это не джамп (JMP), а вход в подпрограмму (CALL)!
Посмотрите, ради интереса, во что компилируется у вас эта С-шная строка.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 14 2010, 19:23
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Xenia @ Feb 14 2010, 22:21) *
Но это не джамп (JMP), а вход в подпрограмму (CALL)!

Это не CALL (которого у ARM нет), а Branch and Exchange (BX). И в любом случае это совершенно не важно.
Go to the top of the page
 
+Quote Post
DigitalM
сообщение Feb 16 2010, 15:33
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 14-02-10
Пользователь №: 55 480



Вот еще один вопрос. Я указываю адрес в оперативке (0x200000) и хочу с нее считать данные в переменную Х. Как я могу это в IAR сделать?
Go to the top of the page
 
+Quote Post

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

 


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


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