AndryG 0 15 апреля, 2016 Опубликовано 15 апреля, 2016 · Жалоба Рисую велосипед марки "планировщик". Будет ездить на связанных списках :) Для рисования использую 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 0 15 апреля, 2016 Опубликовано 15 апреля, 2016 · Жалоба механизм механизмом, а делать то чего после исключения знаете? У вас есть вариант продолжения жизни после того как поняли, что места нет? Обычно проблема именно в этом в эмбеддед. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndryG 0 16 апреля, 2016 Опубликовано 16 апреля, 2016 · Жалоба Я хочу переложить заботу "как жить дальше" с библиотечного кода на основную программу. Пусть она думает, как ей жить после такого конфуза. Порылся в документации. (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 5 16 апреля, 2016 Опубликовано 16 апреля, 2016 · Жалоба И совсем не понимаю, о чём меня предупреждают Забыли подключить хидер-файл с описанием прототипа функции. Вот ИАР и ругается на несоответствие описания по-умолчанию с описанием в хидере. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 12 июня, 2016 Опубликовано 12 июня, 2016 · Жалоба В коде есть момент "приплыли", когда дальнейшее нормальное выполнение невозможно. Нужно переписать код, чтобы исключить момент "приплыли". Исключите все исключения. Функции exit(), abort(), _exit(), __exit() существуют только в силу требований стандарта. Вот, к примеру, текст _exit() - вечный цикл, с приглашением временной вставки своих отладочных действий при написании программы. __exit: ?C_EXIT: ;---------------------------------------------------------------------------- ; The next two lines could be replaced by user defined code. ;---------------------------------------------------------------------------- SLEEP RJMP __exit Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndryG 0 12 июня, 2016 Опубликовано 12 июня, 2016 · Жалоба Почитайте тему выше. Я не могу исключить исключительную ситуацию. Думаю, что вариант с _exit() вполне рабочий. Если основной код не будет перехватывать ситуацию, подставляя свою функцию, то сработает собака. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 12 июня, 2016 Опубликовано 12 июня, 2016 · Жалоба Думаю, что вариант с _exit() вполне рабочий. Если основной код не будет перехватывать ситуацию, подставляя свою функцию, то сработает собака. Функция _exit() - только лишь следствие стандарта, так как в случае avr она совершенно бесполезна, то разработчики IAR реализовали ее в виде зацикленной заглушки. Чтобы в ее тело на стадии написания программы можно было поставить сигнализирующий код, подобный Вашему: PORTB |= 0xff; // это отладочная затычка. Как быть при такой ошибке в библиотечном коде. Собаку ждать и не нужно, можно сформировать ресет программно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slavka012 0 13 июня, 2016 Опубликовано 13 июня, 2016 · Жалоба ничего не понял. В чем дилемма-то? Если приплыли, то дилеммы-то нет, открывайте кингстоны и до свидания. Я представляю себе ситуацию например такую, что у меня периферия по I2C не отзывается. Печатаю в порт дебага сообщение и good bye. Т.е. непонятно, какое именно преимущество дает вам вызов exit() по сравнению с не вызыванием ничего? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 14 июня, 2016 Опубликовано 14 июня, 2016 · Жалоба exception в си называется assert :) Причем, обычно его включают на время отладки, а в релизе выключают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 14 июня, 2016 Опубликовано 14 июня, 2016 · Жалоба exception в си называется assert :) Причем, обычно его включают на время отладки, а в релизе выключают. аналог exception в си, еще в зачаточном состоянии, - это библиотечные функции setjump/longjump. Прыжок в ранее установленную точку, но без раскрутки стека со всеми вытекающими потерями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slavka012 0 14 июня, 2016 Опубликовано 14 июня, 2016 · Жалоба exception в си называется assert :) Причем, обычно его включают на время отладки, а в релизе выключают. Assert это не exception. это скорее дебаг фича. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndryG 0 15 июня, 2016 Опубликовано 15 июня, 2016 · Жалоба Т.е. непонятно, какое именно преимущество дает вам вызов exit() Дает неизменяемость "библиотечного" кода. Я могу подключать этот код без допиливания в разные проекты и каждый будет по своему открывать кингстоны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться