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

[复制链接]
2169|5
 楼主| black0592 发表于 2015-11-4 17:31 | 显示全部楼层 |阅读模式
  1. os_mbx_declare(MsgBox, 16); /* Declare an RTX mailbox */  
  2. U32 mpool[16*(2*sizeof(U32))/4 + 3]; /* Reserve a memory for 16 mes
  1. //声明发送缓冲区的空间
  2. #ifdef __USART_1
  3. u32 USART_1_TPOOL[USART_SENDOBJ_NUM*((MAX_PACK_SIZE+3)/4) + 3];
  4. #endif
  5. #ifdef __USART_2
  6. u32 USART_2_TPOOL[USART_SENDOBJ_NUM*((MAX_PACK_SIZE+3)/4) + 3];
  7. #endif
  8. #ifdef __USART_3
  9. u32 USART_3_TPOOL[USART_SENDOBJ_NUM*((MAX_PACK_SIZE+3)/4) + 3];
  10. #endif

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

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

  16. //声明接收邮箱
  17. 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
myxiaonia 发表于 2015-11-5 11:26 | 显示全部楼层
rtx定义的固定大小内存池定义宏   #define _declare_box(pool,size,cnt)   U32 pool[(((size)+3)/4)*(cnt) + 3]

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

至于这多出来的3个字有何目的,是本内存池管理消耗的内存
 楼主| 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

粉丝
快速回复 在线客服 返回列表 返回顶部