1、嵌入式操作系统的移植和应用课程设计报告院系:自动化学院班级:自动化 100X 班学生:电话:(1)实验选题:LCD 显示字符与 LED 流水灯并行执行,KEY 控制 LED 流水模式切换。(2)实验目的:通过本课程学习,使学生掌握嵌入式操作系统基本知识,了解系统移植和使用的基本方法,软件和硬件结合,培养学生动手解决实际问题能力。(3)实验要求:1. 根据设计题目要求的指标,查阅相关资料;2. 确定开发技术,熟悉、掌握相关开发工具,包括:HEW 集成开发环境、 M16C 开发板使用、u/Cos 嵌入式操作系统移植,按所选课题实现任务测试;3. 编写本课程设计报告。(四)实验原理:嵌入式系统:定义
2、为以应用为中心、计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积功耗严格要求的专用计算机系统。 IEEE 对嵌入式系统的定义为: 嵌入式系统是“用于控制、监视或者辅助操作机器和设备的装置” (devices used to control、monitor、or assist the operation of equipment、machinery or plants)操作系统:是计算机系统中的一个系统软件,它是这样一些程序模块的集合-它们能有效地组织和管理计算机系统中的硬件及软件资源,合理地组织计算机工作流程,控制程序的执行,并向用户提供各种服务功能,使得用户能够灵活、
3、方便、有效地使用计算机,并使整个计算机系统能高效地运行。并发性:所谓“并发性”是指在计算机系统中同时运行着多个程序。程序的并发性具体体现在两个方面:用户程序与用户程序之间并发执行,用户程序与操作系统程序之间并发执行。 共享性:所谓资源“共享性”是指操作系统程序与多个用户程序共用系统中的各种资源。这种共享是在操作系统的控制下实现的。这种共享包括几个方面的内容:)操作系统要管理并发程序对处理器资源的共享,即在多个并发程序间通过调度来分配处理器时间。)操作系统要负责管理对主存和外存的共享使用,并且保证对系统数据共享的正确性和数据的完整性。)操作系统要管理各种外部设备的共享使用。嵌入式(实时)操作系统
4、:用于嵌入式设备的操作系统,具有通用操作系统的基本特点,又具有系统实时性、硬件的相关依赖性、软件固态化以及应用的专用性等优点。嵌入式(实时)操作系统通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器 Browser 等。嵌入式(实时)操作系统的重要指标:实时性(中断响应时间、任务切换时间等) 、尺寸(可裁剪性) 、可扩展性(内核、中间件) 。如下图所示: C/OS-II: 是美国一个名为 Jean Labrosse 的工程师开发的实时操作系统。它以小内核、多任务、丰富的系统服务等特点越来越受欢迎;它具有可移植性:绝大部分的 C/OS-II 的源代码是用一
5、致性强的 ANSIC写的。和微处理器应将相关的那部分使用汇编语言编写,并且已经压到最低限度。可在绝大多数 8 位、16 位、32 位、64 位微处理器、微控制器,数字信号处理器(DSP)上运行。可裁剪:用户可以再使用程序中通过语句#define 定义所需的C/OS-II 功能模块,以减少不必要的存储器空间开支。占先式:属于完全占先式的实时内核,意味着 C/OS-II 总是运行就绪条件下的最高优先级任务。多任务:可以管理 64 个任务,支持 56 个用户任务。赋予每个任务的优先级必须是不相同的,不支持时间片轮转调度法。中断管理:中断可以使正在执行的任务暂时挂起。如果优先级高的任务被唤醒,则高优先
6、级的任务在中断嵌套中全部退出后立即执行,中断嵌套可达 255 层。其他特点:公开源代码、可固化、可确定性、任务栈、体统很多系统服务、稳定性和可靠性强。C/OS-II 提供的系统服务:信号量,带互斥机制的信号量(减少优先级倒置问题) ,事件标志,消息邮箱,消息队列,内存管理,时钟管理,任务管理。M16C/62 :单片机采用高性能硅栅 CMOS 工艺,是 M16C/60 系列单片机中的一种.它具有和所有 M16C/60 系列单片机一样的 CPU 内核,采用 100 脚塑料封装 QFP。数据寄存器(R0,R1,R2,R3) :这四个寄存器为 16 位寄存器.根据命令语句可以作为 8 位或 32 位寄
7、存器用.地址寄存器(A0,A1):A0,A1 为具有和数据寄存器相同功能的 16 位寄存器,可用作相对寻址或间接寻址中的地址寄存器.帧基址寄存器(FB) :FB 为 16 位寄存器,使用于帧相对寻址.程序计数器(PC) :PC 由 20 位组成,指示执行命令的地址中断表格寄存器(INTB) :它由 20 位组成,指示有中断向量表的初始地址堆栈指针(USP/ISP):由 16 位组成,有用户堆栈指针(USP)和中断堆栈指针(ISP)两种.用堆栈指针选择标志 ,可设定使用其中的一种 .启动程序的任务:为了使编好的程序能正常工作在执行程序前需先对单片机进行初始化,并设置堆栈,这些处理通常不是用 C
8、语言编写的,而是用汇编语言写的,单独构成“启动程序” ,NC30 的启动程序为“ncrt30.a30”和“ sect30.inc” 。功能如下:1.划定堆栈的位置2.单片机的初始化位置3.初始化静态变量区4.设置中断表格寄存器“INTB”5.调用 main 函数6.设置中断矢量表(五)实验内容:我在学习了何顶新老师嵌入式理论课程的基础上,自己动手查阅相关资料和书籍,参考学长们的代码,边学边做,一步步完成课程设计。我选择的是第一个题目,LCD 和 LED 并行执行,LCD 显示 LED 灯所代表的的 8421BCD 码数值和流水灯模式,按键控制 LED 流水灯模式。程序流程:OSTaskCrea
9、te(Led,NULL,OSTaskCreate(Lcd,NULL,OSTaskCreate(Key,NULL,说明:LED 流水灯是最高优先级,按键 KEY 是最低优先级。当 LED 灯输出结束时, LED 程序挂起。Lcd 开始显示 Led 流水灯当前数值和加减计数方式。加计数用+表示,减计数用 - 表示。显示完毕以后, Lcd 程序挂起,执行按键 Key 中断响应程序。Key 按键控制 Led 灯显示方式,一号按键表示+ 计数方式,二号按键表示 - 计数方式。按键 Key 一直运行,直到更高优先级的 Lcd 或者 Led 程序结束挂起。(6)核心代码OS_STK TaskLedStkTA
10、SK_STK_SIZE; /分配堆栈OS_STK TaskLcdStkTASK_STK_SIZE;OS_STK TaskKeyStkTASK_STK_SIZE;void main()/*-硬件初始化-*/hardware_init();/*-uCOS 初始化-*/OSInit(); /*-uCOS 创建任务-*/OSTaskCreate(Led,NULL,OSTaskCreate(Lcd,NULL,OSTaskCreate(Key,NULL,/*-uCOS 任务运行-*/OSStart();void Led(void *pdata)unsigned char itemp=0x10;while(
11、1)if(key_mode=1) /模式 1.加计数for(;(itemp=0xA0)|(itemp0x00)itemp=itemp-0x10) p9 = LEDPORT | itemp; LED_OUT(); fflag=itemp;OSTimeDlyHMSM(0, 0, 7, 0); if(itemp=0xA0)|(itemp 4; /将 fflag 缩小到 0-15f = fflag;fm=key_mode;LcdInit();BufferPixelStuff( 2, N, 26, 16, 5, 7);BufferPixelStuff( 2, O, 34, 16, 5, 7); /显示
12、NO.BufferPixelStuff( 2, fm*2+41, 41, 16, 5, 7); /显示+ - 号BufferPixelStuff( 2, :, 48, 16, 5, 7);BufferPixelStuff( 2, ff+48, 54, 16, 5, 7);CommitBuffer( );LCD_ENABLE();/LcdSetContrast(127);OSTimeDlyHMSM(0, 0, 0, 500); /延时使液晶稳定显示(7)实验总结通过这次课程设计,我将课堂上学到的理论知识运用到实践,加深了对嵌入式程序设计的理解,为以后嵌入式的使用打下了基础。我在课程设计的过程中,遇到了很多困难,比如 LCD 的显示等。通过查阅相关资料和书籍,慢慢了解了其中的原理,并逐渐解决了遇到的 LCD 显示的问题。不怕困难,从陌生到熟悉,慢慢学习总有收获。