嵌入式实时操作系统实验报告
精选嵌入式系统实习报告3篇
精选嵌入式系统实习报告3篇嵌入式系统实习报告篇1ARM嵌入式系统综合设计一.实习时间和地点安排1.实习时间:20xx年XX月03 日—— 20xx年XX月14日,共两周的时间。
2.每天的实习时间安排:上午:8:30——11:30下午:13:30——15:303.实习地点:校内。
二.实习目的1.掌握电子元器件的焊接原理和方法。
2.掌握ARM7 LPC2132控制程序的编写方法。
3.掌握调试软件和硬件的方法。
三.实习内容与要求1.根据设计要求焊接好电路板并测试焊接无误。
2.绘制流程图并编写程序。
3.编译通过后,将程序下载到LPC2132进行调试。
4.调试成功后编写实习报告。
四.LPC2132芯片介绍LPC2132最小系统图及其介绍概述LPC2132是基于一个支持实时仿真和嵌入式跟踪的32/16 位 ARM7TDMI-STM CPU 的微控制器,并带有 32kB、64kB、512 kB 的嵌入的高速Flash 存储器。
128 位宽度的存储器接口和独特的加速结构使 32 位代码能在最大时钟速率下运行。
对代码规模有严格控制的应用可使用 16 位 Thumb?模式将代码规模降低超过 30%,而性能的损失却很小。
较小的封装和极低的功耗使 LPC2131/2132/2138 可理想地用于小型系统中,如访问控制和 POS 机。
宽范围的串行通信接口和片内 8/16/32kB 的 SRAM 使LPC2131/2132/2138 非常适用于通信网关、协议转换器、软 modem 、声音辨别和低端成像,为它们提供巨大的缓冲区空间和强大的处理功能。
多个 32 位定时器、1 个或 2 个 10 位 8 路 ADC 、10 位 DAC 、PWM 通道和 47 个 GPIO 以及多达9 个边沿或电平触发的外部中断使它们特别适用于工业控制和医疗系统。
特性1.小型 LQFP64 封装的 16/32 位 ARM7TDMI-S 微控制器。
嵌入式操作系统实验报告
中南大学信息科学与工程学院实验报告:安磊班级:计科0901 学号: 0909090310 指导老师:宋虹目录课程设计容 ----------------------------------- 3 uC/OS操作系统简介 ------------------------------------ 3 uC/OS操作系统的组成 ------------------------------ 3 uC/OS操作系统功能作用 ---------------------------- 4 uC/OS文件系统的建立 ---------------------------- 6 文件系统设计的原则 ------------------------------ 6 文件系统的层次结构和功能模块 --------------------- 6 文件系统的详细设计 -------------------------------- 8 文件系统核心代码 --------------------------------- 9 课程设计感想 ------------------------------------- 11 附录 -------------------------------------------------- 12课程设计容在uC/OS操作系统中增加一个简单的文件系统。
要求如下:(1)熟悉并分析uc/os操作系统(2)设计并实现一个简单的文件系统(3)可以是存放在存的虚拟文件系统,也可以是存放在磁盘的实际文件系统(4)编写测试代码,测试对文件的相关操作:建立,读写等课程设计目的操作系统课程主要讲述的容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。
本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统开发的基本技能。
《嵌入式操作系统》实验报告
..
..
..
..
..
思考:如何能在 Linux 系统启动时,输出显示自定义的文本信息,请修改 码,完成此功能。
Linux 核启动代
..
..
..
..
..
5. 实验中遇到的问题及解决方法
在 实 验 中 遇 到 一 些 问 题 , 例 如 在 复 制 的 时 候 我 记 得 原 来 用 cp
–
a /tmp/linux-2.4.18-br.tar.gz
} module_init(hello_init);
module_exit(hello_exit);
..
..
..
..
..
有关驱动程序的编写规, 请参考课程教材, 本实验只在编写简单的驱动 ( 核 ) 程序并加入 到 Linux 核目录树中,使用户熟悉编译核的过程。该驱动程序是向终端输出相关程序信息。 编写好 helloworld.c 后将其拷贝到核源码树的 drivers/char/ 目录下。
obj-$(CONFIG_PPDEV)
+= ppdev.o
(4) 、运行 make menuconfig 配置核对 helloworld 程序的支持 :
[rootlocalhost linux-2.6.35.7]# make distclean [rootlocalhost linux-2.6.35.7]# make menuconfig
[rootlocalhost
/]#
cp
/UP-Magic210/SRC/kernel/linux-2.6.35.7/drivers/char/
helloworld.c
(2) 、进入实验核源码目录修改 driver/char/ 添加 helloworld 程序的菜单支持
嵌入式系统试验报告
嵌入式系统实验报告学院:计算机科学与工程姓名:___________学号:_______________专业:_______________指导老师:______________完成日期:______________实验一:流水灯案例、8位数码管动态扫描案例一、实验目的1.1 进一步熟悉Keil C51集成开发环境调试功能的使用;1.2 学会自己编写程序,进行编译和仿真测试;1.3 利用开发板下载hex 文件后验证功能。
二、实验原理2.1 :实验原理图030B 〜I ।卜RSI I ™Hi 」 口 UICDR Hr hJJK RR 18q U I. 海水灯电浒周LhE U_EEM^Li > > 第 X > k >n - » =白 L a £0EBS2.2:工作原理2.2.1:流水灯电路中有LO,1,L2,L3,4,L5,L6,L7共八个发光二极管,当引脚LED_ SEL输入为1,对于A、B、C、D、E、F、G、H引脚,只要输入为1,则点亮相连接的发光二极管。
A〜H引脚连接STM32F108VB芯片的PE8〜PE15,程序初始化时,对其进行初始设置。
引脚LED_SEL为1时,发光二极管才工作,否则右边的数码管工作。
注意,LED SEL 连接于PB3,该引脚具有复用功能,在默认状态下,该引脚的I0不可用,需对AFIO_ MAPR寄存器进行设置,设置其为10可用。
2.2.2: 8位数码管数码管中的A~G、DP段分别连接到电路图中的A~G、H线上,当某段上有一-定的电压差值时,便会点亮该段。
当£3输入为1,也就是LED_ 5£1输入为0时,根据SELO〜SEL2的值确定选中的数码管,即位选,再根据A~H引脚的高低电平,点亮对应段,即段选。
三、实验结果3.1:流水灯对于给出的流水灯案例,下载HEX文件后,在开发板上可观察到L0-L7从左至右依次点亮,间隔300ms。
嵌入式实习报告(共5篇)
嵌入式实习报告(共5篇)第一篇:嵌入式实习报告一、嵌入式系统开发与应用概述在今日,嵌入式ARM 技术已经成为了一门比较热门的学科,无论是在电子类的什么领域,你都可以看到嵌入式ARM 的影子。
如果你还停留在单片机级别的学习,那么实际上你已经落下时代脚步了,ARM 嵌入式技术正以几何的倍数高速发展,它几乎渗透到了几乎你所想到的领域。
本章节就是将你领入ARM 的学习大门,开始嵌入式开发之旅。
以嵌入式计算机为技术核心的嵌入式系统是继网络技术之后,又一个IT领域新的技术发展方向。
由于嵌入式系统具有体积小、性能强、功耗低、可靠性高以及面向行业具体应用等突出特征,目前已经广泛地应用于军事国防、消费电子、信息家电、网络通信、工业控制等各个领域。
嵌入式的广泛应用可以说是无所不在。
嵌入式微处理器技术的基础是通用计算机技术。
现在许多嵌入式处理器也是从早期的PC 机的应用发展演化过来的,如早期PC 诸如TRS-80、Apple II 和所用的Z80 和6502 处理器,至今仍为低端的嵌入式应用。
在应用中,嵌入式微处理器具有体积小、重量轻、成本低、可靠性高的优点。
嵌入式处理器目前主要有Am186/88、386EX、SC-400、Power PC、68000、MIPS、ARM 等系列。
在早期实际的嵌入式应用中,芯片选择时往往以某一种微处理器内核为核心,在芯片内部集成必要的ROM/EPROM/Flash/EEPROM、SRAM、接口总线及总线控制逻辑、定时/计数器、WatchDog、I/O、串行口、脉宽调制输出、A/D、D/A 等各种必要的功能和外设。
二、实习设备硬件:Embest EduKit-IV实验平台、ULINK2仿真器套件、PC机软件:μVision IDE for ARM集成开发环境、Windows 98/2000/NT/XP三、实习目的1.初步掌握液晶屏的使用及其电路设计方法;掌握S3C2410X处理器的LCD控制器的使用;掌握通过任务调用的方法把液晶显示函数添加到uC/OS-II中;通过实验掌握液晶显示文本及图形的方法与程序设计。
嵌入式_实习报告
实习报告一、实习背景与目的随着科技的飞速发展,嵌入式系统已经深入到我们生活的方方面面,从智能手机、智能家居到工业控制、无人驾驶等领域,都离不开嵌入式技术的支持。
本次实习旨在让我深入了解嵌入式系统的原理与实践,掌握嵌入式编程的基本技能,提高实际动手能力,为今后的学习和工作打下坚实的基础。
二、实习内容与过程1. 嵌入式系统理论基础在实习的第一阶段,我学习了嵌入式系统的基本概念、硬件架构、软件设计以及常见的嵌入式操作系统等。
通过学习,我了解到嵌入式系统是将计算机技术应用于特定领域的一种计算机系统,具有体积小、功耗低、成本低、可靠性高等特点。
同时,我还掌握了ARM、MIPS等常见嵌入式处理器的架构与编程方法。
2. 嵌入式编程实践在实习的第二阶段,我进行了嵌入式编程实践。
首先,我学习了基于Linux的嵌入式编程,掌握了交叉编译工具链的使用、Makefile的编写以及Bootloader、Kernel的定制与编译。
随后,我通过实际项目案例,学习了如何使用C、C++等编程语言进行嵌入式软件开发,掌握了模块化编程、驱动开发等技巧。
3. 嵌入式系统项目实战在实习的第三阶段,我参与了嵌入式系统项目实战。
以小组为单位,我们设计了一个基于嵌入式处理器的智能家居系统,包括温度传感器、湿度传感器、指纹识别等模块。
在项目实施过程中,我负责编写温度传感器的驱动程序,通过深入理解硬件原理,成功实现了数据的采集、处理与显示。
在项目调试阶段,我积极参与团队讨论,共同解决了一系列技术难题,最终完成了整个项目的开发。
三、实习收获与体会通过本次实习,我收获颇丰。
首先,我系统地学习了嵌入式系统的理论知识,为今后的工作打下了基础。
其次,通过实际动手实践,我掌握了嵌入式编程的技能,提高了自己的实际操作能力。
最后,在项目实战中,我学会了团队合作、问题解决等综合素质,为今后的工作积累了宝贵的经验。
总之,本次嵌入式实习使我受益匪浅,不仅提高了我的专业技能,还锻炼了我的团队协作能力。
嵌入式实习报告三篇
嵌入式实习报告 篇2
此次设计我们采用以LM3S2100为微控制器,并通过硬件和软件两方面设计,结合6位LED数码管,放大整形电路,来实现频率计在嵌入式系统中的开发与应用。
在易嵌短暂的两个月,我们从linux基础入手,强化了c语言编程,学习了linux系统编程和网络编程。时间虽短,但成长很快,无论是理论知识还是实践能力都得到了大幅度的提高。在这里将理论和实践相结合,相互促进,相互补充,使得学习更加透彻。通过用不同方法实现同一个项目,不断深入,层层推进,学以致用!
在易嵌的这个暑假,我过得充实而快乐。在这里有着同学间的探讨、师生间的互动和魔鬼般的训练!在我丰富多彩的人生路上留下了永远亮丽与难忘的记忆!
VF/VHF/UHF频段的频率,也十分方便和准确。PTS2600使用一个12位数字的LCD液晶显示屏来显示所测得的频率、闸口时间(分辨率相关)、菜单功能以及频率表的测量结果。所有这些数值都是同时显示在一个屏幕上的。PTS2600的机箱采用高标准的铝质材料制成,各模块安装在下方有钢板支承的母板上。模块相对独立,维修方便,主要通过更换模块进行。 我国利用相检宽带测频技术设计的高精度频率计也非常具有突破性和实用性。该项新技术及仪器是针对已有测频技术的特点及存在问题,推出完全新颖的检测精度高、便于实施且设备构成又比较经济的一种新技术及仪器。
被测信号经放大整形电路变成计数器所要求的脉冲信号,其频率与被测信号的频率相同。当1s信号来到时,被测脉冲信号进入芯片相关的,计数器开始计数,直到1s信号结束时,停止计数。若在1s时间内计数器计得的脉冲数为N,则被测信号频率fX?Nhz。
实验五(嵌入式实时操作系统实验报告)
学号:08083572班级:信科08-3 姓名:刘俊迪专业:电子信息科学与技术实验五:uC/OS-II内核移植实验1.实验目的:⏹了解uC/OS-II内核的基本原理和主要结构⏹掌握将uC/OS-II内核移植到ARM处理器上的基本方法⏹掌握uC/OS-II下基本多任务应用程序的编写2.实验内容:学习uC/OS-II再ARM处理器上的移植过程编写简单的多任务应用程序,同时实现跑马灯和数码管显示的功能3.实验原理:(1)uC/OS-II的移植1、汇编语言、C语言代码需要移植2、移植工作集中在多任务切换的实现上3、在ARM处理器上的移植,需要完成的工作包括:修改三个和体系结构相关的文件,代码量大约是500行。
这三个文件是OS_CPU_C.c、OS_CPU_C.H以及OS_CPU_A.S(2)OS_CPU.H的移植1、数据类型定义INT8U -> unsigned charINT8S -> signed charINT16U -> unsigned shortINT16S -> signed shortINT32U -> unsigned intINT32S -> signed int2、ARM处理器相关宏定义退出临界区#define OS_ENTER_CRITICAL() ARMDisableInt()进入临界区#define OS_EXIT_CRITICAL() ARMEnableInt()3、堆栈增长方向堆栈由高地址向低地址增长,这个也是和编译器有关的,当进行函数调用时,入口参数和返回地址一般都会保存在当前任务的堆栈中,编译器的编译选项和由此生成的堆栈指令就会决定堆栈的增长方向。
#define OS_STK_GROWTH 1(3)OS_CPU.c的移植1、任务堆栈初始化1、由OSTaskCreate或OSTaskCreateExt调用2、用来初始化任务的堆栈并返回新的堆栈指针stk。
嵌入式教学实践报告(3篇)
第1篇一、引言随着信息技术的飞速发展,嵌入式系统在各个领域得到了广泛的应用。
为了培养适应社会需求的高素质人才,我国高校纷纷开展嵌入式教学。
本文以某高校嵌入式教学实践为例,分析嵌入式教学的现状、方法及成效,以期为我国嵌入式教学提供参考。
二、嵌入式教学现状1. 课程设置目前,我国高校嵌入式课程设置主要包括嵌入式系统原理、嵌入式系统设计、嵌入式Linux、嵌入式编程等。
这些课程旨在使学生掌握嵌入式系统的基本原理、设计方法、编程技巧和开发工具。
2. 教学方法(1)理论教学:通过课堂讲授、案例分析等方式,使学生掌握嵌入式系统的基本概念、原理和设计方法。
(2)实践教学:通过实验、项目实践等环节,提高学生的动手能力和工程实践能力。
(3)线上教学:利用网络平台,为学生提供在线课程、在线实验、在线讨论等资源。
3. 教学资源(1)教材:高校普遍采用国内外优秀的嵌入式教材,如《嵌入式系统原理与应用》、《嵌入式Linux编程》等。
(2)实验设备:高校普遍配备嵌入式实验箱、开发板等实验设备,为学生提供实践平台。
(3)在线资源:高校积极建设在线教学资源,为学生提供丰富的学习资料。
三、嵌入式教学方法探讨1. 案例教学法案例教学法通过分析实际嵌入式系统项目,引导学生掌握嵌入式系统设计、开发和应用方法。
具体步骤如下:(1)选择典型案例:根据教学目标,选择具有代表性的嵌入式系统项目。
(2)分析案例:引导学生分析案例中嵌入式系统的设计思路、关键技术、开发过程等。
(3)讨论与总结:组织学生进行讨论,总结案例中的经验和教训。
2. 项目驱动教学法项目驱动教学法以项目为导向,让学生在完成项目的过程中,掌握嵌入式系统设计、开发和应用技能。
具体步骤如下:(1)确定项目:根据学生的兴趣和市场需求,确定嵌入式系统项目。
(2)项目分解:将项目分解为若干个子任务,明确每个子任务的技术要求和完成时间。
(3)分工与合作:学生分组,明确每个组员的责任,共同完成项目。
嵌入式实时系统实验报告
一、实验目的与要求1. 理解嵌入式实时系统的基本概念和特点。
2. 掌握实时操作系统(RTOS)的基本原理和常用实时调度算法。
3. 学习使用实时操作系统进行嵌入式系统开发,并实现简单的实时任务调度。
4. 通过实验加深对实时系统性能分析和优化的理解。
二、实验正文1. 实验内容本次实验采用嵌入式实时操作系统FreeRTOS进行,通过编写代码实现以下功能:(1)创建实时任务,包括高优先级任务、中优先级任务和低优先级任务。
(2)实现任务间的通信,包括信号量、互斥锁和消息队列。
(3)实时任务调度,观察任务调度策略对系统性能的影响。
2. 实验原理实时操作系统(RTOS)是一种专门为实时系统设计的操作系统,它能够在规定的时间内完成任务的调度和执行。
RTOS的主要特点包括:(1)实时性:RTOS能够在规定的时间内完成任务,满足实时系统的需求。
(2)抢占性:RTOS支持抢占式调度,高优先级任务可以打断低优先级任务的执行。
(3)确定性:RTOS的任务调度和执行具有确定性,便于系统分析和优化。
FreeRTOS是一款开源的实时操作系统,具有以下特点:(1)轻量级:FreeRTOS代码量小,易于移植和集成。
(2)跨平台:FreeRTOS支持多种硬件平台,如ARM、AVR、PIC等。
(3)模块化:FreeRTOS提供丰富的模块,便于用户根据需求进行定制。
3. 实验步骤(1)环境搭建:在PC上安装FreeRTOS相关开发工具,如Keil、IAR等。
(2)创建实时任务:编写代码创建三个实时任务,分别具有高、中、低优先级。
(3)任务间的通信:使用信号量、互斥锁和消息队列实现任务间的通信。
(4)实时任务调度:观察任务调度策略对系统性能的影响,分析不同调度算法的特点。
(5)实验结果分析:对比不同任务调度策略下的系统性能,总结实时系统性能优化的方法。
三、实验总结或结论1. 实验总结通过本次实验,我们深入了解了嵌入式实时系统的基本概念和特点,掌握了RTOS 的基本原理和常用实时调度算法。
嵌入式操作系统实验报告.doc
嵌入式操作系统实验报告..实验一嵌入式开发环境的建立一、实验目的通过此实验系统,读者可以了解嵌入式实时操作系统uC/OS-一、实验目的通过此实验系统,读者可以了解嵌入式实时操作系统uC/OS:注:“重新构建”将本项目中的全部源代码进行一次完全的编译和连接,花费时间较多。
“构建项目”则仅仅将新修改过的源代码进行编译和连接,花费时间最少。
“重建BSP及项目”,不但要完成“重新构建”的全部工作,另外还要编译与该项目有关的的LambdaEDU中内置的部分代码,花费时间最多。
但是在项目刚建立后,第一次构建时需要选择“重建BSP 及项目”。
以后的构建中选择“重新构建”或“构建项目”即可。
另外,在替换了源代码中的文件后,需要选择“重新构建”来完成该项目的构建。
4. 配置虚拟机和目标机代理(1) 制作X86启动盘在LambdaEDU 中依次点击“工具”、“Bochs”、“制作虚拟机启动映象”。
对启动盘进行一些参数设置后(如下图所示),系统将自动为你生成一个PC 虚拟机的启动盘映像。
(2) 配置虚拟机选择使用的网络适配器(网卡)后,点击“确定”完成配置。
注意:如果计算机上有多网卡,请将其他网卡停用(包括VMware 虚拟机添加的虚拟网卡)。
(-“重新构建”将本项目中的全部源代码进行一次完全的编译和连接,花费时间较多。
“构建项目”则仅仅将新修改过的源代码进行编译和连接,花费时间最少。
“重建BSP及项目”,不但要完成“重新构建”的全部工作,另外还要编译与该项目有关的的LambdaEDU中内置的部分代码,花费时间最多。
但是在项目刚建立后,第一次构建时需要选择“重建BSP 及项目”。
以后的构建中选择“重新构建”或“构建项目”即可。
另外,在替换了源代码中的文件后,需要选择“重新构建”来完成该项目的构建。
4. 配置虚拟机和目标机代理(1) 制作X86启动盘在LambdaEDU 中依次点击“工具”、“Bochs”、“制作虚拟机启动映象”。
嵌入式操作系统实验报告
一、实验目的1. 了解嵌入式操作系统的基本概念和特点;2. 掌握嵌入式操作系统的基本开发流程和工具;3. 学习嵌入式操作系统的内核模块设计和调试方法;4. 熟悉实时操作系统(RTOS)的调度策略和同步机制。
二、实验环境1. 开发板:STM32F103C8T6;2. 开发工具:Keil uVision5;3. 操作系统:Linux;4. 实验内容:基于uc/OS-II实时操作系统进行嵌入式系统开发。
三、实验步骤1. 熟悉开发环境和工具(1)安装Keil uVision5,创建新的项目;(2)下载uc/OS-II源码,并将其添加到项目中;(3)学习Keil uVision5的基本操作,如编译、调试等。
2. 学习uc/OS-II实时操作系统(1)了解uc/OS-II的版本、特点和适用场景;(2)学习uc/OS-II的内核模块,如任务管理、内存管理、中断管理等;(3)熟悉uc/OS-II的调度策略和同步机制。
3. 设计实验任务(1)设计一个简单的嵌入式系统,实现以下功能:a. 初始化uc/OS-II实时操作系统;b. 创建多个任务,实现任务间的同步与通信;c. 实现任务调度,观察任务的执行顺序;d. 实现任务优先级管理,观察任务优先级的变化;e. 实现任务延时,观察延时效果;(2)根据实验要求,编写相应的C语言代码。
4. 编译与调试(1)使用Keil uVision5编译实验项目,生成可执行文件;(2)将可执行文件烧录到开发板上;(3)使用调试工具(如J-Link)进行调试,观察实验结果。
5. 分析与总结(1)分析实验过程中遇到的问题及解决方法;(2)总结uc/OS-II实时操作系统的特点和应用场景;(3)总结嵌入式系统开发的经验和技巧。
四、实验结果与分析1. 实验结果(1)成功初始化uc/OS-II实时操作系统;(2)创建多个任务,实现任务间的同步与通信;(3)实现任务调度,观察任务的执行顺序;(4)实现任务优先级管理,观察任务优先级的变化;(5)实现任务延时,观察延时效果。
嵌入式实习报告
嵌入式实习报告嵌入式实习报告(精选5篇)在生活中,报告的用途越来越大,我们在写报告的时候要注意逻辑的合理性。
相信许多人会觉得报告很难写吧,以下是店铺精心整理的嵌入式实习报告(精选5篇),希望对大家有所帮助。
嵌入式实习报告篇1一、实习时间20xx年4月12日-20xx年4月26日二、指导教师姓名陈xx三、实习地点长沙市牛耳服务外包实训基地四、实习目的与内容对于嵌入式项目进行学习培训,掌握嵌入式的主要项目及相关技术五、实习收获与体会一转眼半个月的实习生活过去了,现在我已经回到学校,回想起半个月的实习生活,自己学到了很多,懂得了很多。
真的说不出是什么感觉,伴着时间,就像是在和自己的影子赛跑,不可能从真实的两面去看清它,只是经意不经意的感受着有种东西在过去,也许更适合的只有那句话:时不待我,怎可驻足。
原以为实习对于我来说会是很长,但实际却不同。
想象收获的东西,真的很多,看看我的工作笔记,一篇又一篇,记别人的事情比自己的还多,也许实习,并不像我想象中的那样轻松惬意,而是充满了挑战和艰辛。
我给自己敲响了警钟:“不要半途而废,做事情切忌三分热度。
”我信心十足的回答到:“我一定会坚持到底!”天下英雄皆我辈,一入江湖立马催。
” 从学校到社会的大环境的转变,身边接触的人也完全换了角色,老师变成老板,同学变成同事,相处之道完全不同。
在这巨大的转变中,我们可能彷徨,迷茫,无法马上适应新的环境,但在同学、同事的帮助和自己摸索的情况下,我还是完成了这次实习。
但我发现,以我们的经验,不学到一定的深度和广度是难以在实际工作中应付自如的。
因此反映出学习的还不够,缺点疏漏。
需在加以刻苦钻研及学习,不断开拓视野,增强自己的实践操作技能,我们也许看不惯企业之间残酷的竞争,无法忍受同事之间漠不关心的眼神和言语。
很多时候觉得自己没有受到领导重用,所干的只是一些无关重要的杂活,自己的提议或工作不能得到老板的肯定。
做不出成绩时,会有来自各方面的压力,老板的眼色同事的嘲讽。
嵌入式实时操作系统实验报告
嵌入式实时操作系统实验报告一、实验目的本实验的目的是让学生了解嵌入式实时操作系统的基本概念和特点,并能够运用实时操作系统编写嵌入式程序。
同时,通过本实验让学生对实时性和可靠性的要求有更深入的理解。
二、实验内容本实验的内容包括以下几个方面: 1. 实时操作系统的概念和基本特点; 2. 实时操作系统的任务调度机制; 3. 实时操作系统的信号量和消息队列; 4. 在实时操作系统上编写一个简单的示例程序。
三、实验原理1. 实时操作系统的概念和基本特点实时操作系统是一种以时间为基础的操作系统,它具有两个主要特点:可预测性和可靠性。
可预测性是指系统可以在规定时间内完成特定的任务,同时提供精确的响应时间。
可靠性是指系统能够保证任务的正确性和可靠性。
2. 实时操作系统的任务调度机制实时操作系统的任务调度有两种方式:一种是基于优先级的抢占式调度,另一种是基于时间片的轮询式调度。
在优先级抢占式调度中,系统会根据任务的优先级来决定任务的执行顺序。
而在时间片轮询式调度中,系统会为每个任务分配一个时间片,当时间片用完后会切换到下一个任务。
3. 实时操作系统的信号量和消息队列信号量是操作系统中一种用于同步和互斥的机制,信号量可以用来保护共享资源,从而避免多个任务同时访问共享资源导致的冲突。
消息队列是一种用于任务之间通信的机制,它可以保证任务之间传递的消息的可靠性和有序性。
4. 编写示例程序在实时操作系统上编写程序时,需要首先定义任务,并对任务的优先级进行设置。
然后在任务中编写对共享资源的读/写操作,同时使用信号量或消息队列来实现任务之间的通信。
四、实验步骤1.学习实时操作系统的概念和基本特点;2.了解实时操作系统的任务调度机制,包括优先级抢占式调度和时间片轮询式调度;3.学习实时操作系统的信号量和消息队列;4.根据实验要求,编写一个简单的示例程序;5.运行程序并进行测试,检查程序的正确性和实时性。
五、实验结果与分析在本实验中,我首先学习了实时操作系统的基本概念和特点,并了解了其任务调度机制和信号量、消息队列等机制。
嵌入式系统实训报告范文3篇
嵌入式系统实训报告范文嵌入式系统实训报告范文精选3篇(一)以下是一份嵌入式系统实训报告范文,供参考:实训报告课程名称:嵌入式系统实训姓名:XXX学号:XXXX日期:XXXX年XX月XX日一、实训目的和背景嵌入式系统是一种专门用于控制和执行特定任务的计算机系统。
本次实训旨在通过设计、搭建并测试一个简单的嵌入式系统,帮助学生理解嵌入式系统的根本原理和应用,并提供理论时机来加深对嵌入式系统的理解和应用才能。
二、实训内容1. 系统设计本实训的目的是设计一个简单的温度监测系统。
该系统包括一个传感器用于检测环境温度,并将温度值传输到单片机上进展处理。
单片机再将处理后的数据显示在LCD屏幕上。
2. 硬件搭建根据系统设计,我们首先需要准备以下硬件器件:传感器、单片机、LCD屏幕、电等。
实际搭建时,我们按照电路图连接各个硬件器件,并进展电接入和信号连接的测试。
3. 软件编程完成硬件搭建后,接下来需要进展软件编程。
我们使用C语言来编写嵌入式系统的程序。
主要编程内容包括读取传感器数据、对数据进展处理和计算、将计算结果显示在LCD屏幕上等。
4. 系统测试完成软件编程后,我们进展系统测试。
主要测试内容包括:检测传感器是否能准确读取温度数据、单片机是否能正确处理数据、LCD屏幕是否正常显示等。
通过测试,可以评估系统的稳定性和可靠性。
三、实训收获通过参与本次实训,我收获了以下几点:1. 对嵌入式系统的理解更加深化:通过实操,我对嵌入式系统的原理和应用有了更深化的理解。
2. 掌握了硬件搭建和连接的技能:我学会了如何搭建和连接硬件器件,进步了理论操作才能。
3. 锻炼了软件编程才能:通过编写嵌入式系统的程序,我熟悉了C语言的应用,并提升了编程才能。
4. 增加了问题解决才能:在搭建和编程过程中,遇到了一些困难和问题,通过不断调试和学习,我学会了如何解决问题和排除故障。
综上所述,本次嵌入式系统实训对于进步我的理论操作才能、编程才能和问题解决才能具有重要意义。
嵌入式实时操作系统实验报告
实验一任务的创建与多任务设计实验目的1.掌握任务创建和多任务启动的方法;2、理解任务管理的基本原理, 了解任务的各个基本状态及其变迁过程;3.掌握uC/OS-II 中任务管理的基本方法(创建、启动、挂起、解挂任务);4.熟练使用uC/OS-II 任务管理的基本系统调用;5.熟悉IAR软件的使用;6.熟悉硬件系统和下载方法。
7、实验仪器1. LB-STM32 嵌入式实验开发系统;2. USB 仿真器;3. 带IAR软件(集成开发环境)PC。
实验原理从应用程序设计的角度来看, UC/OS-II的任务就是一个线程, 就是一个用来解决用户问题的C语言函数和与之相关的一下数据结构而构成的一个实体,由于系统存在着多个任务, 于是系统如何来识别并管理一个任务就是一个需要解决的问题。
识别一个任务的最直接的办法是为每一个任务起一个名称。
由于μC/OS-II中的任务都有一个惟一的优先级别, 因此μC/OS-II是用任务的优先级来作为任务的标识的。
所以, 任务控制块还要来保存该任务的优先级别。
1.创建1个用户任务并运行1 重新全编译调试程序代码#define OS_GLOBALS#include "includes.h"#define TASK_STK_SIZE 512OS_STK MyTaskStk[TASK_STK_SIZE];u8 *s_M="0";u8 x=0,y=0;void MyTask(void *data);* 函数名: void main(void)* 描述: main* 输入参数: None.* 输出参数: None.* 返回: None.void main(void){#if (OS_TASK_NAME_SIZE > 14) && (OS_TASK_STAT_EN > 0) INT8U err;#endif//目标板初化,Target_Init();#if OS_TASK_STAT_EN > 0OSStatInit();#endifOSInit();//设置空闲任务名称#if OS_TASK_NAME_SIZE > 14OSTaskNameSet(OS_TASK_IDLE_PRIO, "uC/OS-II Idle", &err); #endif//设置统计任务名称#if (OS_TASK_NAME_SIZE > 14) && (OS_TASK_STAT_EN > 0) OSTaskNameSet(OS_TASK_STAT_PRIO, "uC/OS-II Stat", &err); #endifOSTaskCreate(MyTask, s_M, &MyTaskStk[TASK_STK_SIZE - 1], 0); OSStart( );}void MyTask (void *pdata){u8 *s_Y="1";pdata = pdata;OSStatInit( );for (;;){if(x==9){x=1;y++;Lightup_led(1); /*该函数点亮由x指定的led灯*/ Lightdown_led(8); /*该函数熄灭由x指定的led灯*/}else{Lightup_led(x);Lightdown_led(x-1);}Show_num1(y);x=x+1;if (Get_key( )== 8){Sys_return(); //此处停止系统}OSTimeDlyHMSM(0, 0, 1, 0);}}显示一个数#define OS_GLOBALS#include "includes.h"#define TASK_STK_SIZE 512OS_STK MyTaskStk[TASK_STK_SIZE];INT16S key;u8 *s_M="0";u8 X=0,Y=0;void MyTask(void *data);* 函数名: void main(void)* 描述: main* 输入参数: None.* 输出参数: None.* 返回: None.void main(void){#if (OS_TASK_NAME_SIZE > 14) && (OS_TASK_STAT_EN > 0) INT8U err;#endif//目标板初化,Target_Init();#if OS_TASK_STAT_EN > 0OSStatInit();#endifOSInit();//设置空闲任务名称#if OS_TASK_NAME_SIZE > 14OSTaskNameSet(OS_TASK_IDLE_PRIO, "uC/OS-II Idle", &err); #endif//设置统计任务名称#if (OS_TASK_NAME_SIZE > 14) && (OS_TASK_STAT_EN > 0) OSTaskNameSet(OS_TASK_STAT_PRIO, "uC/OS-II Stat", &err); #endifOSTaskCreate(MyTask, s_M, &MyTaskStk[TASK_STK_SIZE - 1], 0); OSStart( );}void MyTask (void *pdata){pdata = pdata;OSStatInit( );for (;;){if (Y=X){Y+=1;Lightup_led(1); /*该函数点亮由x指定的led灯*/ Lightdown_led(8); /*该函数熄灭由x指定的led灯*/}Show_num2(Y);X++;if (Get_key( )== 8){Sys_return(); //此处停止系统}OSTimeDlyHMSM(0, 0,1, 0);}#define OS_GLOBALS#include "includes.h"#define TASK_STK_SIZE 512/ VARIABLES OS_STK KingTaskStk[TASK_STK_SIZE];OS_STK MyTaskStk[TASK_STK_SIZE];OS_STK YouTaskStk[TASK_STK_SIZE];INT16S key;u8 *s_M="0",*s_Y="0",*S_K="0";u8 x=0,y=0,z=0;void KingTask(void *data);void MyTask(void *data);void YouTask(void *data);* 函数名: void main(void)* 描述: main* 输入参数: None.* 输出参数: None.* 返回: None.void main(void){#if (OS_TASK_NAME_SIZE > 14) && (OS_TASK_STAT_EN > 0) INT8U err;#endif//目标板初化,Target_Init();#if OS_TASK_STAT_EN > 0OSStatInit();#endifOSInit();//设置空闲任务名称#if OS_TASK_NAME_SIZE > 14OSTaskNameSet(OS_TASK_IDLE_PRIO, "uC/OS-II Idle", &err);#endif//设置统计任务名称#if (OS_TASK_NAME_SIZE > 14) && (OS_TASK_STAT_EN > 0) OSTaskNameSet(OS_TASK_STAT_PRIO, "uC/OS-II Stat", &err);#endifOSTaskCreate(KingTask,S_K,&KingTaskStk[TASK_STK_SIZE - 1], 0);OSStart( );}void KingTask (void *pdata){OSTaskCreate(MyTask, s_M, &MyTaskStk[TASK_STK_SIZE - 1], 1);OSTaskCreate(YouTask, s_Y, &YouTaskStk[TASK_STK_SIZE - 1], 2);OSTimeDlyHMSM(0,0,100,0);}void MyTask (void *pdata){#if OS_CRITICAL_METHOD ==3OS_CPU_SR cpu_sr;#endifpdata=pdata;OSStatInit();for(;;){if(x==9){x=1;y++;Lightup_led(1); /*该函数点亮由x指定的led灯*/Lightdown_led(8); /*该函数熄灭由x指定的led灯*/}else{Lightup_led(x);Lightdown_led(x-1);}Show_num1(y);x+=1;if(Get_key()==8){Sys_return();}OSTimeDlyHMSM(0,0,1,0);}}void YouTask(void *pdata){#if OS_CRITICAL_METHOD==3OS_CPU_SR cpu_sr;#endifpdata=pdata;for(;;){if(z==5){z=1;y++;Lightup_led(1); /*该函数点亮由x指定的led灯*/Lightdown_led(4); /*该函数熄灭由x指定的led灯*/ }else{Lightup_led(z);Lightdown_led(z-1);}Show_num2(y);z+=1;if(Get_key()==5){Sys_return();}OSTimeDlyHMSM(0,0,1,0);}}。
嵌入式实习报告6篇
嵌入式实习报告6篇嵌入式实习报告篇1此次设计我们采用以LM3S2100为微控制器,并通过硬件和软件两方面设计,结合6位LED数码管,放大整形电路,来实现频率计在嵌入式系统中的开发与应用。
本次课程设计其主要目的是通过这学期所学的ARM知识,来实现频率计的功能,本次设计我们利用了定时计数器的功能,对输入的信号进行实时的、高精度的频率测量,并通过6位LED数码显示管显示测量结果。
论文中阐述了相关的硬件原理与应用方案,并在此基础上叙述了软件设计最终结合硬件和软件完成了本次设计。
关键词:LM3S2100、频率计、LED数码显示管1绪论频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。
它是一种用十进制数字显示被测信号频率的数字测量仪器。
它的基本功能是测量正弦信号,方波信号及其他各种单位时间内变化的物理量。
在进行模拟、数字电路的设计、安装、调试过程中,由于其使用十进制数显示,测量迅速,精确度高,显示直观,经常要用到频率计。
本频率计将采用定时、计数的方法测量频率。
测量范围在9kHz以下的方波,时基宽度为1us,10us,100us,1ms。
用ARM芯片实现自动测量功能。
基本设计原理是直接用十进制数字显示被测信号频率的一种测量装置。
它以测量周期的方法对方波的频率进行自动的测量。
1.1本次设计任务一.设计题目:ARM为内核的频率计二.主要功能:用ARM的定时器/计数器的定时和计数功能,外部扩展6位数码管,要求累计每秒进入ARM的外部脉冲个数,用LED数码管显示出来,或是用上位机显示。
三.设计要求:用protel画出最小系统和外围扩展电路。
显示部分可用LED数码管或是上位机显示。
要求小组成员分工明确。
1.2设计基本原理所谓频率,就是周期性信号在单位时间(1s)内变化的次数,若在一定时间间隔T内测得这个周期性信号的重复变化次数为N,则其频率可表示为被测信号经放大整形电路变成计数器所要求的脉冲信号,其频率与被测信号的频率相同。
嵌入式实时系统原理及应用开发实验报告
嵌入式实时系统原理及应用开发实验报告7MS320VC5416 TLC320AD50C图1.1语音录放原理图语音录放实验程序流程图如下:旳盼化【用pS|F初*Er化?KnlJ AD5Ui!th' -Millai:(AIK' l)ACIT 开 * ISM L BSP申斷伫I图1.2语音录放程序流程图2.设计性实验原理编写卷积算法程序,用汇编或C语言实现均可。
在CCS下编译、调试并观n察运算结果。
卷积公式y[j] h[k]x[j k],其中k 0h[n] 3 (n) 4 (n 1) 5 (n 2) 6 (n 3),x[n] 2 (n) 3 (n 1) 4 (n 2) 流程图如图1.3所示。
图1.3卷积计算流程图三、使用仪器、材料PC机,SZDSPF型开发实验平台,DSP仿真器,耳机麦克风四、实验步骤1、验证性实验(1)硬件连接:a接通实验所需的硬件电路,将实验箱上的电源模块开关“ MS2”“ MS3、“ MS4、“ MS5按下,打开机箱电源(在机箱右侧船型开关)。
b、SZ-5416D 主控模块上的J2、J4、J7、J9、J16 短接。
c、设置模块” SW中“ A和“C”设置为“1。
d、将麦克风(红色端)插入语音输入插座(In put —M1),将耳机(黑色端) 插入语音输出插座(Output—M2)。
e图像、语音处理模块上J3跳到“ S、。
(2)启动CCS,参考附1.1 “CCS的使用参考步骤”建立工程、编译、下载目标文件并运行。
(3)View/Graph/Time/Frequency打开图形窗口,在地址栏输入0x1000,长度为2000,数值类型为16位有符号位,其它设置不变。
2、设计性实验参考附件1,在CCS下建立一工程文件调试自己编写的算法程序并运行,观察运行结果。
# !■五b j 庁El f »Ui -_j Frflj-ivij-卫 mui. SJ ^_j T.^/Hroi c<jifx( fc fsriflii ate d F II ISF "| IsKludfe • _J l&tEKLtl H _j Swm M] i it_rtu sKe j i- CH.d岸 i K1 nd 睜 € 9td g > h >■ ■. .-r. -r ^ 3 u : f \ 】sit ・ g) k u 口i@t k * Oi Int j-Of mt P *U »・Q; "JlJta 的45建,晨空作为 inl ^■np -Q ;F T」兀:」*4丨 { t urmif>»j-k :if (teap< 0) itQEftp ・ J ; } 5^4-< f [IfPSP^Pl )1 } printf ( <:* r “M ]: sunL-Oj*Lfit PP3 1 L (、kLELt f [ 6 ) ■ {3,4 . S .int g[b]・{2.3.< ■ ■ -■ '»( f r g ) i [0;□ D ■ ■ 匕17』电43 3E 农图1.4语音信号波形图二、设计性实验f[6]=[3,4,5,6]和g[6]=[2,3,4]的卷积结果为:6 17 34 43 38 24。
嵌入式实时操作系统实验报告
嵌入式操作系统实验报告系别:班级:学号:姓名:2013.12实验一嵌入式开发环境的建立一、实验目的通过此实验系统,读者可以了解嵌入式实时操作系统uC/OS-II 的内核机制和运行原理。
本实验系统展示了uC/OS-II 各方面的管理功能,包括信号量、队列、内存、时钟等。
在各个实验中具体介绍了uC/OS-II 的相关函数。
读者在做实验的同时能够结合理论知识加以分析,了解各个函数的作用和嵌入式应用程序的设计方法,最终对整个uC/OS-II 和嵌入式操作系统的应用有较为清楚的认识。
二、实验步骤1. 安装集成开发环境LambdaEDU集成开发环境LambdaEDU 的安装文件夹为 LambdaEDU ,其中有一个名为“Setup.exe”的文件,直接双击该文件便可启动安装过程。
具体的安装指导请看“LambdaEDU 安装手册.doc”文件。
当 LambdaEDU 安装完毕之后,我们看到的是一个空的界面,现在就开始一步一步地将我们的实验项目建立并运行起来。
2. 建立项目为了我们的实验运行起来,需要建立1 个项目基于x86 虚拟机的标准应用项目。
通过点击“文件”、“新建”、“项目”开始根据向导创建一个项目。
可执行的应用程序项目。
在随后出现的对话框中填入项目名称“ucos_x86_demo”。
点击“下一步”。
选择“pc386 uC/OS-II 应用(x86)”作为该项目的应用框架。
点击“下一步”选择“pc386_elf_tra_debug”作为该项目的基本配置。
点击“完成”。
新创建的项目“ucos_x86_demo”将会被添加到项目列表。
src 文件夹下保存了该项目中包含的源文件。
ucos2 文件夹中包含了移植到x86 虚拟机的全部代码。
init.c 文件是基于ucos2和本虚拟机的一个应用程序。
在进行ucos2 内核实验中,只需要替换init.c 文件,即可。
文件名不限,但是文件名中最好不要使用英文符号和数字以外的其他字符,3. 构建项目到这里,项目配置全部完成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式实时操作系统实验报告任务间通信机制的建立系别计算机与电子系专业班级*****学生姓名******指导教师 ******提交日期 2012 年 4 月 1 日一、实验目的掌握在基于嵌入式实时操作系统μC/OS-II的应用中,任务使用信号量的一般原理。
掌握在基于优先级的可抢占嵌入式实时操作系统的应用中,出现优先级反转现象的原理及解决优先级反转的策略——优先级继承的原理。
二、实验内容1.建立并熟悉Borland C 编译及调试环境。
2.使用课本配套光盘中第五章的例程运行(例5-4,例5-5,例5-6),观察运行结果,掌握信号量的基本原理及使用方法,理解出现优先级反转现象的根本原因并提出解决方案。
3.试编写一个应用程序,采用计数器型信号量(初值为2),有3个用户任务需要此信号量,它们轮流使用此信号量,在同一时刻只有两个任务能使用信号量,当其中一个任务获得信号量时向屏幕打印“TASK N get the signal”。
观察程序运行结果并记录。
4. 试编写一个应用程序实现例5-7的内容,即用优先级继承的方法解决优先级反转的问题,观察程序运行结果并记录。
5.在例5-8基础上修改程序增加一个任务HerTask,它和YouTask一样从邮箱Str_Box里取消息并打印出来,打印信息中增加任务标识,即由哪个任务打印的;MyTask发送消息改为当Times为5的倍数时才发送,HerTask接收消息采用无等待方式,如果邮箱为空,则输出“The mailbox is empty”, 观察程序运行结果并记录。
三、实验原理1. 信号量µC/OS-II中的信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的等待任务表。
用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成1,这样µC/OS-II 才能支持信号量。
在使用一个信号量之前,首先要建立该信号量,也即调用OSSemCreate()函数(见下一节),对信号量的初始计数值赋值。
该初始值为0到65,535之间的一个数。
如果信号量是用来表示一个或者多个事件的发生,那么该信号量的初始值应设为0。
如果信号量是用于对共享资源的访问,那么该信号量的初始值应设为1(例如,把它当作二值信号量使用)。
最后,如果该信号量是用来表示允许任务访问n个相同的资源,那么该初始值显然应该是n,并把该信号量作为一个可计数的信号量使用。
µC/OS-II提供了5个对信号量进行操作的函数。
它们是:OSSemCreate(),OSSemPend(),OSSemPost(),OSSemAccept()和OSSemQuery()函数。
图 F6.5说明了任务、中断服务子程序和信号量之间的关系。
图中用钥匙或者旗帜的符号来表示信号量:如果信号量用于对共享资源的访问,那么信号量就用钥匙符号。
符号旁边的数字N代表可用资源数。
对于二值信号量,该值就是1;如果信号量用于表示某事件的发生,那么就用旗帜符号。
这时的数字N代表事件已经发生的次数。
从图 F6.5中可以看出OSSemPost()函数可以由任务或者中断服务子程序调用,而OSSemPend()和OSSemQuery()函数只能有任务程序调用。
2. 优先级反转在本实验中,要体现嵌入式实时内核的优先级抢占调度的策略,并显现由于共享资源的互斥访问而出现的优先级反转现象。
优先级反转发生在有多个任务需要使用共享资源的情况下,可能会出现高优先级任务被低优先级任务阻塞,并等待低优先级任务执行的现象。
高优先级任务需要等待低优先级任务释放资源,而低优先级任务又正在等待中等优先级任务,这种现象就被称为优先级反转。
两个任务都试图访问共享资源是出现优先级反转最通常的情况。
为了保证一致性,这种访问应该是顺序进行的。
如果高优先级任务首先访问共享资源,则会保持共享资源访问的合适的任务优先级顺序;但如果是低优先级任务首先获得共享资源的访问,然后高优先级任务请求对共享资源的访问,则高优先级任务被阻塞,直到低优先级任务完成对共享资源的访问。
3. 优先级继承优先级继承的主要思想是:当高优先级任务因申请某共享资源失败被阻塞时,把当前拥有该资源的、且优先级较低的任务的优先级提升,提升的高度等于这个高优先级任务的优先级。
在μC/OS-II中,在创建管理共享资源的互斥信号量时,可以指定一个PIP(优先级继承优先级),之后可以把拥有共享资源的任务优先级提升到这个高度。
具体过程如下:1. 当任务A申请共享资源S时,首先判断是否有别的任务正在占用资源S,若无,则任务A获得资源S并继续执行;2. 如果任务A 申请共享资源S 时任务B 正在使用该资源,则任务A 被挂起,等待任务B 释放该资源;同时判断任务B 的优先级是否低于任务A 的,若高于任务A,则维持任务B的优先级不变;3. 如果任务B的优先级低于任务A的,则提升任务B的优先级到PIP,当任务B释放资源后,再恢复其原来的优先级。
4. 建立一个信号量, OSSemCreate()程序清单 L6.9是OSSemCreate()函数的源代码。
首先,它从空闲任务控制块链表中得到一个事件控制块[L6.9(1)],并对空闲事件控制链表的指针进行适当的调整,使它指向下一个空闲的事件控制块[L6.9(2)]。
如果这时有任务控制块可用[L6.9(3)],就将该任务控制块的事件类型设置成信号量OS_EVENT_TYPE_SEM[L6.9(4)]。
其它的信号量操作函数OSSem???()通过检查该域来保证所操作的任务控制块类型的正确。
例如,这可以防止调用OSSemPost()函数对一个用作邮箱的任务控制块进行操作[6.06节,邮箱]。
接着,用信号量的初始值对任务控制块进行初始化[L6.9(5)],并调用OSEventWaitListInit()函数对事件控制任务控制块的等待任务列表进行初始化[见6.01节,初始化一个任务控制块,OSEventWaitListInit()][L6.9(6)]。
因为信号量正在被初始化,所以这时没有任何任务等待该信号量。
最后,OSSemCreate()返回给调用函数一个指向任务控制块的指针。
以后对信号量的所有操作,如OSSemPend(), OSSemPost(), OSSemAccept()和OSSemQuery()都是通过该指针完成的。
因此,这个指针实际上就是该信号量的句柄。
如果系统中没有可用的任务控制块,OSSemCreate()将返回一个NULL指针。
值得注意的是,在µC/OS-II中,信号量一旦建立就不能删除了,因此也就不可能将一个已分配的任务控制块再放回到空闲ECB链表中。
如果有任务正在等待某个信号量,或者某任务的运行依赖于某信号量的出现时,删除该任务是很危险的。
程序清单 L6.9 建立一个信号量OS_EVENT *OSSemCreate (INT16U cnt){OS_EVENT *pevent;OS_ENTER_CRITICAL();pevent = OSEventFreeList; (1)if (OSEventFreeList != (OS_EVENT *)0) { (2)OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;}OS_EXIT_CRITICAL();if (pevent != (OS_EVENT *)0) { (3)pevent->OSEventType = OS_EVENT_TYPE_SEM; (4)pevent->OSEventCnt = cnt; (5)OSEventWaitListInit(pevent); (6)}return (pevent); (7)}5. 邮箱邮箱是µC/OS-II中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。
该指针指向一个包含了特定“消息”的数据结构。
为了在µC/OS-II中使用邮箱,必须将OS_CFG.H中的OS_MBOX_EN常数置为1。
使用邮箱之前,必须先建立该邮箱。
该操作可以通过调用OSMboxCreate()函数来完成(见下节),并且要指定指针的初始值。
一般情况下,这个初始值是NULL,但也可以初始化一个邮箱,使其在最开始就包含一条消息。
如果使用邮箱的目的是用来通知一个事件的发生(发送一条消息),那么就要初始化该邮箱为NULL,因为在开始时,事件还没有发生。
如果用户用邮箱来共享某些资源,那么就要初始化该邮箱为一个非NULL的指针。
在这种情况下,邮箱被当成一个二值信号量使用。
µC/OS-II提供了5种对邮箱的操作:OSMboxCreate(),OSMboxPend(),OSMboxPost(),OSMboxAccept()和OSMboxQuery()函数。
图 F6.6描述了任务、中断服务子程序和邮箱之间的关系,这里用符号“I”表示邮箱。
邮箱包含的内容是一个指向一条消息的指针。
一个邮箱只能包含一个这样的指针(邮箱为满时),或者一个指向NULL的指针(邮箱为空时)。
从图 F6.6可以看出,任务或者中断服务子程序可以调用函数OSMboxPost(),但是只有任务可以调用函数OSMboxPend()和OSMboxQuery()。
建立一个邮箱,OSMboxCreate()程序清单 L6.14是OSMboxCreate()函数的源代码,基本上和函数OSSemCreate()相似。
不同之处在于事件控制块的类型被设置成OS_EVENT_TYPE_MBOX[L6.14(1)],以及使用.OSEventPtr域来容纳消息指针,而不是使用.OSEventCnt域[L6.14(2)]。
OSMboxCreate()函数的返回值是一个指向事件控制块的指针[L6.14(3)]。
这个指针在调用函数OSMboxPend(),OSMboxPost(),OSMboxAccept()和OSMboxQuery()时使用。
因此,该指针可以看作是对应邮箱的句柄。
值得注意的是,如果系统中已经没有事件控制块可用,函数OSMboxCreate()将返回一个NULL指针。
邮箱一旦建立,是不能被删除的。
比如,如果有任务正在等待一个邮箱的信息,这时删除该邮箱,将有可能产生灾难性的后果。
程序清单 L6.14 建立一个邮箱OS_EVENT *OSMboxCreate (void *msg){OS_EVENT *pevent;OS_ENTER_CRITICAL();pevent = OSEventFreeList;if (OSEventFreeList != (OS_EVENT *)0) {OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;}OS_EXIT_CRITICAL();if (pevent != (OS_EVENT *)0) {pevent->OSEventType = OS_EVENT_TYPE_MBOX; (1)pevent->OSEventPtr = msg; (2)OSEventWaitListInit(pevent);}return (pevent); (3)}等待一个邮箱中的消息,OSMboxPend()程序清单 L6.15是OSMboxPend()函数的源代码。