基于STM32的嵌入式操作系统程序设计及实现本科毕业论文_第1页
基于STM32的嵌入式操作系统程序设计及实现本科毕业论文_第2页
基于STM32的嵌入式操作系统程序设计及实现本科毕业论文_第3页
基于STM32的嵌入式操作系统程序设计及实现本科毕业论文_第4页
基于STM32的嵌入式操作系统程序设计及实现本科毕业论文_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、本科毕业论文(设计)基于 STM32 的嵌入式操作系统论文题目 :姓名:程序设计及实现郝宇学号:093001020144班级:01班年级:2009级专业:电子信息工程学院:信息工程学院指导教师 :丁光哲 讲师完成时间2013年 5 月 20日武昌工学院毕业论文(设计)专用稿纸作者声明本毕业论文(设计)是在导师的指导下由本人独立撰写完成 的,没有剽窃、抄袭、造假等违反道德、学术规范和其他侵权行 为。对本论文(设计)的研究做出重要贡献的个人和集体,均已 在文中以明确方式标明。因本毕业论文(设计)引起的法律结果 完全由本人承担 。 矚慫润厲钐瘗睞枥庑赖。毕业论文(设计)成果归武昌工学院所有。特此声明

2、作者专业 : 电子信息工程 作者学号 : 093001020144作者签名年月日武昌工学院毕业论文(设计)专用稿纸基于 STM32的嵌入式操作系统程序设计及实现郝宇The Design and Implementation of embedded operating system program based on STM32 聞創沟 燴鐺險爱氇谴净。Hao, Yu武昌工学院毕业论文(设计)专用稿纸2013 年 5 月 20 日武昌工学院毕业论文(设计)专用稿纸摘要随着科学技术不断的进步,工业生产越来越先进复杂,操作系统C/OS-II是高效、稳定、可靠、节能的系统,广泛应用安防, 消费电子中。而

3、基于 Cortex-M3 架构下的 STM32 是一款性价比优越新型微处理器,将 C/OS-II 移植到 STM32 上能够发挥其高效的性能, 从而投入社会生产, 制造出很多有用又实惠的电子产 品,为我们的生活带来便利。 残骛楼諍锩瀨濟溆塹籟。本文主要的研究内容是 C/OS-II 操作系统理论分析、移植方法、应用程序 设计及调试仿真实现。首先,对 C/OS-II 的理论分析,研究其实际应用及系统 结构;其次,分析 STM32 硬件平台及 C/OS-II 的移植需求;最后,在 C/OS-II 上开发 LCD,LED ,按键 KEY 等应用程序,并对多任务系统调试分析。主要研 究结论如下: 酽锕极

4、額閉镇桧猪訣锥。( 1)C/OS-II 操作系统主要分为任务管理、内存管理和时间管理三大部分, 其间通信是通过消息队列和消邮箱。 彈贸摄尔霁毙攬砖卤庑。( 2)C/OS-II 移植主要在 OS_CPU.H,OS_CPU_C.C,OS_CPU_A.ASM 三 个文件中,涉及到数据类型、堆栈、中断定义和任务切换等。 謀荞抟箧飆鐸怼类蒋薔。(3)应用程序设计优先级分配要合理,硬件平台初始化模块化处理。关键词: 嵌入式系统; C/OS-II ;移植武昌工学院毕业论文(设计)专用稿纸AbstractWith the progress of science and technology constantl

5、y, advanced industrial production to more complex, the operating system C/OS-II is efficient, stable, reliable, energy saving system, widely used in the security, and consumer electronics. And based on the STM32 architecture Cortex-M3 framework is a superior cost-effective new microprocessor, C/OS-I

6、I transplantation to STM32 can play its efficient performance, thus in social production and create a lot of useful and affordable electronic product, bring convenience to our lives. 厦礴恳蹒骈時盡继價骚。This article main research content is C/OS-II operating system theory analysis, method of transplantation,

7、 application design and debugging of the simulation implementation. First of all, the theoretical analysis of C/OS-II , research the actual application and system structure; Second, analysis of STM32 hardware platform and the demand C/OS-II transplantation. Finally, on the C/OS-II development of LCD

8、, LED, button KEY applications, and analysis of multitasking system debugging. Main research conclusion is as follows: 茕桢广鳓鯡选块网羈泪。(1) C/OS-II operating system consists of three major task management, memory management and time management, in which communication is through the message queue and email

9、.鹅 娅尽損鹌惨歷茏鴛賴。(2) C/OS-II transplantation mainly in OS_CPU_C.C, OS_CPU_A.ASM file, OS_CPU.H, three involves the data type definition and task switching etc, stack, interrupt. 籟丛妈羥为贍偾蛏练淨。(3) The application design to the allocation of priorities, initialize the modular processing hardware platform. 預頌

10、圣鉉儐歲龈讶骅籴。Key words: embedded system; C/OS-II ; transplant武昌工学院毕业论文(设计)专用稿纸目录1 概 述 1. 渗釤呛俨匀谔鱉调硯錦。1.1 研究的目的及意义 11.2 国内外研究状况综述1 铙誅卧泻噦圣骋贶頂廡。1.3 研究的主要内容2 擁締凤袜备訊顎轮烂蔷。2 C/OS-II 的理论介绍 3. 贓熱俣阃歲匱阊邺镓騷。2.1 C/OS-II 各模块的基本功能3 坛摶乡囂忏蒌鍥铃氈淚。2.2 STM32 上移植方法7 蜡變黲癟報伥铉锚鈰赘。3 LCD屏程序设计及调试 1. 2 買鲷鴯譖昙膚遙闫撷凄。3.1 工具概述 12 綾镝鯛駕櫬鹕踪

11、韦辚糴。3.2 硬件结构 13 驅踬髏彦浃绥譎饴憂锦。3.3C 程序设计 15 猫虿驢绘燈鮒诛髅貺庑。3.4 调试 16 锹籁饗迳琐筆襖鸥娅薔。结 语 1.8 構氽頑黉碩饨荠龈话骛。主要参考文献 1.9 輒峄陽檉簖疖網儂號泶。附 录 20附录 1 主程序代码 20 尧侧閆繭絳闕绚勵蜆贅。武昌工学院毕业论文(设计)专用稿纸1 概述1.1 研究的目的及意义C/OS-II是由美国工程师 Jean Labrosse编写的嵌入式多任务的实时操作系 统,包括实时内核、任务管理、时钟管理、任务间通信同步 (信号量、邮箱、消 息队列 )和内存管理。除了有上面的优点外, C/OS-II它具有别的操作系统没有的

12、优点,具体如下: 识饒鎂錕缢灩筧嚌俨淒。(1)源代码开放: C/OS-II 的源代码可以免费获取,且标有清晰的注释, 可读性好。(2)可移植性好: C/OS-II的源代码90以上是用 C语言编写的,可以很容 易地把它移植到各类 8位、16位和 32位处理器上。 凍鈹鋨劳臘锴痫婦胫籴。(3)稳定性高: C/OS-II已得到 FAA的标准认证,且目前已有上百个商业 应用实例,其稳定性和可靠性是经过实践验证的。 恥諤銪灭萦欢煬鞏鹜錦。因此, C/OS-II广泛的应用于控制系统中,如在衍射仪高压控制系统中使用 C/OS-II操作系统是一种很好的选择。控制系统是一个复杂的系统,它需要多个 系统协同工作。

13、 传统的系统开发我们往往使用前后台的方式, 但是这种开发方式 在任务较简单的开发中比较适用, 对于任务比较复杂的系统往往力不从心。 对于 任务较多而且复杂的情况我们就要引入实时操作系统 RTOS。鯊腎鑰诎褳鉀沩懼統庫。RTOS体现了一种新的应用程序设计思想和开放的框架, 用户在编写程序时, 可以分别编写各个任务, 不必同时将所有任务运行的各种可能情况记在心中, 大 大减小了程序编写的工作量, 而且减小了出错的可能, 保证最终程序具有高可靠 性,从而降低程序的复杂度和开发周期。 由于控制系统功能较复杂, 诸多的功能 可以划分成许多不同的模块, 模块之间既彼此联系又相对独立, 可以当作不同的 任务

14、来进行处理。所以, 使用实时操作系统, 将不同的功能划分成不同的任务进 行处理使得设计大大简化。 硕癘鄴颃诌攆檸攜驤蔹。1.2 国内外研究状况综述嵌入式系统是继 IT网络技术之后, 又一个新的技术发展方向。 中国单片机二 十年论坛总结出,我国嵌入式起步较早, 但总体来说发展缓慢, 和国外的开发应 用具有很大的差距, 造成这一局面的原因是多方面的。 在国内嵌入式系统开发方 面,多是一些低层次的应用,停留在以前老的技术基础之上。例如,经典 51系列 单片机在上世纪我国的工业信息化改造过程中发挥了重要的作用, 渗透到生产生 活的各个方面。与此同时在大学电类相关的工科单片机教学中, 依然是经典的 51

15、, 微机原理依然是 8086/88,这显然体现不了最新的技术特征,造成了大学教育与 实际社会需要的脱节。 国外的大部分高校和国内的极少数大学相继开设嵌入式微 处理器设计等相关的前沿性的课程, 可见基于 STM32技术将是未来微控制开发的 主流方向。由于 C/OS-II 系统具有体积小、性能强、功耗低、可靠性高以及面向-1-武昌工学院毕业论文(设计)专用稿纸行业应用的突出特征, 目前已经被广泛的应用于军事国防、 消费电子、网络通信、 工业控制等各个领域。 阌擻輳嬪諫迁择楨秘騖。今天嵌入式系统带来的工业年产值已超过了 1万亿美元, 1997年来自美国嵌 入式系统大会 (Embedded Syste

16、m Conference的) 报告指出,未来 5年仅基于嵌入式 计算机系统的全数字电视产品,就将在美国产生一个每年 1500亿美元的新市场。 美国汽车大王福特公司的高级经理也曾宣称, “福特出售的计算能力已超过 了 IBM ”,由此可以想见嵌入式计算机工业的规模和广度。 1998年11月在美国加 州举行的嵌入式系统大会上,基于 RTOS的 Embedded Interne成t 为一个技术新热 点。在国内,“维纳斯计划”和“女娲计划”一度闹得沸沸扬扬,机顶盒、信息 加电这两年更成了 IT热点,而实际上这些都是嵌入式系统在特定环境下的一个特 定应用。据调查, 目前国际上已有两百多种嵌入式操作系统,

17、 而各种各样的开发 工具、应用于嵌入式开发的仪器设备更是不可胜数。在国内,虽然嵌入式应用、 开发很广, 但该领域却几乎还是空白, 只有三两家公司和极少数人员在从事这方 面工作。由此可见, 嵌入式系统技术发展的空间真是无比广大。 氬嚕躑竄贸恳彈瀘颔澩。 1.3 研究的主要内容本文是在基于 32 位的 ARM 微处理器 STM32 和嵌入式实时操作系统 C/OS-II 上进行嵌入式操作系统的移植和功能实现。 通过将嵌入式实时操作系统 C/OS-II 移植到 STM32 微处理器上,并对其进行软件功能的扩展和硬件扩展, 实现了一个基本完整的嵌入式实时操作系统。 建立了基于嵌入式 ARM 处理器的 应

18、用软件体系;将 C/OS-II 移植到 STM32 ,建立了嵌入式操作系统研究及 C/OS-II 下的开发环境体系。包括 C/OS-II 系统配置、 C/OS-II 下的移植、启 动、测试和功能实现等。完成了基于 STM32 的C/OS-II 的应用设计。釷鹆資贏車贖 孙滅獅赘。本文主要分为 4 章,章节安排如下:(1)绪论。主要介绍了开题的背景和研究意义,以及 C/OS-II 的国内外研 究现状。( 2)C/OS-II 的理论介绍。主要介绍 C/OS-II 各模块的基本功能和在 STM32 上移植方法。(3)硬件平台介绍及 LCD 屏程序设计及调试。 多任务的建立并实现基本功 能。(4)结语

19、。主要介绍本论文中的优点和不足之处。-2-武昌工学院毕业论文(设计)专用稿纸2 C/OS-II 的理论介绍2.1 C/OS-II 各模块的基本功能2.1.1 C/OS-II 内核结构(1)C/OS-II 是以源代码形式提供的实时操作系统内核,其包含的文件结 构如图 2.1 所示: 怂阐譜鯪迳導嘯畫長凉。应用软件用户代码)C/OS-II 内核文件( 与处理器类型无关的代码 )OS_CORE.C OS_FLAG.C OS_MBOX.C OS_MEM.C OS_MUTEX.C OS_Q.COS_TASK.COS_TIME.C COS-II.C COS-II.H OS_SEM.CC/OS-II 配置文

20、件( 与应用程序有关 )OS_CFG.HINCLUDES.H移植 C/OS-II(与处理器类型有关的代码)OS_CPU.HOS_CPU_C.C OS_CPU_A.ASM软件CPU定时器图 2.1 C/OS-II 内核结构基于C/OS-II 操作系统进行应用时, 设计时的主要任务是将系统合理划分成多个任务,并由 RTOS进行调度,任务之间使用 C/OS-II 提供的系统服务进行通-3-武昌工学院毕业论文(设计)专用稿纸信,以配合实现应用系统的功能。与前后台系统一样,基于 C/OS-II 的多任务系 统也有一个 main主函数, main函数由编译器所带的 C启动程序调用。在 main主函 数中主

21、要实现 C/OS-II的初始化 OSInit() 、任务创建、一些任务通信方法的创建、 C/OS-II 的多任务启动 OSStart()等常规操作。另外,还有一些应用程序相关的初 始化操作,例如:硬件初始化、数据结构初始化等。 谚辞調担鈧谄动禪泻類。(2) OSInit()初始化 C/OS-II所有的变量和数据结构,并建立空闲任务 OS_TaskIdle(),这个任务总是处于就绪态。 嘰觐詿缧铴嗫偽純铪锩。2.1.2 C/OS-II 内核体系结构图C/OS-II 内核主要对用户任务进行调度和管理, 并为任务间共享资源提供服 务。包含的模块有任务管理、 任务调度、任务间通信、 时间管理、内核初始

22、化等。C/OS-II内核体系结构如图 2.2所示: 熒绐譏钲鏌觶鷹緇機库。图 2.2 内核结构图2.1.3 任务状态及其转换关系 在多任务系统中,任务是设计者实现应用系统的基本形式,也是 C/OS-II 系 统进行调度的基本单元。 任务可以是一个无限的循环, 也可以在一次执行后被操 作系统删除。任务函数和任何 C函数一样,具有一个返回类型和一个参数,但是 它决不返回。 鶼渍螻偉阅劍鲰腎邏蘞。任务控制块( TCB)是一个数据结构 OS_TCB,一旦一个任务创建,就有一 个和它关联的 TCB被赋值。当任务的CPU使用权被剥夺时, 它用来保存该任务的 状态。这样,当任务重新获得 CPU使用权时,可以

23、从 TCB 中获取任务切换前的信 息,准确的继续运行。 纣忧蔣氳頑莶驅藥悯骛。-4-武昌工学院毕业论文(设计)专用稿纸2.1.4 任务调度器 C/OS-II总是运行进入就绪态的优先级最高的任务。任务调度器的功能是: 在就绪表中查找最高优先级的任务,然后进行必要的任务切换,运行该任务。 C/OS-II 的任务调度有两种情况:任务级的任务调度由 OS_Sched()完成;中断级 的任务调度由 OSIntExt() 完成。这两种任务调度情况调用的任务切换函数不同: 任务级的任务调度 OS_Sched()调用了任务切换函数 OS_TASK_SW(),而中断级 的调度 OSIntExt()调用了任务切换

24、函数 OSIntCtxSw()。 颖刍莖蛺饽亿顿裊赔泷。任务级的任务调度是由于有更高优先级的任务进入就绪态,当前的任务的 CPU使用权被剥夺, 发生了任务到任务的切换; 中断级的调度是指当前运行的任 务被中断打断,由于 ISR运行过程中有更高优先级的任务被激活进入就绪态。而 中断返回前 ISR调用OSIntExt() 函数,该函数查找就绪表发现有必要进行任务切 换,从而被中断的任务进入等待状态,运行被激活的高优先级的任务。 濫驂膽閉驟 羥闈詔寢賻。(1) 任务切换 任务切换有两种: OS_TASK_SW()和OSIntCtxSw() 。任务级的任务切换OS_TASK_SW()是宏调用,通过软中

25、断指令来实现 CPU寄存器内容切换。例如: #define OS_TASK_SW() asm(“ int #32 。”銚銻)縵哜鳗鸿锓謎諏涼。任务级的任务切换过程: 保存当前运行的任务的 CPU寄存器值到该任务的 堆栈。如:堆栈指针,程序计数器,状态寄存器等。将要运行的高优先级的任 务的寄存器值从堆栈恢复到 CPU寄存器。进行 TCB的切换,并运行任务 。 挤貼綬 电麥结鈺贖哓类。中断级的任务切换 OSIntCtxSw()是在 OSIntExt()中调用的,我们一般在用户 ISR中调用 OSIntExt()以实现中断返回前的任务调度。由于 ISR已经将 CPU寄存器 的值存入被中断的任务的堆栈

26、中,所以 OSIntCtxSw()的实现和 OS_TASK_SW()不 一样,具体参见移植文档。 赔荊紳谘侖驟辽輩袜錈。(2) 就绪表每 个 就绪 的任 务都 放在 就绪表 中, 就绪 表有 两 个变 量: OSRdyGrp和 OSRdyTbl 。OSRdyGrp中,将任务按优先级分组,八个为一组。 OSRdyGrp的每 一位代表每组任务是否有进入就绪态的任务。 塤礙籟馐决穩賽釙冊庫。在就绪表中查找优先级最高的任务不需要扫描整个 OSRdyTbl ,只要查优先 级判定表 OSUnMapTbl 。OSUnMapTbl 是常量表,所以查找优先级最高的任务 的执行时间为常量,和就绪表的任务数无关。

27、裊樣祕廬廂颤谚鍘羋蔺。2.1.5 中断服务在用户的 ISR中可以调用 OSIntEnter()和OSIntExit()通知 C/OS-II发生了中 断,这样可以实现 ISR返回前的任务调度。 仓嫗盤紲嘱珑詁鍬齊驁。2.1.6 时钟节拍-5-武昌工学院毕业论文(设计)专用稿纸C/OS-II要求用户提供一个周期性的时钟源,来实现时间的延迟和超时功 能,时钟节拍应该每秒发生 10100次 /秒。时钟节拍率越高,系统的额外负荷就 越重。 绽萬璉轆娛閬蛏鬮绾瀧。应该在多任务系统启动后,也就是调用 OSStart()后再开启时钟节拍器。系统 设计者可以在第 1个开始运行的任务中调用时钟节拍启动函数。假设用

28、定时器 TA0 作为时钟中断源, 那么,在移植过程中实现了函数 init_timer_ta0(),此函数用 来初始化定时器 TA0,并将其打开。 C/OS-II 中的时钟节拍服务是在 ISR中调用 OSTimeTick()实现的。 OSTimeTick()跟踪所有任务的定时器以及超时时限。 骁顾燁 鶚巯瀆蕪領鲡赙。2.1.7 C/OS-II 的初始化和启动调用 C/OS-II的服务之前要先调用系统初始化函数 OSInit()。OSInit() 初始化 C/OS-II所有的变量和数据结构, 并建立空闲任务。 C/OS-II 初始化任务控制块、 事件控制块、消息队列缓冲、标志控制块等数据结构的空缓

29、冲区。 瑣钋濺暧惲锟缟馭 篩凉。多任务的启动是通过调用 OSStart()实现的。启动之前要至少创建一个任务。 OSStart()调用就绪任务启动函数 OSStartHighRdy(),其功能是将任务栈的值恢复 到 CPU寄存器,并执行中断返回指令,强制执行该任务代码。 鎦诗涇艳损楼紲鯗餳類。 2.1.8 内存管理在ANSI C 中是使用 malloc和free两个函数来动态分配和释放内存。但在嵌入 式实时系统中,多次这样的操作会导致内存碎片,且由于内存管理算法的原因, malloc和free的执行时间也是不确定。 C/OS-II 中把连续的大块内存按分区管理。 每个分区中包含整数个大小相同的

30、内存块, 但不同分区之间的内存块大小可以不 同。用户需要动态分配内存时,系统选择一个适当的分区,按块来分配内存。释 放内存时将该块放回它以前所属的分区, 这样能有效解决碎片问题, 同时执行时 间也是固定的。 栉缏歐锄棗鈕种鵑瑶锬。2.1.9 任务管理C/OS-II中最多可以支持 64个任务,分别对应优先级 063,其中 0为最高优 先级。 63为最低级,系统保留了 4个最高优先级的任务和 4个最低优先级的任务, 所有用户可以使用的任务数有 56个。C/OS-II 提供了任务管理的各种函数调用, 包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。系统初始化 时会自动产生两个任务:一个是

31、空闲任务, 它的优先级最低, 该任务仅给一个整 型变量做累加运算;另一个是统计任务, 它的优先级为次低, 该任务负责统计当 前 CPU的利用率。 辔烨棟剛殓攬瑤丽阄应。2.1.10 C/OS-II 任务间通信方式(1) 信号量信号量由两部分组成: 一部分是 16位的无符号整型信号量的计数值; 另一部-6-武昌工学院毕业论文(设计)专用稿纸分是由等待该信号量的任务组成的等待任务表。信号量用于对共享资源的访问, 用钥匙符号,符号旁数字代表可用资源数,对于二值信号量该值为1。信号量还可用于表示某事件的发生, 用旗帜符号表示, 符号旁数字代表事件已经发生的次 数。互斥型信号量用于处理共享资源。 峴扬斕

32、滾澗辐滠兴渙藺。(2)消息邮箱 一种通信机制,可以使一个任务或者中断服务子程序向另一个任务发送一个 指针型的变量,通常该指针指向一个包含了消息的特定数据结构。 詩叁撻訥烬忧毀厉 鋨骜。(3)消息队列另一种通信机制, 允许一个任务或者中断服务子程序向另一个任务发送以指 针方式定义的变量或其它任务, 因具体应用不同, 每个指针指向的包含了消息的 数据结构的变量类型也有所不同。 则鯤愜韋瘓賈晖园栋泷。2.2 STM32 上移植方法2.2.1 平台需求 C/OS-II的正常运行需要处理器平台满足以下要求: (1)处理器的 C编译器能产生可重入代码。 胀鏝彈奥秘孫戶孪钇賻。(2)用C语言就可以打开和关闭

33、中断。(3)处理器支持中断,并且能产生定时中断 (通常在 10至100Hz之间)。(4)处理器支持能够容纳一定量数据 (可能是几千字节 )的硬件堆栈。( 5)处理器有将堆栈指针和其它 CPU寄存器读出和存储到堆栈或内存中的 指令。2.2.2 移植方法(1)内核头文件( OS_CPU.H)在OS_CP U.H 中,主要声明了一些与微处理器相关的常量、宏和 typedef。 定义与处理器无关的数据类型typede funsigned charBOOLEAN;typedefunsigned charINT8U;typedefsigned charNT8S;typedefunsigned shortI

34、NT16U;typedefsigned shortINT16S;typedefunsigned intINT32U;typedefsigned intNT32S;typedeffloatFP32;typedefdoubleFP64;typedefunsigned intOS_STK;typedefunsigned intOS_CPU_SR;在STM32处理器及 keil MDK 或者 IAR 编译环境中可以通过查手册得知-7-武昌工学院毕业论文(设计)专用稿纸short类型是 16位而int类型是 32位,这对于 Cortex-M3内核是一致的。故这部分代 码无需修改。尽管 C/OS-II定义

35、了float 类型和double 类型,但为了方便移植它 们在 C/OS-II源代码中并未使用。为了方便使用堆栈, C/OS-II 定义了一个堆栈 数据类型。在 Cortex-M3 中寄存器为 32位,故定义堆栈的长度也为32 位。Cortex-M3 状态寄存器为 32位,定义 OS_CPU_SR主要是为了在进出临界代码段 保存状态寄存器。 鳃躋峽祷紉诵帮废掃減。(2) 临界代码段C/OS-II为了保证某段代码的完整执行,需要临时的关闭中断,在这 段代码执行完成之后再打开中断。这样的代码段称作临界代码段。 C/OS-II 通过 定义两个宏 OS_ENTER_CRITICAL() 和OS_EXI

36、T_CRITICAL() 来分别实现中断 的关闭和打开。一般来说, 采用方法3来实现这两个宏。 这两个宏分别定义如下: 稟虛嬪赈维哜妝扩踴粜。#define OS_CRITICAL_METHOD 3#define OS_ENTER_CRITICAL() cpu_sr = OS_CPU_SR_Save(); 陽簍埡鲑罷規呜旧岿錟。#define OS_EXIT_CRITICAL() OS_CPU_SR_Restore(cpu_sr); 沩 氣嘮戇苌鑿鑿槠谔應。函数 OS_CPU_SR_Save()和 OS_CPU_SR_Restore(cpu_sr在) OS_CPU_A.ASM 中定义。同时得注

37、意,在使用这两个宏之前,必须定义 OS_CPU_SR cpu_sr; 否则编译时将出错。 钡嵐縣緱虜荣产涛團蔺。(3) 栈的增长方向 尽管C/OS-II支持两种方向生长的栈,但对于以 Cortex-M3为内核的 STM32 微处理器来说,它支持向下增长的满栈,故需要定义栈增长方向宏为1。即定义成如下形式 懨俠劑鈍触乐鹇烬觶騮。#define OS_STK_GROWTH 1(4) 任务级任务切换 任务级任务切换调用宏 OS_TASK_SW()来实现。因为这个宏也是与处理器相 关的,因此这个宏在 OS_CPU_A.ASM 中描述。 謾饱兗争詣繚鮐癞别瀘。(5) 其他函数声明在OS_ CPU.H中,

38、还声明了以下几个函数, 这几个函数均在 OS_CPU_A.ASM 中实现。void OSCtxSw(void);void OSIntCtxSw(void);void OSStartHighRdy(void);void OS_CPU_PendSVHandler(void);(6) 与处理器相关的汇编代码( OS_CPU_A.ASM ) 在OS_CP U_A.ASM 中实现的是下面五个与处理器相关的函数 OS_CPU_SR_Save();-8-武昌工学院毕业论文(设计)专用稿纸OS_CPU_SR_Restore();OSStartHighRdy();OSCtxSw();OSIntCtxSw();2

39、.3.3 函数实现(1)关中断函数( OS_CPU_SR_Save() 即先保存当前的状态寄存器然后关中断。故关中断实现代码如下 OS_CPU_SR_SaveMRS R0, PRIMASK ;CPSID IBX LR这也是宏 OS_ENTER_CRITICAL() 的最终实现。(2)恢复中断函数( OS_CPU_SR_Restore()这是宏 OS_EXIT_CRITICAL() 的最终实现。也就是将状态寄存器的内容从 R0 中恢复, 然后跳转回去。 此函数完成的将中断状态恢复到关中断前的状态。 其代 码如下: 呙铉們欤谦鸪饺竞荡赚。OS_CPU_SR_RestoreMSR PRIMASK,

40、R0BX LRCortex-M3 处理器有单独的指令来打开或者关闭中断,所以这两个函数实现 起来很简单。(3) 启动最高优先级任务运行( OSStartHighRdy()OSStart()调用 OSStartHighRdy()来启动最高优先级任务的运行,从而启动整 个系统。 OSStartHighRdy()主要完成以下几项工作: 莹谐龌蕲賞组靄绉嚴减。 为任务切换设置 PendSV的优先级; 为第一次任务切换设置栈指针为 0; 设置OSRunning = TRUE,以表明系统正在运行; 触发一次 PendSV, 打开中断等待第一次任务的切换。(4)任务级和中断级任务切换因为 Cortex-M3

41、进入异常自动保存寄存器 R3-R0, R12,LR,PC和xPSR这种 的特殊机制,这两个函数都是触发一次 PendSV来实现任务的切换。首先是微处 理器自动保存上面提到的寄存器, 然后把当前的堆栈指针保存到任务的栈中, 将 要切换的任务的优先级和任务控制块的指针赋值给运行时的最高优先级指针和 运行时的任务控制块指针, 最后再把要运行的任务的堆栈指针赋值给微处理器的 堆栈指针, 这样就可以退出中断服务程序了。 中断服务程序退出的时候将自动出 栈R3-R0,R12,LR,PC和xPSR。具体的 PendSV服务程序的伪代码如下: 麸肃鹏 镟轿騍镣缚縟糶。-9-武昌工学院毕业论文(设计)专用稿纸O

42、S_CPU_PendSVHandler :/ 进入异常,处理器自动保存 R3-R0,R12,LR ,PC和xPSRif (PSP != NULL) / 判断不是开始第一次任务保存R4-R11到任务的堆栈;OSTCBCur-OSTCBStkPtr = SP; /保存堆栈的指针到任务控制块OSTaskSwHook();/实现用户扩展功能而定义的钩子OSPrioCur = OSPrioHighRdy; /设置运行任务为最高优先级就绪任务OSTCBCur = OSTCBHighRdy; / 设置运行的任务控制块为最高 /就绪任控制块务PSP = OSTCBHighRdy-OSTCBStkPtr;/将要

43、切换的任务堆栈指/ 针赋给微处理器的堆栈指/ 针从而实现切换从堆栈中恢复 R4-R11; 从异常中返回;/ 退出异常,处理器自动恢复 R3-R0,R12,LR ,PC和xPSR 这样很容易写出 PendSV中断服务程序的代码了。(5) 与CPU 相关的C 函数和钩子函数( OS_CPU_C.C )这个文件中包含 10个函数,具体如下:OSInitHookBegin ();OSInitHookEnd ();OSTaskCreateHook ();OSTaskDelHook ();OSTaskIdleHook ();OSTaskStatHook ();OSTaskStkInit ();OSTask

44、SwHook ();OSTCBInitHook ();OSTimeTickHook ();这10个函数有 9个是为了扩展用户功能而定义的钩子函数,这些钩子函数可 以都为空函数,也可以加上一些用户需要的扩展功能。另外一个不是钩子函数, 它是OSTaskStkInit()。这个函数的功能是当一个任务被创建时,它完成这个任务 堆栈的初始化。这个函数首先将用户为任务分配的堆栈顶地址赋值给一个栈指针 变量,然后再通过这个栈指针向任务的栈空间写入初值。这个初值无关紧要, 为 0就可以了。这个函数的代码时下如下: 納畴鳗吶鄖禎銣腻鰲锬。OS_STK *OSTaskStkInit (void (*task)(

45、void *pd), void *p_arg, 風撵鲔貓铁频钙蓟纠庙。-10-武昌工学院毕业论文(设计)专用稿纸OS_STK *ptos, INT16U opt)OS_STK *stk;(void)opt; /防止编译器报错stk = ptos;/ 将栈顶地址赋值给栈指针变量/ 以进入异常的顺序来给栈赋初值*(stk) = (INT32U)0x00000000L; /xPSR*(-stk) = (INT32U)task;/Entry Point*(-stk) =(INT32U)0x00000000L;/ R14 (LR)*(-stk) =(INT32U)0x00000000L;/R12*(-s

46、tk) =(INT32U)0x00000000L;/R3*(-stk) =(INT32U)0x00000000L;/ R2*(-stk) =(INT32U)0x00000000L;/ R1*(-stk) =(INT32U)p_arg;/R0 : 传递的参数/ 剩下的寄存器初始化*(-stk) =(INT32U)0x00000000L;/ R11*(-stk) =(INT32U)0x00000000L;/R10*(-stk) =(INT32U)0x00000000L;/ R9*(-stk) =(INT32U)0x00000000L;/R8*(-stk) =(INT32U)0x00000000L;

47、/R7*(-stk) =(INT32U)0x00000000L;/ R6*(-stk) =(INT32U)0x00000000L;/ R5*(-stk) =(INT32U)0x00000000L;/ R4return (stk);整个移植以此来验其他的钩子函数都为空函数。 这样,整个移植的代码就介绍完了 的过程非常容易。剩下的工作就是编写用户任务,并在开发板上验证, 证该移植方案是可行的和成功的。 灭嗳骇諗鋅猎輛觏馊藹。-11-武昌工学院毕业论文(设计)专用稿纸3 LCD 屏程序设计及调试3.1 工具概述RVMDK 源自德国的 KEIL 公司,是 RealView MDK 的简称。RealVi

48、ew MDK 集成了业内最领先的技术,支持 ARM7 、ARM9 和 Cortex-M3 核处理器,自动配 置启动代码,集成 Flash烧写模块,强大的 Simulation 设备模块,性能分析等功 能。 铹鸝饷飾镡閌赀诨癱骝。3.1.1 keil4工程建立以及仿真方法(1)新建工程。打开 MDK 软件,选择 Project New uVision Project菜单项,新建一个文件 夹名为“毕业设计 ”,保存,则弹出器件选择对话框,这里选择 STM32F103RB。 单击 “OK”按钮,则弹出一个对话框加载启动文件到工程中。 攙閿频嵘陣澇諗谴隴泸。打开“毕业设计 ”文件夹,在里面添加子文件夹

49、(2)添加系统文件与工程管理。回到“毕业设计”文件夹中,把系统 SYSTEM 文件夹(delay,sys,usart文件夹) 复制过来,再建立 main 和 hardware文件夹用于主函数和各外设资源函数。回到 工程中,点击 manage component,s 添加工程中的文件,进行分类管理工程。 趕輾 雏纨颗锊讨跃满賺。(3)最后新建 main 文件,在编辑区写代码。3.1.2 硬件平台绍ALIENTEK MiniSTM32 选择的是 STM32F103RBT6 作为 MCU ,STM32F103 的型号众多,作为一款低端开发板, 选择 STM32F103RBT6 是最佳的选择。 128

50、K FLASH 、20K SRAM、2个 SPI、3个串口、 1个USB 、1个CAN、2个12位的 ADC 、RTC、51 个可用 IO 脚,这样的配置无论放到那里都是很不错的了, 更重要的是其价格, 18 元左右的零售价,相对其他芯片配置及价格,所以我们 选择了它作为我们的主芯片。 夹覡闾辁駁档驀迁锬減。BOOT1 用于设置 STM32 的启动方式,其对应启动模式如表 3.1 所示:表 3.1 BOOT0、 BOOT1 启动模式表BOOT0BOOT1启动模式说明0X用户闪存存储器用户闪存存储器,也就是 FLASH 启动10系统存储器系统存储器启动,用于串口下载11SRAM 启动SRAM 启

51、动,用于在 SRAM 中调试代码按照表 3.1,一般情况下如果我们想用用串口下载代码, 则必须配置 BOOT0 为 1, BOOT1 为 0,而如果想让 STM32 一按复位键就开始跑代码,则需要配置 BOOT0 为 0,BOOT1 随便设置都可以。 ALIENTEK 这款开发板专门设计了一键 下载电路,通过串口的 DTR 和 RTS 信号,来自动配置 BOOT0 和 BOOT1,因-12-武昌工学院毕业论文(设计)专用稿纸此不需要用户来手动切换他们的状态, 直接串口下载和软件自动控制, 可以非常 方便的下载代码。 视絀镘鸸鲚鐘脑钧欖粝。P3和P1分别用于 PORTA和 PORTB的 IO 口

52、引出,其中 P2还有部分用于 PORTC口的引出。 PORTA和PORTB都是按顺序排列的,这样设计的目的是为 了让大家更方便地与外部设备连接。 P2连接了 DS18B20 的数据口以及红外传感 器的数据线,它们分别对应着 PA0和 PA1,只需要 19通过跳线帽将 P2和 P3连 接起来就可以使用了。这里不直接连在一起的原因有二: 1,防止红外传感器和 DS18B20 对这两个 IO 口作为其他功能使用的时候的影响; 2,DS18B20 和红外 传感器还可以用来给其他板子提供输入, 等于我们的板子为别的板子提供了红外 接口和温度传感器,在调试的时候,还是蛮有用的。 P4口连接了 PL2303

53、 的串口 输出,对应着 STM32 的串口 1(PA9/PA10),在使用的时候,也是通过跳线帽 将这两处连接起来。 这样设计有 2个好处:1,使得 PA9和 PA10用作其他用途。 偽澀锟攢鴛擋緬铹鈞錠。使用的时候,不受到 PL2303的影响。 2,USB 转串口可以用作他用,并不 仅限在这个板上的 STM32 使用,也可以连接到其他板子上,这样 ALIENEK MiniSTM32 就相当于一个 USB 串口。P5口是另外一个 IO 引出排阵,将 PORTC 和 PORTD 等的剩余 IO 口从这里引出。 緦徑铫膾龋轿级镗挢廟。在此部分原理图中, 我们还可以看到 STM32F103RBT6 的各个 IO 口与外设 的连接关系,这些将在后面给大家介绍。 这里 STM32 的 VBAT 采用 CR1220 纽 扣电池和 VCC3.3 混合供电的方式,在有外部电源( VCC3.3 )的时候, CR1220 不给 VBAT 供电,而在外部电源断开的时候, 则由 CR1220 给 VBAT 供电。这样, VBAT 总是有电的,以保证 RTC 的走时以及后备寄存器的内容不丢失。 騅憑钶銘侥 张礫阵轸蔼。3.2 硬件结构3.2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论