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

网站建设需要多少内存石家庄网页设计制作

网站建设需要多少内存,石家庄网页设计制作,广州建设公共资源交易中心,恒基建设集团网站地址OSAL消息管理机制 二、消息管理机制2.1 消息的数据结构2.2 消息内存分配2.3 消息的接收和销毁2.3 源码链接地址 二、消息管理机制 在上一篇文中提到#xff0c;系统消息事件#xff08;SYS_EVENT_MSG#xff09;用于任务间传递数据#xff0c;而消息队列是这种机制的基础系统消息事件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://www.w-s-a.com/news/813924/

相关文章:

  • 制作一个网站需要哪些人网站建设经营服务合同
  • 山东省住房和城乡建设厅官方网站网易发布广州
  • 长沙设计网站效果设计师灵感网站
  • 做网站php都用什么框架把asp.net写的网站别人怎么访问
  • 网站建设捌金手指下拉六正规的代运营公司
  • 自己申请网站空间冀州建网站
  • 哈尔滨旅游团购网站建设江苏建设工程建设网
  • 在郑州做网站茶叶网站建设网页设计制作
  • 58做网站吗南京有关制作网站的公司
  • 申请建设门户网站的申请先做网站还是先申请域名
  • 门户网站怎么做seo玩具外贸好做吗
  • 网页设计模板的网站黄埔营销型网站建设
  • 企业为什么要建立网站江苏高校品牌专业建设工程网站
  • 网站建设公司需要交税么福建省城乡建设厅网站
  • dedecms网站首页网站正在建设中 源码下载
  • 论坛网站有哪些怎么wordpress主题
  • 网站搭建中企动力第一返利的网站怎么做
  • 在哪网站可以做农信社模拟试卷优衣库网站建设的目的
  • 杭州网站建设ttmwl网络平台推广公司
  • 工作室网站技能培训班
  • 东丰网站建设万盛网站制作
  • 安徽黄山网站建设wordpress 公众号 获取密码
  • 自己电脑做网站模板腾讯网站建设分析
  • 如何增加网站反链虚拟主机 2个网站
  • 手机网站调用分享wordpress.org移除
  • 工业和信息化部网站备案系统查询市场调研表模板
  • 网站流量转化线下推广活动有哪些
  • 030159网站建设与维护宝安网站公司
  • 个人网站备案网站内容做gif表情包网站
  • 湖南省建设厅城乡建设网站怎么建立一个网站网址