|
|
  |
Как реагировать на критическую ошибку времени исполнения?, Хочется аналог исключения в iar avr |
|
|
|
Apr 15 2016, 22:34
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317

|
Рисую велосипед марки "планировщик". Будет ездить на связанных списках  Для рисования использую 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); ...
|
|
|
|
|
Apr 16 2016, 10:20
|
Частый гость
 
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jun 12 2016, 14:04
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 12 2016, 16:43
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(AndryG @ Jun 12 2016, 18:07)  Думаю, что вариант с _exit() вполне рабочий. Если основной код не будет перехватывать ситуацию, подставляя свою функцию, то сработает собака. Функция _exit() - только лишь следствие стандарта, так как в случае avr она совершенно бесполезна, то разработчики IAR реализовали ее в виде зацикленной заглушки. Чтобы в ее тело на стадии написания программы можно было поставить сигнализирующий код, подобный Вашему: PORTB |= 0xff; // это отладочная затычка. Как быть при такой ошибке в библиотечном коде. Собаку ждать и не нужно, можно сформировать ресет программно.
|
|
|
|
|
Jun 14 2016, 11:10
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(MrYuran @ Jun 14 2016, 13:46)  exception в си называется assert  Причем, обычно его включают на время отладки, а в релизе выключают. аналог exception в си, еще в зачаточном состоянии, - это библиотечные функции setjump/longjump. Прыжок в ранее установленную точку, но без раскрутки стека со всеми вытекающими потерями.
|
|
|
|
|
Jun 15 2016, 20:43
|
Частый гость
 
Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317

|
Цитата Т.е. непонятно, какое именно преимущество дает вам вызов exit() Дает неизменяемость "библиотечного" кода. Я могу подключать этот код без допиливания в разные проекты и каждый будет по своему открывать кингстоны.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|