Как обрабатываются ошибки во время выполнения во встроенном C?

#c #embedded #microcontroller

Вопрос:

Например, ошибка «Деления на 0» переменных в C.

 int x = 0;
int y;
y = 12/x;
 

Комментарии:

1. Вопрос не ясен. Он слишком широк (ошибок во время выполнения много!).

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

3. Мне кажется достаточно ясным — безусловно, отвечающим — у меня есть готовый ответ. Хотелось бы, чтобы это позволило публиковать ответы в процессе 🙁 — расстраивает напрасный ввод текста. В любом случае, короткая версия : C не определяет обработку ошибок во время выполнения, среда выполнения может предоставлять обработчики исключений для обнаруженных аппаратных проблем, таких как деление на ноль, неправильное выравнивание, недопустимый адрес и т. Д., Где это поддерживается. Обычно во встроенных системах вы несете ответственность за предоставление подходящего обработчика, часто по умолчанию используется просто бесконечный цикл ожидания сброса сторожевого пса.

4. @Клиффорд, я разделяю твое разочарование. Иногда я намеренно публикую неполный ответ, просто чтобы его опубликовать, а затем дополняю его в последовательности правок. Я должен взвесить замешательство читателя, увидев неполный ответ, по сравнению с моим собственным разочарованием в том, что я вообще не смогу его завершить, если я не сделаю этого таким образом. (Теоретически это плохое поведение с моей стороны: если я знаю, что вопрос вот-вот закроется, возможно, мне вообще не следует на него отвечать.)

5. Кроме того, «встроенный C» — это слишком широкий вопрос. Возможности поддержки встроенного ПО различаются так же сильно, как и аппаратное обеспечение. Большая разница между 8-контактным разъемом ATtiny и двухъядерной частью рычага.

Ответ №1:

Язык C не определяет обработку ошибок во время выполнения. Что касается языка, то это приводит к неопределенному поведению. Это не означает, что среда выполнения не может определить конкретное поведение или обработку.

Деление на ноль, недопустимый адрес, недопустимое выравнивание и т.д. Обычно обрабатываются средой выполнения как обработчики исключений (в тех случаях, когда процессор поддерживает любые такие исключения).

Во встроенных системах вы часто несете ответственность за предоставление подходящих обработчиков исключений, поскольку код среды выполнения по умолчанию будет общим и не будет знать, какую поддержку имеет конкретная система для представления таких ошибок. Если это плата COTS с поставляемым поставщиком BSP, вы можете получить больше, и если вы используете какой-либо RTOS, который является чем-то большим, чем простое ядро планирования, это может обеспечить поддержку.

Например, в ARM Cortex-M, использующем CMSIS, у вас обычно есть файл startup_xxxx_.s (где xxxx-имя целевого устройства) , например:

 HardFault_Handler PROC
                EXPORT  HardFault_Handler          [WEAK]
                B       .
                ENDP
MemManage_Handler PROC
                EXPORT  MemManage_Handler          [WEAK]
                B       .
                ENDP
BusFault_Handler PROC
                EXPORT  BusFault_Handler           [WEAK]
                B       .
                ENDP
UsageFault_Handler PROC
                EXPORT  UsageFault_Handler         [WEAK]
                B       .
                ENDP
 

Обратите внимание, что все они имеют «слабую связь», что означает, что если вы определили обработчик (и в Cortex-M, который может быть функцией C) с тем же именем, он переопределит значение по умолчанию. Так что вы могли бы, например, иметь:

 void HardFault_Handler(void)
{
    volatile int stop = 1 ;

    // Emit status registers and stack dump (for example), 
    // or just a message.
    ...

    // If debugger is connected, halt program here
    if (CoreDebug->DHCSR amp; 1) {
        __breakpoint(0);
    }

    // infinite loop, allow debugger 
    // to force return by clearing `stop`.
    while( stop )
    {
    }
}
 

Комментарии:

1. Спасибо!! Это полезно

Ответ №2:

Программирование на языке C не поддерживает проверку ошибок во время выполнения