Использование функций ISR в контексте Contiki

Я новичок в использовании ОС Contiki, и у меня есть фундаментальный вопрос.

Могу ли я безопасно использовать ISR низкого уровня из процесса Contiki?

Я делаю это как быстрый тест, и он работает хорошо. Тем не менее, я обеспокоен тем, что я могу подрывать что-то в ОС, что позже выйдет из строя при других условиях.

В контексте процесса, который периодически запускается на основе таймера события, я вызываю функцию, которая настраивает мигание светодиода. Сама функция мигания светодиода является обратным вызовом от ISR, запускаемого аппаратным таймером на микроконтроллере Atmel SAMD21.

Может ли кто-нибудь объяснить мне, о каких ограничениях мне следует беспокоиться в этом конкретном случае?

Благодарю вас.


person forrestjon    schedule 20.10.2016    source источник


Ответы (1)


В принципе, вы можете, но вы должны понимать контекст, в котором работает каждая часть кода.

Процесс имеет контекст функции, планировщик Contiki запускается в теле main, таймеры будут ставить в очередь пробуждение процесса в этом планировщике, на самом деле, думайте о процессах Contiki как о функциях, вызываемых друг за другом, обратите внимание, что эти макросы PROCESS_* на самом деле вызывают возврат по функции.

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

Я настоятельно рекомендую вам прочитать о «протопотоках», кроме того, что они звучат как потоки, это не так, это функции, работающие в основном теле. (Я думаю, что эта ссылка проинформирует вас http://dunkels.com/adam/pt/)

В описанной вами проблеме не вижу ничего плохого.

В самой Contiki есть несколько модулей аппаратных абстракций, поэтому вам не придется иметь дело с платформой непосредственно из кода вашего приложения. Я написал большие прошивки, используя Contiki, и нашел эти абстракции не очень удобными, поскольку у них ограниченное применение. Что я сделал в этом случае, так это написал свой собственный низкоуровневый слой, чтобы коснуться платформы, поэтому в приложении все по-прежнему не зависит от платформы, но с точки зрения ОС у меня был код приложения, вызывающий регистры платформы.

person Felipe Lavratti    schedule 28.10.2016