背景:因为本内核基于消息驱动,因此消息的建立与携带参数的修改是非常重要的。
消息的结构体定义
struct msg{
msg_id_t msg_id;
task_id_t src_id;
task_id_t dest_id;
uint16_t param_len;
uint16_t param[LENTH];
};
为了扩展消息的使用范围,因此不能限制消息携带的参数类型和长度。所以参数都会放在param[LENTH]数组中。
因此,消息的生成函数需要建立消息指针,并将通用的消息参数填入后,返回消息结构体的参数(如上面代码部分的param)部分的指针返回。调用消息的生成函数后获得的指针,可以将需要传递的参数填入。最终在消息接收的函数中,可以直接从消息的参数指针中获取需要传递的参数。
如下代码就是获取消息的参数部分的指针
void * msg2param(struct msg_t const *msg){
return (void*) (((uint8_t*) msg) + offsetof(struct msg_t, param));
}
即以msg指针为起点,获取其中param在msg_t结构体中的偏移,即为param的地址。其中offsetof在这篇文章中有所阐述:
Offsetof宏详解