首页 资讯 应用 高压 设计 行业 低压 电路图 关于

嵌入式

旗下栏目: PLC 嵌入式 单片机 DCS

OSAL之消息管理

嵌入式 | 发布时间:2017-10-04 | 人气: | #评论# |本文关键字:OSAL,消息管理
摘要:OSAL 消息管理实现代码在 OSAL.c 与 OSAL.h 两个文件中,但是消息管理仅仅占这两个文件功能的一小部分。对于操作系统来说,不可缺少的就是任务之间信息的传递,信号包括:信号量,互

OSAL消息管理实现代码在OSAL.cOSAL.h两个文件中,但是消息管理仅仅占这两个文件功能的一小部分。对于操作系统来说,不可缺少的就是任务之间信息的传递,信号包括:信号量,互斥量,消息邮箱、消息队列等。在OSAL中仅仅实现了消息队列的功能,系统可以发送或接收消息,并对消息进行管理。

1、定义消息管理的首部

typedef struct{  void   *next;  uint16 len;  uint8  dest_id;} osal_msg_hdr_t;

其中next将消息组织成有序的链表,len为消息的长度,dest_id是目标任务id

2、定义管理消息的消息队列结构

typedef void * osal_msg_q_t;

3、定义几个消息的操作

查找下一则消息:

#define OSAL_MSG_NEXT(msg_ptr) ((osal_msg_hdr_t *) (msg_ptr) - 1)->next

初始化消息队列:

#define OSAL_MSG_Q_INIT(q_ptr) *(q_ptr) = NULL

清空消息队列:

#define OSAL_MSG_Q_EMPTY(q_ptr) (*(q_ptr) == NULL)

获取消息队列头:

#define OSAL_MSG_Q_HEAD(q_ptr) (*(q_ptr))

消息的长度计算:

#define OSAL_MSG_LEN(msg_ptr)  ((osal_msg_hdr_t *) (msg_ptr) - 1)->len

获取消息对应的任务id:

#define OSAL_MSG_ID(msg_ptr) ((osal_msg_hdr_t *) (msg_ptr) - 1)->dest_id

4、定义一个消息队列头,指向要管理的消息队列

osal_msg_q_t osal_qHead;

OSAL之消息管理

 

osal_msg_allocate() 给消息分配内存空间

参数:

len-消息的长度

1、分配内存空间(消息管理首部大小+消息的长度)

hdr=(osal_msg_hdr_t*)osal_mem_alloc((short)(len+sizeof( osal_msg_hdr_t )) );

2、填充消息管理首部

hdr->next = NULL;hdr->len = len;hdr->dest_id = TASK_NO_TASK;

3、返回消息的空间地址

return ( (uint8 *) (hdr + 1) );

 

osal_msg_deallocate() 释放消息内存空间

参数:

msg_ptr-指向要释放的消息

1、判断消息是否还被任务占用

if ( OSAL_MSG_ID( msg_ptr ) != TASK_NO_TASK )

2、任务已释放消息,则释放消息的内存空间

x = (uint8 *)((uint8 *)msg_ptr - sizeof( osal_msg_hdr_t ));osal_mem_free( (void *)x );

 

osal_msg_enqueue_push() 将消息添加到消息队列中

参数:

destination_task-目标任务id

msg_ptr-要传递的消息

push-TRUE添加到队首,FALSE添加到队尾

1、确保消息有效

if ( msg_ptr == NULL ){  return ( INVALID_MSG_POINTER );}

2、确保有目标任务id有效

if ( destination_task >= tasksCnt ) {  osal_msg_deallocate( msg_ptr );  return ( INVALID_TASK );}

3、确保消息首部有效

if ( OSAL_MSG_NEXT( msg_ptr ) != NULL ||   OSAL_MSG_ID( msg_ptr ) != TASK_NO_TASK ){  osal_msg_deallocate( msg_ptr );  return ( INVALID_MSG_POINTER );}

4push==TRUE,则将消息添加到消息队首

osal_msg_push( &osal_qHead, msg_ptr );

5push==FALSE,则将消息添加到消息队尾

osal_msg_enqueue( &osal_qHead, msg_ptr );

6、设置系统消息事件

osal_set_event( destination_task, SYS_EVENT_MSG );

  

责任编辑:电气自动化网

上一篇:OSAL之任务同步

下一篇:OSAL之功耗管理

首页 | 资讯 | 应用 | 高压 | 设计 | 行业 | 低压 | 电路图 | 关于

Copyright 2017-2018 电气自动化网 版权所有 辽ICP备17010593号-1

电脑版 | 移动版

Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。