1.
From: http://blog.163.com/xzp114@126/blog/static/484255322013119104029726
FreeRTOS内核不提供定时器的功能,但是它却提供了软件定时器的任务进程,这对于有些定时器资源比较紧张的硬件平台而言可有效的帮助解决这一问题。但同时需要注意的是软件定时器的精度是无法和硬件定时器相比较的,因为在软件定时器的定时过程中是极有可能被其它的任务或进程序所打断,由此就引起了时间精度不准的问题(个人实验所测,确实随着时间的推移,定时器精度确实有所下降)。
关于FreeRTOS软件定时器的原理还未仔细研究源代码,所以具体不是很清晰,但通过官方帮助文档的介绍,软件定时器就是单独作的一个线程在运行,用户代码和软件定时器代码是通过定时器命令队列(TimerCommand Queue)来进行通信与交流,当用户根据个人需要对软件定时器作相关的操作后,FreeRTOS内核都会向此队列发送命令,同时软件定时器进程会从这个共用队列中来提取命令,并作出相关的操作。
其它FreeRTOS的软件定时器功能适用性并不是很高,最简单的应用如官方所说,就是在指定的时间间隔内来调用回调函数(callbackFunction)关于回调函数一定要注意的是不要尝试在回调函数中引用类似于vTaskDelay()或vTaskDelayUntil()等等阻塞函数,因为这样的话会严重的影响软件定时器的精度与可靠性。同样软件定时器还可配置在单次模式(One-Shot)或自动重载模式(Auto-Reload),具体做法和微控制器硬件定时器做法相差不大。软件定时器也具有运行过程中重设置(Resetinga Timer)功能,相对来说功能还算是比较全面。
对于软件定时器的使用并不复杂,具体要配置如下宏参数:
#define configUSE_TIMERS // 使能软件定时器
#define configTIMER_TASK_PRIORITY // 确定软件定时器进程优先级(根据具体应用而定,不要设的过低,否则精度也会随之下降)
#define configQueue_LENGTH // 定时器命令队列(TimerCommand Queue)长度
#define configTIMER_TASK_STACK_DEPTH // 分配给软件定时器任务的内存大小
FreeRTOS为软件定时器提供了如下API函数:
xTimerCreate();
xTimerlsTimerActive();
xTimerStart();
xTimerStop();
xTimerChangePeriod();
xTimerDelete();
xTimerReset();
xTimerStartFromISR();
xTimerStopFromISR();
xTimerChangePeriodFromISR();
xTimerResetFromISR();
xTimerGetTimerID();
xTimerGetTimerDaemonTaskHandle();