|
|
  |
Коды завершения функции |
|
|
|
May 7 2018, 15:05
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(haker_fox @ May 7 2018, 17:59)  Я лишь идею предложил, а реализацией не занимался. Сначала нужно описать идею "от" и "до". Хотя бы на бумажке (ворде, паинте и т. п.), а уже потом браться за реализацию. А пока будете "рисовать" все эти идеи, куча из них "отвалятся" сами собой еще до реализации  Вангую, что останется самая простая и примитивная из них. Либо выйдут несколько вариантов разной сложности под разные случаи применения. А универсальное решение в любой области - утопия.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
May 7 2018, 19:12
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(haker_fox @ May 7 2018, 17:25)  Остаюсь при своём мнении: передавать коды ошибок наверх для меня удобно) С другой стороны откуда у вас так много ошибок? Почему вы не можете их исправить? Или это по сути не ошибки, а некие маркеры разных состостояний и вы просто имеете дело с неявными автоматами состояний. Тогда лучше привести их к явному виду. Настоящие ошибки - это ценная находка. Когда такие случаются я собираю о них максимум информации. Там и их количество с момента перезапуска, и место(имя функции и номер строки) где возникла, и точное время в микросекундах когда возникла или какая-либо другая сопутствующая статистика связанных сигналов. Это там где я жду ошибки. Очень часто безрезультатно, но зато когда ловлю я уже почти знаю их причину.
|
|
|
|
|
May 7 2018, 19:40
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Мне кажется, что опять пошла путаница с рабочими ошибками и критическими сбоями. Обработка рабочих ошибок - штатный режим работы приложения. А задача программиста предусмотреть реакцию на все задокументированные ошибки. Чем меньше предусмотрено различных рабочих ошибок, тем проще их обработка. Иначе велик риск наплодить новых ошибок, заметьте, на абсолютно ровном месте А вот критические/аварийные сбои, при которых работа дальше уже невозможна или невозобновима, нужно журналировать, писать в логи и т.п, собирая максимум информации в стиле "где/что/когда". Но для этого уже существую готовые открытые сторонние решения, в т. ч. встроенные даже в среду. Нужно лишь освоить готовые продукты. И получается, что нагромождение чудовищных надстроек над банальным кодами ошибок той или иной банальной функции - аки "Сизифов труд"
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
May 7 2018, 19:53
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(Forger @ May 7 2018, 22:40)  Мне кажется, что опять пошла путаница с рабочими ошибками и критическими сбоями. Интересный термин "рабочие ошибки" Ну какие могут быть ошибки в глубоко встраиваемой системе. Нет, если у вас некий инструмент, который без участия человека-оператора не работает, то еще понятно. А если у вас силовой инвертер, контроллер квадрокоптера или робота, то какие там могут быть "рабочие ошибки"? Если они не приводят к аварии или деградации - это не ошибки, а штатная передача состояний.
|
|
|
|
|
May 7 2018, 20:00
|
Знающий
   
Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664

|
Цитата контроллер квадрокоптера или робота, то какие там могут быть "рабочие ошибки"? Обрыв канала связи. Ошибка данных в памяти, которую обнаруживает, но не исправляет ECC.
Сообщение отредактировал one_eight_seven - May 7 2018, 20:02
|
|
|
|
|
May 7 2018, 20:15
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(AlexandrY @ May 7 2018, 22:53)  Интересный термин "рабочие ошибки" Я уж не знаю как еще проще разжевать такие очевидные вещи, но попробую еще раз: "рабочие ошибки" - в моем понимании ошибки, возвращаемые вызываемыми функциями, т.е. ошибки, которые приложение может обработать самостоятельно - именно так, как это предусмотрел программист. Или по-другому: речь про ВСЕ коды, возвращаемые своими или сторонними функциями. Все необработанные ошибки автоматически попадают в категорию критических (в терминах плюсов "exception"). Ведь никто не знает, как себя поведет приложение, если проигнорировать хотя бы одну из задокументированных ошибок. Именно поэтому я уверен, что стремление плодить функции с кучей возвращаемых кодов, имхо, - создавать головную боль тому, кто эту функцию потом будет вызывать. Или вы скажите, что отсутствие реакции на хотя бы на одну задокументированную ошибку (код, возвращаемый любой фукцией) - это нормально и можно дальше работать?
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
May 7 2018, 20:41
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(Forger @ May 7 2018, 23:15)  Или вы скажите, что отсутствие реакции на не предусмотренную в коде ошибку - это нормально и можно дальше работать? Да нет, если вам функция что-то вернула, вы обработали как ни в чем не бывало, не выйдя за тактовый интервал и все задачи были выполнены вовремя, то это была не ошибка, а отработка автомата состояний. Если вы задаетесь вопросом как же перечислить все эти состояния, то у вас проблема с неполнотой автомата либо с неправильной его архитектурой. Ошибка - это то что реально наносит системе ущерб. Я так себе представляю. exception - это не ошибка, как вы понимаете, а такой способ раннего выхода из функций по специальным состояниям. Т.е. я предлагаю отделять чисто программистское понятие ошибки от ошибки с точки зрения разработчика дивайса.
|
|
|
|
|
May 7 2018, 20:50
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(AlexandrY @ May 7 2018, 23:41)  Если вы задаетесь вопросом как же перечислить все эти состояния, то у вас проблема с неполнотой автомата либо с неправильной его архитектурой. У меня нет проблем " с неполнотой автомата либо с неправильной его архитектурой". Не путайте "теплое" с "мягким" - еще раз прочитайте название этой темы. Цитата Ошибка - это то что реально наносит системе ущерб. Я так себе представляю. Код завершения функции обычно несет в себе код некой ошибки, причину, почему функция не отработала правильно. Если функция не отработала правильно, то это - ошибка. Или для вас это не ошибка, а что-то другое? Цитата Т.е. я предлагаю отделять чисто программистское понятие ошибки от ошибки с точки зрения разработчика дивайса. Программисткие ошибки (или ошибки разработчика всего "дивайса") исправляются еще на этапе отладки и разработки, и речь в этой теме явно не про них.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
May 8 2018, 00:46
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (Forger @ May 7 2018, 23:05)  А универсальное решение в любой области - утопия. Если оно претендует на универсальность во всём, то да, возможно, что и утопия. QUOTE (AlexandrY @ May 8 2018, 03:12)  Почему вы не можете их исправить? Например, закорочена шина данных. Значит возникла ошибка передачи данных между микроконтроллером, и, к примеру, АЦП. Я считаю, что это именно ошибка, ане состояние. И вот как её исправить? Это же аппаратная проблема. И чтобы её проще было локаллизовать, и исправить, я и передаю коды ошибок "наверх".
--------------------
Выбор.
|
|
|
|
|
May 8 2018, 03:59
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Мне интнересна вся дискуссия, явно вышедшая за пределы начальной темы. Вопрос был про коды, какие может выдавать функция. В простейшем случае, действительно, хватило бы true и false. Но мне показалось правильным иметь более широкий диапазон ответов. Например, функция, выполняющая деление, может выдать ошибку "деление на ноль". Или "не хватает памяти" для создания временного массива. Это - универсальные ответы, и о них был вопрос. Их не нужно документировать, а просто использовать в вызывающей функции. Другое дело - ошибки, события, возникающие в работе конкретного устройства. Которые нужно неким образом донести до потребителя или разработчика. Здесь, понятно, универсальности быть не может. Глобальные переменные в данном случае не кажутся мне неправильным решением.
|
|
|
|
|
May 8 2018, 05:39
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(haker_fox @ May 8 2018, 03:46)  Например, закорочена шина данных. Значит возникла ошибка передачи данных между микроконтроллером, и, к примеру, АЦП. Я считаю, что это именно ошибка, ане состояние. И вот как её исправить? Это же аппаратная проблема. И чтобы её проще было локаллизовать, и исправить, я и передаю коды ошибок "наверх". Да это безусловно ошибка и она фатальная. Неизбежно приведет к деградации работы системы. В риалтайме не исправляется, или вы знаете как это сделать? Поэтому о ней надо собрать максимум информации. Для этого, как говорится, организуется комплекс мероприятий, после того как появилось подозрение на такую ошибку. Именно после! Самым невинным из которых будет рефакторинг кода. А самым тяжелым тюнинг всех выпущенных плат. А с вашим понятием верха, создается ощущение как будто на верху вы только и ждете сбоев АЦП и там уже все готово к потере или искажению данных. А у меня на верху работает какой нить алгоритм управления движением механизма. Передача ему неких кодов ошибок АЦП совершенно бесполезно, алгоритм не занимается разруливанием проблем периферии. Или вот живой пример. У меня RTOS. В ней есть такой неслабый список ошибок. Он не полный. Относится только к ядру CODE #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 уже понять нельзя, потому как у них есть куча других эффективных средств.
|
|
|
|
|
May 8 2018, 05:53
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(ViKo @ May 8 2018, 06:59)  Например, функция, выполняющая деление, может выдать ошибку "деление на ноль". Это - уже критическая ошибка, ее можно избежать еще на этапе создания кода, добавив перед делением соотв. проверку. Если этого не делать, то придется ставить ловушку для ВСЕГО кода с соотв. реакцией на подобное событие. Цитата Или "не хватает памяти" для создания временного массива. Это - тоже критическая ошибка, обрабатывается также, как и деление на ноль (см. выше). Но, правильно, имхо, вообще не использовать штатный механизма выделения памяти (malloc/free), а, использоваться специализированные решения, под конкрентные задачи. Цитата Это - универсальные ответы, и о них был вопрос. На подобные ответы уже есть готовые решения, для этого не нужно создавать новую тему
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
May 8 2018, 05:58
|
Знающий
   
Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664

|
Цитата Да это безусловно ошибка и она фатальная. Неизбежно приведет к деградации работы системы. В риалтайме не исправляется, или вы знаете как это сделать? Поэтому о ней надо собрать максимум информации. Для этого, как говорится, организуется комплекс мероприятий, после того как появилось подозрение на такую ошибку. Именно после! А если шина не закорочена? А просто обрыв канала связи, например, радиоканала с пультом управления. И канал связи может восстановиться. Или датчик в сети теряет базу (orphaning). Это всё ошибки в работе системы. С точки зрения автомата - это рабочие ситуации, но они все начинаются с возврата ошибок. То же получение Nack - ситуация стандартная, но ошибочная, в том, смысле, что это ошибка работы системы.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|