在生成的BLE工程里能看到很多地方出现了 UTIL_SEQ_RegTask() 函数。通过跳转的功能,可以发现其是STM32提供的一个库函数,出现在 Utilities 文件夹中,是sequencer下的函数。那么sequencer是做什么的呢?
sequencer提供了一种类似于前后台架构中,对后台程序的一系列管理函数。Sequencer本质是一个while循环,在这个循环中通过判断标志位来确定是否要执行某个函数。
在这个文件里包含以下主要函数:
- UTIL_SEQ_Idle() 当sequencer中没有要执行的函数时,进入idle状态,也就是调用该函数,这个函数处于临界区,也就是禁用中断的状态。
- UTIL_SEQ_PreIdle() 这个函数在 UTIL_SEQ_Idle() 之前,但是它没在临界区
- UTIL_SEQ_PostIdle() 同理这个函数在UTIL_SEQ_Idle() 之后,也是没在临界区
- UTIL_SEQ_Run() 为while循环,并在该循环中执行用户注册进去的程序
- UTIL_SEQ_RegTask() 通过该函数将程序注册到sequencer的while循环中
- UTIL_SEQ_SetTask() 设置注册函数的标志位,是的某个注册函数开始执行
- UTIL_SEQ_PauseTask() 暂停一个程序,此时通过 UTIL_SEQ_SetTask() 设置了标志位之后,也不执行
- UTIL_SEQ_ResumeTask() 恢复一个程序
- UTIL_SEQ_WaitEvt() 设置某个程序等待一个事件,类似于OS里的信号量
- UTIL_SEQ_SetEvt() 设置事件
- UTIL_SEQ_IsEvtPend() 判断是否在等待事件
Sequencer虽然提供的功能有点像OS的功能,但它只是一个while循环,其执行结构如下图所示,这个结构其实就是UTIL_SEQ_Run() 的内容。
Sequencer最多注册32个函数,因为其使用一个uint32_t 的数据保存标志位,其中每个位能够指代一个函数。
总结
在sequencer里见到最多的是UTIL_SEQ_RegTask() 函数,这个函数的作用就是将一个函数注册到后台中等待执行。通过调用UTIL_SEQ_SetTask() 函数,可以控制已经注册的函数开始执行。
下面的附件为ST对sequencer介绍的PPT。