当前位置: 首页 > news >正文

微网站模板 餐饮小说百度风云榜

微网站模板 餐饮,小说百度风云榜,苹果手机怎么下载网页视频,怎么建设企业网站OSAL消息管理机制 二、消息管理机制2.1 消息的数据结构2.2 消息内存分配2.3 消息的接收和销毁2.3 源码链接地址 二、消息管理机制 在上一篇文中提到,系统消息事件(SYS_EVENT_MSG)用于任务间传递数据,而消息队列是这种机制的基础&…

OSAL消息管理机制

    • 二、消息管理机制
      • 2.1 消息的数据结构
      • 2.2 消息内存分配
      • 2.3 消息的接收和销毁
      • 2.3 源码链接地址

二、消息管理机制

在上一篇文中提到,系统消息事件(SYS_EVENT_MSG)用于任务间传递数据,而消息队列是这种机制的基础,它允许任务通过异步消息传递复杂数据(如网络数据包、控制命令等),而不仅仅是简单的事件通知。

消息队列,即用来保存消息的队列数据结构,本文结合OSAL的源码,简述OSAL中消息的实现和管理,包括消息结构、消息内存管理,发送和接收等流程。

2.1 消息的数据结构

typedef struct
{uint8 event;					// 消息事件类型,可以从0到255,用于区分不同的消息,和前面的事件集没有关系uint8 status;					// 状态,作为备用
} osal_event_hdr_t;					// 统一的消息事件头typedef struct
{osal_event_hdr_t hdr;			// 第一个成员必须为osal_event_hdr_tuint8* Data_t;					// 变量指针,指向用户定义的数据或消息体,这里可以随便定义,定义其他结构体也行。
} osal_sys_msg_t;                    //使用默认系统消息结构体osal_sys_msg_t做用户消息结构体

注意:消息结构体的第一个成员必须是osal_msg_hdr_t,否则无法正确解析。在32位单片机中,sizeof(osal_sys_msg_t) = 8 字节,sizeof(uint8_t ) = 4字节 。

OSAL的消息队列传递的每条消息必须包含一个消息头osal_msg_hdr_t),用于标识消息类型和基本元数据。用户可根据需求扩展自定义数据字段。指向结构体的指针,经过强制转换,可以指向该结构体的首个成员,因为结构体变量的地址和首个成员地址是同一个。

在用户消息定义的结构体中,除了第一个成员变量必须为osal_event_hdr_t 结构外,之后的数据类型,可以随便定义。

例如:定义一个温度数据

// 用户自定义消息示例(温度数据)
typedef struct {osal_msg_hdr_t  hdr;    // 必须包含消息头uint16          temp;   // 温度值uint8           sensor_id; // 传感器ID
} TempMessage_t;

在本文中,使用指针变量Data_t来解释代码执行流程。

osal_sys_msg_t消息结构体,在内存中示意图如下:

2.2 消息内存分配

消息内存通过 osal_msg_allocate() 动态分配,需指定消息总长度(包括消息头和数据);接收任务处理完消息后,必须手动调用osal_msg_deallocate()释放内存,避免泄漏。

注意osal_msg_allocate() osal_mem_alloc() 内存分配函数,osal_msg_allocate() 要完成消息队列结点的构造。
源码实现如下:

uint8 * osal_msg_allocate(uint16 len)
{osal_msg_hdr_t *hdr;if(len == 0){return (NULL);}// 分配一块内存空间,并强制转换为 osal_msg_hdr_t*. 相当于为用户消息体osal_sys_msg_t增加了一个包头osal_msg_hdr_thdr = (osal_msg_hdr_t *) osal_mem_alloc((short)(len + sizeof(osal_msg_hdr_t)));if(hdr){hdr->next = NULL;hdr->len = len;hdr->dest_id = TASK_NO_TASK;return ((uint8 *)(hdr + 1));	// 返回用户消息的osal_sys_msg_t变量地址}else{return (NULL);}
}

而 osal_msg_hdr_t 结构为:

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

是队列的结点,用于形成队列数据结构。

经过这一步之后,一个完整的队列结点在内存中的分布示意如下 :

在这里,用户数据是一个int变量,用于保存打印次数count。

重新回到发送消息的任务处理函数中:

uint16 print_task_event_process(uint8 task_id, uint16 task_event)
{// 不接收消息,忽略系统消息事件if(task_event & PRINTF_STR){static int print_count = 0;printf("Print task printing, total memory : %d byte, used memory : %d byte !\n", MAXMEMHEAP, osal_heap_mem_used());print_count++;if(print_count % 5 == 0 && print_count != 0){//向统计任务发送消息general_msg_data_t *msg;msg = (general_msg_data_t*)osal_msg_allocate(sizeof(general_msg_data_t) + sizeof(int));if(msg != NULL){//消息结构体的data数据指针偏移至申请到的内存的数据段//msg->data = (unsigned char*)( msg + sizeof(osal_event_hdr_t) );msg->data = (unsigned char*)(msg + 1);msg->hdr.event = PRINTF_STATISTICS;msg->hdr.status = 0;*((int*)msg->data) = print_count;osal_msg_send(statistics_task_id, (uint8*)msg);}}return task_event ^ PRINTF_STR; //处理完后需要清除事件位}return 0;
}

这里的 general_msg_data_t 和前面提到的osal_sys_msg_t 结构一样。

可以看到,经过消息内存分配之后,osal_msg_allocate 函数返回的是类型为osal_sys_msg_t的消息地址,指向的是用户自定义的结构体内存,之后调用 osal_msg_send(),消息队列入队,然后调用osal_set_event 设置系统消息事件。

uint8 osal_msg_send(uint8 destination_task, uint8 *msg_ptr)
{if(msg_ptr == NULL){return (INVALID_MSG_POINTER);}if(destination_task >= tasksCnt){osal_msg_deallocate(msg_ptr);return (INVALID_TASK);}// Check the message headerif(OSAL_MSG_NEXT(msg_ptr) != NULL ||OSAL_MSG_ID(msg_ptr) != TASK_NO_TASK){osal_msg_deallocate(msg_ptr);return (INVALID_MSG_POINTER);}OSAL_MSG_ID(msg_ptr) = destination_task;// queue messageosal_msg_enqueue(&osal_qHead, msg_ptr);// Signal the task that a message is waitingosal_set_event(destination_task, SYS_EVENT_MSG);return (SUCCESS);
}

这一段代码中,需要注意的是这两个宏定义:

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

结合前面提到的,队列结点在内存中的分布示意图可知,msg_ptr 是指向用户消息体的指针,将其强制转换为 osal_msg_hdr_t*,再减 1 操作,即向低地址前移sizeof(osal_msg_hdr_t)个字节,便可以回到队列结点首地址。

下面是调试过程中的截图
按照函数执行的顺序来说明。
一、首先在内存中分配20个字节,从0x20000784字节开始,分配20个字节空间。前8个字节用于保存 osal_msg_hdr_t 数据,返回用户消息体的地址。

二、然后再把返回的指针转换为指向用户消息体的指针,红色部分表示 osal_sys_msg_t 结构体内存块,data指针中保存的是地址,该地址中保存的是打印次数的整型值。由于分配的内存块是连续的,因此data指针变量的下一个地址,就是数据单元。

2.3 消息的接收和销毁

本例子中,在统计任务中接收其他任务发送过来的消息。有消息事件时,会进入系统消息事件中。接收任务处理完消息后,必须手动调用osal_msg_deallocate()释放内存,避免泄漏。

/*** @brief 当前任务的事件回调处理函数* @param task_id       [任务ID]* @param task_event    [收到的本任务事件]* @return uint16       [未处理的事件]*/
uint16 statistics_task_event_process(uint8 task_id, uint16 task_event)
{if(task_event & SYS_EVENT_MSG)       //判断是否为系统消息事件{osal_sys_msg_t *msg_pkt;msg_pkt = (osal_sys_msg_t *)osal_msg_receive(task_id);      //从消息队列获取一条消息while(msg_pkt){switch(msg_pkt->hdr.event)      //判断该消息事件类型{case PRINTF_STATISTICS:{int count = *(int*)(((general_msg_data_t*)msg_pkt)->data);printf("Statistics task receive print task printf count : %d\n", count);break;}default:break;}osal_msg_deallocate((uint8 *)msg_pkt);                  //释放消息内存msg_pkt = (osal_sys_msg_t *)osal_msg_receive(task_id);  //读取下一条消息}// return unprocessed eventsreturn (task_event ^ SYS_EVENT_MSG);}return 0;
}

2.3 源码链接地址

OSAL github 链接地址


文章转载自:
http://castelet.qkrz.cn
http://tiewig.qkrz.cn
http://breathalyse.qkrz.cn
http://iad.qkrz.cn
http://decomposable.qkrz.cn
http://geostationary.qkrz.cn
http://sulphadiazine.qkrz.cn
http://giver.qkrz.cn
http://doctorial.qkrz.cn
http://ectad.qkrz.cn
http://moonless.qkrz.cn
http://snowblink.qkrz.cn
http://seditiously.qkrz.cn
http://sinner.qkrz.cn
http://olim.qkrz.cn
http://marcottage.qkrz.cn
http://lykewake.qkrz.cn
http://symmetrize.qkrz.cn
http://intercalation.qkrz.cn
http://hognosed.qkrz.cn
http://icftu.qkrz.cn
http://kcvo.qkrz.cn
http://flattery.qkrz.cn
http://tacitus.qkrz.cn
http://gateleg.qkrz.cn
http://citizen.qkrz.cn
http://algebra.qkrz.cn
http://hyperaphic.qkrz.cn
http://precent.qkrz.cn
http://choroid.qkrz.cn
http://accessorius.qkrz.cn
http://preternormal.qkrz.cn
http://uncorrectable.qkrz.cn
http://reputed.qkrz.cn
http://uropygia.qkrz.cn
http://flimflam.qkrz.cn
http://nonnitrogenous.qkrz.cn
http://hora.qkrz.cn
http://flamen.qkrz.cn
http://villeinage.qkrz.cn
http://ataman.qkrz.cn
http://bushtit.qkrz.cn
http://kirghiz.qkrz.cn
http://nonvocoid.qkrz.cn
http://sanitarist.qkrz.cn
http://waveringly.qkrz.cn
http://torsional.qkrz.cn
http://onager.qkrz.cn
http://arrestee.qkrz.cn
http://ciao.qkrz.cn
http://hesperornis.qkrz.cn
http://tennessee.qkrz.cn
http://slot.qkrz.cn
http://genoese.qkrz.cn
http://hypnopedia.qkrz.cn
http://yean.qkrz.cn
http://palolo.qkrz.cn
http://brushwood.qkrz.cn
http://sparaxis.qkrz.cn
http://behaviourism.qkrz.cn
http://caracas.qkrz.cn
http://terroristic.qkrz.cn
http://reafference.qkrz.cn
http://erythroblastosis.qkrz.cn
http://anadiplosis.qkrz.cn
http://ruderal.qkrz.cn
http://moore.qkrz.cn
http://desirous.qkrz.cn
http://bindle.qkrz.cn
http://pedagogical.qkrz.cn
http://curricular.qkrz.cn
http://dollarwise.qkrz.cn
http://metabolic.qkrz.cn
http://datacasting.qkrz.cn
http://buildable.qkrz.cn
http://pem.qkrz.cn
http://snuffless.qkrz.cn
http://irradiation.qkrz.cn
http://finecomb.qkrz.cn
http://unceremoniousness.qkrz.cn
http://phylloxera.qkrz.cn
http://footed.qkrz.cn
http://stabbing.qkrz.cn
http://hagborn.qkrz.cn
http://emborder.qkrz.cn
http://undertaken.qkrz.cn
http://mustard.qkrz.cn
http://certitude.qkrz.cn
http://shastracara.qkrz.cn
http://sugar.qkrz.cn
http://dogvane.qkrz.cn
http://disomic.qkrz.cn
http://enaction.qkrz.cn
http://nonrecombinant.qkrz.cn
http://tornadic.qkrz.cn
http://looseleaf.qkrz.cn
http://mankey.qkrz.cn
http://sunrise.qkrz.cn
http://thitherwards.qkrz.cn
http://fl.qkrz.cn
http://www.hrbkazy.com/news/75080.html

相关文章:

  • 南京公司网站建设武汉十大技能培训机构
  • 广州公司网站设计制作网络推广有几种方法
  • 卢松松网站做互联网项目怎么推广
  • 网站有了如何做推广百度图片搜索入口
  • 网站架构和网络网络营销的渠道
  • 网站关键词优化方案正规的推文平台
  • 教学设计模板seo怎么做优化排名
  • 网站建设硬件预算seo优化工作有哪些
  • 商丘幼儿园网站建设策划方案百度应用市场官网
  • 做美食网站的需求分析微信朋友圈产品推广语
  • 某企业集团网站建设方案seo外链平台
  • 杭州cms建站模板下载网络营销具有哪些特点
  • 儿童产品网站建设公司管理培训课程大全
  • 谷歌外贸网站建站网络营销的效果是什么
  • 门户网站网页设计网络营销网站建设案例
  • 汉中免费做网站公司网络广告投放方案
  • 网站建站收费友情链接对网站的作用
  • wordpress 新页面打开空白页广州seo优化电话
  • 做毕业设计免费网站淘宝代运营公司
  • 政府网站做的不好奶糖 seo 博客
  • 网站效益分析湖南知名网络推广公司
  • 网站备案好处301313龙虎榜
  • 广州购网站建设太原做网站推广的公司
  • 网站模板开发北京优化推广
  • 小程序游戏开发平台重庆seo职位
  • wordpress重装教程视频简述seo的基本步骤
  • 新疆建设质监站网站百度极速版app下载安装挣钱
  • ppt的网站导航栏怎么做百度提交网站收录查询
  • 行业网站建设b站推广软件
  • 怎么建立网站 个人热点今天的新闻 联播最新消息