реклама на сайте
подробности

 
 
9 страниц V  « < 6 7 8 9 >  
Reply to this topicStart new topic
> Коды завершения функции
Forger
сообщение May 7 2018, 15:05
Сообщение #106


Профессионал
*****

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



Цитата(haker_fox @ May 7 2018, 17:59) *
Я лишь идею предложил, а реализацией не занимался.

Сначала нужно описать идею "от" и "до". Хотя бы на бумажке (ворде, паинте и т. п.), а уже потом браться за реализацию.
А пока будете "рисовать" все эти идеи, куча из них "отвалятся" сами собой еще до реализации wink.gif
Вангую, что останется самая простая и примитивная из них. Либо выйдут несколько вариантов разной сложности под разные случаи применения.
А универсальное решение в любой области - утопия.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 7 2018, 16:35
Сообщение #107


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Forger @ May 7 2018, 18:05) *
Вангую, что останется самая простая и примитивная из них.
Ага))) и звать её ssize_t
подробнее тут


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение May 7 2018, 19:12
Сообщение #108


Ally
******

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



Цитата(haker_fox @ May 7 2018, 17:25) *
Остаюсь при своём мнении: передавать коды ошибок наверх для меня удобно)

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

Настоящие ошибки - это ценная находка.
Когда такие случаются я собираю о них максимум информации.
Там и их количество с момента перезапуска, и место(имя функции и номер строки) где возникла,
и точное время в микросекундах когда возникла или какая-либо другая сопутствующая статистика связанных сигналов.
Это там где я жду ошибки. Очень часто безрезультатно, но зато когда ловлю я уже почти знаю их причину.
Go to the top of the page
 
+Quote Post
Forger
сообщение May 7 2018, 19:40
Сообщение #109


Профессионал
*****

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



Мне кажется, что опять пошла путаница с рабочими ошибками и критическими сбоями.
Обработка рабочих ошибок - штатный режим работы приложения.
А задача программиста предусмотреть реакцию на все задокументированные ошибки.
Чем меньше предусмотрено различных рабочих ошибок, тем проще их обработка.
Иначе велик риск наплодить новых ошибок, заметьте, на абсолютно ровном месте smile3046.gif

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

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


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение May 7 2018, 19:53
Сообщение #110


Ally
******

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



Цитата(Forger @ May 7 2018, 22:40) *
Мне кажется, что опять пошла путаница с рабочими ошибками и критическими сбоями.

Интересный термин "рабочие ошибки"
Ну какие могут быть ошибки в глубоко встраиваемой системе.
Нет, если у вас некий инструмент, который без участия человека-оператора не работает, то еще понятно.
А если у вас силовой инвертер, контроллер квадрокоптера или робота, то какие там могут быть "рабочие ошибки"?
Если они не приводят к аварии или деградации - это не ошибки, а штатная передача состояний.
Go to the top of the page
 
+Quote Post
one_eight_seven
сообщение May 7 2018, 20:00
Сообщение #111


Знающий
****

Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664



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

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

Сообщение отредактировал one_eight_seven - May 7 2018, 20:02
Go to the top of the page
 
+Quote Post
Forger
сообщение May 7 2018, 20:15
Сообщение #112


Профессионал
*****

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



Цитата(AlexandrY @ May 7 2018, 22:53) *
Интересный термин "рабочие ошибки"

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

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

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


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение May 7 2018, 20:41
Сообщение #113


Ally
******

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



Цитата(Forger @ May 7 2018, 23:15) *
Или вы скажите, что отсутствие реакции на не предусмотренную в коде ошибку - это нормально и можно дальше работать?

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

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

Т.е. я предлагаю отделять чисто программистское понятие ошибки от ошибки с точки зрения разработчика дивайса.
Go to the top of the page
 
+Quote Post
Forger
сообщение May 7 2018, 20:50
Сообщение #114


Профессионал
*****

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



Цитата(AlexandrY @ May 7 2018, 23:41) *
Если вы задаетесь вопросом как же перечислить все эти состояния, то у вас проблема с неполнотой автомата либо с неправильной его архитектурой.
У меня нет проблем " с неполнотой автомата либо с неправильной его архитектурой".
Не путайте "теплое" с "мягким" - еще раз прочитайте название этой темы.

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

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



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


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
haker_fox
сообщение May 8 2018, 00:46
Сообщение #115


Познающий...
******

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



QUOTE (Forger @ May 7 2018, 23:05) *
А универсальное решение в любой области - утопия.

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

QUOTE (AlexandrY @ May 8 2018, 03:12) *
Почему вы не можете их исправить?

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


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 8 2018, 03:59
Сообщение #116


Универсальный солдатик
******

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



Мне интнересна вся дискуссия, явно вышедшая за пределы начальной темы. Вопрос был про коды, какие может выдавать функция. В простейшем случае, действительно, хватило бы true и false. Но мне показалось правильным иметь более широкий диапазон ответов. Например, функция, выполняющая деление, может выдать ошибку "деление на ноль". Или "не хватает памяти" для создания временного массива. Это - универсальные ответы, и о них был вопрос. Их не нужно документировать, а просто использовать в вызывающей функции.
Другое дело - ошибки, события, возникающие в работе конкретного устройства. Которые нужно неким образом донести до потребителя или разработчика. Здесь, понятно, универсальности быть не может. Глобальные переменные в данном случае не кажутся мне неправильным решением.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение May 8 2018, 05:39
Сообщение #117


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 уже понять нельзя, потому как у них есть куча других эффективных средств.
Go to the top of the page
 
+Quote Post
Forger
сообщение May 8 2018, 05:53
Сообщение #118


Профессионал
*****

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



Цитата(ViKo @ May 8 2018, 06:59) *
Например, функция, выполняющая деление, может выдать ошибку "деление на ноль".

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

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

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

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

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


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
one_eight_seven
сообщение May 8 2018, 05:58
Сообщение #119


Знающий
****

Группа: Участник
Сообщений: 916
Регистрация: 3-10-08
Из: Москва
Пользователь №: 40 664



Цитата
Да это безусловно ошибка и она фатальная. Неизбежно приведет к деградации работы системы.
В риалтайме не исправляется, или вы знаете как это сделать?
Поэтому о ней надо собрать максимум информации.
Для этого, как говорится, организуется комплекс мероприятий, после того как появилось подозрение на такую ошибку. Именно после!


А если шина не закорочена? А просто обрыв канала связи, например, радиоканала с пультом управления. И канал связи может восстановиться. Или датчик в сети теряет базу (orphaning). Это всё ошибки в работе системы. С точки зрения автомата - это рабочие ситуации, но они все начинаются с возврата ошибок. То же получение Nack - ситуация стандартная, но ошибочная, в том, смысле, что это ошибка работы системы.
Go to the top of the page
 
+Quote Post
Forger
сообщение May 8 2018, 06:01
Сообщение #120


Профессионал
*****

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



Цитата(one_eight_seven @ May 8 2018, 08:58) *
А просто обрыв канала связи, например, радиоканала с пультом управления. И канал связи может восстановиться.

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



--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post

9 страниц V  « < 6 7 8 9 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 09:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.0153 секунд с 7
ELECTRONIX ©2004-2016