Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как реагировать на критическую ошибку времени исполнения?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
AndryG
Рисую велосипед марки "планировщик". Будет ездить на связанных списках 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);
...
jorikdima
механизм механизмом, а делать то чего после исключения знаете? У вас есть вариант продолжения жизни после того как поняли, что места нет? Обычно проблема именно в этом в эмбеддед.
AndryG
Я хочу переложить заботу "как жить дальше" с библиотечного кода на основную программу. Пусть она думает, как ей жить после такого конфуза.

Порылся в документации. (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

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

Забыли подключить хидер-файл с описанием прототипа функции.
Вот ИАР и ругается на несоответствие описания по-умолчанию с описанием в хидере.
aiwa
Цитата(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
AndryG
Почитайте тему выше. Я не могу исключить исключительную ситуацию.

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

Функция _exit() - только лишь следствие стандарта, так как в случае avr она совершенно бесполезна, то разработчики IAR реализовали ее в виде зацикленной заглушки. Чтобы в ее тело на стадии написания программы можно было поставить сигнализирующий код, подобный
Вашему: PORTB |= 0xff; // это отладочная затычка. Как быть при такой ошибке в библиотечном коде.
Собаку ждать и не нужно, можно сформировать ресет программно.
ar__systems
ничего не понял. В чем дилемма-то? Если приплыли, то дилеммы-то нет, открывайте кингстоны и до свидания.

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

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

аналог exception в си, еще в зачаточном состоянии, - это библиотечные функции setjump/longjump.
Прыжок в ранее установленную точку, но без раскрутки стека со всеми вытекающими потерями.
ar__systems
Цитата(MrYuran @ Jun 14 2016, 05:46) *
exception в си называется assert sm.gif
Причем, обычно его включают на время отладки, а в релизе выключают.

Assert это не exception. это скорее дебаг фича.
AndryG
Цитата
Т.е. непонятно, какое именно преимущество дает вам вызов exit()


Дает неизменяемость "библиотечного" кода. Я могу подключать этот код без допиливания в разные проекты и каждый будет по своему открывать кингстоны.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.