Forger 17 7 мая, 2018 Опубликовано 7 мая, 2018 · Жалоба Я лишь идею предложил, а реализацией не занимался. Сначала нужно описать идею "от" и "до". Хотя бы на бумажке (ворде, паинте и т. п.), а уже потом браться за реализацию. А пока будете "рисовать" все эти идеи, куча из них "отвалятся" сами собой еще до реализации ;) Вангую, что останется самая простая и примитивная из них. Либо выйдут несколько вариантов разной сложности под разные случаи применения. А универсальное решение в любой области - утопия. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 7 мая, 2018 Опубликовано 7 мая, 2018 · Жалоба Вангую, что останется самая простая и примитивная из них.Ага))) и звать её ssize_t подробнее тут Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 7 мая, 2018 Опубликовано 7 мая, 2018 · Жалоба Остаюсь при своём мнении: передавать коды ошибок наверх для меня удобно) С другой стороны откуда у вас так много ошибок? Почему вы не можете их исправить? Или это по сути не ошибки, а некие маркеры разных состостояний и вы просто имеете дело с неявными автоматами состояний. Тогда лучше привести их к явному виду. Настоящие ошибки - это ценная находка. Когда такие случаются я собираю о них максимум информации. Там и их количество с момента перезапуска, и место(имя функции и номер строки) где возникла, и точное время в микросекундах когда возникла или какая-либо другая сопутствующая статистика связанных сигналов. Это там где я жду ошибки. Очень часто безрезультатно, но зато когда ловлю я уже почти знаю их причину. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 7 мая, 2018 Опубликовано 7 мая, 2018 · Жалоба Мне кажется, что опять пошла путаница с рабочими ошибками и критическими сбоями. Обработка рабочих ошибок - штатный режим работы приложения. А задача программиста предусмотреть реакцию на все задокументированные ошибки. Чем меньше предусмотрено различных рабочих ошибок, тем проще их обработка. Иначе велик риск наплодить новых ошибок, заметьте, на абсолютно ровном месте :smile3046: А вот критические/аварийные сбои, при которых работа дальше уже невозможна или невозобновима, нужно журналировать, писать в логи и т.п, собирая максимум информации в стиле "где/что/когда". Но для этого уже существую готовые открытые сторонние решения, в т. ч. встроенные даже в среду. Нужно лишь освоить готовые продукты. И получается, что нагромождение чудовищных надстроек над банальным кодами ошибок той или иной банальной функции - аки "Сизифов труд" :cranky: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 7 мая, 2018 Опубликовано 7 мая, 2018 · Жалоба Мне кажется, что опять пошла путаница с рабочими ошибками и критическими сбоями. Интересный термин "рабочие ошибки" Ну какие могут быть ошибки в глубоко встраиваемой системе. Нет, если у вас некий инструмент, который без участия человека-оператора не работает, то еще понятно. А если у вас силовой инвертер, контроллер квадрокоптера или робота, то какие там могут быть "рабочие ошибки"? Если они не приводят к аварии или деградации - это не ошибки, а штатная передача состояний. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 3 7 мая, 2018 Опубликовано 7 мая, 2018 (изменено) · Жалоба контроллер квадрокоптера или робота, то какие там могут быть "рабочие ошибки"? Обрыв канала связи. Ошибка данных в памяти, которую обнаруживает, но не исправляет ECC. Изменено 7 мая, 2018 пользователем one_eight_seven Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 7 мая, 2018 Опубликовано 7 мая, 2018 · Жалоба Интересный термин "рабочие ошибки" Я уж не знаю как еще проще разжевать такие очевидные вещи, но попробую еще раз: "рабочие ошибки" - в моем понимании ошибки, возвращаемые вызываемыми функциями, т.е. ошибки, которые приложение может обработать самостоятельно - именно так, как это предусмотрел программист. Или по-другому: речь про ВСЕ коды, возвращаемые своими или сторонними функциями. Все необработанные ошибки автоматически попадают в категорию критических (в терминах плюсов "exception"). Ведь никто не знает, как себя поведет приложение, если проигнорировать хотя бы одну из задокументированных ошибок. Именно поэтому я уверен, что стремление плодить функции с кучей возвращаемых кодов, имхо, - создавать головную боль тому, кто эту функцию потом будет вызывать. Или вы скажите, что отсутствие реакции на хотя бы на одну задокументированную ошибку (код, возвращаемый любой фукцией) - это нормально и можно дальше работать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 7 мая, 2018 Опубликовано 7 мая, 2018 · Жалоба Или вы скажите, что отсутствие реакции на не предусмотренную в коде ошибку - это нормально и можно дальше работать? Да нет, если вам функция что-то вернула, вы обработали как ни в чем не бывало, не выйдя за тактовый интервал и все задачи были выполнены вовремя, то это была не ошибка, а отработка автомата состояний. Если вы задаетесь вопросом как же перечислить все эти состояния, то у вас проблема с неполнотой автомата либо с неправильной его архитектурой. Ошибка - это то что реально наносит системе ущерб. Я так себе представляю. exception - это не ошибка, как вы понимаете, а такой способ раннего выхода из функций по специальным состояниям. Т.е. я предлагаю отделять чисто программистское понятие ошибки от ошибки с точки зрения разработчика дивайса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 7 мая, 2018 Опубликовано 7 мая, 2018 · Жалоба Если вы задаетесь вопросом как же перечислить все эти состояния, то у вас проблема с неполнотой автомата либо с неправильной его архитектурой.У меня нет проблем " с неполнотой автомата либо с неправильной его архитектурой". Не путайте "теплое" с "мягким" - еще раз прочитайте название этой темы. Ошибка - это то что реально наносит системе ущерб. Я так себе представляю. Код завершения функции обычно несет в себе код некой ошибки, причину, почему функция не отработала правильно. Если функция не отработала правильно, то это - ошибка. Или для вас это не ошибка, а что-то другое? Т.е. я предлагаю отделять чисто программистское понятие ошибки от ошибки с точки зрения разработчика дивайса.Программисткие ошибки (или ошибки разработчика всего "дивайса") исправляются еще на этапе отладки и разработки, и речь в этой теме явно не про них. :bb-offtopic: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 8 мая, 2018 Опубликовано 8 мая, 2018 · Жалоба А универсальное решение в любой области - утопия. Если оно претендует на универсальность во всём, то да, возможно, что и утопия. Почему вы не можете их исправить? Например, закорочена шина данных. Значит возникла ошибка передачи данных между микроконтроллером, и, к примеру, АЦП. Я считаю, что это именно ошибка, ане состояние. И вот как её исправить? Это же аппаратная проблема. И чтобы её проще было локаллизовать, и исправить, я и передаю коды ошибок "наверх". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 8 мая, 2018 Опубликовано 8 мая, 2018 · Жалоба Мне интнересна вся дискуссия, явно вышедшая за пределы начальной темы. Вопрос был про коды, какие может выдавать функция. В простейшем случае, действительно, хватило бы true и false. Но мне показалось правильным иметь более широкий диапазон ответов. Например, функция, выполняющая деление, может выдать ошибку "деление на ноль". Или "не хватает памяти" для создания временного массива. Это - универсальные ответы, и о них был вопрос. Их не нужно документировать, а просто использовать в вызывающей функции. Другое дело - ошибки, события, возникающие в работе конкретного устройства. Которые нужно неким образом донести до потребителя или разработчика. Здесь, понятно, универсальности быть не может. Глобальные переменные в данном случае не кажутся мне неправильным решением. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 8 мая, 2018 Опубликовано 8 мая, 2018 · Жалоба Например, закорочена шина данных. Значит возникла ошибка передачи данных между микроконтроллером, и, к примеру, АЦП. Я считаю, что это именно ошибка, ане состояние. И вот как её исправить? Это же аппаратная проблема. И чтобы её проще было локаллизовать, и исправить, я и передаю коды ошибок "наверх". Да это безусловно ошибка и она фатальная. Неизбежно приведет к деградации работы системы. В риалтайме не исправляется, или вы знаете как это сделать? Поэтому о ней надо собрать максимум информации. Для этого, как говорится, организуется комплекс мероприятий, после того как появилось подозрение на такую ошибку. Именно после! Самым невинным из которых будет рефакторинг кода. А самым тяжелым тюнинг всех выпущенных плат. А с вашим понятием верха, создается ощущение как будто на верху вы только и ждете сбоев АЦП и там уже все готово к потере или искажению данных. А у меня на верху работает какой нить алгоритм управления движением механизма. Передача ему неких кодов ошибок АЦП совершенно бесполезно, алгоритм не занимается разруливанием проблем периферии. Или вот живой пример. У меня 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 уже понять нельзя, потому как у них есть куча других эффективных средств. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 8 мая, 2018 Опубликовано 8 мая, 2018 · Жалоба Например, функция, выполняющая деление, может выдать ошибку "деление на ноль". Это - уже критическая ошибка, ее можно избежать еще на этапе создания кода, добавив перед делением соотв. проверку. Если этого не делать, то придется ставить ловушку для ВСЕГО кода с соотв. реакцией на подобное событие. Или "не хватает памяти" для создания временного массива. Это - тоже критическая ошибка, обрабатывается также, как и деление на ноль (см. выше). Но, правильно, имхо, вообще не использовать штатный механизма выделения памяти (malloc/free), а, использоваться специализированные решения, под конкрентные задачи. Это - универсальные ответы, и о них был вопрос. На подобные ответы уже есть готовые решения, для этого не нужно создавать новую тему :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 3 8 мая, 2018 Опубликовано 8 мая, 2018 · Жалоба Да это безусловно ошибка и она фатальная. Неизбежно приведет к деградации работы системы. В риалтайме не исправляется, или вы знаете как это сделать? Поэтому о ней надо собрать максимум информации. Для этого, как говорится, организуется комплекс мероприятий, после того как появилось подозрение на такую ошибку. Именно после! А если шина не закорочена? А просто обрыв канала связи, например, радиоканала с пультом управления. И канал связи может восстановиться. Или датчик в сети теряет базу (orphaning). Это всё ошибки в работе системы. С точки зрения автомата - это рабочие ситуации, но они все начинаются с возврата ошибок. То же получение Nack - ситуация стандартная, но ошибочная, в том, смысле, что это ошибка работы системы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 8 мая, 2018 Опубликовано 8 мая, 2018 · Жалоба А просто обрыв канала связи, например, радиоканала с пультом управления. И канал связи может восстановиться. Это - не критическая ошибка, не фатальная. Т.е. "рабочая" ошибка. Поэтому и работать с ней нужно иначе (зависит от проекта, точнее от его ТЗ). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться