ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:133KB ,
资源ID:14534323      下载积分:5 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-14534323.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(邝坚北邮嵌入式实验报告.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

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

1、邝坚北邮嵌入式实验报告嵌入式系统期末实验一、实验要求题目:支持消息驱动模式的实时软件框架目的:在充分理解嵌入式处理器特点、RTOS 及强实时嵌入式系统软件设计规范的基础上,构建自己的实时系统软件框架基本功能,并在其上自拟应用(如部分模拟TCP 的C/S两端通信流程),测试软件框架的相关功能。环境:VxWorks 的VxSim 仿真环境或2440(ARM920T)内容:必选功能:1. 消息驱动的Task 统一框架,包含统一消息格式定义及使用规范;2. 支持消息驱动模式的软定时器的机制;3. Task 启动同步功能;4. 体现前次实验中实现的自定义内存管理机制,最大限度降低外部碎片对系统可靠性的威

2、胁。可选功能(加分):其它有利于实时处理的有效机制,如:无信号量(互斥)支持的临界资源访问方式,zero copy 等;二、实现的功能1. 消息驱动的Task 统一框架,包含统一消息格式定义及使用规范;STATUS Task()Initialization(MBox, Data Structure, Timer, etc.)ForeverMsgReceive If()else if()typedef struct _MESSAGE int mType; /* 消息类型 0:timer-client *1:client-server 2:server-client*/ int mSendId;

3、/* 发送任务的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 task

4、Delay(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(msgQIdClientid,(char*)&txMsg,MAX_MSG_LEN,WAIT_FOREVER,MSG_PRI_NORM

5、AL) = ERROR ) return (ERROR); return (OK);3. Task 启动同步功能;由manager()创建的任务优先级最高,先创建timer()、server()、client()的任务,让他们都在等待信号量semSynStart而被阻塞,最后创建manager()的任务,占据CPU,等待其他所有任务都被阻塞,解锁所有等待信号量的任务,让它们同时启动。/* progStart()启动实例程序*/STATUS progStart(void) int id; /* 用来区分不同的定时器或者客户任务 */ mallocPtr=&sysMalloc; mallocPtr

6、-frontBlock = 0; initialPtr = initial(); tidServer = tidManager = 0; for (id = 0; id NUM_CLIENT; id+) tidClientid = 0; for (id = 0; id NUM_TIMER; id+) tidTimerid = 0; /* 创建消息队列 */ msgQIdServer = msgQCreate(MAX_MSGS, MAX_MSG_LEN, MSG_Q_FIFO|MSG_Q_EVENTSEND_ERR_NOTIFY); if (msgQIdServer = NULL) return

7、 (ERROR); for (id = 0; id NUM_CLIENT; id+) msgQIdClientid = msgQCreate(MAX_MSGS, MAX_MSG_LEN, MSG_Q_FIFO|MSG_Q_EVENTSEND_ERR_NOTIFY); if (msgQIdClientid = NULL) return (ERROR); semSynStart = semBCreate(SEM_Q_FIFO | SEM_EVENTSEND_ERR_NOTIFY,SEM_EMPTY); semMalloc = semBCreate(SEM_Q_PRIORITY,SEM_FULL);

8、 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 tempName20; sprintf(tempName, tClient%d, id); tidClientid = taskSpawn(tempName, 210, 0, STACK_SIZE, (FUNCPTR)client

9、,id,0,0,0,0,0,0,0,0,0); for (id = 0; id NUM_TIMER; id+) char tempName20; sprintf(tempName, tTimer%d, id); tidTimerid = 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(pro

10、grame 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(tidClientid) | taskIsReady(tidClientid) taskDelay(10); for (id = 0; id poolNum = 2; poolPtr

11、-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(poolHea

12、d); /*初始化块的首位置*/ poolHeadPtr-firstavailable = blockHeadPtr; /*初始化第一块可用块的位置*/ poolHeadPtr-next= (poolHead*)(char*)poolHeadPtr + sizeof(poolHeadPtr) + 32*(sizeof(blockHead)+16); /*next指向第二个内存池 */ blockHeadPtr-poolId =1; blockHeadPtr-frontBlock = 0; for(i=1;ipoolId = 1; /* pool号为1,表示他是16B容量的*/ blockHea

13、dPtr-frontBlock = poolHeadPtr-firstavailable; /* 当前首个可用块位置赋给frontBlock */ poolHeadPtr-firstavailable = blockHeadPtr; /* 求下一首个可用块位置*/ /*初始化pool 2 该内存池分配大小为256B的内存*/ poolHeadPtr = poolHeadPtr-next; poolHeadPtr-available = 16; /*初始化可用块数16*/ poolHeadPtr-blockSize = 256; /*块大小256*/ blockHeadPtr = (blockH

14、ead*)(char*)poolHeadPtr+sizeof(poolHead); poolHeadPtr-firstavailable = blockHeadPtr; poolHeadPtr-next = 0; blockHeadPtr-poolId =2; blockHeadPtr-frontBlock = 0; for(i=1;ipoolId = 2; /* pool号为2,表示他是256B容量的*/ blockHeadPtr-frontBlock = poolHeadPtr-firstavailable; poolHeadPtr-firstavailable = blockHeadPt

15、r; return (pool*)mem;/*memMalloc() 分配内存*/void* memMalloc(int Size) void* mem; poolHead* poolHeadPtr; blockHead* blockHeadPtr; semTake(semMalloc,WAIT_FOREVER); poolHeadPtr = initialPtr-pool; if(Size available != 0) /*长度小于16时,分配长度为16的内存空间*/ blockHeadPtr = poolHeadPtr-firstavailable; /*首个可用块位置赋给分配块的首位置

16、*/ poolHeadPtr-firstavailable = blockHeadPtr-frontBlock; /*改变下一第一可用块的位置*/ poolHeadPtr-available -; /*可用块数减一*/ semGive(semMalloc); return (void*)(char*)blockHeadPtr + sizeof(blockHead); /*分配内存时加入块头开销*/ else if(Size next)-available != 0) /*长度大于16小于256时,分配长度为256的内存空间*/ blockHeadPtr = (poolHeadPtr-next)

17、-firstavailable; (poolHeadPtr-next)-firstavailable = blockHeadPtr-frontBlock; (poolHeadPtr-next)-available -; semGive(semMalloc); return (void*)(char*)blockHeadPtr + sizeof(blockHead); else /*其他情况用系统的内存分配函数malloc分配*/ printf(nWarning : Too large for blocks or the blocks are exhausted n); mem = malloc

18、(Size); /*采用系统函数malloc()分配内存*/ blockHeadPtr = (blockHead*)mem; blockHeadPtr-poolId = (initialPtr-poolNum +1); blockHeadPtr-frontBlock = mallocPtr; mallocPtr = blockHeadPtr; semGive(semMalloc); return (void*)(char*)blockHeadPtr + sizeof(blockHead); /*memFree() 释放内存空间*/void memFree(void* dataPtr) char

19、* mem= (char*) dataPtr; poolHead* poolHeadPtr; blockHead* blockHeadPtr; semTake(semFree,WAIT_FOREVER); poolHeadPtr = initialPtr-pool; /*恢复内存池首址*/ blockHeadPtr = (blockHead*)(char*)mem - sizeof(blockHead); /*恢复内存块首址*/ if(blockHeadPtr-poolId = 1) /*释放16B的内存块*/ blockHeadPtr-frontBlock = poolHeadPtr-fir

20、stavailable; /*恢复frontBlock位置*/ poolHeadPtr-firstavailable = blockHeadPtr; /*恢复第一可用块位置*/ poolHeadPtr-available+; /*恢复可用块数*/ else if(blockHeadPtr-poolId = 2)/*释放256B的内存块*/ blockHeadPtr-frontBlock = (poolHeadPtr-next)-firstavailable; (poolHeadPtr-next)-firstavailable = blockHeadPtr; (poolHeadPtr-next)

21、-available +; else /*释放由系统分配的内存块*/ blockHeadPtr = mallocPtr; mallocPtr = blockHeadPtr-frontBlock; free(char*)mem - sizeof(blockHead); semGive(semFree); return;/*memDel()删除内存块*/void memDel(void) void* mem; blockHead* blockHeadPtr; mem = (void*)(initialPtr); free(mem); while(mallocPtr-frontBlock != 0)

22、 mem = (void*)(mallocPtr); free(mem); mallocPtr=mallocPtr-frontBlock ; semDelete(semMalloc); /*删除信号量*/ semDelete(semFree);5. 无信号量(互斥)支持的临界资源访问方式有一个server任务,有10个client任务,10个client任务定时给server的消息队列发送消息,server任务接收到消息后,发送ACK消息到client的消息队列,如图:6. zero copy 消息队列存储的是指向消息的指针,从而实现了零拷贝。#define MAX_MSG_LEN sizeo

23、f(MESSAGE*)MESSAGE* rxMsg; /* 用于从消息队列中接收消息 */MESSAGE* txMsg; /* 用于向消息队列中发送消息 */msgQReceive(msgQIdServer,(char*)&rxMsg,MAX_MSG_LEN,WAIT_FOREVER);msgQSend(msgQIdClientmSendId,(char*)&txMsg,MAX_MSG_LEN,WAIT_FOREVER,MSG_PRI_NORMAL);三、运行结果 在shell中输入progStart,观察VxSim,输入progStop结束。 四、心得实验中遇到了各种各样的问题,特别是代码调试,对报错的分析,定位错误,但是通过不懈努力,完成了本次实验,让我对课堂上所讲的内容有了更深刻的认识,对嵌入式实时操作系统有了更深的理解。由于正值期末,考试任务繁重,时间紧迫,自身水平有限,难免会有疏漏,请老师指正。文档可能无法思考全面,请浏览后下载,另外祝您生活愉快,工作顺利,万事如意!

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2