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函数无法正常传参
较为深层的原因更容易让人理解, 即: 若是内存池的地址是随机变化的, 那我们自然无法在一个"变化不停"的内存片上进行管理
从代码层次上来看, 链表的头自然不可以乱动.

最低0.47元/天 解锁文章
3954

被折叠的 条评论
为什么被折叠?



