Здравствуйте, reversecode, Вы писали:
R>это готовность контроллера R>если он не готов то можете поставить цикл и падать в паник
Я очень мало понимаю в работе микроконтролёров, поэтому мой вопрос может быть бессмысленный, но он такой: что будет, если произойдёт прерывание между следующими двумя строчками:
Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, reversecode, Вы писали:
R>>это готовность контроллера R>>если он не готов то можете поставить цикл и падать в паник
BFE>Я очень мало понимаю в работе микроконтролёров, поэтому мой вопрос может быть бессмысленный, но он такой: что будет, если произойдёт прерывание между следующими двумя строчками: BFE>
CMCC->>CTRL.bit.CEN = 0;
BFE>// тут
BFE>while(CMCC->SR.bit.CSTS);
BFE>
BFE>и если внутри кода прерывания будет выполнена строчка: BFE>
CMCC->>CTRL.bit.CEN = 1;
BFE>
BFE>? BFE>Или такого быть не может? Или процессор восстановит (поставит в 0) состояние этого бита?
Прерывание может даже в середине строчки прийти. Процессор он не строчками оперирует, а командами. А чтобы было больше понимания полезно в генеренный асм посматривать.
Здравствуйте, B0FEE664, Вы писали:
BFE>Или такого быть не может? Или процессор восстановит (поставит в 0) состояние этого бита?
Надо смотреть описание бита. Скорее всего это чисто аппаратный бит, и конкретно его ручками никак не поставить..
В примере ты сбрасываешь управляющий бит, и ждешь, когда статусный опустится. Если в прерывании управляющий бит выставить снова, то наверное статусный бит или не сбросится, или сбросится, но сразу поднимется, и ты весьма вероятно не успеешь поймать его нулевое значение.
Если кто-то в прерывании дергает ту же периферию, что дергается и в основной проге, то яйки я бы поотрывал бы ему. Это раз.
Второе. Обычно периферия включается сразу, а выключается с некоторой задержкой — так, для CAN/UART/I2C/SPI производится передача текущего пакета/байта, и только потом периферия выключается. Задержка тут небольшая, и всё должно стабильно работать. Если не работает, то с железом произошел какой-то огромный глобальный ппц, и то, что ты корректно выскочишь из цикла по таймауту и брякнешься в паник — крайне низка.
Но я обычно на всякий случай так делаю — помогает иногда отловить неправильную инициализацию, но это обычно на включение, а не на выключение.
Однозначно так делаю, когда внешнее тактирование настраиваю — там зависит от внешних цепей и может не завестись с большой вероятностью