好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

邝坚-北邮嵌入式实验报告.docx

14页
  • 卖家[上传人]:碎****木
  • 文档编号:229373474
  • 上传时间:2021-12-25
  • 文档格式:DOCX
  • 文档大小:90.72KB
  • / 14 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 嵌入式系统期末实验14 / 14一、实验要求题目:支持消息驱动模式的实时软件框架目的:在充分理解嵌入式处理器特点、RTOS 及强实时嵌入式系统软件设计规范的基础上, 构建自己的实时系统软件框架基本功能,并在其上自拟应用(如部分模拟TCP 的C/S两端通信流程),测试软件框架的相关功能环境:VxWorks 的VxSim 仿真环境或2440(ARM920T) 内容:必选功能:1. 消息驱动的Task 统一框架,包含统一消息格式定义及使用规范;2. 支持消息驱动模式的软定时器的机制;3. Task 启动同步功能;4. 体现前次实验中实现的自定义内存管理机制,最大限度降低外部碎片对系统可靠性的威胁可选功能(加分):其它有利于实时处理的有效机制,如:无信号量(互斥)支持的临界资源访问方式,zero copy 等;二、实现的功能1. 消息驱动的Task 统一框架,包含统一消息格式定义及使用规范; STATUS Task(){Initialization(MBox, Data Structure, Timer, etc.) Forever{MsgReceive If(…){……}else if(…){……}……}}typedef struct _MESSAGE{intmType;/* 消息类型 0:timer->client*1:client->server 2:server->client*/intmSendId;/*发送任务的MESSAGE ID */int mRecvId; /* 接收任务的MESSAGE ID */int mData; /* 消息中传递的数据 */}MESSAGE;2. 支持消息驱动模式的软定时器的机制;/* timer(id)向客户端消息队列定时发送的定时器*/ STATUS timer(int id){MESSAGE* txMsg;/* 用于从消息队列中接收消息 */int tick;/*创建一个定时,用于提醒发送者任务定时发送消息*/ tick=sysClkRateGet();semTake(semSynStart,WAIT_FOREVER); FOREVER{taskDelay((int)(tick*DELAY_SECOND)); txMsg = (MESSAGE*)memMalloc(MAX_MSG_LEN); txMsg->mType = 0;txMsg->mSendId = MID_TIMER(id); txMsg->mRecvId = MID_CLIENT(id); txMsg->mData = 0;printf("tTimer%d send message to tClient%d!\n",id,id); if(msgQSend(msgQIdClient[id],(char*)&txMsg,MAX_MSG_LEN,WAIT_FOREVER,MSG_PRI_NORMAL) == ERROR ){return (ERROR);}}return (OK);}3. Task 启动同步功能;由manager()创建的任务优先级最高,先创建timer()、server()、client()的任务, 让他们都在等待信号量semSynStart而被阻塞,最后创建manager()的任务,占据CPU,等待其他所有任务都被阻塞,解锁所有等待信号量的任务,让它们同时启动。

      /* progStart()启动实例程序*/ STATUS progStart(void){int id; /* 用来区分不同的定时器或者客户任务 */ mallocPtr=&sysMalloc;mallocPtr->frontBlock = 0;initialPtr = initial(); tidServer = tidManager = 0;for (id = 0; id < NUM_CLIENT; id++){tidClient[id] = 0;}for (id = 0; id < NUM_TIMER; id++){tidTimer[id] = 0;}/* 创建消息队列 */msgQIdServer = msgQCreate(MAX_MSGS, MAX_MSG_LEN, MSG_Q_FIFO|MSG_Q_EVENTSEND_ERR_NOTIFY);if (msgQIdServer == NULL){return (ERROR);}for (id = 0; id < NUM_CLIENT; id++){msgQIdClient[id] = msgQCreate(MAX_MSGS, MAX_MSG_LEN, MSG_Q_FIFO|MSG_Q_EVENTSEND_ERR_NOTIFY);if (msgQIdClient[id] == NULL){return (ERROR);}}semSynStart = semBCreate(SEM_Q_FIFO | SEM_EVENTSEND_ERR_NOTIFY,SEM_EMPTY);semMalloc = semBCreate(SEM_Q_PRIORITY,SEM_FULL); semFree = semBCreate(SEM_Q_PRIORITY,SEM_FULL);/* 创建任务 */tidServer = taskSpawn("tServer", 220, 0, STACK_SIZE,(FUNCPTR)server,0,0,0,0,0,0,0,0,0,0);for (id = 0; id < NUM_CLIENT; id++){char tempName[20]; sprintf(tempName, "tClient%d", id);tidClient[id] = taskSpawn(tempName, 210, 0, STACK_SIZE,(FUNCPTR)client,id,0,0,0,0,0,0,0,0,0);}for (id = 0; id < NUM_TIMER; id++){char tempName[20]; sprintf(tempName, "tTimer%d", id);tidTimer[id] = taskSpawn(tempName, 230, 0, STACK_SIZE, (FUNCPTR)timer,id,0,0,0,0,0,0,0,0,0);}tidManager = taskSpawn("tMannager", 200, 0, STACK_SIZE, (FUNCPTR)manager,0,0,0,0,0,0,0,0,0,0);printf("programe start!\n"); return (OK);}/* manager() 管理进程,实现task同步*/ STATUS manager(){int id;while(taskIsSuspended(tidServer) || taskIsReady(tidServer)) taskDelay(10);for (id = 0; id < NUM_CLIENT; id++){while(taskIsSuspended(tidClient[id]) || taskIsReady(tidClient[id]))taskDelay(10);}for (id = 0; id < NUM_TIMER; id++){while(taskIsSuspended(tidTimer[id]) || taskIsReady(tidTimer[id])) taskDelay(10);}semFlush(semSynStart); return (OK);}/* server()处理来自各个客户任务的消息*/ STATUS server(void){……semTake(semSynStart,WAIT_FOREVER); FOREVER{……}return (OK);}/* timer(id)向客户端定时发送的定时器*/ STATUS timer(int id){…… semTake(semSynStart,WAIT_FOREVER); FOREVER{……}return (OK);}/*client(id)向服务器任务发请求消息*/ STATUS client(int id){…… semTake(semSynStart,WAIT_FOREVER); FOREVER{……}return (OK);}4. 体现前次实验中实现的自定义内存管理机制,最大限度降低外部碎片对系统可靠性的威胁。

      静态内存的数据结构为单链表,采用头插法,申请内存时,修改firstavailable另 其指向第二块,将firstavailable指向的头块取出,回收内存时,将回收的块的 frontBlock指向第一块,修改firstavailable另其指向回收的块,将回收的块作为第一块, 数据结构如下所示:poolpoolHead firstavailableblockHeadfrontBlockblockHeadfrontBlocbklockHeadfrontBlockblockHeadnextpoolHeadfirstavailableblockHeadfrontBlockfrontBlock frontBlockblockHead blockHead blockHead静态分配了含有32个16B块的内存池和含有16个256B块的内存池,如果申请的内存大于256B,调用系统malloc/*initial() 初始化内存池*/ pool* initial(void){int i; pool* mem;pool* poolPtr; poolHead* poolHeadPtr;blockHead* blockHeadPtr; mem=(pool*)malloc(6000);/*分配6000B内存作为内存池*//*初始化pool*/ poolPtr = (pool*)mem; poolPtr->poolNum = 2;poolPtr->pool = (poolHead*)((char*)mem + sizeof(pool)); /*pool指向申请内存区尾*/位置*//*初始化pool 1 该内存池分配大小为16B的内存*/poolHeadPtr = (poolHead*)((char*)mem + sizeof(pool));/*初始化内存池的首poolHeadPtr->available = 32; /*初始化可用块数32*/ poolHeadPtr->blockSize = 16; /*块大小16B*/blockHeadPtr = (blockHead*)((char*)poolHeadPtr+sizeof(poolHead)); /* 初始化块的首位置*/poolHeadPtr->firstavailable = blockHeadPtr; /*初始化第一块可用块的位置*/ poolHeadPtr->next= 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.