RT-Thread Nano版本 Version 3.1.5
一、timer初始化通过函数 rt_timer_init 函数实现,代码如下:
void rt_timer_init(rt_timer_t timer,
const char *name,
void (*timeout)(void *parameter),
void parameter,
rt_tick_t time,
rt_uint8_t flag)
{
/ timer check /
RT_ASSERT(timer != RT_NULL);
/ timer object initialization */
rt_object_init((rt_object_t)timer, RT_Object_Class_Timer, name);
_rt_timer_init(timer, timeout, parameter, time, flag);
}
在函数里调用了对象初始化函数 rt_object_init ,赋予的第一个参数为(rt_object_t)timer 存在问题。
首先,rt_object_t的定义如下:
struct rt_object
{
char name[RT_NAME_MAX]; /< name of kernel object */
rt_uint8_t type; /< type of kernel object */
rt_uint8_t flag; /< flag of kernel object */
rt_list_t list; /< list node of kernel object */
};
typedef struct rt_object *rt_object_t; /**< Type for kernel objects. */
其次,timer通过rt_timer_t定义,而rt_timer_t的定义如下:
struct rt_timer
{
struct rt_object parent; /< inherit from rt_object */
rt_list_t row[RT_TIMER_SKIP_LIST_LEVEL];
void (*timeout_func)(void *parameter); /< timeout function */
void *parameter; /< timeout function's parameter */
rt_tick_t init_tick; /< timer timeout tick */
rt_tick_t timeout_tick; /**< timeout tick */
};
typedef struct rt_timer *rt_timer_t;
因此,调用 rt_object_init 函数的正确赋值如下:
/* timer object initialization */
rt_object_init((rt_object_t)&(timer->parent), RT_Object_Class_Timer, name)
二、查看了下RT-Thread的标准版Version 4.1.1的timer.c文件里的
rt_timer_init函数,调用对象函数rt_object_init的结构如下:
rt_object_init(&(timer->parent), RT_Object_Class_Timer, name);
总结,通过RT-Thread的标准版Ver4.1.1的使用方式,也验证的了上述RT-Thread Nano版本Version3.1.5的问题。
原作者:RTT_MrWang