最近项目中用到FreeRTOS, 使用了CMSIS-RTOS中定义的接口。
CMSIS-RTOS中的定时器支持传输参数,
创建定时器时,argument
的意图是用于传输用户自定义参数,如下,
osTimerId osTimerCreate (const osTimerDef_t *timer_def, os_timer_type type, void *argument);
之后期望该参数传递给定时器time up回调,
typedef void (*os_ptimer) (void const *argument);
依照这个期望设计时,发现参数并未成功传递。
读osTimerCreate
源码时发现,argument
参数被传递给FreeRTOS定时器接口xTimerCreate
中的pvTimerID
参数。
而FreeRTOS的time up回调中传递的参数是TimerHandle_t
,是定时器的句柄,如下,
typedef void (*TimerCallbackFunction_t)( TimerHandle_t xTimer );
因此,直接获取time up回调,得到的参数并不是用户当初创建定时器时传递的那个argument
。
这个问题不知道算不算CMSIS的bug,但是ARM也一直没有修正。
解决方法
在time up中取参数时,使用pvTimerGetTimerID
函数获取真正的argument
。
static void timeup_callback (void const *argument)
{
<T> t = pvTimerGetTimerID(argument);
}
网友评论