前面测评的时候,提到了BLE的协议栈是使用sequencer来实现后台任务的管理的,除了sequence以外还提供了定时器函数。因此如果我们想添加自己的任务时,就需要借助sequence或者Tim_serv了。
- Sequence用于添加一些常用后台任务,尤其是需要事件去触发的任务。
- Tim_serv用于添加周期性的任务,或者需要延时一段时间之后在启动的任务。
Sequencer的用法
使用sequence的时候,需要用到2个函数UTIL_SEQ_RegTask()和UTIL_SEQ_SetTask()函数。前者是将一个任务注册到后台中,但是此时它还没有运行,需要调用UTIL_SEQ_SetTask()才能运行。两个函数的原型如下:
/**
* [url=home.php?mod=space&uid=159083]@brief[/url] This function registers a task in the sequencer.
*
* @param TaskId_bm The Id of the task
* @param Flags Flags are reserved param for future use
* @param Task Reference of the function to be executed
*
* @note It may be called from an ISR.
*
*/
void UTIL_SEQ_RegTask( UTIL_SEQ_bm_t TaskId_bm, uint32_t Flags, void (*Task)( void ) );
第一个参数为我们自定义的ID号,第2个参数没有使用,第3个参数则是注册执行的任务函数。需要注意的是ID最多是32个,因为在后台中使用了一个uint32_t的数据,这个数据的每1位代表一个任务。所以要注意限制注册函数的数量。在代码中,我们自定义的函数都是放在一个enum变量中的。
/**
* @brief This function requests a task to be executed
*
* @param TaskId_bm The Id of the task
* It shall be (1<<task_id) where task_id is the number assigned when the task has been registered
* @param Task_Prio The priority of the task
* It shall a number from 0 (high priority) to 31 (low priority)
* The priority is checked each time the sequencer needs to select a new task to execute
* It does not permit to preempt a running task with lower priority
*
* @note It may be called from an ISR
*
*/
void UTIL_SEQ_SetTask( UTIL_SEQ_bm_t TaskId_bm , uint32_t Task_Prio );
这个函数的第一个参数是将要执行的任务ID,第2个参数为优先级。
Tim_serv的用法
使用tim_serv时,首先需要创建 UTIL_TIMER_Create(),然后调用开始函数UTIL_TIMER_Start()或者UTIL_TIMER_StartWithPeriod()。这个库里还包括其它的控制或者设置函数。
比如用户想创建一个LED闪烁的函数,因为BLE协议栈需要一直运行,所以在后台程序中尽量不要使用延时函数,所以可以将闪烁的函数加入到tim_serv中。
UTIL_TIMER_Object_t led_timer_ob; //创建tim_serv的句柄
void blue_led_toggle(void *parameter) //定时执行的任务
{
HAL_GPIO_TogglePin(Blue_Led_GPIO_Port, Blue_Led_Pin);
}
//在void APP_BLE_Init(void)函数中添加以下代码
UTIL_TIMER_Create(&led_timer_ob,500,UTIL_TIMER_PERIODIC,&blue_led_toggle,0);
UTIL_TIMER_Start(&led_timer_ob);
这样就可以实现蓝色LED的闪烁