|
Как это делается средствами Си или IAR C |
|
|
|
 |
Ответов
|
Dec 21 2006, 05:49
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Цитата(SasaVitebsk @ Dec 21 2006, 07:24)  При программировании однокристалок иногда приходится обрабатывать глобальные ошибки. Или, к примеру, реагировать на существенное изменение конфигурации.
В этом случае самый простой а чаще и найболее надёжный способ, - это рестарт программы. Во всяком случае я пользовался таким способом под ASM и, несмотря на "некрасивость", не хочу обходится без этого и на СИ.
На Си я делаю это так: asm("jmp 0"); // Начать сначала
У меня это единственный оператор ASM на всё прогу. Может существует специальный вызов для IAR, что-то вроде __restart(); ?
И ещё один вопрос. Компилятор вопреки моему мнению скомпилировал его не в jmp. Это зачем? В бутлоадере исплользовал такое объявление функции: Код void (*start_application)( void ) = 0x0000; //pointer to application //at flash start Далее, в произвольном месте программы, мы можем ее вызвать и соответственно перейти по адресу 0. З.Ы. Работает. Использую компилятор GCC.
--------------------
Выбор.
|
|
|
|
|
Dec 25 2006, 01:53
|
Гуру
     
Группа: Свой
Сообщений: 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. Спасибо. Не додумался до такого. Прямолинейно мыслю, - переход значит переход! А в IAR, интересно, это выглядит так? extern void start_application(void)@0x0000; Спасибо также _bill. Не обратил внимания, теперь буду помнить. Думаю можно использовать по входу/выходу из sleep. Всем остальным тоже спасибо. Буду переваривать и пробовать.
|
|
|
|
|
Dec 25 2006, 02:19
|
Гуру
     
Группа: Свой
Сообщений: 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)(); Это наиболее правильный вариант.
|
|
|
|
|
Dec 25 2006, 12:38
|

Гуру
     
Группа: Свой
Сообщений: 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)();
Это наиболее правильный вариант. Сейчас глянул на цитируемое и понял, что в первом посте банально опечатался  и для полгого счастья скобочек не хватает. Во втором посте не ошибся, полностью универсально и переносимо так: Код ((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
|
|
|
|
Сообщений в этой теме
SasaVitebsk Как это делается средствами Си или IAR C Dec 21 2006, 02:24 zltigo Цитата(haker_fox @ Dec 21 2006, 04:49) В ... Dec 21 2006, 10:45  haker_fox Цитата(zltigo @ Dec 21 2006, 15:45) Цитат... Dec 22 2006, 05:19   aaarrr Цитата(haker_fox @ Dec 22 2006, 05:19) А ... Dec 22 2006, 05:39   zltigo Цитата(haker_fox @ Dec 22 2006, 04:19) А ... Dec 22 2006, 11:36    IgorKossak Цитата(zltigo @ Dec 25 2006, 11:38) 8. Эт... Dec 26 2006, 12:01 dxp Цитата(SasaVitebsk @ Dec 21 2006, 05:24) ... Dec 21 2006, 08:11 jorikdima ну в данном то случае и goto() подойдет, верно?
... Dec 22 2006, 12:20 zltigo Цитата(jorikdima @ Dec 22 2006, 11:20) ну... Dec 22 2006, 13:08 jorikdima Тормознул
goto ведь на метку идет, а не по ад... Dec 22 2006, 15:30 zltigo Цитата(jorikdima @ Dec 22 2006, 14:30) от... Dec 22 2006, 16:17  _Bill Цитата(zltigo @ Dec 22 2006, 16:17) Цитат... Dec 22 2006, 17:37   zltigo Цитата(_Bill @ Dec 22 2006, 16:37) Можно ... Dec 22 2006, 18:41    _Bill Цитата(zltigo @ Dec 22 2006, 18:41) Цитат... Dec 22 2006, 23:01     zltigo Цитата(_Bill @ Dec 22 2006, 22:01) перехо... Dec 22 2006, 23:25 _artem_ У прямого перехода по адресу есть свои минусы - не... Dec 22 2006, 17:27
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|