解决CMSIS-RTOS osTimerCreate 参数传输错误的问题

最近项目中用到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);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容