FreeRTOS是一个多任务多进程的操作系统,每个Task按照其优先级等关系由系统调度器统一调度执行。
上篇文章讲到的18B20是一个单线双向通信的系统,必须确保在一次通信期间是连续的,不希望被别的task打断,如果有打断情况可能出现检测温度错误。
为了调高温度检测的可靠性,可以将温度检测所在的Task使用较高的优先级,不至于在检测期间被别的任务打断:
osThreadDef(myTask02, StartTask02, osPriorityAboveNormal, 0, 128); //温度检测所在的task
其中osPriorityAboveNormal就是优先级,建议温度所在task使用比别的task更高的优先级。
typedef enum {
osPriorityIdle = -3, ///< priority: idle (lowest)
osPriorityLow = -2, ///< priority: low
osPriorityBelowNormal = -1, ///< priority: below normal
osPriorityNormal = 0, ///< priority: normal (default)
osPriorityAboveNormal = +1, ///< priority: above normal
osPriorityHigh = +2, ///< priority: high
osPriorityRealtime = +3, ///< priority: realtime (highest)
osPriorityError = 0x84 ///< system cannot determine priority or thread has illegal priority
} osPriority;
除了优先级的使用,还有就是在温度检测期间关闭进程调度的调度
vTaskSuspendAll(); //开启调度锁,开启后不会被别的甚至优先级更高的任务打断
short temp = Get_temp();
xTaskResumeAll(); //关闭调度锁,必须成对出现,开锁后必须关锁
这样温度检测一般可以比较稳定,安全一些
再要考虑安全的话可以判断温度的数值,如果出现特别高或者特别低的数据,直接不使用。
希望对你有一点点帮助。