Цитата(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 уже понять нельзя, потому как у них есть куча других эффективных средств.