如果,处理器的硬件定时器不足,而成本又受到限制,并且在误差允许范围(1-2 Tick)内,就可以用软件定时器,除了不能像某些硬件定时可以直接发生波形,做做通用定时器还是挺方便的.既然是软件定时器,那一定占一些软件资源,比如RAM和性能开销.定时器以CallBack方式运行,类似于发生事情时,进入一个中断函数.定时器可以任何时候创建,删除,暂停,调整定时间距.
每个定时器,他有独立的结构体,TimerHandle_t类型,我们目前做2个定时器,所以... 叫做:
TimerHandle_t xTimers1; TimerHandle_t xTimers2;
需要使用xTimerCreate创建,创建失败返回NULL,否则就是生成这个Handle.举例说明:
xTimers1 = xTimerCreate("Timers1", ( 1000 ), pdTRUE, ( void * ) 1,xTimersFunc); xTimers2 = xTimerCreate("Timers2", ( 5000 ), pdFALSE, ( void * ) 2,xTimersFunc);
首先第一个参数是友好的名字,跟Task的人为命名是一个东西,第二个参数是定时间隙,这个是以Tick为单位,并不是系统主频也不是总线频率哦,接着是是否循环定时,pdTRUE就是循环,接着是定时器的唯一ID,最后是定时器溢出是否调用的函数的名字.他们共同调用的函数,我写成这样:
void xTimersFunc( TimerHandle_t pxTimer ) { int32_t lArrayIndex; lArrayIndex = ( int32_t ) pvTimerGetTimerID( pxTimer ); if(lArrayIndex == 1) { } else if(lArrayIndex == 2) { } }
通过lArrayIndex获取是哪个定时器唯一ID来操作.xTaskCreate分配了唯一ID是1和2.我们在创建后,还可以随时修改这个周期.
xTimers1 = xTimerCreate("Timers1", ( 5000 / portTICK_RATE_MS ), pdTRUE, ( void * ) 1, xTimersFunc); xTimers2 = xTimerCreate("Timers2", ( 10000 / portTICK_RATE_MS ), pdFALSE, ( void * ) 2, xTimersFunc); xTimerChangePeriod( xTimers1, 500 / portTICK_PERIOD_MS, 2000 ); xTimerStart(xTimers1, 0); xTimerStart(xTimers2, 0);
注意的是,不得只有一个定时器,一定要有任务才能启动调度器,否则会出错,在现实的项目中,也不可能没有别的任务啊.