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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как это делается средствами Си или 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
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
dxp
сообщение Dec 21 2006, 08:11
Сообщение #3


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(SasaVitebsk @ Dec 21 2006, 05:24) *
При программировании однокристалок иногда приходится обрабатывать глобальные ошибки. Или, к примеру, реагировать на существенное изменение конфигурации.

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

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

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

И ещё один вопрос. Компилятор вопреки моему мнению скомпилировал его не в jmp. Это зачем?

Переносимого в рамках языка способа нет. Все очень зависит от целевого проца и кросс-компилятора. В некоторых процах есть специальные команды для глобального сброса. Сброс, также, может поддерживаться компилятором путем различного рода расширений языка. В конце концов, сбросы тоже разные бывают - "холодные", "теплые". Для "холодного" можно просто завести внешнюю ногу Reset на один из пинов МК и принудильно самого себя сбрасывать. "Теплый" сброс может быть огранизован по-разному, начиная от явного прописывания адреса перехода на вектор сброса и заканчивая сбросом средствами процессора - сторожевым таймером или специальными командами или установкой (сбросом) специальных битов в регистрах спец. функций.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 21 2006, 10:45
Сообщение #4


Гуру
******

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


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

Группа: Свой
Сообщений: 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
aaarrr
сообщение Dec 22 2006, 05:39
Сообщение #6


Гуру
******

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



Цитата(haker_fox @ Dec 22 2006, 05:19) *
А компилятор не оптимизирует, приведенное мной выражение?

Нет. Компилятор создаст в RAM указатель на функцию, а уж что с ним дальше произойдет - не его дело. Может быть, Вы ему не 0, а другое какое-нибудь значение перед вызовом присвоить захотите.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 22 2006, 11:36
Сообщение #7


Гуру
******

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



Цитата(haker_fox @ Dec 22 2006, 04:19) *
А компилятор не оптимизирует, приведенное мной выражение?

Написан обычный вызов функции, только адрес указан явно 0x0000(); вместо name();. Никаким образом "заоптимизировать" его компилятор не может, ибо как минимум ничего не знает о теле вызываемой функции smile.gif


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


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



ну в данном то случае и goto() подойдет, верно?


описался, имел ввиду goto - ключевое слово С, а не goto()
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 22 2006, 13:08
Сообщение #9


Гуру
******

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



Цитата(jorikdima @ Dec 22 2006, 11:20) *
ну в данном то случае и goto() подойдет, верно?

????? О чем это ????? Не понимаю совсем.

#define goto( addr ) ((void (*)(void))(addr))()

Или о чем?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Dec 22 2006, 15:30
Сообщение #10


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Тормознул biggrin.gif biggrin.gif
goto ведь на метку идет, а не по адресу.
Вот если метку моставить туда куда идти надо (на main() например), то можно просто
goto Label;
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 22 2006, 16:17
Сообщение #11


Гуру
******

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



Цитата(jorikdima @ Dec 22 2006, 14:30) *
от если метку моставить туда куда идти надо (на main() например), то можно просто
goto Label;

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
_artem_
сообщение Dec 22 2006, 17:27
Сообщение #12


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



У прямого перехода по адресу есть свои минусы - не происходит внутреннего резета процессора , что в некоторых слючаях желательно.
watchdog или соединение ресета с одним из gpio можно попробовать в этом случае.


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
_Bill
сообщение Dec 22 2006, 17:37
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(zltigo @ Dec 22 2006, 16:17) *
Цитата(jorikdima @ Dec 22 2006, 14:30) *

от если метку моставить туда куда идти надо (на main() например), то можно просто
goto Label;

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

Можно использовать функции setjmp() и longjmp().
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 22 2006, 18:41
Сообщение #14


Гуру
******

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



Цитата(_Bill @ Dec 22 2006, 16:37) *
Можно использовать функции setjmp() и longjmp().

Для описанного случая нельзя smile.gif setjmp() текущий pc и стек сохраняет а не устанавливает какой хочется.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
_Bill
сообщение Dec 22 2006, 23:01
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(zltigo @ Dec 22 2006, 18:41) *
Цитата(_Bill @ Dec 22 2006, 16:37) *

Можно использовать функции setjmp() и longjmp().

Для описанного случая нельзя smile.gif setjmp() текущий pc и стек сохраняет а не устанавливает какой хочется.

Я имел в виду переход между функцииями. setjmp() запоминает стек и PC точки перехода в буфере, переход в эту точку происходит путем вызова функции longjmp().

Сообщение отредактировал _Bill - Dec 22 2006, 23:02
Go to the top of the page
 
+Quote Post

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

 


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


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