бесконечный цикл
От: B0FEE664  
Дата: 28.02.20 10:06
Оценка:
Недавно я столкнулся с практикой чтения битов регистров вот такого вида:
CMCC->CTRL.bit.CEN = 0;
while (CMCC->SR.bit.CSTS){}

Вопрос: следует ли добавить в этот цикл счетчик до некого лимита или можно полагать, что бесконечного зацикливания здесь произойти не может?
И каждый день — без права на ошибку...
Re: бесконечный цикл
От: reversecode google
Дата: 28.02.20 11:03
Оценка: 6 (1)
нельзя там счетчик
Re[2]: бесконечный цикл
От: B0FEE664  
Дата: 28.02.20 11:37
Оценка:
Здравствуйте, reversecode, Вы писали:

R>нельзя там счетчик


А почему нельзя?
И каждый день — без права на ошибку...
Re[3]: бесконечный цикл
От: reversecode google
Дата: 28.02.20 12:04
Оценка:
https://github.com/arduino/ArduinoModule-CMSIS-Atmel/blob/master/CMSIS-Atmel/CMSIS/Device/ATMEL/samd51/include/component/cmcc.h#L174
https://github.com/adafruit/SAMD51-Camera-Demo/blob/master/sketch.cpp#L39
Re[4]: бесконечный цикл
От: B0FEE664  
Дата: 28.02.20 12:10
Оценка:
Здравствуйте, reversecode, Вы писали:

R>https://github.com/arduino/ArduinoModule-CMSIS-Atmel/blob/master/CMSIS-Atmel/CMSIS/Device/ATMEL/samd51/include/component/cmcc.h#L174

R>https://github.com/adafruit/SAMD51-Camera-Demo/blob/master/sketch.cpp#L39

Собственно в этом и вопрос. Есть гарантии, что такой код никогда не повиснет в этом цикле?
И каждый день — без права на ошибку...
Re[5]: бесконечный цикл
От: reversecode google
Дата: 28.02.20 12:18
Оценка:
это готовность контроллера
если он не готов то можете поставить цикл и падать в паник
Re[6]: бесконечный цикл
От: B0FEE664  
Дата: 28.02.20 14:03
Оценка:
Здравствуйте, reversecode, Вы писали:

R>это готовность контроллера

R>если он не готов то можете поставить цикл и падать в паник

Я очень мало понимаю в работе микроконтролёров, поэтому мой вопрос может быть бессмысленный, но он такой: что будет, если произойдёт прерывание между следующими двумя строчками:
CMCC->CTRL.bit.CEN = 0; 
// тут
while(CMCC->SR.bit.CSTS);

и если внутри кода прерывания будет выполнена строчка:
CMCC->CTRL.bit.CEN = 1;

?
Или такого быть не может? Или процессор восстановит (поставит в 0) состояние этого бита?
И каждый день — без права на ошибку...
Re[7]: бесконечный цикл
От: IID Россия  
Дата: 14.04.20 00:41
Оценка:
Здравствуйте, 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) состояние этого бита?

Прерывание может даже в середине строчки прийти. Процессор он не строчками оперирует, а командами. А чтобы было больше понимания полезно в генеренный асм посматривать.
kalsarikännit
Re[7]: бесконечный цикл
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.04.20 00:52
Оценка: 6 (1)
Здравствуйте, B0FEE664, Вы писали:

BFE>Или такого быть не может? Или процессор восстановит (поставит в 0) состояние этого бита?



Надо смотреть описание бита. Скорее всего это чисто аппаратный бит, и конкретно его ручками никак не поставить..

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

Если кто-то в прерывании дергает ту же периферию, что дергается и в основной проге, то яйки я бы поотрывал бы ему. Это раз.

Второе. Обычно периферия включается сразу, а выключается с некоторой задержкой — так, для CAN/UART/I2C/SPI производится передача текущего пакета/байта, и только потом периферия выключается. Задержка тут небольшая, и всё должно стабильно работать. Если не работает, то с железом произошел какой-то огромный глобальный ппц, и то, что ты корректно выскочишь из цикла по таймауту и брякнешься в паник — крайне низка.

Но я обычно на всякий случай так делаю — помогает иногда отловить неправильную инициализацию, но это обычно на включение, а не на выключение.
Однозначно так делаю, когда внешнее тактирование настраиваю — там зависит от внешних цепей и может не завестись с большой вероятностью
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.