消息指针中获取参数指针的理解

本文探讨了在基于消息驱动的系统中,如何有效地处理消息结构体中的参数。通过定义包含msg_id, src_id, dest_id和param数组的消息结构体,实现了参数的灵活携带。消息生成函数返回参数部分的指针,允许填充任意类型和长度的参数。在接收端,可以直接从指针获取传递的参数,提高了系统的扩展性和效率。offsetof宏在此过程中用于计算结构体内成员的偏移量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:因为本内核基于消息驱动,因此消息的建立与携带参数的修改是非常重要的。
消息的结构体定义

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宏详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值