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

 
 
> Как это делается средствами Си или IAR C
SasaVitebsk
сообщение Dec 21 2006, 02:24
Сообщение #1


Гуру
******

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



При программировании однокристалок иногда приходится обрабатывать глобальные ошибки. Или, к примеру, реагировать на существенное изменение конфигурации.

В этом случае самый простой а чаще и найболее надёжный способ, - это рестарт программы. Во всяком случае я пользовался таким способом под ASM и, несмотря на "некрасивость", не хочу обходится без этого и на СИ.

На Си я делаю это так:
asm("jmp 0"); // Начать сначала

У меня это единственный оператор ASM на всё прогу. Может существует специальный вызов для IAR, что-то вроде __restart(); ?

И ещё один вопрос. Компилятор вопреки моему мнению скомпилировал его не в jmp. Это зачем?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
haker_fox
сообщение Dec 21 2006, 05:49
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 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.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 21 2006, 10:45
Сообщение #3


Гуру
******

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



Цитата(haker_fox @ Dec 21 2006, 04:49) *
В бутлоадере исплользовал такое объявление функции:
void (*start_application)( void ) = 0x0000; //pointer to application
Далее, в произвольном месте программы, мы можем ее вызвать и соответственно перейти по адресу 0.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Dec 22 2006, 05:19
Сообщение #4


Познающий...
******

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



Цитата(zltigo @ Dec 21 2006, 15:45) *
Цитата(haker_fox @ Dec 21 2006, 04:49) *

В бутлоадере исплользовал такое объявление функции:
void (*start_application)( void ) = 0x0000; //pointer to application
Далее, в произвольном месте программы, мы можем ее вызвать и соответственно перейти по адресу 0.

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

Спасибо! Я не задумывался об этом. Теперь буду знать. А компилятор не оптимизирует, приведенное мной выражение?


--------------------
Выбор.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- SasaVitebsk   Как это делается средствами Си или IAR C   Dec 21 2006, 02:24
||- - 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
|- - SasaVitebsk   Цитата(haker_fox @ Dec 21 2006, 05:49) В ...   Dec 25 2006, 01:53
|- - aaarrr   Цитата(SasaVitebsk @ Dec 25 2006, 01:53) ...   Dec 25 2006, 02:19
|- - zltigo   Цитата(aaarrr @ Dec 25 2006, 01:19) Проци...   Dec 25 2006, 12:38
|- - 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


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 01:49
Рейтинг@Mail.ru


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