邝坚_北邮嵌入式实验报告

合集下载

嵌入式实验报告总结

嵌入式实验报告总结

嵌入式实验报告总结嵌入式实验报告总结近年来,嵌入式系统在各个领域中得到了广泛的应用。

嵌入式系统是指将计算机系统嵌入到其他设备或系统中,以实现特定功能的一种计算机系统。

在本次嵌入式实验中,我深入学习了嵌入式系统的原理和应用,并通过实际操作,加深了对嵌入式系统的理解。

实验一:嵌入式系统的基本概念和发展历程在本实验中,我们首先了解了嵌入式系统的基本概念和发展历程。

嵌入式系统的特点是紧凑、高效、实时性强,并且适用于各种各样的应用场景。

通过学习嵌入式系统的发展历程,我们了解到嵌入式系统在不同领域的应用,如智能家居、医疗设备、汽车电子等。

这些应用领域的嵌入式系统都有着各自的特点和需求,因此在设计嵌入式系统时需要根据具体应用场景进行优化。

实验二:嵌入式系统的硬件平台与软件开发环境在本实验中,我们学习了嵌入式系统的硬件平台和软件开发环境。

硬件平台是嵌入式系统的基础,包括处理器、内存、外设等。

而软件开发环境则提供了开发嵌入式系统所需的工具和库函数。

我们通过实际操作,搭建了嵌入式系统的硬件平台,并使用软件开发环境进行程序的编写和调试。

通过这个实验,我深刻理解了硬件平台和软件开发环境对嵌入式系统的影响,以及它们之间的协同工作。

实验三:嵌入式系统的实时操作系统在本实验中,我们学习了嵌入式系统的实时操作系统。

实时操作系统是嵌入式系统中非常重要的一部分,它能够保证系统对外界事件的响应速度和可靠性。

我们通过实际操作,学习了实时任务的创建和调度,以及实时操作系统的中断处理机制。

实时操作系统的学习让我更加深入地了解了嵌入式系统的实时性要求和相关的调度算法。

实验四:嵌入式系统的通信与网络在本实验中,我们学习了嵌入式系统的通信与网络。

嵌入式系统通常需要与其他设备或系统进行通信,以实现数据的传输和共享。

我们学习了嵌入式系统的通信协议和网络协议,如UART、SPI、I2C、TCP/IP等。

通过实际操作,我掌握了这些通信和网络协议的使用方法,以及在嵌入式系统中如何进行数据的传输和处理。

北邮嵌入式实验报告

北邮嵌入式实验报告

北京邮电大学嵌入式系统开发实验报告学院:班级:姓名:学号:序号:目录一、实验目的 (1)二、实验设备 (1)三、基础实验(实验一~实验七) (1)1.实验五 (1)2.实验六 (1)3.实验七 (1)四、驱动程序 (5)1.设备驱动程序的概念 (5)2.驱动程序结构 (6)3.设备注册和初始化 (7)4.设备驱动程序的开发过程 (8)五、基本接口实验 (8)1.实验十二简单设备驱动程序 (9)2.实验十三CPU GPIO驱动程序设计 (9)3.实验十四中断实验 (10)4.实验十五数码管显示实验 (12)5.实验十六LED点阵驱动程序设计 (19)6.实验十七AD驱动实验 (23)7.实验十八DA驱动实验 (26)六、实验中遇到的问题及解决方法 (30)七、实验总结及心得 (31)一、实验目的通过实验熟悉Linux环境,并掌握一些基本接口驱动的写法和用C语言编写简单的实验程序。

学习LINUX开发环境的搭建,通讯配置等。

并熟练掌握LINUX驱动程序的编写及开发流程。

对嵌入式系统有进一步的了解。

二、实验设备1.一套PXA270EP嵌入式实验箱2.安装Redhat9的宿主PC机,并且配置好ARM Linux的开发环境三、基础实验(实验一~实验七)实验一~七为基础实验,目的是为后续实验搭建好软、硬件环境,配置好相关的协议、服务,并通过编写最简单的HelloWorld程序进行测试。

由于后面的实验都要依靠前面实验的配置,故本段只着重叙述实验七的具体实现。

1.实验五实验五为宿主PC机配置了TFTP服务。

TFTP(Trivial File Transfer Protocol)是简单文件传输协议,由于特定开发环境的制约,这一服务是必须的。

在配置完成后,每次重启宿主PC机时,都须先输入命令:service xinetd restart,以启动TFTP服务。

2.实验六实验六为宿主PC机配置了NFS服务。

NFS(Network File System)指网络文件系统,它实现了文件在不同的系统间使用。

嵌入式实时操作系统_uCOSII

嵌入式实时操作系统_uCOSII

uC/OS-II北京邮电大学计算机学院 邝 坚 2011年10月教材及参考文献《嵌入式实时操作系统 uC/OS-II(第2 版)》,Jean brosse, 邵贝贝, 北航出版 社, 2003年1月uC/OS-II的主要特点实时性可确定:绝大多数系统服务的执行时间具有可确定 性,不依赖于用户应用程序Task数目的多少。

多任务、独立栈:最多64个Task,基于优先级抢占调度方 式。

每个Task有自身独立的堆栈。

可裁减性:系统最小可裁减到几K到十几K,这种裁减还可 以做到基于函数级。

可移植性:与CPU体系结构相关部分用汇编编写,其他功 能组件CPU无关。

可靠、稳定性:由整个系统设计来保证,市场验证。

美国 联邦航空管理局(FAA)认证。

开源代码:内核约5500行C代码。

可固化:面向嵌入式应用。

系统功能实时内核 任务管理 时间管理 信号量、互斥信号量管理 事件标志组管理 消息邮箱管理 消息队列管理 内存管理 …Targets x86 68k PPC CPU32 i960 SPARC ARM MIPS XScale …Typical development configurationEthernetRS-232Development HostTargetTypical scenario:1. Boot target. 4. Download object module. 2. Attach target server. 5. Test & Debug. 3. Edit & compile. 6. Return to 3 or 1 as necessaryMulti-TaskingTask是代码运行的一个映像,从系统的角 度看,Task是竞争系统资源的最小运行单 元。

Task可以使用或者等待CPU、I/O设备 及内存空间等系统资源,并独立于其它的 Task,与它们一起并发运行。

Task OperationPriority-base preemptive scheduling(基 于优先级的抢占式调度)Task调度器上锁和开锁给调度器上锁函数OSSchedlock() 用于临 时禁止任务调度,直到任务完成后调用给 调度器开锁函数OSSchedUnlock()为止。

嵌入式实验四实验报告

嵌入式实验四实验报告

嵌入式实验四实验报告实验四:嵌入式编程设计
实验设计目的:
1. 学习使用嵌入式开发工具进行编程设计;
2. 学习使用C语言编写嵌入式程序;
3. 学习使用GPIO模块进行输入输出;
4. 学习使用中断处理函数。

实验器材:
1. 嵌入式开发板;
2. USB数据线;
3. 电脑;
4. LED灯;
5. 电阻;
6. 蜂鸣器;
7. 其他必要的电路元件。

实验步骤:
1. 连接开发板和计算机,安装开发板驱动程序;
2. 打开嵌入式开发工具,创建一个新的工程;
3. 在工程中添加一个C文件,编写程序;
4. 编写程序实现以下功能:
- 使用GPIO模块控制LED灯的亮、灭;
- 使用GPIO模块读取按键状态;
- 使用GPIO模块控制蜂鸣器的开、关;
- 使用Timer模块计时;
- 使用中断处理函数处理外部中断;
- 其他必要的功能;
5. 编译程序,下载到开发板;
6. 运行程序,测试功能是否正常。

实验结果与分析:
实验结果应当是LED灯、蜂鸣器、按键正常工作,可以通过按键控制LED灯的亮、灭、蜂鸣器的开、关。

实验总结:
通过本次实验,我学会了使用嵌入式开发工具进行编程设计,掌握了使用C语言编写
嵌入式程序的方法。

通过实验,我深入理解了嵌入式系统的原理和实现方法,对嵌入
式系统的应用有了更加深入的了解。

在今后的学习和工作中,我将能够更好地运用嵌
入式技术解决实际问题。

嵌入式实训课实验报告

嵌入式实训课实验报告

一、实验背景嵌入式系统在现代工业、消费电子、智能家居等领域扮演着越来越重要的角色。

为了让学生深入了解嵌入式系统的设计原理和开发过程,提高学生的实践能力和创新精神,我们开设了嵌入式实训课程。

本次实验报告将针对实训课程中的部分实验进行总结和分析。

二、实验目的1. 掌握嵌入式系统的基本原理和开发流程。

2. 熟悉嵌入式开发工具和环境。

3. 熟练使用C语言进行嵌入式编程。

4. 学会调试和优化嵌入式程序。

三、实验内容本次实训课程共安排了五个实验,以下是每个实验的具体内容和实验步骤:实验一:使用NeoPixel库控制RGB LED灯带1. 实验目的:学习使用NeoPixel库控制RGB LED灯带,实现循环显示不同颜色。

2. 实验步骤:(1)搭建实验平台,连接NeoPixel LED灯带。

(2)编写程序,初始化NeoPixel库,设置LED灯带模式。

(3)通过循环,控制LED灯带显示不同的颜色。

实验二:使用tm1637库控制数码管显示器1. 实验目的:学习使用tm1637库控制数码管显示器,显示数字、十六进制数、温度值以及字符串,并实现字符串滚动显示和倒计时功能。

2. 实验步骤:(1)搭建实验平台,连接tm1637数码管显示器。

(2)编写程序,初始化tm1637库,设置显示模式。

(3)编写函数,实现数字、十六进制数、温度值的显示。

(4)编写函数,实现字符串滚动显示和倒计时功能。

实验三:使用ds18x20库和onewire库读取DS18B20温度传感器的数据1. 实验目的:学习使用ds18x20库和onewire库读取DS18B20温度传感器的数据,并输出温度值。

2. 实验步骤:(1)搭建实验平台,连接DS18B20温度传感器。

(2)编写程序,初始化ds18x20库和onewire库。

(3)编写函数,读取温度传感器的数据,并输出温度值。

实验四:使用ESP32开发板连接手机热点,并实现LED1作为连接指示灯1. 实验目的:学习使用ESP32开发板连接手机热点,并通过LED1指示灯显示连接状态。

嵌入式实训报告范文2篇2

嵌入式实训报告范文2篇2

嵌入式实训报告范文 (2)嵌入式实训报告范文 (2)精选2篇(一)嵌入式实训报告一、实训背景嵌入式系统是一种以具体任务为中心,集成了硬件与软件的计算机系统。

由于其体积小、功耗低、功能强大等特点,嵌入式系统被广泛应用于各个领域,如家电、汽车、医疗等。

通过参与嵌入式实训,我希望能够掌握嵌入式开发的基本原理和方法,提高自己的实践能力。

二、实训目标1.掌握嵌入式系统的基本知识和开发工具的使用;2.了解嵌入式系统的硬件架构和软件设计流程;3.能够根据需求设计并实现简单的嵌入式系统。

三、实训内容1.学习嵌入式系统基础知识:通过课堂教学和自主学习,了解了嵌入式系统的概念、特点及应用领域。

深入学习了ARM架构和C语言的基本知识,并进行了相应的实践操作。

2.学习嵌入式开发工具的使用:学习了Keil MDK和IAR Embedded Workbench等常用的嵌入式开发工具的安装和配置方法。

通过实操操作,掌握了调试、编译、下载等基本功能的使用。

3.学习嵌入式系统设计流程:了解了嵌入式软件开发的常用流程,包括需求分析、系统设计、编码实现、调试测试、系统验证等。

通过案例分析和实践操作,对嵌入式系统设计流程有了更深入的了解。

4.设计并实现简单的嵌入式系统:根据实训要求,我选择了一个简单的嵌入式系统项目,通过分析需求、设计系统架构、编写软件代码、调试测试等环节,最终成功完成了项目。

四、实训总结及收获通过参与嵌入式实训,我不仅掌握了嵌入式系统的基本知识和开发工具的使用,还锻炼了自己的实践能力。

我深刻认识到嵌入式系统开发需要全面的知识储备和较高的技术水平,同时也需要良好的分析、设计和沟通能力。

通过实训,我对嵌入式系统开发流程有了更深入的理解,对嵌入式系统的设计和开发也有了更高的认识和要求。

在未来的学习和工作中,我会继续深入学习嵌入式系统开发相关知识,并不断提高自己的实践能力。

嵌入式系统是未来的发展方向,通过不断探索和实践,我相信我能够在这个领域取得更好的成果。

嵌入式实训报告范文2篇

嵌入式实训报告范文2篇

嵌入式实训报告范文嵌入式实训报告范文精选2篇(一)嵌入式实训报告一、实训目的和背景嵌入式实训的目的是通过设计和实现一个嵌入式系统,培养学生的嵌入式系统开发才能和团队协作才能。

本次实训的背景是为了满足社会对嵌入式系统开发人才的需求,进步学生的实际动手才能。

二、实训内容1. 硬件平台的选择和搭建:选择了一款ARM开发板作为硬件平台,并搭建了相应的开发环境。

2. 系统设计和分析:根据实训要求,我们团队设计了一个智能门锁系统,包括用户认证、门锁控制和远程监控功能。

3. 软件开发:使用C语言和嵌入式开发工具进展软件开发,实现了用户认证、门锁控制和远程监控等功能。

4. 硬件连接和调试:将开发板和相关传感器、执行器等硬件设备进展连接和调试,确保系统可以正常运行。

5. 功能测试和调优:对系统进展全面测试,发现并修复了一些问题,并对系统进展了性能优化。

三、实训心得和体会通过本次实训,我深入认识到嵌入式系统开发的复杂性和挑战性。

在实训过程中,我们团队遇到了许多问题,比方硬件和软件的兼容性、性能优化等方面。

但是通过团队的努力和合作,我们成功解决了这些问题,并完成了一个功能完善的嵌入式系统。

此外,我还学到了许多软件开发和硬件调试的技巧,进步了自己的实际动手才能。

在团队协作方面,我们团队成员之间互相配合,共同解决问题,形成了良好的协作机制。

总结起来,本次嵌入式实训让我受益匪浅,学会了许多实际应用的技能和知识,并进步了自身的综合才能。

四、实训成果展示在实训完毕后,我们团队成功完成了一个智能门锁系统,具备用户认证、门锁控制和远程监控等功能。

系统的稳定性和可靠性得到了验证,并且在实际使用中得到了积极的反应。

附图:〔展示系统界面、硬件设备连接示意图等〕五、实训改良意见尽管本次实训获得了良好的成果,但仍有一些方面需要改良。

首先,实训的时间安排可以更合理一些,以便更充分地利用时间进展理论操作。

其次,可以增加一些真实场景的案例分析和解决方案的设计,以提升学生的实际应用才能。

嵌入式实验报告总结

嵌入式实验报告总结

嵌入式实验报告总结本次嵌入式实验主要涉及到嵌入式系统的设计与开发,通过对实验过程的总结和分析,可以得出以下结论和认识。

在实验过程中,我们深入了解了嵌入式系统的基本原理和设计方法。

嵌入式系统是一种针对特定应用领域设计的计算机系统,具有体积小、功耗低、功能强大等特点。

在实验中,我们通过学习相关理论知识,了解了嵌入式系统的硬件结构和软件开发流程,并且亲自动手进行了系统设计和开发,加深了对嵌入式系统的理解和掌握。

实验中我们学习了嵌入式系统的硬件设计。

嵌入式系统的硬件设计是整个系统的基础,包括选择合适的处理器、外设接口设计、电源电路设计等。

在实验中,我们根据实际需求选择了合适的处理器和外设,进行了相关接口的设计和连接,确保硬件系统的稳定性和可靠性。

然后,实验中我们进行了嵌入式系统的软件开发。

嵌入式系统的软件开发是整个系统的核心,需要编写各种驱动程序和应用程序,实现系统的各种功能。

在实验中,我们学习了嵌入式系统的软件开发工具和方法,使用C语言编写了驱动程序和应用程序,并进行了调试和测试,确保软件系统的正确性和稳定性。

实验中我们还学习了嵌入式系统的调试和测试方法。

嵌入式系统的调试和测试是确保系统正常运行的重要环节,需要使用专业的工具和方法进行。

在实验中,我们学习了嵌入式系统的调试和测试工具,通过对系统的性能和功能进行评估,发现并解决了一些潜在的问题,确保系统的稳定性和可靠性。

通过本次实验,我们对嵌入式系统的设计与开发有了更深入的了解和认识。

嵌入式系统作为一种特殊的计算机系统,具有广泛的应用前景和市场需求。

通过学习和实践,我们不仅提高了自己的技术水平,也为将来的工作和研究打下了坚实的基础。

希望今后能够继续深入学习和研究嵌入式系统,为推动科技进步和社会发展做出更大的贡献。

本次嵌入式实验通过对硬件设计、软件开发、调试测试等方面的学习和实践,使我们对嵌入式系统的设计与开发有了更深入的了解和认识。

通过实验的过程,我们不仅提高了自己的技术水平,也增强了对嵌入式系统的兴趣和热情。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

嵌入式系统期末实验一、实验要求题目:支持消息驱动模式的实时软件框架目的:在充分理解嵌入式处理器特点、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{MsgReceiveIf(…){……}else if(…){……}……}}typedef struct _MESSAGE{int mType; /* 消息类型 0:timer->client*1:client->server 2:server->client*/int mSendId; /* 发送任务的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另其指向回收的块,将回收的块作为第一块,数据结构如下所示:静态分配了含有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= (poolHead*)((char*)poolHeadPtr + sizeof(poolHeadPtr)+ 32*(sizeof(blockHead)+16)); /*next指向第二个内存池 */blockHeadPtr->poolId =1;blockHeadPtr->frontBlock = 0;for(i=1;i<32;i++) /*将该内存池划分为32个容量16B的内存块*/{blockHeadPtr=(blockHead*)((char*)blockHeadPtr +(sizeof(blockHead)+16)); /*块的首址移动16加结构体的开销长度*/blockHeadPtr->poolId = 1; /* pool号为1,表示他是16B容量的*/blockHeadPtr->frontBlock = poolHeadPtr->firstavailable; /* 当前首个可用块地址赋给frontBlock */poolHeadPtr->firstavailable = blockHeadPtr; /* 求下一首个可用块地址*/}/*初始化pool 2 该内存池分配大小为256B的内存*/poolHeadPtr = poolHeadPtr->next;poolHeadPtr->available = 16; /*初始化可用块数16*/poolHeadPtr->blockSize = 256; /*块大小256*/blockHeadPtr = (blockHead*)((char*)poolHeadPtr+sizeof(poolHead));poolHeadPtr->firstavailable = blockHeadPtr;poolHeadPtr->next = 0;blockHeadPtr->poolId =2;blockHeadPtr->frontBlock = 0;for(i=1;i<16;i++) /*将该内存池划分为16个容量256B的内存块*/{blockHeadPtr=(blockHead*)((char*)blockHeadPtr +(sizeof(blockHead)+256));blockHeadPtr->poolId = 2; /* pool号为2,表示他是256B容量的*/blockHeadPtr->frontBlock = poolHeadPtr->firstavailable;poolHeadPtr->firstavailable = blockHeadPtr;}return (pool*)mem;}/*memMalloc() 分配内存*/void* memMalloc(int Size){void* mem;poolHead* poolHeadPtr;blockHead* blockHeadPtr;semTake(semMalloc,WAIT_FOREVER);poolHeadPtr = initialPtr->pool;if((Size <= 16)&&(poolHeadPtr->available != 0)) /*长度小于16时,分配长度为16的内存空间*/{blockHeadPtr = poolHeadPtr->firstavailable; /*首个可用块地址赋给分配块的首地址*/poolHeadPtr->firstavailable = blockHeadPtr->frontBlock; /*改变下一第一可用块的地址*/poolHeadPtr->available --; /*可用块数减一*/semGive(semMalloc);return (void*)((char*)blockHeadPtr + sizeof(blockHead)); /*分配内存时加入块头开销*/}else if((Size <= 256)&&((poolHeadPtr->next)->available != 0))/*长度大于16小于256时,分配长度为256的内存空间*/{blockHeadPtr = (poolHeadPtr->next)->firstavailable;(poolHeadPtr->next)->firstavailable = blockHeadPtr->frontBlock;(poolHeadPtr->next)->available --;semGive(semMalloc);return (void*)((char*)blockHeadPtr + sizeof(blockHead));}else /*其他情况用系统的内存分配函数malloc分配*/{printf("\n[Warning] : Too large for blocks or the blocks areexhausted \n");mem = malloc(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* 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->firstavailable; /*恢复frontBlock地址*/poolHeadPtr->firstavailable = blockHeadPtr; /*恢复第一可用块地址*/poolHeadPtr->available++; /*恢复可用块数*/}else if(blockHeadPtr->poolId == 2)/*释放256B的内存块*/{blockHeadPtr->frontBlock = (poolHeadPtr->next)->firstavailable;(poolHeadPtr->next)->firstavailable = blockHeadPtr;(poolHeadPtr->next)->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){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消息队列存储的是指向消息的指针,从而实现了零拷贝。

相关文档
最新文档