[嵌入式RTOS专精]CMSIS-RTOS : 消息队列传输自定义的带数组结构体

CMSIS-RTOS的消息队列及内存池

使用CMSIS-RTOS: FreeRTOS的消息队列及内存池实现了传输自定义的结构体变量

为什么要使用"内存池"这类内存管理模块?

对于消息队列来说, 要想传输结构体变量, 只能使用传入指针的方式来进行实现

如:

typedef struct JsonPackage{
   
   
    int counter;
    char JsonString[128];
} t_JsonPackage;

	t_JsonPackage *JsonPtr = osPoolAlloc(JsonQ_Mem);
	/*
	* 或者使用 
	* t_JsonPackage *JsonPtr = (t_JsonPackage *)malloc(sizeof(t_JsonPackage));
	*/
	osMessagePut(JsonQueueHandle, (uint32_t)JsonPtr, 0);

若是没有对此指针指向的内存区进行内存管理, 则会产生大量不可控的内存碎片, 有运行时的内存隐患

CMSIS-RTOS对内存的管理进行了统一化, 预先创建好需要的内存池, 将对应的指针变量分配进内存池之中, 便能够安全有效地进行内存的管理与控制

在接收sender发送出的指针, 并完成对应处理后, 便可调用对应的API来销毁这部分不需要的内存.

	osPoolFree(JsonQ_Mem, JsonBuffer);

对应模块的初始化

首先定义内存池及消息队列的属性及对应句柄

//必须是全局变量!
osPoolDef(JsonQ_Mem, 16, t_JsonPackage);
osMessageQDef(JsonQueue, 16, uint32_t);
osPoolId JsonQ_Mem;
osMessageQId JsonQueueHandle;

//创建于其他函数调用内存池/消息队列之前
JsonQ_Mem = osPoolCreate(osPool(JsonQ_Mem));
JsonQueueHandle = osMessageCreate(osMessageQ(JsonQueue), NULL);

这里的句柄必须要是全局变量! 并且在需要调用的地方要extern进去

原因很简单, 最浅显的原因就是, 不这样做的话, osMessagePut或osMessageGet函数无法正常传参

较为深层的原因更容易让人理解, 即: 若是内存池的地址是随机变化的, 那我们自然无法在一个"变化不停"的内存片上进行管理

从代码层次上来看, 链表的头自然不可以乱动.

消息队列的发送与接收

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值