Должны ли все ловушки быть всегда определены?


18

Я видел два случая с dsPIC 30F4013, когда контроллер сбрасывался из-за неопределенной ловушки. Почему эти ловушки поднимались в первую очередь, до сих пор остается загадкой, но это не мой непосредственный вопрос. Я начинаю думать, что было бы хорошей практикой программирования всегда определять все ловушки, даже если ловушки никогда не должны возникать, поэтому я получаю хотя бы четкое сообщение об ошибке вместо случайного сброса. Это стандартная практика, о которой я не знаю? Есть ли недостатки в этой практике, которые я должен рассмотреть?


4
Не ответ на ваш вопрос, но я недавно страдал от таких симптомов в системах dsPIC и PIC24. В моем случае ловушки возникли из-за битов кода, в которых я разыменовывал указатели на 16-битные значения, а сами эти указатели имели нечетные (не четные) значения, поскольку они указывали в круговой буфер обмена - а у меня не было предварительного способ узнать, будет ли 16-битное значение начинаться с нечетной или четной границы. Компилятор XC16 здесь не защищает вас от зависаний оборудования. Я закончил тем, что написал макрос-обёртку для этих функций, который принудительно вызвал 2 8-битных указателя.
Brhans

Ответы:


13

Мое неофициальное правило:

  1. Если прерывание включено, то у вас должен быть код, который его обрабатывает.
  2. Если вы не пишете код для прерывания, отключите его.
  3. Если вы не можете отключить его, напишите код для него.

Тем не менее, даже без этого правила, лист данных явно отвечает на ваш вопрос:

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

( Источник , раздел 8.3, первое примечание)

Учитывая, что вы не можете замаскировать ловушки, вы должны справиться с ними. Если вы не хотите иметь дело с ловушкой определенным образом, соответствующий метод - выполнить RESETинструкцию.


Ага. У меня есть стандартный модуль с целями для всех ловушек.
Олин Латроп

16

Да, это хорошая идея - единственным недостатком является немного дополнительного размера кода, и вам нужно решить, что делать с ловушкой (выдать сообщение на последовательный порт? Включить индикатор "СБОЙ"? Тихая перезагрузка? И т. Д. )


4
Я обычно просто запускаю процессор в бесконечном цикле NOP / GOTO. Таким образом, стек не был поврежден из ловушки, и при отладке у меня есть шанс распутать его и выяснить, что произошло. Я не получаю ловушки часто, но 80% времени это странная ловушка адреса, обычно потому, что мусор загружается как указатель. Иногда указатель стека повреждается и выдает странные ловушки адресов. Их сложнее отладить, так как стека больше нет. К счастью, это действительно редко.
Олин Латроп
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.