程序员

解决CMSIS-RTOS osTimerCreate 参数传输错

2020-05-29  本文已影响0人  超级普普罗特

最近项目中用到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);
}
上一篇下一篇

猜你喜欢

热点阅读