【详细】FreeRTOS软件定时器的内部机制
目录一.硬件定时器二.软件定时器结构体三.启动定时器四.读取定时器一.硬件定时器每一个tick计数值加1.二.软件定时器结构体const char * pcTimerName定时器的文本名称ListItem_t xTimerListItem记载软件定时器的列表TickType_t xTimerPeriodInTicks定时器的周期或超时时间void * pvTimerID定时器IDTimerCallbackFunction_t pxCallbackFunction定时器到期时将要调用的回调函数指针uint8_t ucStatus; 定时器的状态位掩码三.启动定时器1.先创建一个xMessage结构体并赋值2.把这个结构体写入xTimerQueue队列中正因为有了这个等待时间ListItem_t xTimerListItem才起到了作用这时候就和写队列的操作一样时间到了超时返回时间未到放入链表阻塞并等待被唤醒。还有一个问题这个队列是何时创建的呢四.读取定时器1.谁来读取呢调度器创建的Timer Task这个任务的作用prvGetNextExpireTime作用查询当前定时器列表找出下一个即将到期的定时器的到期时间以系统节拍计数值表示。prvProcessTimerOrBlockTask作用根据定时器到期时间决定行为如果有定时器到期了即系统节拍计数已达到或超过 xNextExpireTime则处理该到期定时器调用其注册的回调函数 pxCallbackFunction如果是周期定时器重新计算下次到期时间并将其插回定时器列表。如果定时器列表为空xListWasEmpty pdTRUE则将定时器服务任务无限阻塞直到命令队列收到新命令例如启动某个定时器。否则有定时器但尚未到期将任务阻塞直到最近的一个定时器到期时间到达或命令队列收到命令两者中较早者唤醒任务。prvProcessReceivedCommands作用处理定时器命令队列Timer Command Queue中积累的所有命令。这些命令由其他任务或中断通过 API 发送例如xTimerStart / xTimerStop启动/停止定时器xTimerChangePeriod改变定时器周期、xTimerReset重置定时器、创建/删除定时器等该函数会依次取出命令并对目标定时器控制块xTIMER执行相应操作插入/移除列表、修改周期、调用回调等。创造不易多加支持点赞!