打印
[STM32F1]

请教一下定义RTX系统邮箱缓存写法的问题

[复制链接]
2003|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
black0592|  楼主 | 2015-11-4 17:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
os_mbx_declare(MsgBox, 16); /* Declare an RTX mailbox */  
U32 mpool[16*(2*sizeof(U32))/4 + 3]; /* Reserve a memory for 16 mes
//声明发送缓冲区的空间
#ifdef __USART_1
u32 USART_1_TPOOL[USART_SENDOBJ_NUM*((MAX_PACK_SIZE+3)/4) + 3];
#endif
#ifdef __USART_2
u32 USART_2_TPOOL[USART_SENDOBJ_NUM*((MAX_PACK_SIZE+3)/4) + 3];
#endif
#ifdef __USART_3
u32 USART_3_TPOOL[USART_SENDOBJ_NUM*((MAX_PACK_SIZE+3)/4) + 3];
#endif

//声明缓冲区
USART_msgpool_ptr_declare(USART_mTpool, USART_NUM);                                                //发送缓冲区
USART_msgpool_declare(USART_mRpool, USART_NUM*(USART_RECVOBJ_NUM));                //接收缓冲区

//声明发送邮箱
USART_mbx_arr_declare(USART_MBX_TX,USART_NUM,USART_SENDOBJ_NUM);

//声明接收邮箱
USART_mbx_arr_declare(USART_MBX_RX,USART_NUM,USART_RECVOBJ_NUM);

为什么定义一个rtx实时系统邮箱的缓存长度都要用一个(x+3)/4 +3
沙发
black0592|  楼主 | 2015-11-4 17:32 | 只看该作者
这么定义长度是有什么意义,为什么要这么定义

使用特权

评论回复
板凳
myxiaonia| | 2015-11-5 08:32 | 只看该作者
邮箱内存块有邮箱定义宏,固定大小内存块也有对应宏,不需要自己搞这个对齐,,,rtx都已经准备好了

这是我的用法
static _declare_box(rxbuf,MAX_XFER,MAX_RX_BUF);        //rx½ÓÊÕ»º³åÇø,ÆäÖÐ1¸öÖ»ÄÜ»º´æ

static _declare_box(rxptr,sizeof(struct _wait_ack),MAX_RX_BUF);    //´ýÓ¦´ð½ÓÊÕ»º´æÁ´±í½Úµã

static os_mbx_declare(rxmbx,MAX_RX_BUF);            //½ÓÊÕÓÊÏä

话说你怎么有好多外设特定的声明啊,你这代码来自哪里,重构这些声明不知道是何意

使用特权

评论回复
地板
black0592|  楼主 | 2015-11-5 09:33 | 只看该作者
myxiaonia 发表于 2015-11-5 08:32
邮箱内存块有邮箱定义宏,固定大小内存块也有对应宏,不需要自己搞这个对齐,,,rtx都已经准备好了

这是 ...

我是知道可以这么用,但是不知道为什么要用除以4 再加上3

使用特权

评论回复
5
myxiaonia| | 2015-11-5 11:26 | 只看该作者
rtx定义的固定大小内存池定义宏   #define _declare_box(pool,size,cnt)   U32 pool[(((size)+3)/4)*(cnt) + 3]

用这个就可以了  没必要自己再重复造轮子  不知道代码上这么做出于什么目的

至于这多出来的3个字有何目的,是本内存池管理消耗的内存

使用特权

评论回复
6
black0592|  楼主 | 2015-11-5 17:24 | 只看该作者
本帖最后由 black0592 于 2015-11-5 17:31 编辑
myxiaonia 发表于 2015-11-5 11:26
rtx定义的固定大小内存池定义宏   #define _declare_box(pool,size,cnt)   U32 pool[(((size)+3)/4)*(cnt)  ...

_declare_box
原型   #include <rtl.h>

#define _declare_box( \
    pool,      \    /* Name of the memory pool variable. */
    size,      \    /* Number of bytes in each block. */
    cnt )      \    /* Number of blocks in the memory pool. */
    U32 pool[((size+3)/4)*(cnt) + 3]


说明   _declare_box 宏声明一串字节,可以作为存储池使用,分配固定块。

pool 指定可变的存储池的名称,这个名称亦被用于存储块分配程序。

size 指定块的大小,字节表示。

cnt 指定存储池需要的块数。

_declare_box宏是 RL-RTX的一部分,在rtl.h中定义



该宏使得size 的值向上取值到下一个4的倍数,使用4位字节对齐方式。
该宏在存储池的开始位置亦声明一个额外的12位字节,用来存储自身的指针和空间大小信息。


返回值     宏_declare_box无返回值。
这个是帮助文档的解释,你误会了,我不是想造轮子,我是想了解原理,这里的公式((size+3)/4)*(cnt) + 3是怎么来的为什么这么算,为什么里面的size要加3,是不是每一个block都要+3来存储自身的指针和空间大小信息,想了解一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

21

帖子

0

粉丝