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

 
 
 
Reply to this topicStart new topic
> Как реагировать на критическую ошибку времени исполнения?, Хочется аналог исключения в iar avr
AndryG
сообщение Apr 15 2016, 22:34
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Рисую велосипед марки "планировщик". Будет ездить на связанных списках sm.gif Для рисования использую IAR (avr).

В коде есть момент "приплыли", когда дальнейшее нормальное выполнение невозможно.
Я решил, что в данном случае не надо полумер по типу "а эту задачу в очередь не поставим, ибо места нет".

На php я бы выбросил исключение и перехватил бы его на самом высоком уровне для вывода юзеру "упс".
А как тут быть? Решение хочется универсальное, ибо планируется использовать сей код в разных проектах без индивидуального допиливания.

Поделитесь, пжлст, идеями. Может какой механизм великого компилятора можно задействовать? Как вы поступаете в таких случаях?

Код
void qtTask(qtTaskPtr ptr, qtDelay tick){
  Task *r = empty.h;

  if(NULL == r){ // нет свободных записей. Приплыли.
    PORTB |= 0xff; // это отладочная затычка. Как быть при такой ошибке в библиотечном коде.
    while(1);
  }

  head2tail(&empty, tick ? &delay : &active);
...
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Apr 15 2016, 22:59
Сообщение #2


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

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



механизм механизмом, а делать то чего после исключения знаете? У вас есть вариант продолжения жизни после того как поняли, что места нет? Обычно проблема именно в этом в эмбеддед.
Go to the top of the page
 
+Quote Post
AndryG
сообщение Apr 16 2016, 10:20
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Я хочу переложить заботу "как жить дальше" с библиотечного кода на основную программу. Пусть она думает, как ей жить после такого конфуза.

Порылся в документации. (IAR C/C++ Compiler Reference Guide for AVR 86 стр.)
В раделе System startup and termination встречается описание функций exit(), abort(), _exit(), __exit().

Как я понял, то я могу вызывать в библиотченом коде abort(), указывая тем самым, что нормально дальше работать невозможно.
А основная программа может реализовать свою функцию __exit(int) и там уже колдовать. Или светодиод зажечь и стоять при отладке или перегрузиться с журналированием и т.д.

Попробовал поставить abort() и exit() в проблемном месте. И совсем не понимаю, о чём меня предупреждают
Цитата
Warning[w6]: Type conflict for external/entry "abort", in module dispatcher against external/entry in module ?abort;
prototyped function vs K&R function
Warning[w6]: Type conflict for external/entry "exit", in module dispatcher against external/entry in module ?exit; prototyped
function vs K&R function

Go to the top of the page
 
+Quote Post
Baser
сообщение Apr 16 2016, 12:31
Сообщение #4


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(AndryG @ Apr 16 2016, 13:20) *
И совсем не понимаю, о чём меня предупреждают

Забыли подключить хидер-файл с описанием прототипа функции.
Вот ИАР и ругается на несоответствие описания по-умолчанию с описанием в хидере.
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jun 12 2016, 14:04
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(AndryG @ Apr 16 2016, 01:34) *
В коде есть момент "приплыли", когда дальнейшее нормальное выполнение невозможно.

Нужно переписать код, чтобы исключить момент "приплыли".
Исключите все исключения.
Функции exit(), abort(), _exit(), __exit() существуют только в силу требований стандарта.


Вот, к примеру, текст _exit() - вечный цикл, с приглашением временной вставки своих отладочных действий при написании программы.

Код
__exit:
?C_EXIT:

;----------------------------------------------------------------------------
; The next two lines could be replaced by user defined code.    
;----------------------------------------------------------------------------
    SLEEP
    RJMP    __exit
Go to the top of the page
 
+Quote Post
AndryG
сообщение Jun 12 2016, 15:07
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Почитайте тему выше. Я не могу исключить исключительную ситуацию.

Думаю, что вариант с _exit() вполне рабочий. Если основной код не будет перехватывать ситуацию, подставляя свою функцию, то сработает собака.
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jun 12 2016, 16:43
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(AndryG @ Jun 12 2016, 18:07) *
Думаю, что вариант с _exit() вполне рабочий. Если основной код не будет перехватывать ситуацию, подставляя свою функцию, то сработает собака.

Функция _exit() - только лишь следствие стандарта, так как в случае avr она совершенно бесполезна, то разработчики IAR реализовали ее в виде зацикленной заглушки. Чтобы в ее тело на стадии написания программы можно было поставить сигнализирующий код, подобный
Вашему: PORTB |= 0xff; // это отладочная затычка. Как быть при такой ошибке в библиотечном коде.
Собаку ждать и не нужно, можно сформировать ресет программно.
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Jun 13 2016, 21:33
Сообщение #8


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



ничего не понял. В чем дилемма-то? Если приплыли, то дилеммы-то нет, открывайте кингстоны и до свидания.

Я представляю себе ситуацию например такую, что у меня периферия по I2C не отзывается. Печатаю в порт дебага сообщение и good bye.

Т.е. непонятно, какое именно преимущество дает вам вызов exit() по сравнению с не вызыванием ничего?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 14 2016, 10:46
Сообщение #9


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



exception в си называется assert sm.gif
Причем, обычно его включают на время отладки, а в релизе выключают.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jun 14 2016, 11:10
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(MrYuran @ Jun 14 2016, 13:46) *
exception в си называется assert sm.gif
Причем, обычно его включают на время отладки, а в релизе выключают.

аналог exception в си, еще в зачаточном состоянии, - это библиотечные функции setjump/longjump.
Прыжок в ранее установленную точку, но без раскрутки стека со всеми вытекающими потерями.
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Jun 14 2016, 22:15
Сообщение #11


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(MrYuran @ Jun 14 2016, 05:46) *
exception в си называется assert sm.gif
Причем, обычно его включают на время отладки, а в релизе выключают.

Assert это не exception. это скорее дебаг фича.
Go to the top of the page
 
+Quote Post
AndryG
сообщение Jun 15 2016, 20:43
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Цитата
Т.е. непонятно, какое именно преимущество дает вам вызов exit()


Дает неизменяемость "библиотечного" кода. Я могу подключать этот код без допиливания в разные проекты и каждый будет по своему открывать кингстоны.
Go to the top of the page
 
+Quote Post

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

 


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


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