Перейти к содержанию
    

Как реагировать на критическую ошибку времени исполнения?

Рисую велосипед марки "планировщик". Будет ездить на связанных списках :) Для рисования использую 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);
...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И совсем не понимаю, о чём меня предупреждают

Забыли подключить хидер-файл с описанием прототипа функции.

Вот ИАР и ругается на несоответствие описания по-умолчанию с описанием в хидере.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Нужно переписать код, чтобы исключить момент "приплыли".

Исключите все исключения.

Функции exit(), abort(), _exit(), __exit() существуют только в силу требований стандарта.

 

 

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

 

__exit:
?C_EXIT:

;----------------------------------------------------------------------------
; The next two lines could be replaced by user defined code.    
;----------------------------------------------------------------------------
    SLEEP
    RJMP    __exit

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Думаю, что вариант с _exit() вполне рабочий. Если основной код не будет перехватывать ситуацию, подставляя свою функцию, то сработает собака.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Думаю, что вариант с _exit() вполне рабочий. Если основной код не будет перехватывать ситуацию, подставляя свою функцию, то сработает собака.

Функция _exit() - только лишь следствие стандарта, так как в случае avr она совершенно бесполезна, то разработчики IAR реализовали ее в виде зацикленной заглушки. Чтобы в ее тело на стадии написания программы можно было поставить сигнализирующий код, подобный

Вашему: PORTB |= 0xff; // это отладочная затычка. Как быть при такой ошибке в библиотечном коде.

Собаку ждать и не нужно, можно сформировать ресет программно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

exception в си называется assert :)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

exception в си называется assert :)

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

аналог exception в си, еще в зачаточном состоянии, - это библиотечные функции setjump/longjump.

Прыжок в ранее установленную точку, но без раскрутки стека со всеми вытекающими потерями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

exception в си называется assert :)

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

Assert это не exception. это скорее дебаг фича.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...