原创 在OS里传递消息一法

2010-3-25 11:53 2512 5 5 分类: 软件与OS

这几天遇到了这么一个事,想将串口接收到的数据作为消息分发给几个任务而又不愿意使用全局变量,因为串口消息不常用,且为不定长度,所以在收到数据后再分配内存,这样可以减小常态下RAM的开支。使用osal_msg_allocate()可以得到任意字节的连续内存。将消息及事件结构定义如下:
//OS事件结构体
typedef struct
{
  uint8  event;
  uint8  status;
} osal_event_hdr_t;
//OS消息结构体
typedef struct
{
  osal_event_hdr_t hdr;     /* OSAL Message header */
  uint8 len;                /* User Message length */
  uint8 *buf;               /* User Message pointer */ 
}halUARTMsg_t;


可以使用buf指向不定长的数据,长度由len指定。重点是如何使用*buf指针之后的内存来存放串口接收到数据,简单说是将buf指向它后面的一个地址,然后将数据存放在buf所指向的内存(段)内。举例来说:


在cc2430上,串口接收到10byte数据,要将这一消息发给task_app1进程。串口数据为"0123456789"。


#define UART_EVENT  0X02
halUARTMsg_t *msg;  //定义指针
msg = (halUARTMsg_t*)osal_msg_allocate(15); //分配15byte的内存,假定地址为0x07f0
//osal_event_hdr_t 2 byte,halUARTMsg_t 3 byte
//其中buf是2byte,而不是1byte,因为buf是指针,而2430的内存地址是16位的,所以占2byte
//消息使用10byte
msg->buf = (uint8*)msg+5; //将buf指向它之后的第一个地址
HalUARTRead(Uport1,msg->buf,10);//读出串口数据
msg->hdr.event = UART_EVENT; //串口收到数据的事件标志
msg->len = 10;   //消息长度
osal_msg_send( task_app1, (uint8*)msg ); //发送消息
//切记,在收到消息后要将这一段内存回收
//osal_msg_deallocate( (uint8*)msg ); //释放内存


内存数据示意图
地址   数据
0x07f0  [0x02]
0x07f1 [0x??]
0x07f2 [0x0a]//数据长度
0x07f3 [0xf5]//地址低字节 ,CC2430是小端模式
0x07f4 [0x07]//指向0x07f5 ,感觉这里还浪费了一个字。实际上可以不要这个指针
0x07f5 [0x30]//数据
0x07f6 [0x31]
0x07f7 [0x32]
0x07f8 [0x33]
0x07f9 [0x34]
0x07fa [0x35]
0x07fb [0x36]
0x07fc [0x37]
0x07fd [0x38]
0x07fe [0x39]
0x07ff [0x3a]


写这里应该说清楚了,就不再多说了。欢迎朋友给意见。


2010年3月20日


 

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /2 下一条