基于ARM9的μCOSⅡ嵌入式系统移植.doc

上传人:laozhun 文档编号:2392663 上传时间:2023-02-17 格式:DOC 页数:28 大小:2.45MB
返回 下载 相关 举报
基于ARM9的μCOSⅡ嵌入式系统移植.doc_第1页
第1页 / 共28页
基于ARM9的μCOSⅡ嵌入式系统移植.doc_第2页
第2页 / 共28页
基于ARM9的μCOSⅡ嵌入式系统移植.doc_第3页
第3页 / 共28页
基于ARM9的μCOSⅡ嵌入式系统移植.doc_第4页
第4页 / 共28页
基于ARM9的μCOSⅡ嵌入式系统移植.doc_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《基于ARM9的μCOSⅡ嵌入式系统移植.doc》由会员分享,可在线阅读,更多相关《基于ARM9的μCOSⅡ嵌入式系统移植.doc(28页珍藏版)》请在三一办公上搜索。

1、大庆师范学院 本科生毕业论文基于ARM9的C/OS-嵌入式系统移植院 (系) 物理与电气信息工程 专 业 电子信息工程 研 究 方 向 嵌入式技术 学 生 姓 名 钮佳楠 学 号 200901071677 指导教师姓名 成宝芝 指导教师职称 讲师 2013年 5 月 15 日摘 要随着计算机和电子技术的发展,越来越多的嵌入式产品出现在人们的日常生活和工业生产之中。由于嵌入式设备的智能型,使得生活和生产变得极为方便,由此也带来了嵌入式操作系统的迅速发展。本文通过ADS1.2和JLink的软件平台,以及芯片为S3C2440的ARM9开发板,成功进行微型嵌入式操作系统C/OS-在开发板上的移植。在此

2、过程中对于C/OS-进行了较为全面的学习,对于移植操作也有了深刻的认识。关键词:C/OS-;Arm9;移植AbstractWith the development of computer and electronic technology, more and more embedded in peoples daily life and industrial production. Intelligent embedded devices, making life extremely convenient and production, which also brought the rapid

3、 development of embedded operating system.This article by ADS1.2 and JLink, software platforms, and chip S3C2440 ARM9 development board, the success of micro embedded operating system OS-II development board transplantation. In this process, the OS-II for a more comprehensive learning, have a deep u

4、nderstanding for the transplant operation.Key words: u C/OS - ; Arm9; transplant目 录第一章 嵌入式系统基础11.1 嵌入式系统概述11.2 嵌入式体系硬件基础11.3 嵌入式体系软件基础2第二章 C/OS-II介绍3第三章ARM9介绍4第四章 C/OS-在S3C2440上的移植54.1移植环境简介54.2 移植条件54.3 移植内容54.3.1 INCLUDES.H54.3.2 OS_CFG.H64.3.3 OS_CPU.H64.3.4 OS_CPU_C.C64.3.5 OS_CPU_A.ASM8第五章 实例移植

5、95.1 函数配置95.2 工程创建115.3 工程设置125.4 实例调试16第六章 结束语18参考文献19谢 辞20附 录21OS_CPU.H 文件函数:21OS_CPU_A.ASM文件函数21第一章 嵌入式系统基础1.1 嵌入式系统概述与一般的计算机系统不同,嵌入式系统的功能性、可靠性和安全性以及成本、体积、功耗都有严格的要求,并且在以应用为中心的前提下,能够进行软硬件的裁剪。一般嵌入式系统的组成包括以下部分:1. 嵌入式的微处理器2. 硬件设备(外围)3. 嵌入式的操作系统4. 特定应用程序嵌入式的系统特点如下:1. 特定且广泛的应用2. 密集的技术、知识、资金3. 高效性4. 较长生

6、命周期5. 高可靠性6. 软硬件集于一体,以软件为主嵌入式系统的应用领域十分广泛,主要包括交通管理、机器人、军事电子、通信设备、网络设备、医疗仪器、环境监测、汽车电子、工控设备等。嵌入式系统从上世纪60年代中期开始,从无操作系统、简单操作系统、实时操作系统直至今日面向Intenet的阶段,历经50多年。嵌入式因为广泛应用性,巨大的创业型和广阔市场性,走进了千家万户。1.2 嵌入式体系硬件基础存储器、总线和输入输出设备以及作为硬件核心的微处理器共同组成了嵌入式系统的硬件体系。1. 微处理器:至少包含一个微处理器,采用的体系结构是冯诺依曼或哈佛结构。2. 存储器:由内存和外存构成。内存(即主存)存

7、放一些数据和具体的代码;外存中存放各种信息,包括配置信息,调试信息等。3. 总线:种类随处理器的不同而不同,有些处理器总线32位,有些则是26位的。4. 输入/输出接口和设备:包含了串并口、中断处理器和DMA等设备。1.3 嵌入式体系软件基础同WINDOWS类似,嵌入式软件系统一般由操作系统(RTOS)、图形界面(GUI)、网络以及一些通用的模块组成。随着科技和技术的发展,嵌入式产品的功能由单一化转向专业化,成功应用在了各行各业。在除了任务调度,同步机制的一些基本功能外,嵌入式系统还具备有以下优点:1. 可装载卸载性。开放性、可伸缩性体系结构。2. 极强的实时性。EOS实时性较强,可用于各种设

8、备的控制当中。3. 统一的接口。提供了各种设备驱动接口。4. 方便操作、简单、提供图形GUI,图形的界面,追求的是易学易用性。5. 网络协议的多元化,提供各种网络协议的接口。6. 强稳定性和弱交互性。7. 固化的代码,系统和应用软件固化在ROM中。8. 更好的适应硬件,具有良好的移植性。第二章 C/OS-II介绍嵌入式操作系统(RTOS)是一个实时操作系统,所说的实时,就是指在外界中断或事件产生的时候,能够快速进行该中断的接受和处理操作,同时在规定的时间内使之控制相应的过程并作出正确响应的性能。20世纪90年代初期,美国人Jean J.Labrosse在嵌入式系统编程杂志上发表了一个关于名为C

9、/OS 的实时操作系统的文章,从而为C/OS系统掀开了崭新的篇章。微型内核的C/OS源码开放,稳定性强,作为C/OS升级版本的C/OS-II,主要有ANSI C,以及少量的汇编代码构成,全部代码不超过5000行,正因为占用空间的小巧,结构的简洁,基于实时性强的优点,C/OS-II能在多重不同位数的处理器上运行。大到航空航天,小至手持设备,C/OS-II已经成功应用诸多领域,为人们的生活带来了极大的便利。C/OS-II体系结构如图2.1所示图2.1 C/OS-II体系结构第三章ARM9介绍ARM9的低功耗和高性价比,使之在工业生产和日常生活中得到广泛应用。ARM9基于RISC(精简指令)的结构,

10、使它较用微程序控制的复杂指令系统的计算机具有更高的中断响应和指令处理的能力。ARM9的指令集共包含了11种基本类型:1. 桶式的移位器及乘法器和偏上算术的逻辑单元(两种);2. 指令控制数据传送:用在弹性地址,高速内容切换,和交换数据(三种); 3. 控制流程和特权级执行的指令(三种);4. 专门用在能够扩展到片外的协处理器中(三种)。ARM9的指令集比较适用不同的高级语言编译器,但需要临界代码段,汇编语言编程也比较简单,不像其它的需要复杂的编译器来管理指令。ARM9的流水线技术使它可以在译码的同时进行下一条指令的取指操作,具有更高的速率和效率。ARM9有32位地址总线,也可以配制成26位的地

11、址线,使早期版本的处理器能够被它兼容。 全静态CMOS 的ARM9,允许时钟停止循环,并保存当前状态。基于上述的优势,ARM9适用于一些需要紧凑且功能强大的RISC处理器系统,包括电子通讯、数据通信、信息存储、图像处理、JOEG控制器等,为人们的日常生活和工业生产带来了极大的便利。第四章 C/OS-在S3C2440上的移植4.1移植环境简介保证一个系统的内核保证能够在多个微处理器或微控制器上,同时保持了它的实时性和稳定性操作过程,就是移植。本文硬件平台选择的是S3C2440芯片,软件开发环境应用ADS1.2,再通过JLink-H进行调试,基本满足了移植的需求。ARM9的S3C2440,能够在A

12、RM920T核心的基础上,对系统内存进行高效的管理;哈佛体系结构使其执行效率和速度得到了加强。4.2 移植条件由于CPU版本的不同,C/OS-II 可能会出现不兼容的问题,这时需要对操作系统进行移植,使它能够在使用的CPU 上运行。C/OS-II的移植必须满足下列要求:1. 处理器的 C 编译器可产生可重入代码;2. 进入和退出临界区代码用 C 进行调用;3. 处理器必须支持具有定时中断源的硬件中断处理器必须能够容纳一定的数据硬件堆栈;4. 处理器需要有交换数据的指令,使其能够在 CPU 的寄存器和内核及堆栈间进行数据的交换。 4.3 移植内容针对C/OS-的移植操作看似复杂,其实过程并不困难

13、,在理解处理器位数和操作系统位数的前提下,只需要改写几个与处理器硬件相关的函数就能够保证移植操作的成功。一般而言,在C/OS-的移植过程中做到以下几点就基本可以使移植成功:1. 用#define设置一些常量的值(OS_CPU.H)2. 声明10个指定的数据类型(OS_CPU.H)3. 用#define声明2个宏(OS_CPU.H) 4. 用 C 语言编写6个简单函数(OS_CPU_C.C) 5. 根据硬件编写了4个函数(OS_CPU_ A.ASM)4.3.1 INCLUDES.H 在移植初期,需要写入一个被包含在所有.C文件中的头文件,其中包含了可能用到的头文件和一些可能与实际应用不相关的头文

14、件。由于头文件的增加,导致了编译时间变长,但是避免了在编译过程中头文件丢失的风险,大大增强了移植性。当加入新的程序或代码的时,只需将所用头文件放到include.h文件中即可。需要增加的头文件必须需放在include.h头文件的最后,为了避免在编译过程中将已编译的内容再重新进行编译。4.3.2 OS_CFG.H内核是一个系统的核心,而OS_CFG.H就是用来配置内核的头文件,根据不同的需要和应用,我们可以对内核进行定制和裁剪,从而提高了实时性。4.3.3 OS_CPU.H OS_CPU.H:由#define重新定义的与处理器相关的宏,数据类型和常量存放在这个文件中。众所周知,处理器有8位,16

15、位,32位,64位甚至128位,对应到不同处理器的操作系统中位数是不一样的,否则会发生无法兼容的问题,C/OS-中不使用C中使用频繁的short(短整),int(整型)和long(长整)等数据类型。所以为了能够与处理器的字长相匹配,需要对C/OS-中的数据类型进行重新的定义。在任何的操作系统中,中断都是必不可少的,否则在更高优先级的任务发生时,无法对其进行处理,可能导致系统的崩溃。在类似这种情况下,需要对C/OS-进行中断的禁止操作,且在访问代码结束重新将中断置为允许状态。所以在C/OS-中有两个宏: OS_ENTER_CRITICAL()(中断禁止)和OS_EXIT_CRITICAL()(中

16、断允许)。结构常量OS_STK_GROWTH是在移植过程中专门为改变堆栈生长方式而定义的一个宏:将其置1时生长方式是从上往下,置0则相反。在执行中断,或者任务优先级变化的时候,需要任务的切换(低任务优先级级到最高优先级任务)。任务切换简而言之就是将当前任务的寄存器和状态字保存到堆栈中并把更高优先级任务从堆栈中恢复出来。任务切换的时候需要OS_TASK_SW(),在移植过程中需要对这个宏重新定义。4.3.4 OS_CPU_C.C C/OS-的移植中需要用C语言编写六个简单的函数:1. OSTaskStkInit()2. OSTaskCreateHook()3. OSTaskDelHook()4.

17、 OSTaskSwHook()5. OSTaskStatHook()6. OSTimeTickHook()在移植过程中,OSTaskStkInit()是唯一需要进行改写的函数,其余的五个钩子函数(挂机函数),只需要对其声明,不需要详细的代码,且由于只是声明,所以在内核配置文件OS_CFG.H中需要将OS_CPU_HOOKS_EN的值设置为0。4.3.4.1 OSTaskStkInt()OSTaskStkInt():初始化堆栈欧诺个能函数。 在早期任务创建时使用OSTaskCreate()和 OSTaskCreateExt()调用OSTaskStkInt(),在这个过程中OSTaskStkInt

18、()获得通过的pdata指针,任务堆栈栈顶和任务优先级和其它参数参数,以确保正确的初始化堆栈结构。4.3.4.2 OSTaskCreateHook()OSTaskCreateHook():C/OS-的功能扩展的允许与否,在创建任务的时候通过这个函数进行功能设置。建立任务之后会返回一个OS_TCB的指针,在选择扩展功能的时候,该指针会传给OSTaskCreateHook(),通过这个指针访问任务的附加数据(MMU 寄存器,浮点寄存器,以及调试的信息等)和结构成员。从而决定可允许扩展的成员。4.3.4.3 OSTaskDelHook()OSTaskDelHook():用于任务的删除。任务建立之后会

19、返回一个OS_TCB指针,在删除任务的时候,该指针会传给OSTaskDelHook(),通过这个指针访问任务的附加数据和结构成员。从而决定删除的对象。4.3.4.4 OSTaskSwHook()OSTaskSwHook():优先级改变,或者中断发生,进行任务切换的时候调用的函数。调用OSTaskSwHook()期间中断应该处于禁止的状况,这是为了防止程序的崩溃。任务切换的时间越短,任务执行效率越高,所以在任务切换的时候尽量将代码简化,OSTaskSwHook()无参数,也没有返回值。4.3.4.5 OSTaskStatHook()OSTaskStatHook():进行扩展统计功能的函数。OST

20、askStatHook()无参数,无返回值。4.3.4.6 OSTimeTickHook()OSTaskTimeHook():应用于每一个时钟节拍中。事实上,OSTaskTimeHook()是在节拍被C/OS-真正处理,并通知实例或应用程序之前被调用。OSTaskTimeHook()无参数,无返回值。4.3.5 OS_CPU_A.ASM 四个汇编函数的编写是C/OS-移植的重点:1. OSStartHighRdy()2. OSCtxSw()3. OSIntCtxSw()4. OSTickISR()为了节省空间和内存,将所有与处理器相关的函数、代码集中放到OS_CPU_C.C 文件中。4.3.5

21、.1 OSStartHighRdy()OSStartHighRdy():选择优先级最高的任务执行。OSStart是开始运行任务的函数,在运行开始之后可以调用OSStartHighRdy()选择优先级最高的任务执行。在任务切换之后和恢复先前任务之前需要将此函数的OSRunning设置为0。4.3.5.2 OSCtxSw()OSCtxSw():执行最高优先级的任务是C/OS-的特点之一,而OSCtxSw()就是基于此而创建的函数。调用任务切换函数的时候中断也必须处于禁止状态。 4.3.5.3 OSIntCtxSw()OSIntCtxSw():C/OS-中唯一与微处理器相关的函数。4.3.5.4 O

22、STickISR() OSTickISR():为了满足时间期满和延迟功能而编写的函数。第五章 实例移植本章是在基于第四章内容的基础上,进行一个详细的代码实例移植。通过源码介绍、软件设置和仿真调试,实现ARM9开发板上LED灯的控制。5.1 函数配置实例移植是验证移植成功的关键。通过网络或其它途径获得C/OS-的源代码,对于一些在第四章描述的变量、宏和函数进行重新定义和配置。源代码如图5-1所示:图5-1 源代码文件夹在S3C2440文件夹下有两个子文件夹,分别是includes和source,如图5-2所示:图5-2 S3C2440文件夹下的文件在includes文件中包括config.h、l

23、cd.h、mmu.h、Nand.h、Option.h、S3C2440addr.h、S3C2440lib.h、S3C24400slib.h、Timer.h,这些文件都是一些与芯片相关的头文件。如图5-3所示:图5-3 includes文件夹在source文件中包括Timer.c、2440init.s、2440lib.c、2440slib.s、 Font_Libs.c、iphone.c、lcd.c、mmu.c、nand.c、Target.c、main.c等,这些都是一些与芯片相关的源文件,这里的main.c函数可以写入测试程序,执行测试操作,如图5-4:图5-4 source文件夹uCOS_II文

24、件夹中包含了四个文件夹,分别是API、include、arm、SOURCE。图5-5 uCOS_II文件夹在API文件夹中只有一个应用配置相关的头文件:app_cfg.H,如图5-6所示:图5-6 API文件夹include中有三个文件:os_cfg.h、OS_CPU.H和ucos_ii.H,其中OS_CPU.H需要进行配置,如图5-7:图5-7 include文件夹arm文件夹中也是三个文件:IRQ.inc、Os_cpu_a.a、Os_cpu_c.C,其中后两个是需要进行配置的文件,如图5-8所示:图5-8 arm文件夹在SOURCE文件夹中有一个API文件夹(包含os_api.h和os_a

25、pi.c)和os_core.c、os_dbg_r.c、os_flag.c、os_mbox.c、os_mem.c、os_mutex.c、os_q.c、os_sem.c、os_task.c、os_time.c、os_tmr.c、Printf.h、Printf.c和ucos_ii.c文件,这些是一些与系统服务相关的函数文件,比如消息机制,内存共享,信号量等函数。图5-8所示:图5-8 SOURCE文件夹在对源码结构了解之后,就是对所需文件进行相应的配置,具体配置代码见附录1。5.2 工程创建在PC机上安装ADS1.2和JLink-H仿真器(软件和驱动),通过转换口将JLink-H仿真器和ARM9的开

26、发板以及PC机连接起来,ARM9的蜂鸣器短接跳线JP9。 J-Link与ARM9连接图如图5-9所示图5-9 JLink与ARM9的连接图PC机上启动ADS 1.2,新建一个ARM Executable Image工程,在【Project name】中填写工程名称:uCOS.mcp,在Location中填入代码所在位置,工程建立完毕。5.3 工程设置在ADS1.2中的工程建立之后,还需要对于工程进行相应的设置在【Edit】【DebugRel Settings】下在【Target】条目中选择【Target Settings】,将其中的【Post-linker】设置成ARM fromELF,如图5

27、-10所示。图5-10 ADS1.2工程设置(1)在【Target】条目中选择【Access Paths】,将【Always Search User Paths】选中(因为系统的部分文件采用包涵在#include ,这里不做修改可能无法导致文件),如图5.2.2所示。图5-10 ADS1.2工程设置(2)在【Language Settings】条目下依次选择【ARM Assembler】,将其处理器设置成ARM920T,【ARM C Compliler】、【ARM C+ Complier】也是类似操作,如图5-11所示。图5-11ADS1.2工程设置(3)在【Language Settings

28、】条目下选择【ARM C Compliler】,在【Errors】中勾销掉【Implicit pointer c】,然后选择【ARM C Compliler】,在【Warnings】中购销掉【Unused declaration】(-O1 -g+ -cpu ARM920T -Wx -Ec),如图5-12所示图5-12 ADS1.2工程设置(4)在【ARM Linker】条目下选择【Output】,将【RO Base】设置成0x30000000,【Options】下【Image entry point】设置成0x30000000,【Layout】下【Place at beginning of i

29、mage】下的【Object/Symbol】设置成2440init.o,【Section】设置成Init,【Listings】下选勾Image map、【List file】设置list.txt,勾上Sizes、Totals、Unused、Veneers。如图5-13所示。图5-13 ADS1.2工程设置(5)【ARM fromELF】条目下选择【Output file name】,填写“输出的二进制”,如图5-14所示图5-14 ADS1.2工程设置(6)在ADS1.2工程配置过后,同样对JLink-H进行相应的设置。打开JFlashARM,点击Options下拉菜单,找到Project s

30、ettings选项,点击,在【General】中对连接USB端口进行设置(不确定的情况下去系统设备管理器中查找),如图5-15所示:图5-15 JFashArm设置(1)在【Target Interface】条目中的【Core】选择设备:ARM9,如图5-16所示:图5-16 JFashArm设置(2)JLink设置完毕。5.4 实例调试在工程和JLink全部设置完毕,将测试程序写入到main.c函数中,测试程序见附录。设置之后,选用DebugRel生成目标,然后点击Make编译工程。编译成功显示如图5-17所示:图5-17编译界面在这里显示出现0个错误,7个警告,由下面的窗口可知,警告是因为

31、LCD日期打印,导致的原因可能是下载的源码中LCD源码部分不完整或者混淆,但是这不影响移植的测试,所以未加以修改。将ARM9开发板上的蜂鸣器Lcd跳线进行短接,启动方式的选择跳线也短接,然后按RST键复位系统。点击Debug,进行JLink的仿真调试在这里声明一下,因为JLink是一个在线修改下载的仿真器,所以在代码不正确都得情况下,可以直接在线修改,不需要像DNW和超级终端一样重复下载。在main.c中默认设置几个断点,程序会在断点处停止,然后进行分步执行操作同VB类似,在ADS1.2中可以通过观察窗口观察程序中的全局变量和局部变量的值的变化情况,具体操作是点击【Context Variab

32、le】按钮(或者选择【Processor Views】条目下的【Variables】)。 第六章 结束语本文通过对嵌入式、C/OS-和ARM9的介绍,以及较为详细的移植内容分析,基于ADS1.2、EasyJTAG-H仿真器和开发板组合的实例测试,验证了此移植的准确性,为C/OS-嵌入式系统的应用,提供了最为基本的条件。随着科技的发展,工业生产和日常生活的需要,作为一个具有明显优势的实时操作系统,C/OS-具有广泛的应用前景和市场价值,必定会在嵌入式中占据一席之地。参考文献1 王振宇. uC/OS操作系统在ARM系统中的应用D. 长春:吉林大学硕士学位论文, 2003:1-16. 2 李承创,

33、陈跃斌, 房晓丽, 等. uC/OS-III在Cortex-M3处理器上的移植J. 单片机与嵌入式系统应用, 2012(4):42-44. 3 孙顺远,秦会斌,崔佳冬,等. C/OS-在Cortex-M3内核上的移植及优化J. 计算机系统应用, 2010(4):208-211.4 唐其伟. 基于ARM与C/OS-II的嵌入式系统研究D.广州:广东工业大学硕士学位论文, 2005:32-52. 5 罗西门. UCOS_II的移植,ADS1.2+ARM9(S3C2440)EB/OL. 2013-5-15. 2094yeah/blog/static/161844416201172595510470/

34、.6 Jean J.Labrosse.嵌入式实时操作系统uCOS-IIM. 邵贝贝,等译.北京:北京航空航天大学出版社, 2 003 年 :97-145. 7 李玉刚. 嵌入式操作系统C/OS-在ARM上的移植研究J. 微计算机信息, 2010,23:97-98.8 王帅. 基于SOPC的多路温度检测系统设计D.成都:成都理工大学硕士学位论文, 2012:35-38.9 张雪峰. 基于实时内核C/OS-II的应用研究D.成都:西南交通大学硕士学位论文, 2004年4月:1-23.10 陶保壮. 基于ARM7的嵌入式操作系统C/OS-II平台的剖析与实现J.安徽工程科技学院学报, 2009(2)

35、:55-57.谢 辞本文在成宝芝老师的指导下完成。经过几个月的查阅资料、资料学习和论文撰写,成功完成了此篇论文基于ARM9的C/OS-嵌入式系统移植。在查阅资料的过程中,成老师给予了我很大的帮助;资料学习中,不仅仅是对参考资料和C/OS-的了解,对于快速学习,理解的方法也有了较为详细的总结,为以后的学习、工作打下了较为夯实的基础;最为艰难的论文撰写,在这个过程中,经过了一稿、二稿、三稿和终稿,每一稿成老师都给了我很大的意见和帮助,由最初的论文模型,直到最终成为最为合适的论文内容,都少不了老师的指导和帮助。论文的完成,也同样少不了大学四年中教育我的老师们,没有他们,我现在仍旧只是一个懵懂的少年。

36、在他们的帮助下,我成长到了今天,让我具备了步入社会的能力,感谢各位老师。在论文撰写过程中,也感谢曾在培训过程中指导我的叶老师,以及在公司实习过程中帮助我的各位同事。附 录OS_CPU.H 文件函数:#ifdef OS_CPU_GLOBALS#define OS_CPU_EXT#else#define OS_CPU_EXT extern#endif Data type (with the compiler related)typedef unsigned char BOOLEAN; /*无符号布尔类型*/typedef unsigned char INT8U; /*无符号8位整数*/typede

37、f signed char INT8S; /*有符号8位整数*/typedef unsigned char INT16U; /*无符号16位整数*/typedef signed char INT16S; /*有符号16位整数*/typedef unsigned char INT32U; /*无符号32位整数*/typedef signed char INT32S; /*有符号32位整数*/typedef float FP32; /*单精度浮点数(32位长度)*/typedef double FP64; /*双精度浮点数(64位长度)*/typedef unsigned int OS_STK;

38、/*堆栈入口宽度为16位*/ 与处理器相关的代码define OS_ENTER_CRITCAL() /*禁止中断*/define OS_EXIT_CRITICAL() /*允许中断*/define OS_STK_GROWTH 1 /*定义堆栈的增长方向:1=向下,0=向上*/#define OS_TASK_SWOS_CPU_A.ASM文件函数OSStartHighRdy()的原型如程序清单 :void OSStartHighRdy (void)Call a user-defined OSTaskSwHook ();Stack Pointer recovery tasks:Stack point

39、er = OSTCBHighRdy-OSTCBStkPtr;OSRunning = TRUE;New tasks stack to restore all processor registers;Return from interrupt instruction execution;OSCtxSw()的原型程序清单:void OSCtxSw(void)Save processor registers;The current tasks stack pointer is saved to the current task OS_TCB in:OSTCBCur-OSTCBStkPtr = Stac

40、k pointer;Call a user-defined OSTaskSwHook ();OSTCBCur = OSTCBHighRdy;OSPrioCur = OSPrioHighRdy;Get tasks need to restore the stack pointer:Stack pointer = OSTCBHighRdy- OSTCBStkPtr;All processor registers from the new tasks stack to restore it;Execution of an interrupt return instruction;OSIntCtxSw

41、()的原型程序清单:void OSIntCtxSw(void)Adjust the stack pointer to remove the call:OSIntExit (),OSIntCtxSw () onto the stack during the extra content;The current task stack pointer saved to the current task OS_TCB in:OSTCBCur-OSTCBStkPtr = stack pointer;Call a user-defined OSTaskSwHook ();OSTCBCur = OSTCBHi

42、ghRdy;OSPrioCur = OSPrioHighRdy;Get tasks need to restore the stack pointer:Stack Pointer = OSTCBHighRdy- OSTCBStkPtr;All processor registers from the new tasks stack to restore it;Execution of an interrupt return instruction;OSTickISR()程序清单 L 4.4在不正确的位置启动时钟节拍中断void main(void)OSInit (); / * initiali

43、ze C / OS-II * / * Application initialization code . * / * Call OSTaskCreate () to establish at least one task * /Allows the clock tick interrupt; / * Do not allow here! * /OSStart (); / * begin multi-task scheduling * /程序清单 L 4.5时钟节拍ISR的原型void OSTickISR(void)Save processor registers;Call OSIntEnter

44、 () or directly to the OSIntNesting plus 1;Call OSTimeTick ();Call OSIntExit ();Restore processor registers;Execution of an interrupt return instruction;移植测试程序:void OSTaskIdleHook (void)static i = 0 ;if (i %300000 = = 0) /* Each light a LED light 30,000 times */sysUtilsLightLed (LED_ ALL,FALSE) ; /* Turn off all LED lights */sysUtilsLightLed (i %3+1,TRUE) ; /* An LED light cycle */i + + ;ret urn ;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号