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

Коды завершения функции

Я лишь идею предложил, а реализацией не занимался.

Сначала нужно описать идею "от" и "до". Хотя бы на бумажке (ворде, паинте и т. п.), а уже потом браться за реализацию.

А пока будете "рисовать" все эти идеи, куча из них "отвалятся" сами собой еще до реализации ;)

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

А универсальное решение в любой области - утопия.

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


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

Вангую, что останется самая простая и примитивная из них.
Ага))) и звать её ssize_t

подробнее тут

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


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

Остаюсь при своём мнении: передавать коды ошибок наверх для меня удобно)

С другой стороны откуда у вас так много ошибок?

Почему вы не можете их исправить?

Или это по сути не ошибки, а некие маркеры разных состостояний и вы просто имеете дело с неявными автоматами состояний.

Тогда лучше привести их к явному виду.

 

Настоящие ошибки - это ценная находка.

Когда такие случаются я собираю о них максимум информации.

Там и их количество с момента перезапуска, и место(имя функции и номер строки) где возникла,

и точное время в микросекундах когда возникла или какая-либо другая сопутствующая статистика связанных сигналов.

Это там где я жду ошибки. Очень часто безрезультатно, но зато когда ловлю я уже почти знаю их причину.

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


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

Мне кажется, что опять пошла путаница с рабочими ошибками и критическими сбоями.

Обработка рабочих ошибок - штатный режим работы приложения.

А задача программиста предусмотреть реакцию на все задокументированные ошибки.

Чем меньше предусмотрено различных рабочих ошибок, тем проще их обработка.

Иначе велик риск наплодить новых ошибок, заметьте, на абсолютно ровном месте :smile3046:

 

А вот критические/аварийные сбои, при которых работа дальше уже невозможна или невозобновима, нужно журналировать, писать в логи и т.п, собирая максимум информации в стиле "где/что/когда".

Но для этого уже существую готовые открытые сторонние решения, в т. ч. встроенные даже в среду. Нужно лишь освоить готовые продукты.

 

И получается, что нагромождение чудовищных надстроек над банальным кодами ошибок той или иной банальной функции - аки "Сизифов труд" :cranky:

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


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

Мне кажется, что опять пошла путаница с рабочими ошибками и критическими сбоями.

Интересный термин "рабочие ошибки"

Ну какие могут быть ошибки в глубоко встраиваемой системе.

Нет, если у вас некий инструмент, который без участия человека-оператора не работает, то еще понятно.

А если у вас силовой инвертер, контроллер квадрокоптера или робота, то какие там могут быть "рабочие ошибки"?

Если они не приводят к аварии или деградации - это не ошибки, а штатная передача состояний.

 

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


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

контроллер квадрокоптера или робота, то какие там могут быть "рабочие ошибки"?

Обрыв канала связи.

Ошибка данных в памяти, которую обнаруживает, но не исправляет ECC.

Изменено пользователем one_eight_seven

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


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

Интересный термин "рабочие ошибки"

Я уж не знаю как еще проще разжевать такие очевидные вещи, но попробую еще раз: "рабочие ошибки" - в моем понимании ошибки, возвращаемые вызываемыми функциями,

т.е. ошибки, которые приложение может обработать самостоятельно - именно так, как это предусмотрел программист.

Или по-другому: речь про ВСЕ коды, возвращаемые своими или сторонними функциями.

 

Все необработанные ошибки автоматически попадают в категорию критических (в терминах плюсов "exception").

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

Именно поэтому я уверен, что стремление плодить функции с кучей возвращаемых кодов, имхо, - создавать головную боль тому, кто эту функцию потом будет вызывать.

 

Или вы скажите, что отсутствие реакции на хотя бы на одну задокументированную ошибку (код, возвращаемый любой фукцией) - это нормально и можно дальше работать?

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


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

Или вы скажите, что отсутствие реакции на не предусмотренную в коде ошибку - это нормально и можно дальше работать?

Да нет, если вам функция что-то вернула, вы обработали как ни в чем не бывало, не выйдя за тактовый интервал и все задачи были выполнены вовремя, то это была не ошибка, а отработка автомата состояний.

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

 

Ошибка - это то что реально наносит системе ущерб. Я так себе представляю.

exception - это не ошибка, как вы понимаете, а такой способ раннего выхода из функций по специальным состояниям.

 

Т.е. я предлагаю отделять чисто программистское понятие ошибки от ошибки с точки зрения разработчика дивайса.

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


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

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

Не путайте "теплое" с "мягким" - еще раз прочитайте название этой темы.

 

Ошибка - это то что реально наносит системе ущерб. Я так себе представляю.

Код завершения функции обычно несет в себе код некой ошибки, причину, почему функция не отработала правильно.

Если функция не отработала правильно, то это - ошибка. Или для вас это не ошибка, а что-то другое?

 

 

 

Т.е. я предлагаю отделять чисто программистское понятие ошибки от ошибки с точки зрения разработчика дивайса.
Программисткие ошибки (или ошибки разработчика всего "дивайса") исправляются еще на этапе отладки и разработки, и речь в этой теме явно не про них. :bb-offtopic:

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


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

А универсальное решение в любой области - утопия.

Если оно претендует на универсальность во всём, то да, возможно, что и утопия.

 

Почему вы не можете их исправить?

Например, закорочена шина данных. Значит возникла ошибка передачи данных между микроконтроллером, и, к примеру, АЦП. Я считаю, что это именно ошибка, ане состояние. И вот как её исправить? Это же аппаратная проблема. И чтобы её проще было локаллизовать, и исправить, я и передаю коды ошибок "наверх".

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


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

Мне интнересна вся дискуссия, явно вышедшая за пределы начальной темы. Вопрос был про коды, какие может выдавать функция. В простейшем случае, действительно, хватило бы true и false. Но мне показалось правильным иметь более широкий диапазон ответов. Например, функция, выполняющая деление, может выдать ошибку "деление на ноль". Или "не хватает памяти" для создания временного массива. Это - универсальные ответы, и о них был вопрос. Их не нужно документировать, а просто использовать в вызывающей функции.

Другое дело - ошибки, события, возникающие в работе конкретного устройства. Которые нужно неким образом донести до потребителя или разработчика. Здесь, понятно, универсальности быть не может. Глобальные переменные в данном случае не кажутся мне неправильным решением.

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


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

Например, закорочена шина данных. Значит возникла ошибка передачи данных между микроконтроллером, и, к примеру, АЦП. Я считаю, что это именно ошибка, ане состояние. И вот как её исправить? Это же аппаратная проблема. И чтобы её проще было локаллизовать, и исправить, я и передаю коды ошибок "наверх".

Да это безусловно ошибка и она фатальная. Неизбежно приведет к деградации работы системы.

В риалтайме не исправляется, или вы знаете как это сделать?

Поэтому о ней надо собрать максимум информации.

Для этого, как говорится, организуется комплекс мероприятий, после того как появилось подозрение на такую ошибку. Именно после!

Самым невинным из которых будет рефакторинг кода. А самым тяжелым тюнинг всех выпущенных плат.

 

А с вашим понятием верха, создается ощущение как будто на верху вы только и ждете сбоев АЦП и там уже все готово к потере или искажению данных.

А у меня на верху работает какой нить алгоритм управления движением механизма.

Передача ему неких кодов ошибок АЦП совершенно бесполезно, алгоритм не занимается разруливанием проблем периферии.

 

Или вот живой пример.

У меня RTOS. В ней есть такой неслабый список ошибок.

Он не полный. Относится только к ядру

#define MQX_INVALID_POINTER				 (MQX_ERROR_BASE|0x01)
#define MQX_INVALID_SIZE					(MQX_ERROR_BASE|0x02)
#define MQX_NOT_RESOURCE_OWNER			  (MQX_ERROR_BASE|0x03)
#define MQX_OUT_OF_MEMORY				   (MQX_ERROR_BASE|0x04)
#define MQX_CORRUPT_MEMORY_SYSTEM		   (MQX_ERROR_BASE|0x05)
#define MQX_CORRUPT_STORAGE_POOL			(MQX_ERROR_BASE|0x06)
#define MQX_CORRUPT_STORAGE_POOL_FREE_LIST  (MQX_ERROR_BASE|0x07)
#define MQX_CORRUPT_STORAGE_POOL_POINTERS   (MQX_ERROR_BASE|0x08)
#define MQX_INVALID_CHECKSUM				(MQX_ERROR_BASE|0x09)
#define MQX_OUT_OF_TASK_DESCRIPTORS		 (MQX_ERROR_BASE|0x0A)
#define MQX_INVALID_MEMORY_BLOCK			(MQX_ERROR_BASE|0x0B)
#define MQX_INVALID_PARAMETER			   (MQX_ERROR_BASE|0x0C)
#define MQX_CANNOT_CALL_FUNCTION_FROM_ISR   (MQX_ERROR_BASE|0x0D)
#define MQX_INVALID_TASK_PRIORITY		   (MQX_ERROR_BASE|0x0E)
#define MQX_TASK_QUEUE_EMPTY				(MQX_ERROR_BASE|0x0F)
#define MQX_NO_TASK_TEMPLATE				(MQX_ERROR_BASE|0x10)
#define MQX_INVALID_TASK_STATE			  (MQX_ERROR_BASE|0x11)
#define MQX_INVALID_TASK_ID				 (MQX_ERROR_BASE|0x12)
#define MQX_INVALID_PROCESSOR_NUMBER		(MQX_ERROR_BASE|0x13)
#define MQX_INVALID_VECTORED_INTERRUPT	  (MQX_ERROR_BASE|0x14)
#define MQX_INVALID_TEMPLATE_INDEX		  (MQX_ERROR_BASE|0x15)
#define MQX_INVALID_CONFIGURATION		   (MQX_ERROR_BASE|0x16)

/* Kernel component error codes */
#define MQX_COMPONENT_EXISTS				(MQX_ERROR_BASE|0x17)
#define MQX_COMPONENT_DOES_NOT_EXIST		(MQX_ERROR_BASE|0x18)
#define MQX_INVALID_COMPONENT_HANDLE		(MQX_ERROR_BASE|0x19)
#define MQX_INVALID_COMPONENT_BASE		  (MQX_ERROR_BASE|0x1A)
#define MQX_INVALID_COMPONENT_NAME		  (MQX_ERROR_BASE|0x1B)
#define MQX_INVALID_HANDLE				  (MQX_ERROR_BASE|0x1C)

/* Test error codes */
#define MQX_CORRUPT_QUEUE				   (MQX_ERROR_BASE|0x1D)
#define MQX_INVALID_TASK_QUEUE			  (MQX_ERROR_BASE|0x1E)
#define MQX_INVALID_LWSEM				   (MQX_ERROR_BASE|0x1F)
#define MQX_CORRUPT_INTERRUPT_STACK		 (MQX_ERROR_BASE|0x20)

/* Initialization error return codes */
#define MQX_KERNEL_MEMORY_TOO_SMALL		 (MQX_ERROR_BASE|0x21)
#define MQX_COULD_NOT_CREATE_IPC_TASK	   (MQX_ERROR_BASE|0x22)
#define MQX_TOO_MANY_PRIORITY_LEVELS		(MQX_ERROR_BASE|0x23)
#define MQX_TOO_MANY_INTERRUPTS			 (MQX_ERROR_BASE|0x24)
#define MQX_DUPLICATE_TASK_TEMPLATE_INDEX   (MQX_ERROR_BASE|0x25)
#define MQX_TIMER_ISR_INSTALL_FAIL		  (MQX_ERROR_BASE|0x26)

/* Scheduler error codes */
#define MQX_SCHED_INVALID_POLICY			(MQX_ERROR_BASE|0x27)
#define MQX_SCHED_INVALID_PARAMETER_PTR	 (MQX_ERROR_BASE|0x28)
#define MQX_SCHED_INVALID_PARAMETER		 (MQX_ERROR_BASE|0x29)
#define MQX_SCHED_INVALID_TASK_ID		   (MQX_ERROR_BASE|0x2A)

/* I/O error codes */
#define MQX_INVALID_IO_CHANNEL			  (MQX_ERROR_BASE|0x2B)
#define MQX_IO_OPERATION_NOT_AVAILABLE	  (MQX_ERROR_BASE|0x2C)

/* IPC error codes */
#define MQX_INTER_PROCESSOR_INIT_FAILED	 (MQX_ERROR_BASE|0x2D)
#define MQX_IPC_INVALID_MESSAGE			 (MQX_ERROR_BASE|0x2E)
#define MQX_IPC_SERVICE_NOT_AVAILABLE	   (MQX_ERROR_BASE|0x2F)
#define MQX_IPC_ROUTE_EXISTS				(MQX_ERROR_BASE|0x30)

/* User memory error codes */
#define MQX_MEM_POOL_TOO_SMALL			  (MQX_ERROR_BASE|0x31)
#define MQX_MEM_POOL_INVALID				(MQX_ERROR_BASE|0x32)

/* MMU error codes */
#define MQX_OUT_OF_MMU_PAGE_TABLES		  (MQX_ERROR_BASE|0x33)
#define MQX_MMU_CONTEXT_EXISTS			  (MQX_ERROR_BASE|0x34)
#define MQX_MMU_CONTEXT_DOES_NOT_EXIST	  (MQX_ERROR_BASE|0x35)
#define MQX_MMU_PARENT_TASK_CANNOT_BE_MMU   (MQX_ERROR_BASE|0x36)

/* LWSEM wait timeout error codes */
#define MQX_LWSEM_WAIT_TIMEOUT			  (MQX_ERROR_BASE|0x37)

/* LWMEM error codes */
#define MQX_LWMEM_POOL_INVALID			  (MQX_ERROR_BASE|0x38)

/* LWEVENT error codes */
#define MQX_LWEVENT_INVALID				 (MQX_ERROR_BASE|0x39)

/* LWTIMER error codes */
#define MQX_LWTIMER_INVALID				 (MQX_ERROR_BASE|0x40)

/* UNHANDLED error codes */
#define MQX_UNHANDLED_INTERRUPT			 (MQX_ERROR_BASE|0x41)

/* RTC error codes */
#define MQX_RTC_UNLOCK_FAILED			   (MQX_ERROR_BASE|0x42)

#define MQX_NO_USER_TASKS				   (MQX_ERROR_BASE|0x43)
#define MQX_TOO_MANY_USER_TASKS			 (MQX_ERROR_BASE|0x44)
#define MQX_ACCESS_ERROR					(MQX_ERROR_BASE|0x45)

#define MQX_INVALID_DEVICE				  (MQX_ERROR_BASE|0x46)
#define MQX_TASKQ_CREATE_FAILED			 (MQX_ERROR_BASE|0x47)

/* TLSF error codes */
#define MQX_TLSF_POOL_INVALID			   (MQX_ERROR_BASE|0x48)
#define MQX_TLSF_TOO_LARGE_BLOCK			(MQX_ERROR_BASE|0x49)

/* MMU error codes - continued*/
#define MQX_MMU_ERROR					   (MQX_ERROR_BASE|0xfe)

#define MQX_ERROR						   (MQX_ERROR_BASE|0xff)

 

И что вы думаете делается с этими кодами ошибок в самой RTOS?

Ничего! Часто функции вызываются без проверки возвращаемого значения, а в лучшем случае все передается по цепочке вверх до самого пользовательского API.

И я там эти коды тоже не проверяю. Ну максимум код таймаута у некоторых объектов синхронизации.

Потому как безполезно. Т.е. как правило уже поздно и ничего исправить нельзя.

Но авторов RTOS понять можно, у них не было других средств.

А вот авторов приложений над RTOS уже понять нельзя, потому как у них есть куча других эффективных средств.

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


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

Например, функция, выполняющая деление, может выдать ошибку "деление на ноль".

Это - уже критическая ошибка, ее можно избежать еще на этапе создания кода, добавив перед делением соотв. проверку.

Если этого не делать, то придется ставить ловушку для ВСЕГО кода с соотв. реакцией на подобное событие.

 

Или "не хватает памяти" для создания временного массива.

Это - тоже критическая ошибка, обрабатывается также, как и деление на ноль (см. выше).

Но, правильно, имхо, вообще не использовать штатный механизма выделения памяти (malloc/free), а, использоваться специализированные решения, под конкрентные задачи.

 

Это - универсальные ответы, и о них был вопрос.

На подобные ответы уже есть готовые решения, для этого не нужно создавать новую тему :)

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


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

Да это безусловно ошибка и она фатальная. Неизбежно приведет к деградации работы системы.

В риалтайме не исправляется, или вы знаете как это сделать?

Поэтому о ней надо собрать максимум информации.

Для этого, как говорится, организуется комплекс мероприятий, после того как появилось подозрение на такую ошибку. Именно после!

 

А если шина не закорочена? А просто обрыв канала связи, например, радиоканала с пультом управления. И канал связи может восстановиться. Или датчик в сети теряет базу (orphaning). Это всё ошибки в работе системы. С точки зрения автомата - это рабочие ситуации, но они все начинаются с возврата ошибок. То же получение Nack - ситуация стандартная, но ошибочная, в том, смысле, что это ошибка работы системы.

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


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

А просто обрыв канала связи, например, радиоканала с пультом управления. И канал связи может восстановиться.

Это - не критическая ошибка, не фатальная. Т.е. "рабочая" ошибка. Поэтому и работать с ней нужно иначе (зависит от проекта, точнее от его ТЗ).

 

 

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


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

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

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

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

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

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

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

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

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

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