嵌入式系统实验指导书2-UCOS部分
- 格式:doc
- 大小:369.50 KB
- 文档页数:46
《嵌入式系统原理及应用》——UCOS部分实验指导书华南师范大学物电学院前言随着芯片技术和电子产品智能化的飞速发展,嵌入式技术越来越受到人们的关注,应用领域几乎遍及所有的电子产品:智能机器人、网络通信、军用设备、汽车导航、环境保护、智能仪器等等。
嵌入式系统融合了计算机软、硬件技术、通讯技术和半导体微电子技术,针对实际应用系统要求,将相应的计算机直接嵌入到应用系统中,并可针对应用需求对软、硬件进行优化、裁剪。
通过嵌入式系统课程的学习并结合本次实验,使学生了解嵌入式系统的开发方法和流程,熟悉ARM9-2410硬件平台及其应用处理机的使用方法,熟悉UCOS-II嵌入式操作系统的基本原理、概念。
并能针对ARM9-2410硬件平台、应用需求自行定制、优化UCOS-II操作系统,并独立编写可在ARM9-2410嵌入式设备上运行的应用程序。
所以本实验指导书为学习ARM9-2410硬件平台的学生,配合《嵌入式系统原理与应用》课程的教学,结合ARM9-2410硬件平台编写了这本实验指导书。
《嵌入式系统原理与应用》是一门实践性很强的课程,提高教学质量的一个重要环节是上机实习和训练,无论是学习汇编语言程序设计,还是学习嵌入式操作系统,不通过加强动手是不能获得预期效果的。
本实验指导书提供多个实验的指导性材料,有些实验还有一些有一定难度的选做项目,可以根据课时的安排和教学要求进行取舍。
为了达到某些实验的目的,书中提供的参考程序与实际应用中的程序会有些差别,所以不一定是最优的。
由于时间紧迫,需要赶课程进度与实验时间的同步,加上编者学识有限,书中定有不少欠妥、疏漏之处,还请同学们不吝指正,以利于我们在今后的教学中不断改进和提高。
“嵌入式系统”是一门新兴的课程,如何能让同学们更好地掌握这门新技术,我们也希望听到同学们意见和建议,以便我们能推出更合理的教学、实验方案。
在此谢谢同学们在本学期的支持!实验须知1. 实验前必须阅读教科书的有关部分和本实验指导书,了解实验目的、内容、步骤,做好实验前的准备工作,编写好实验中要求自编或修改的程序;完成实验前要求完成的准备工作后方可以上机实验,否则不得上机操作。
2.严禁带电接线和接插元器件。
通电前须经过指导教师检查认可后方能通电。
3. 不准随意拨弄各种与实验无关的旋钮和开关,凡与本次实验无关的任何设备都禁止动用和摸弄,注意安全。
4. 实验中若损坏仪器或元器件,应及时向指导教师报告。
5. 在实验室内保持安静和卫生,不得随意走动和喧哗,集中精力完成实验。
6. 实验完成后,关掉电源,及时整理实验台桌面,保持环境整洁。
7. 按规定认真完成实验报告,在规定的时间内缴上实验报告。
8. 凡实验或实验报告未能按规定完成的学员,不能参加本课程的考试或考查。
嵌入式实验报告格式实验报告标题一、实验目的二、实验内容三、实验设计及调试:(1)实验分析及内容。
(2)实验设计及调试步骤:根据内容写出实验程序。
调试程序,观察结果。
(3)实验调试过程中所遇到的问题、解决问题的思路和解决的方法。
四、实验后的经验教训总结。
五、对实验课的建议目录第一部分 UCOS-II 内核移植和裁减 (6)1.1 uC/OS-II 移植实验 (6)1.2 内核裁减实验 (8)第二部分µCOS-II 系统实验 (10)实验一µCOS-II 任务基础实验 (10)实验二优先级反转实验 (16)实验三uC/OS-II任务间同步实验 (24)实验四信号量实验——哲学家就餐问题 (26)实验五时间中断实验 (32)实验六邮箱通信实验 (37)实验七消息队列实验 (38)第三部分嵌入式µCOS-II综合实验 (46)实验八交通灯控制 (46)实验九多任务....................................................................................... 错误!未定义书签。
第一部分 UCOS-II 内核移植和裁减1.1 uC/OS-II 移植实验一、实验目的1. 了解uC/OS-II内核的基本原理和主要结构;2. 掌握将uC/OS-II内核移植到ARM处理器上的基本方法;3. 掌握uC/OS-II下基本多任务应用程序的编写。
1. 学习uC/OS-II再ARM处理器上的移植过程;二、实验内容1. 了解嵌入式操作系统的构架,以及具体的uC/OS-II的组成;2. 了解操作系统的移植方法。
三、实验设备1. 硬件:JX44B0教学实验箱、PC机;2. 软件:PC机操作系统Windows 98(2000、XP) +ADT IDE集成开发环境。
二、实验原理1. uC/OS-IIuC/OS-II在特定处理器上的移植工作绝大部分集中在多任务切换的实现上,因为这部分代码主要是用来保存和恢复处理器现场,许多操作如读写寄存器操作不能用C语言,只能使用特定的处理器的汇编语言来完成。
将uC/OS-II 移植到ARM处理器上,需要完成的工作非常简单,修改三个和体系结构相关的文件即可,代码量大约是500行。
这三个文件是OS_CPU_C.c、OS_CPU_C.H以及OS_CPU_A.S,下面将分别说明。
移植步骤之一-- 基本的配置和定义所有需要完成的基本配置和定义全部集中在os_cpu.h 头文件中。
●定义与编译器相关的数据类型。
µCOS-II 为了保证可移植性,程序中没有直接使用int,unsigned int 等定义,而是自己定义了一套数据类型,如INT16U 表示16 位无符号整型,对于ARM 这样的32 位内核,INT16U 是unsigned short 型,如果是16 位的处理器,则是unsigned int 型。
●定义允许和禁止中断宏。
●定义栈的增长方向。
用户规划好栈的增长方向后,定义符号OS_STK_GROWTH 的值。
●定义OS_TASK_SW 宏。
OS_TASK_SW 宏是uC/OS-II 从低优先级任务切换到高优先级任务时的调用,可以采用下面两种方式定义:如果处理器支持软中断,可以使用软中断将中断向量指向OSCtxSw 函数;或者直接调用OSCrxSw 函数。
移植步骤之二-- 移植OS_CPU_A.ASM 汇编代码文件OS_CPU_A.ASM 汇编代码文件有四个汇编函数需要移植。
OSStartHighRdy 函数本函数由OSStart 函数调用,OSStart 函数负责使就绪状态的任务开始运行,其中OSStartHighRdy 负责获取新任务的堆栈指针,并从堆栈指针中恢复新任务的所有处理器寄存器。
函数要移植的原因就是因为它涉及到保存处理器寄存器到堆栈。
OSCtxSw 函数本函数由OS_TASK_SW 宏调用,OS_TASK_SW 宏由OSSched 函数调用,OSSched函数负责任务之间的切换;OSCtxSw 函数在OSSched 函数中负责保存当前任务对应的处理器寄存器到堆栈中,并将任务中需要恢复的处理器寄存器从堆栈中恢复出来。
OSIntCtxSw 函数本函数由OSIntExit 函数调用,OSIntExit 函数由OSTickISR 调用,负责在定时中断中的任务之间的切换,前面提到的函数OSCtxSw 和本函数均负责任务之间的切换,区别主要在于是否在定时中断期间负责任务切换;OSIntCtxSw 函数主要保存当前任务堆栈指针,并将新任务对应的处理器寄存器从堆栈中恢复出来。
OSTickISR 函数时间节拍函数,由定时中断产生,主要负责在进入时保存处理器寄存器,完成任务的切换,退出时恢复寄存器并返回。
移植步骤之三-- 移植OS_CPU_C.C 标准C 代码文件移植µC/OS-II 的第三步是移植C 语言源代码文件OS_CPU_C.C,这个源文件中由6 个函数需要移植:OSTaskStkInit( )OSTaskCreateHook( )OSTaskDelHook( )OSTaskSwHook( )OSTaskStatHook( )OSTimeTickHook( )后面五个HooK 函数,又称为钩子函数,主要用来扩展uC/OS-II 功能。
但必须声明,并不一定要包含任何代码。
唯一必需移植的函数是OSTaskStkInit 函数,这个函数在任务创建时被调用,它负责初始化任务的堆栈结构。
这个函数在大部分ARM 处理器中移植时都可以采用一种形式。
1.2 内核裁减实验一、实验目的1. 本实验的目的让学生了解如何在uC/OS-II 下裁减内核。
二、实验内容1. 裁减uC/OS-II 内核。
三、预备知识1. C 语言的基础知识;2. 程序调试的基础知识和方法。
嵌入式操作系统的裁减的一个直接的目标是使得在满足现有功能的前提下,去掉一些不必要的功能,并对现有程序进行优化使得目标系统运行的代码尺寸尽可能小。
代码尺寸不仅仅和程序编程有关,而且也和所使用的库文件相关,不同的编译器编译uC/OS-II 得到的代码尺寸通常都是不相同的。
在ARM 系统中,硬件资源,尤其是存储器资源通常都比较丰富,而且uC/OS-II 本省已经是比较小型化的一个操作系统。
因此,裁减功能在嵌入式操作系统中体现的并不是非常迫切。
本实验的目的就是在JXARM9-2410 上进行uC/OS-II 的裁减,以学习和理解操作系统裁减的概念和方法,这对于其它操作系统的移植都是很有帮助的。
四、实验设备1. 硬件:JXARM9-2410 教学实验箱、PC 机;2. 软件:PC 机操作系统Windows 98(2000、XP) +ADT IDE 集成开发环境。
五、实验步骤本实验是在µCOS-II 系统实验的基础上进行的,选择其中用到uC/OS-II的信号量的工程(假设为u1),首先从裁减该功能开始。
1. 观察当前uC/OS-II 的大小打开ucos 工作区,并设置u1 为当前活动工程,然后编译,编译成功后将在UCOS-II\debug 目录下有一个u1.elf 文件。
然后点击“Tools”->“elf to binary”菜单项,屏幕将出现一个Windows 控制台窗口后立即消失,此时通过在Windows 资源管理器中查看UCOS-II\debug 目录,可以看到生成了一个u1.bin 的文件,在该文件上点击右键菜单的“属性”选项,可以看到该文件的大小,这个大小就是u1过程生成的代码大小。
2. 裁减信号量功能(功能裁减)打开UCOS-II\os_cfg.h 文件将其中的#define OS_SEM_EN 1/* Include code for SEMAPHORES */修改为:#define OS_SEM_EN 0/* Include code for SEMAPHORES */然后选择“Build”->“Clean”和“Build”->“Build”菜单,在output 窗口的build 提示栏中提示编译错误,如下所示:-------------------- Configuration : u1 - DEBUG --------------------OS_CPU_C.cUCOS_II.c44blib.cuhal.cOS_CPU_A.Sramstart.su1.cE:/UCOS-II/UCOS-II/ u1.c: In function `Main':E:/UCOS-II/UCOS-II/u1.c:134: warning: assignment makes pointer from integer without a cast E:/UCOS-II/UCOS-II/u1.c:135: warning: assignment makes pointer from integer without a cast Link .......\debug\ u1.o(.text+0xd4): In function `TaskLED':E:/UCOS-II/UCOS-II/u1.c:74: undefined reference to `OSSemPend'.\debug\u1.o(.text+0xf4):E:/UCOS-II/UCOS-II/u1.c:81: undefined reference to `OSSemPost'.\debug\u1.o(.text+0x138): In function `TaskSEG':E:/UCOS-II/UCOS-II/u1.c:100: undefined reference to `OSSemPend'.\debug\u1.o(.text+0x158):E:/UCOS-II/UCOS-II/u1.c:107: undefined reference to `OSSemPost'.\debug\u1.o(.text+0x198): In function `Main':E:/UCOS-II/UCOS-II/u1.c:134: undefined reference to `OSSemCreate'.\debug\u1.o(.text+0x1a8):E:/UCOS-II/UCOS-II/u1.c:135: undefined reference to `OSSemCreate' U1.elf - build uncompleted.上面的提示显示在u1.c 文件中调用的OSSemPend 和OSSemPost 函数没有定义,它们是信号量函数,由于在UCOS-II\os_cfg.h 文件中将OS_SEM_EN 定义为0,也就是将信号量功能屏蔽掉了,因此也就没有OSSemPend 和OSSemPost 函数实现,所以报错。