版权声明:玛雅实时操作系统(MY-RTOS)软件及其说明文档由 欣欣学习网 版主 Stoneway QI 创作,作者保留其版权。任何人可以免费在其产品设计或著作中使用或引用该软件及其说明文档,但要求保留原作品当中的版权声明,并注明引用段落的出处。 -- Stoneway QI 主页: http://www.xxworks.com 邮箱: Stonewayqi@hotmail.com 除了对随机内存的动态管理之外,玛雅系统也为应用程序提供只读内存的管理。应用程序可以向系统申请只读内存索引,通过索引来引用只读内存中的段落。引用后的只读内存段落可以象随机内存一样参与内存队列,灵活的在任务间传递。
向系统申请只读内存索引的方式与申请随机内存块的方式类似,也是通过调用系统函数OSAllocateBlock()完成的。当第1个入口参数取值为0的时候,即表示申请只读内存索引。同样,调用系统函数OSFreeBlock(),可以将只读内存索引归还系统。对于一个未知属性的内存块,可以通过判断其大小来分辨其是随机内存块还是只读内存索引。只读内存索引的大小为8。以下代码示例了两个任务之间通过内存队列来传递只读内存中的数据的过程。
|
...
const U8 Msg[] = {...}; //定义在只读内存中的数据
...
OS_QUEUE MemQ = {&MemQ, &MemQ}; //定义内存队列
...
void main(void)
{
U8 * pMem;
BSP(); // 硬件初化
OSInit(72000); //玛雅系统初始化
...
while(1)
{
...
pMem = OSAllocateBlock(0, OS_MBLK_FIX); //向系统申请只读内存索引
if(pMem != NULL) //指针不为空则申请成功
{
((OS_PACK *)pMem)->Load = (U8 *)Msg; //引用只读内存中的数据
((OS_PACK *)pMem)->DataLen = sizeof(Msg); //指明数据的长度
OSAppendBlockTo(&MemQ, pMem); //将其加入内存队列
}
...
}
}
void Task(void)
{
U8 * pMem;
U8 * Load;
U16 DataLen;
...
while(1)
{
...
pMem = OSGetBlockFrom(&MemQ); //从内存队列中取出内存块
if(pMem != NULL) //返回值不为NULL则有内存块取出
{
Size = OSGetMemSize(pMem); //检测内存块的大小
if(Size == 8) //大小为8表示为只读内存索引
{
Load = ((OS_PACK *)pMem)->Load; //取出只读内存的地址
DataLen = ((OS_PACK *)pMem)->DataLen; //取出数据长度
... //处理数据
}
else //其它值则表示为随机内存块
{
... //按随机内存处理
}
OSFreeBlock(pMem); //将随机内存块或只读内存索引归还系统
}
...
}
} (1) |
|
|