五、嵌入式实时操作系统的移植ppt.ppt
《五、嵌入式实时操作系统的移植ppt.ppt》由会员分享,可在线阅读,更多相关《五、嵌入式实时操作系统的移植ppt.ppt(93页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、嵌入式系统设计与实例开发ARM与C/OS-第五讲 C/OS-移植分析和系统初始化北京航空航天大学嵌入式机电控制研究室,提 要,1,2,嵌入式系统的初始化,C/OS-移植分析,初始化程序的下载执行,目标机,宿主机,1)通过编程器将可执行目标文件烧写到BootROM(ROM、EPROM、FLASH)等;2)通过串行口和网口下载执行目标文件,要求宿主机系统上有数据传输工具程序、目标机装载器、嵌入式监视器或目标机系统上的调试代理;3)通过JTAG或BDM接口下载。,嵌入式系统的初始化过程,嵌入式系统的初始化过程,硬件初始化阶段,1. 复位向量 ENTRY b ResetHandler ;for deb
2、ug b HandlerUndef ;handlerUndef b HandlerSWI ;SWI interrupt handler b HandlerPabort ;handlerPAbort b HandlerDabort ;handlerDAbort b . ;handlerReserved b HandlerIRQ b HandlerFIQ,嵌入式系统的初始化过程(2),硬件初始化阶段,2. 最小硬件初始化,1)设置适当的寄存器,使嵌入式处理器处于一个已知的状态:获得CPU的类型。获得或设置CPU的时钟频率。2)禁止中断和高速缓存。3)初始化内存控制器、内存芯片和高速缓存单元,包括:
3、得到内存的开始地址。得到内存的大小。如果有要求,则还需要进行主存测试,嵌入式系统的初始化过程(3),硬件初始化阶段,3. 其余硬件初始化,引导代码调用合适的函数对目标机系统上的全部硬件部件进行初始化,包括:建立执行处理程序。初始化中断处理程序。初始化总线接口。初始化板级外设得到内存的开始地址。,嵌入式系统的初始化过程(4),RTOS初始化阶段,4.RTOS初始化,1)RTOS初始化2)RTOS对象和服务初始化任务信号量定时器中断内存管理3)RTOS任务堆栈初始化4)RTOS扩展部件初始化5)启动RTOS,嵌入式系统的初始化过程(5),应用程序初始化阶段,5.应用程序初始化,ARM7TDMI系统
4、初始化的一般过程,启动(系统上电/复位),从程序入口点,关闭中断,初始化时钟等硬件相关寄存器,初始化存储器系统,初始化C所需要的存储器空间,调用C入口函数,一、设置程序入口指针,上电复位后直接到程序入口点执行,入口点一般为一个跳转表,跳转到复位处理程序处开始执行ARM7TDMI系统的初始化。启动程序首先必须定义入口指针,而且整个应用程序只有一个入口指针。例:AREA Boot,CODE,READONLY ENTRY /*设置程序入口指针*/,二、设置中断向量,ARM要求中断向量必须设置在从OX00000000地址开始,连续8*4字节的地址空间。向量表包含一系列跳转指令,跳转到相应的中断服务程序
5、。对各未用中断,使其指向一个含返回指令的哑函数,以防止错误中断引起系统的混乱。,中断向量表,中断向量表的程序,AREA Boot,CODE,READONLYENTRYB Reset_handlerB Undef_HandlerB SWI_HandlerB PreAbort_HandlerB . ;for reserved interrupt,stop hereB IRQ_handlerB FIQ_handler,三、初始化时钟和设置相关的寄存器,通过设置时钟控制器来确定CPU的工作频率,设置中断控制寄存器屏蔽中断。,四、初始化存储器系统,参考芯片手册,设置与内存映射相关的寄存器。,五、初始化堆
6、栈,ARM处理器有好几种运行状态(模式),各种状态都需要有自己的堆栈,所以需要分别为这些堆栈分配空间并设置好各自的堆栈指针。如果系统使用了DRAM或其他外设,需要设置一些寄存器,以确定其刷新频率、数据总线宽度等信息。有的系统还需设置一些寄存器来控制SDRAM、USB、网络接口等。,六、初始化C环境,在目标文件中,代码、数据放在不同的段中。源文件编译链接生成含.data、.text段的目标文件,且链接器生成的.data段是以系统RAM为参考地址。故在系统启动时需要复制ROM或FLASH中的.data段到RAM,以完成对RAM的初始化。在初始化期间应将系统需要读写的数据和变量从ROM复制到RAM里
7、运行。,链接器产生的符号表,符号由链接器自动产生,只读段(read-only RO)就是代码段,读写段(read-write RW)是已经初始化的全局变量,而零初始化段(zero-initialized section ZI)中存放未初始化的全局变量。,初始化C环境(2),C环境初始化,就是利用上述符号初始化RW和ZI段以使后面使用的全局变量的C程序正常运行。这里有两个循环,第一个循环把预初始化的数据段(位于代码段的后面)复制到RAM中,另一个循环把未初始化的数据段ZI初始化为0,也就是实现把从ROM中的.data段复制到RAM,对ZI段内的数据初始化为0,以完成对C环境的初始化。,ROM地址
8、的重映射,初始化C环境(3),七、呼叫C程序,对main函数的调用进入C/OS 的入口,通过这个入口就进入C/OS 的主函数,启动对C/OS 的初始化。例 IMPORT Main b Main ;C Entry,C/OS 系统的初始化,完成了前面的硬件初始化和运行环境的相关设置后,进入Main(), Main()是C/OS 的入口函数,启动对C/OS 的初始化。,ARM7的硬件抽象层uHALC/OS,ARM公司为操作系统的开发提供了一个硬件抽象层HAL,称为uHAL。从结构上看,uHAL是一组库程序,需要说明的是,uHAL并不是专门为C/OS 准备的,甚至也不是专为操作系统内核准备的。uHAL
9、只是个针对ARM核的函数库。C/OS 是建立在uHAL的基础之上的。,C/OS 系统的初始化(2),ARMTargetInit()函数结构,ARMTargetInit(),调uHAL打印接口打印系统信息,调用uHAL函数禁止所有中断,调用uHAL函数对中断初始化,uHAL函数对ARM计数器初始化,结束,uHAL的功能,uHAL的作用之一是在操作系统本身进入正常运行之前,为系统提供基本的输入输出手段,例如uHALr_printf()等。uHAL还要为操作系统的运行准备一个基本的运行环境,具体包括下列各种初始化:通过uHAL_ResetMMU(),将MMU设置在一个确定的初始状态。通过ARMDis
10、able()关闭中断。通过uHAL_InitInterrupts()设置中断向量处理程序。通过uHAL_InitTimer()对系统使用的计数器进行初始 化。,ARMTargetStart()的分析,创建了任务之后,ARMTargetStart()调用uHALr_InstallSystemTimer()创建一个系统时钟,为时钟中断做好准备。,提 要,1,2,嵌入式系统的初始化,C/OS-移植分析,操作系统移植的概念,所谓操作系统的移植,是指使一个实时操作系统能够在某个微处理器平台上运行。COS-II的主要代码都是由标准的C语言写成的,移植方便。移植的主要工作是修改部分与处理器硬件相关的代码。,
11、移植的层次,操作系统的移植大体可以分为两个层次:跨体系结构的移植。针对特定处理器的移植。,移植COS-II满足的条件,处理器的C编译器能产生可重入代码。 在程序中可以打开或者关闭中断。 处理器支持中断,并且能产生定时中断(通常在10-100Hz之间)。 处理器支持能够容纳一定量数据的硬件堆栈。 处理器有将堆栈指针和其他CPU寄存器存储和读出到堆栈(或者内存)的指令。,什么是可重入代码,可重入的代码指的是一段代码(比如:一个函数)可以被多个任务同时调用,而不必担心会破坏数据。也就是说,可重入型函数在任何时候都可以被中断执行,过一段时间以后又可以继续运行,而不会因为在函数中断的时候被其他的任务重新
12、调用,影响函数中的数据。,可重入代码举例,程序1:可重入型函数void swap(int *x, int *y)int temp;temp=*x;*x=*y;*y=temp;,非可重入代码举例,程序2:非可重入型函数int temp;void swap(int *x, int *y)temp=*x;*x=*y;*y=temp;,返回,不可重入函数被中断破坏,如何使函数具有可重入性,使Swap()函数具有可重入性:把Temp定义为局部变量。调用Swap()函数之前关中断,调动后再开中断。用信号量禁止该函数在使用过程中被再次调用。,打开/关闭中断,在COS-II中,可以通过:OS_ENTER_CR
13、ITICAL() OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。这需要处理器的支持。在ARM7TDMI的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。,处理器支持中断并且能产生定时中断,COS-II是通过处理器产生的定时器的中断来实现多任务之间的调度的。ARM7TDMI的处理器上可以产生定时器中断。,处理器支持硬件堆栈,COS-II进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是COS-II多任务调度的基础。 ARM7处理器中有专门的指令处理堆栈
14、,可以灵活的使用堆栈。,移植对开发工具的要求,移植COS-II需要一个标准的C交叉编译器。由于移植时需要对CPU的寄存器进行操作,所以需要C交叉编译器能够支持汇编语言程序。嵌入式C编译器一般都包括汇编器、链接器和定位器。链接器是用来将不同的模块(编译或汇编过的文件)链接成目标文件;定位器则允许将代码和数据放置在目标处理器的指定内存空间中。,移植C/OS-II要点(1),开关中断的方式。推荐使用method3#if OS_CRITICAL_METHOD = 3OS_CPU_SR cpu_sr;#endif OS_ENTER_CRITICAL(); OS_EXIT_CRITICAL();,使用me
15、thod3方式的开关中断,#define OS_ENTER_CRITICAL() cpu_sr = INTS_OFF(); #define OS_EXIT_CRITICAL() if(cpu_sr = 0) INTS_ON(); ,ARM的中断模式,设备的中断在ARM中被映射到了两个异常中断中FIQ和IRQ。通过控制CPSR中的对应数据位,可以开启或者关闭中断。为了方便和统一C/OS-II系统中断的处理,只使用了IRQ模式的中断。,移植C/OS-II要点(2)系统中断的处理,所有中断的调用都需要经过系统的接管。中断处理函数调用前后需要通知系统。例如:OSIntEnter();yourInter
16、ruptFun();OSIntExit();,OSIntExit的意义,ARM的工作模式,ARM处理器有7种操作模式:用户模式(usr) 正常的程序执行模式。快速中断模式(fiq) 支持高速数据传输或通道处理。中断模式(irq) 用于通用中断处理。管理员模式(svc) 操作系统的保护模式。中止模式(abt) 支持虚拟内存和/或内存保护等异常。系统模式(sys) 支持操作系统的特殊用户模式(运行操作系统任务)。未定义模式(und) 支持硬件协处理器的软件仿真。 除了用户模式外,其他模式均可视为特权模式,ARM的寄存器(1),37个寄存器:31 个通用32位寄存器,包括程序计数器PC。6 个状态寄
17、存器。15个通用寄存器 (R0 to R14), 以及2个状态寄存器和程序计数器(PC)在任何时候都中可见的。可见的寄存器取决于处理器的模式,不同的模式映射了不同的工作寄存器。,ARM寄存器的组织,注:表明用户或系统模式使用的正常寄存器已经被异常模式指定的另一个寄存器取代,ARM的寄存器(2),R0 到 R15 可以直接访问。R0 到 R14 是通用寄存器。R13: 堆栈指针 (sp) (通常)。每种处理器模式都有单独的堆栈。R14: 链接寄存器 (lr)。R15:程序计数器 (PC)。CPSR :当前程序状态寄存器,包括代码标志状态和当前模式位。5个SPSR(程序状态保存寄存器) :当异常发
18、生时保存CPSR状态。,C/OS-II在ARM上的任务切换,任务级的任务切换;中断级的任务切换。,中断处理过程,OSIntExit(),void OSIntExit (void) OS_ENTER_CRITICAL(); (1) if (-OSIntNesting | OSLockNesting) = 0) (2) OSIntExitY = OSUnMapTblOSRdyGrp; (3) OSPrioHighRdy = (INT8U)(OSIntExitY 3) + OSUnMapTblOSRdyTblOSIntExitY); if (OSPrioHighRdy != OSPrioCur) O
19、STCBHighRdy = OSTCBPrioTblOSPrioHighRdy; OSCtxSwCtr+; OSIntCtxSw(); (4) OS_EXIT_CRITICAL();,OSIntExit的关键OSIntCtxSw,实现中断级的任务切换ARM在栈指针调整过程中的优势,移植C/OS-II要点(3)Thumb带来的问题,很多ARM内核集成了16位thumb指令集。Thumb可以在一定程度上节省代码空间,提高系统效率。Thumb会给中断级的任务切换带来麻烦。CPSR中的T位不能直接操作。Thumb状态将导致CPSR恢复以后的指令不能运行。解决办法:对Thumb的使用必须保证原子操作。专
20、门对任务切换中Thumb的情况作处理。建议,小心使用C编译器,尽量不使用Thumb。,移植C/OS-II的要点(4)何时启动系统定时器,如果在OSStart之前启动定时器,则系统可能无法正确执行完OSStartHighRdy。OSStart函数直接调用OSStartHighRdy去执行最高优先级的任务,OSStart不返回。系统定时器应该在系统的最高优先级任务中启动。使用OSRunning变量来控制操作系统的运行。在我们的移植版本中,使用了C/OS-II中的保留任务1作为系统任务,负责启动定时器。,例:C/OS-II在S3C44B0X上的移植,设置OS_CPU.H中与处理器和编译器相关的代码
21、。用C语言编写六个操作系统相关的函数(OS_CPU_C.C)。 用汇编语言编写四个与处理器相关的函数(OS_CPU.ASM)。,设置与处理器和编译器相关的代码,OS_CPU.H中定义了与编译器相关的数据类型。比如:INT8U、INT8S等。与 ARM处理器相关的代码,使用OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL() 宏开启关闭中断。设置堆栈的增长方向 :堆栈由高地址向低地址增长 。,设置includes.h,typedef unsigned char BOOLEAN;typedef unsigned char INT8U; typedef signed cha
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 实时 操作系统 移植 ppt
限制150内