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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Как это делается средствами Си или IAR C
zltigo
сообщение Dec 22 2006, 23:25
Сообщение #16


Гуру
******

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



Цитата(_Bill @ Dec 22 2006, 22:01) *
переход в эту точку происходит путем вызова функции longjmp().

А я о чем? Только о том, что прямо установить точку возврата невозможно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 25 2006, 01:53
Сообщение #17


Гуру
******

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



Цитата(haker_fox @ Dec 21 2006, 05:49) *
В бутлоадере исплользовал такое объявление функции:
Код
void (*start_application)( void ) = 0x0000;     //pointer to application
                                                //at flash start

Далее, в произвольном месте программы, мы можем ее вызвать и соответственно перейти по адресу 0.
З.Ы. Работает. Использую компилятор GCC.


Спасибо. Не додумался до такого. Прямолинейно мыслю, - переход значит переход! smile.gif

А в IAR, интересно, это выглядит так?

extern void start_application(void)@0x0000;

Спасибо также _bill. Не обратил внимания, теперь буду помнить. Думаю можно использовать по входу/выходу из sleep.

Всем остальным тоже спасибо. Буду переваривать и пробовать.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 25 2006, 02:19
Сообщение #18


Гуру
******

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



Цитата(SasaVitebsk @ Dec 25 2006, 01:53) *
А в IAR, интересно, это выглядит так?

extern void start_application(void)@0x0000;


Процитирую коллегу:

Цитата(zltigo @ Dec 21 2006, 10:45) *
RAM зачем расходовать попусту? Сразу и пишите.
(void (*)(void))(0x0000)();


Это наиболее правильный вариант.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 25 2006, 12:38
Сообщение #19


Гуру
******

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



Цитата(aaarrr @ Dec 25 2006, 01:19) *
Процитирую коллегу:

Цитата(zltigo @ Dec 21 2006, 10:45) *

RAM зачем расходовать попусту? Сразу и пишите.
(void (*)(void))(0x0000)();


Это наиболее правильный вариант.


Сейчас глянул на цитируемое и понял, что в первом посте банально опечатался sad.gif и для полгого счастья скобочек не хватает. Во втором посте не ошибся, полностью универсально и переносимо так:
Код
((void (*)(void))(0x0000))();


1. Берем абстрактный 0
2.....делаем из него указатель (*)0
3. ... на функцию ((*)())0
4. ... без аргументов ((*)(void))0
5.... ничего не возвращающую (void(*)(void))0
6.... если вместо 0 какой-нибудь define выражение поставлять будут и забудут в выражении скобочки поставить,то для перестраховки ставим свои (void(*)(void))(0)
7. осталось вызвать функцию ((void(*)(void))(0))();
8. Это я все к тому, что на форуме уже был спор по подобному прводу со стенаниями "непонятно!!!","скобочки!!!", "звездочки!!!". Решил пошагово обьяснить.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 26 2006, 12:01
Сообщение #20


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(zltigo @ Dec 25 2006, 11:38) *
8. Это я все к тому, что на форуме уже был спор по подобному прводу со стенаниями "непонятно!!!","скобочки!!!", "звездочки!!!". Решил пошагово обьяснить.

Стенают обычно те, кто вырос на Паскале.
У эмбеддеров такие вопросы не возникают.
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 - 00:04
Рейтинг@Mail.ru


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