В принципе, вы можете, но вы должны понимать контекст, в котором работает каждая часть кода.
Процесс имеет контекст функции, планировщик Contiki запускается в теле main
, таймеры будут ставить в очередь пробуждение процесса в этом планировщике, на самом деле, думайте о процессах Contiki как о функциях, вызываемых друг за другом, обратите внимание, что эти макросы PROCESS_*
на самом деле вызывают возврат по функции.
Когда вы находитесь в обработчике прерывания или обратном вызове, вы находитесь в другом контексте, здесь вы можете иметь условия гонки, если вы делитесь данными с процессами, то же самое было бы в прошивке с нуля, где прерывание и main()
являются разными контекстами.
Я настоятельно рекомендую вам прочитать о «протопотоках», кроме того, что они звучат как потоки, это не так, это функции, работающие в основном теле. (Я думаю, что эта ссылка проинформирует вас http://dunkels.com/adam/pt/)
В описанной вами проблеме не вижу ничего плохого.
В самой Contiki есть несколько модулей аппаратных абстракций, поэтому вам не придется иметь дело с платформой непосредственно из кода вашего приложения. Я написал большие прошивки, используя Contiki, и нашел эти абстракции не очень удобными, поскольку у них ограниченное применение. Что я сделал в этом случае, так это написал свой собственный низкоуровневый слой, чтобы коснуться платформы, поэтому в приложении все по-прежнему не зависит от платформы, но с точки зрения ОС у меня был код приложения, вызывающий регистры платформы.
person
Felipe Lavratti
schedule
28.10.2016