《最新嵌入式系统BootLoader的设PPT课件.ppt》由会员分享,可在线阅读,更多相关《最新嵌入式系统BootLoader的设PPT课件.ppt(130页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、嵌入式系统嵌入式系统BootLoader的设的设2操作系统移植概述操作系统移植概述u所谓操作系统的移植,是指一个操作系统能够在某个微处所谓操作系统的移植,是指一个操作系统能够在某个微处理器平台上运行。理器平台上运行。u操作系统操作系统C/OS-IIC/OS-II是一个基于优先级的抢占式实时多任务是一个基于优先级的抢占式实时多任务内核。内核。C/OS-IIC/OS-II的大部分代码是用的大部分代码是用ANSI CANSI C语言编写的,也语言编写的,也包含一小部分汇编语言代码,使之可以提供给不同架构的包含一小部分汇编语言代码,使之可以提供给不同架构的微处理器使用。至今,从微处理器使用。至今,从8
2、 8位到位到6464位,位,C/OS-IIC/OS-II已经在多已经在多种不同架构的微处理器上移植成功。种不同架构的微处理器上移植成功。3456789工作状态的选择工作状态的选择u自从自从ARM7TDMI CoreARM7TDMI Core以后,体系结构中具有以后,体系结构中具有T T变种的变种的ARMARM处处理器核可以工作在以下两种状态,并支持两个指令集:理器核可以工作在以下两种状态,并支持两个指令集:nARMARM状态状态u ARM ARM状态下执行字对准的状态下执行字对准的3232位位ARMARM指令;指令;nThumbThumb状态状态u Thumb Thumb状态下执行半字对准的状
3、态下执行半字对准的1616位位ThumbThumb指令;指令;u COS-IICOS-II的任务可以在任何一种工作状态下运行,并可以的任务可以在任何一种工作状态下运行,并可以进行状态切换。进行状态切换。为了移植代码的编写简单,本移植只在为了移植代码的编写简单,本移植只在ARMARM状态下实现。状态下实现。10Phase 1 Phase 1 移植前的规划移植前的规划C/OS-IIC/OS-II移植的条件移植的条件1234编译器的选择编译器的选择工作状态的选择工作状态的选择工作模式的选择工作模式的选择11ARMARM处理器工作模式(处理器工作模式(1 1)处理器模式处理器模式说明说明备注备注 用户
4、用户 (usr)(usr)正常程序工作模式正常程序工作模式不能直接切换到其它模式不能直接切换到其它模式 系统系统 (sys)(sys)用于支持操作系统的特权任务用于支持操作系统的特权任务与用户模式类似,但具有可以直接切换与用户模式类似,但具有可以直接切换到其它模式等特权到其它模式等特权 快中断快中断(fiq)(fiq)支持高速数据传输及通道处理支持高速数据传输及通道处理FIQFIQ异常响应时进入此模式异常响应时进入此模式 中断中断 (irq)(irq)用于通用中断处理用于通用中断处理IRQIRQ异常响应时进入此模式异常响应时进入此模式 管理管理 (svc)(svc)操作系统保护代码操作系统保护
5、代码系统复位和软件中断响应时进入此模式系统复位和软件中断响应时进入此模式 中止中止 (abt)(abt)用于支持虚拟内存和用于支持虚拟内存和/或存储或存储器保护器保护在在ARM7TDMIARM7TDMI没有大用处没有大用处 未定义未定义(und)(und)支持硬件协处理器的软件仿真支持硬件协处理器的软件仿真未定义指令异常响应时进入此模式未定义指令异常响应时进入此模式未定义未定义 (und)(und)中止中止 (abt)(abt)管理管理 (svc)(svc)中断中断 (irq)(irq)快中断快中断 (fiq)(fiq)系统系统 (sys)(sys)除用户模式外,其它模式均为特权模式。ARM内
6、部寄存器和一些片内外设在硬件设计上只允许(或者可选为只允许)特权模式下访问。此外,特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。12ARMARM处理器工作模式(处理器工作模式(2 2)处理器模式处理器模式说明说明备注备注 用户用户 (usr)(usr)正常程序工作模式正常程序工作模式不能直接切换到其它模式不能直接切换到其它模式 系统系统 (sys)(sys)用于支持操作系统的特权任务用于支持操作系统的特权任务与用户模式类似,但具有可以直接切换与用户模式类似,但具有可以直接切换到其它模式等特权到其它模式等特权 快中断快中断(fiq)(fiq)支持高速数据传输及通道处理支持高
7、速数据传输及通道处理FIQFIQ异常响应时进入此模式异常响应时进入此模式 中断中断 (irq)(irq)用于通用中断处理用于通用中断处理IRQIRQ异常响应时进入此模式异常响应时进入此模式 管理管理 (svc)(svc)操作系统保护代码操作系统保护代码系统复位和软件中断响应时进入此模式系统复位和软件中断响应时进入此模式 中止中止 (abt)(abt)用于支持虚拟内存和用于支持虚拟内存和/或存储或存储器保护器保护在在ARM7TDMIARM7TDMI没有大用处没有大用处 未定义未定义(und)(und)支持硬件协处理器的软件仿真支持硬件协处理器的软件仿真未定义指令异常响应时进入此模式未定义指令异常
8、响应时进入此模式未定义未定义 (und)(und)中止中止 (abt)(abt)管理管理 (svc)(svc)中断中断 (irq)(irq)快中断快中断 (fiq)(fiq)这五种模式称为异常模式。它们除了可以通过程序切换进入外,也可以由特定的异常进入。当特定的异常出现时,处理器进入相应的模式。每种异常模式都有一些独立的寄存器,以避免异常退出时用户模式的状态不可靠。本移植中本移植中 COS-IICOS-II的任务正常运行在管理的任务正常运行在管理(SVC)(SVC)模式模式。13Phase 2 Phase 2 操作系统移植操作系统移植BootLoaderBootLoader1234系统系统初始
9、化流程初始化流程最小启动代码编写最小启动代码编写C/OS-IIC/OS-II相关文件修改相关文件修改14BootLoaderBootLoader的基本概念的基本概念u要想让要想让 COS-IICOS-II在在S3C44B0XS3C44B0X处理器上正常运行,我们需要处理器上正常运行,我们需要对系统的硬件环境进行初始化。对系统的硬件环境进行初始化。u对于对于PCPC机,其开机后操作系统启动前的硬件初始化操作是机,其开机后操作系统启动前的硬件初始化操作是由由BIOSBIOS(Basic Input/Output SystemBasic Input/Output System)完成的,但对于)完成的
10、,但对于嵌入式系统来说,出于通用性、价格方面的考虑,通常并嵌入式系统来说,出于通用性、价格方面的考虑,通常并没有像没有像BIOSBIOS那样的固件程序,因此启动时用于完成初始化那样的固件程序,因此启动时用于完成初始化操作的引导加载程序必须自行编写完成,这段程序一般被操作的引导加载程序必须自行编写完成,这段程序一般被称为称为BootloaderBootloader程序。程序。uBootLoaderBootLoader是系统加电(或复位)后运行的第一段软件代是系统加电(或复位)后运行的第一段软件代码。通过这段代码,我们可以初始化系统硬件设备码。通过这段代码,我们可以初始化系统硬件设备、建立、建立内
11、存空间的映内存空间的映射射图,从而将系统的软硬件环境带到一个合图,从而将系统的软硬件环境带到一个合适的状态,以便最终调用操作系统内核适的状态,以便最终调用操作系统内核。u简单地说,简单地说,BootLoaderBootLoader就是在操作系统内核运行之前运行就是在操作系统内核运行之前运行的一段初始化程序的一段初始化程序。15BootLoaderBootLoader的特点的特点uBootLoaderBootLoader除了依赖除了依赖CPUCPU的体系结构外,还依赖于具体的的体系结构外,还依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,嵌入式板级设备的配置,比如板卡的硬件地址分配,R
12、AMRAM芯片的类型,其它外设的类型等。对于两块不同的嵌入式芯片的类型,其它外设的类型等。对于两块不同的嵌入式开发板,即使它们是基于同一种开发板,即使它们是基于同一种CPUCPU而构建的,如果他们而构建的,如果他们的硬件资源和配置不一致,要想让运行在一块板子上的的硬件资源和配置不一致,要想让运行在一块板子上的BootLoaderBootLoader程序也能运行在另一块板子上,也还是需要作程序也能运行在另一块板子上,也还是需要作一些必要的修改。一些必要的修改。u因此,为嵌入式系统建立一个通用的因此,为嵌入式系统建立一个通用的BootLoaderBootLoader是很困难是很困难的。尽管如此,我
13、们仍然可以对的。尽管如此,我们仍然可以对BootLoaderBootLoader(尤其是基于(尤其是基于同种同种CoreCore的微处理器)归纳出一些通用的概念和设计思路,的微处理器)归纳出一些通用的概念和设计思路,用来指导用户特定的用来指导用户特定的BootLoaderBootLoader设计与实现。设计与实现。16BootLoaderBootLoader的启动过程的启动过程u为了增加为了增加BootLoaderBootLoader的通用性和可移植性,本文把启动过的通用性和可移植性,本文把启动过程分为程分为phaselphasel和和phase2phase2两个阶段。两个阶段。nphase1
14、phase1阶段执行的是用汇编语言来实现的依赖阶段执行的是用汇编语言来实现的依赖CPUCPU体系结构的代码,体系结构的代码,这样可以提高系统的启动速度;这样可以提高系统的启动速度;nphase2phase2阶段完成的是阶段完成的是OSOS内核启动前的准备工作,多采用处理能力内核启动前的准备工作,多采用处理能力强、可移植性好的强、可移植性好的C C语言来实现。语言来实现。uphase1phase1阶段执行的代码,我们称之为最小启动代码。阶段执行的代码,我们称之为最小启动代码。所谓所谓最小启动代码最小启动代码是指为了完成系统(是指为了完成系统(OSOS或用户应用程序)启或用户应用程序)启动所必须的
15、最少硬件的初始化程序。动所必须的最少硬件的初始化程序。17BootLoaderBootLoader的安装媒介的安装媒介u系统加电或复位后,所有的系统加电或复位后,所有的CPUCPU通常都从通常都从CPUCPU制造商预先安制造商预先安排的地址上取指令。排的地址上取指令。u基于基于ARM7TDMI CoreARM7TDMI Core的嵌入式系统中,系统在上电或复位的嵌入式系统中,系统在上电或复位时是从时是从0 x000000000 x00000000地址开始取第一条指令执行,而在这个地址开始取第一条指令执行,而在这个地址处安排的通常就是系统的地址处安排的通常就是系统的BootLoaderBootL
16、oader程序。程序。u嵌入式系统通常都有某种类型的固态存储设备嵌入式系统通常都有某种类型的固态存储设备(比如:比如:ROMROM、EPROMEPROM或或FLASHFLASH等等)被安排这个起始地址上用来存放被安排这个起始地址上用来存放BootLoaderBootLoader程序。程序。18BootLoaderBootLoader的下载方式的下载方式p 通过编程器将可执行目标文件烧写到BootROM中;p 通常通过串行口、网口或JTAG等接口下载。串口网口JTAG目标机目标机MPURAMBOOT ROM下载工具宿主机宿主机19Phase 2 Phase 2 操作系统移植操作系统移植BootL
17、oaderBootLoader1234系统系统初始化流程初始化流程最小启动代码编写最小启动代码编写C/OS-IIC/OS-II相关文件修改相关文件修改20嵌入式系统的初始化流程嵌入式系统的初始化流程1234567硬件初始化RTOS初始化软件初始化设置中断向量表最小硬件初始化RTOS初始化启动RTOS最小启动代码phase1phase2用户程序RTOS运行环境初始化硬件抽象层初始化用户程序初始化21嵌入式系统的初始化流程(嵌入式系统的初始化流程(1 1)123硬件初始化阶段硬件初始化阶段最小硬件初始化最小启动代码p 中断向量表放在上电后映射在从0 x00000000开始的8*4个字节的连续存储空
18、间中,其作用是指定了各种异常中断处理程序的入口地址。phase1设置中断向量表设置中断向量表RTOS运行环境初始化22嵌入式系统的初始化流程(嵌入式系统的初始化流程(2 2)硬件初始化阶段硬件初始化阶段p 禁用看门狗定时器;p 屏蔽所有中断;p 设定CPU的时钟频率;p 初始化存储器;p 分配各种模式下的栈空间。最小硬件初始化123最小硬件初始化最小启动代码设置中断向量表RTOS运行环境初始化phase123嵌入式系统的初始化流程(嵌入式系统的初始化流程(3 3)硬件初始化阶段硬件初始化阶段p 为RTOS运行准备合适的RAM空间;p 呼叫RTOS主(Main)程序。RTOS运行环境初始化123
19、最小硬件初始化最小启动代码设置中断向量表RTOS运行环境初始化phase124嵌入式系统的初始化流程(嵌入式系统的初始化流程(4 4)RTOSRTOS初始化阶段初始化阶段456硬件抽象层初始化RTOS初始化启动RTOS硬件抽象层初始化p 系统cache、总线设置;p 中断及中断向量处理子程序初始化;p I/O端口配置;p 初始化定时器,为时钟中断做好准备;p 对RTOS所需的其它设备初始化。phase225嵌入式系统的初始化流程(5)RTOSRTOS初始化阶段初始化阶段456硬件抽象层初始化RTOS初始化启动RTOSRTOS初始化p RTOS内核启动参数初始化;p RTOS扩展部件初始化。ph
20、ase226嵌入式系统的初始化流程(嵌入式系统的初始化流程(6 6)RTOSRTOS初始化阶段初始化阶段456硬件抽象层初始化RTOS初始化启动RTOS启动RTOSp 运行优先级最高的就绪任务;p 启动RTOS时钟中断。phase227嵌入式系统的初始化流程(嵌入式系统的初始化流程(7 7)用户程序初始化阶段用户程序初始化阶段用户程序初始化p 用户程序正常运行所进行的初始化。7用户程序用户程序初始化28Phase 2 Phase 2 操作系统移植操作系统移植BootLoaderBootLoader1234系统系统初始化流程初始化流程最小启动代码编写最小启动代码编写C/OS-IIC/OS-II相
21、关文件修改相关文件修改29设置中断向量表设置中断向量表u因为中断向量表中每种异常只分配因为中断向量表中每种异常只分配4 4个字节,所以不能放个字节,所以不能放下整个异常中断处理程序,只能放一条跳转指令,用以跳下整个异常中断处理程序,只能放一条跳转指令,用以跳转到相应的异常中断处理程序。转到相应的异常中断处理程序。向量地址异常中断类型转移指令0 x0000001CFIQLDR PC,=FIQHandler0 x00000018IRQLDR PC,=IRQHandler0 x00000014ReservedNOP0 x00000010Data AbortLDR PC,=DabortHandler0
22、 x0000000CPrefech AbortLDR PC,=PabortHandler0 x00000008SWILDR PC,=SWIHandler0 x00000004Undefined InstructionLDR PC,=UndefHandler0 x00000000ResetB ResetHandler30禁用看门狗定时器和屏蔽所有外部中断禁用看门狗定时器和屏蔽所有外部中断u示意代码分析示意代码分析WTCON EQU 0 x01d30000 ;看门狗定时器控制寄存器INTMSK EQU 0 x01e0000c ;中断屏蔽寄存器 ResetHandlerResetHandler LD
23、R r0,=WTCON LDR r1,=0 x00000000 ;Watch Dog Disable STR r1,r0 LDR r0,=INTMSK LDR r1,=0 x07ffffff ;All Interrupt Disable STR r1,r0 说明:默认初始状态允许看门狗定时器工作(p496),所以要关闭。如果要屏蔽所有中断,可用MRS指令设置CPSR的I/F位(p431,p440)。31S3C44B0XS3C44B0X时钟发生器组成(时钟发生器组成(1 1)uS3C44B0XS3C44B0X的时钟发生器可产生的时钟发生器可产生CPUCPU和外设所需要的时钟信和外设所需要的时钟信
24、号。时钟发生器可在号。时钟发生器可在S/WS/W的控制下向外设提供时钟信号,的控制下向外设提供时钟信号,也可断开时钟与每个外设的连接来降低功耗。首先要求要也可断开时钟与每个外设的连接来降低功耗。首先要求要确定主时钟确定主时钟MCLKMCLK,然后以主时钟作为一种基准,通过分频,然后以主时钟作为一种基准,通过分频控制定时器,串口等外设的时钟频率。控制定时器,串口等外设的时钟频率。uS3C44B0XS3C44B0X时钟发生器组成:时钟发生器组成:n主时钟源有两个:一个是主时钟源有两个:一个是XTAL0XTAL0和和EXTAL0EXTAL0连接的外部晶振,另一个连接的外部晶振,另一个是是EXTCLK
25、EXTCLK连接的外部时钟;连接的外部时钟;nPLLPLL的功能是以低频振荡器的输出作为输入,产生的功能是以低频振荡器的输出作为输入,产生S3C44B0XS3C44B0X需要的需要的高频信号;高频信号;n还有一个时钟控制逻辑部件来可产生稳定的时钟频率。还有一个时钟控制逻辑部件来可产生稳定的时钟频率。uS3C44B0XS3C44B0X时钟源的选择由处理器的两个引脚时钟源的选择由处理器的两个引脚OM3:2OM3:2控制。控制。OM3:2=00OM3:2=00时钟源为晶振,时钟源为晶振,OM3:2=01OM3:2=01时钟源为外部时钟。时钟源为外部时钟。本移植采用晶振作为时钟源。晶振为本移植采用晶振
26、作为时钟源。晶振为6MHz,6MHz,即即f finin=6MHz=6MHz。32S3C44B0XS3C44B0X时钟发生器组成(时钟发生器组成(2 2)u时钟发生器框图时钟发生器框图说明:时钟发生器(p446)33PLLPLL锁相环原理框图锁相环原理框图uPLLPLL锁相环框图锁相环框图说明:PLL锁相环原理(p446-p447)34设置设置PLLPLL分频器分频器u输出时钟频率输出时钟频率f fpllopllo和输入的时钟频率和输入的时钟频率f finin的关系如下:的关系如下:f fpllopllo=(m*f=(m*finin)/(p*2s)/(p*2s)其中,其中,m=MDIV(m=M
27、DIV(分频器分频器M M的分频值的分频值)+8)+8,p=PDIV(p=PDIV(分频器分频器P P的分频值的分频值)+2)+2,s=SDIV(s=SDIV(分频器分频器S S的分频值的分频值)uPLLPLL值的选择向导:值的选择向导:nf fpllopllo必须大于必须大于20Mhz20Mhz,小于,小于66MHz66MHz;nf fpllopllo*2s*2s必须小于必须小于170MHz170MHz;35时钟控制逻辑部件时钟控制逻辑部件u当当PLLPLL被配置为一个新的频率值时,时钟控制逻辑部件在被配置为一个新的频率值时,时钟控制逻辑部件在PLLPLL输出稳定之前禁止输出稳定之前禁止f
28、foutout,直到,直到PLLPLL锁定系统时钟后取消锁定系统时钟后取消禁止。禁止。PLLPLL锁时实际上是锁时实际上是PLLPLL输出稳定所需要的时间,这个输出稳定所需要的时间,这个时间应长于时间应长于208us208us。锁定时间值计算公式如下:。锁定时间值计算公式如下:t tlocklock=(1/f=(1/finin)*n)*n 其中其中n=LTIMECNTn=LTIMECNT值。值。36设定设定CPUCPU及各功能模块时钟频率及各功能模块时钟频率u示意代码分析示意代码分析PLLCON EQU 0 x01d80000 ;PLL控制寄存器 CLKCON EQU 0 x01d80004
29、;时钟控制寄存器 LOCKTIME EQU 0 x01d8000c ;锁时计数寄存器M_DIV EQU 0 x48 P_DIV EQU 0 x02S_DIV EQU 0 x01LDR r0,=LOCKTIMELDR r1,=0 x00000fff ;tlock=(1/fin)*LTIMECNTSTR r1,r0 LDR r0,=PLLCON ;fin=6MHz,fout=60MHLDR r1,=(M_DIV12)+(P_DIVOSTCBStkPtrSP=OSTCBHighRdy-OSTCBStkPtr按照按照OSTaskStkInit()OSTaskStkInit()中相反顺序中相反顺序从新任
30、务栈中恢复处理器的所有寄存器从新任务栈中恢复处理器的所有寄存器模拟中断返回模拟中断返回84OS_CPU_A.S-OSStartHighRdy()OS_CPU_A.S-OSStartHighRdy()代码分析代码分析u示意代码分析示意代码分析OSStartHighRdyOSStartHighRdy ;MSR CPSR_c,#(ARM_INT_DIS|ARM_SVC_MODE)BL OSTaskSwHook LDR R0,=OSRunning MOV R1,#1 STRB R1,R0 LDR R0,=OSTCBHighRdy LDR R0,R0 LDR SP,R0 ;LDR R1,=OSTCBCu
31、r ;STR R0,R1 LDMFD SP!,R0 MSR SPSR_cxsf,R0 LDMFD SP!,R0 MSR CPSR_cxsf,R0 LDMFD SP!,R0-R12,LR,PC 关中断,切换到SVC模式调用OSTaskSwHook()函数得到将要恢复运行任务的栈指针OSRunning=TRUE从新任务栈中恢复处理器的所有寄存器,模拟中断返回85ContentsContents OSStartHighRdy()1 OSCtxSw()2 OSTickISR()3 OSIntCtxSw()486OS_CPU_A.S-OSCtxSw()OS_CPU_A.S-OSCtxSw()uOSCtx
32、Sw()OSCtxSw()是是C/OS-IIC/OS-II从低优先级任务切换到高优先级任从低优先级任务切换到高优先级任务时用到的任务级切换函数。该函数实现的功能可以分为务时用到的任务级切换函数。该函数实现的功能可以分为两部分,第一部分代码用来保存正在运行(将被中断)任两部分,第一部分代码用来保存正在运行(将被中断)任务的当前状态(即处理器寄存器的全部内容)到该任务的务的当前状态(即处理器寄存器的全部内容)到该任务的栈中;第二部分代码是把将要运行的更高优先级任务的当栈中;第二部分代码是把将要运行的更高优先级任务的当前状态从栈中恢复到处理器寄存器中。前状态从栈中恢复到处理器寄存器中。87OS_CP
33、U_A.S-OSCtxSw()OS_CPU_A.S-OSCtxSw()执行流程图执行流程图调用接口函数调用接口函数 OSTaskSwHook()OSTaskSwHook()OSPrioCur=OSPrioHighRdy;OSPrioCur=OSPrioHighRdy;OSTCBCur=OSTCBHighRdy;OSTCBCur=OSTCBHighRdy;得到将要恢复运行任务的栈指针得到将要恢复运行任务的栈指针:SP=OSTCBHighRdy-OSTCBStkPtrSP=OSTCBHighRdy-OSTCBStkPtr按照按照OSTaskStkInit()OSTaskStkInit()中相反顺序
34、中相反顺序从新任务栈中恢复处理器的所有寄存器从新任务栈中恢复处理器的所有寄存器模拟中断返回模拟中断返回保存处理器寄存器;保存处理器寄存器;在当前任务的任务控制块中保存栈指针:在当前任务的任务控制块中保存栈指针:OSTCBCur-OSTCBStkPtr=SPOSTCBCur-OSTCBStkPtr=SP88OS_CPU_A.S-OSCtxSw()OS_CPU_A.S-OSCtxSw()实现分析(实现分析(1 1)R0R1R2R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)Current Task StackSVC ModeCPSRSPSR_
35、svcBeforeOSTCBStkPtr I F T MODECPSR:1100 x13OS_TCBOS_TCBOSTCBCurOSTCBStkPtrOS_TCBOS_TCBOSTCBHighRdyn说明:根据OSTaskStkInit()函数初始化的情况,当前任务运行在ARM状态、SVC模式。当任务级的调度函数OS_Sched()函数调用宏OS_TASK_SW()(即OSCtxSw())时,是在临界段中进行的,所以IRQ和FIQ中断都禁用。当OS_Sched()调用OSCtxSw()时,类似于下面操作:BL OSCtxSw 所以OSCtxSw()返回地址保存在R14_svc。89OS_CPU
36、_A.S-OSCtxSw()OS_CPU_A.S-OSCtxSw()实现分析(实现分析(2 2)SPSR_svcCPSRR0R1R2R3R4R5R6R7R8R9R10R11R12R14_svc(LR)R15(PC)R0R1R2R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)CPSRSPSR_svcOSCtxSwOSCtxSw STMFD SP!,LR STMFD SP!,LR STMFD SP!,R0-R12 MRS R0,CPSR STMFD SP!,R0 MRS R0,SPSR STMFD SP!,R0 Current Task St
37、ackSVC ModeBeforeAfterOSTCBStkPtrOS_TCBOS_TCBOSTCBCurOSTCBStkPtrOS_TCBOS_TCBOSTCBHighRdy保存处理器寄存器 I F T MODECPSR:1100 x1390OS_CPU_A.S-OSCtxSw()OS_CPU_A.S-OSCtxSw()实现分析(实现分析(3 3)SPSR_svcCPSRR0R1R2R3R4R5R6R7R8R9R10R11R12R14_svc(LR)R15(PC)R0R1R2R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)CPSRSPS
38、R_svcOSCtxSwOSCtxSw LDR R0,=OSTCBCur LDR R1,R0 STR SP,R1 Current Task StackSVC ModeOSTCBStkPtrOS_TCBOS_TCBOSTCBCurOSTCBStkPtrOS_TCBOS_TCBOSTCBHighRdyOSTCBCur-OSTCBStkPtr=SP I F T MODECPSR:1100 x1391OS_CPU_A.S-OSCtxSw()OS_CPU_A.S-OSCtxSw()实现分析(实现分析(4 4)SPSR_svcCPSRR0R1R2R3R4R5R6R7R8R9R10R11R12R14_svc
39、(LR)R15(PC)R0R1R2R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)CPSRSPSR_svcOSCtxSwOSCtxSw BL OSTaskSwHook LDR R0,=OSPrioCur LDR R1,=OSPrioHighRdy LDRB R1,R1 STRB R1,R0 Current Task StackSVC ModeOSTCBStkPtrOS_TCBOS_TCBOSTCBCurOSTCBStkPtrOS_TCBOS_TCBOSTCBHighRdy将新任务的优先级复制给当前任务优先级在 OS_CPU_C.C中定义
40、I F T MODECPSR:1100 x1392OS_CPU_A.S-OSCtxSw()OS_CPU_A.S-OSCtxSw()实现分析(实现分析(5 5)SPSR_svcCPSRR0R1R2R3R4R5R6R7R8R9R10R11R12R14_svc(LR)R15(PC)R0R1R2R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)CPSRSPSR_svcOSCtxSwOSCtxSw LDR R0,=OSTCBCur LDR R1,=OSTCBHighRdy LDR R1,R1 STR R1,R0 Current Task StackS
41、VC ModeOSTCBStkPtrI F T MODECPSR:1100 x13OS_TCBOS_TCBOSTCBCurOSTCBStkPtrOS_TCBOS_TCBOSTCBHighRdyOSTCBCur=OSTCBHighRdy93OS_CPU_A.S-OSCtxSw()OS_CPU_A.S-OSCtxSw()实现分析(实现分析(6 6)SPSR_svcCPSRR0R1R2R3R4R5R6R7R8R9R10R11R12R14_svc(LR)R15(PC)R0R1R2R3R4R5R6R7R8R9R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)CPSRSPSR_s
42、vcOSCtxSwOSCtxSw LDR SP,R1 New Task StackSVC ModeOSTCBStkPtrOS_TCBOS_TCBOSTCBCurOSTCBStkPtrOS_TCBOS_TCBOSTCBHighRdySP=OSTCBHighRdy-OSTCBStkPtrI F T MODECPSR:1100 x1394OS_CPU_A.S-OSCtxSw()OS_CPU_A.S-OSCtxSw()实现分析(实现分析(7 7)SPSR_svcCPSRR0R1R2R3R4R5R6R7R8R9R10R11R12R14_svc(LR)R15(PC)R0R1R2R3R4R5R6R7R8R9
43、R10R11R12R13_svc(SP)R14_svc(LR)R15(PC)CPSRSPSR_svcOSCtxSwOSCtxSw LDMFD SP!,R0 MSR SPSR_cxsf,R0 LDMFD SP!,R0 MSR CPSR_cxsf,R0 LDMFD SP!,R0-R12,LR,PCSVC ModeBeforeAfterOSTCBStkPtrOS_TCBOS_TCBOSTCBCurOSTCBStkPtrOS_TCBOS_TCBOSTCBHighRdyNew Task Stack从新任务堆栈中恢复处理器所有寄存器的值模拟中断返回运行新任务I F T MODECPSR:1100 x139
44、5ContentsContents OSStartHighRdy()1 OSCtxSw()2 OSTickISR()3 OSIntCtxSw()496OS_CPU_A.S-OS_CPU_A.S-时钟中断时钟中断uC/OS-C/OS-要求用户提供一个周期性的时钟资源,来实现要求用户提供一个周期性的时钟资源,来实现时间的延时和超时功能。时钟节拍通常每秒发生时间的延时和超时功能。时钟节拍通常每秒发生1010010100次次/秒。为了完成该任务,可以使用硬件时钟,也可以从交秒。为了完成该任务,可以使用硬件时钟,也可以从交流电中获得流电中获得50/60Hz50/60Hz的时钟频率。本移植采用的时钟频率。
45、本移植采用S3C44B0XS3C44B0X的的PWMPWM定时器定时器Timer1Timer1作为作为C/OS-C/OS-系统时钟。系统时钟。u用户必须在开始多任务调度后用户必须在开始多任务调度后(即调用即调用OSStart()OSStart()后后)允许允许时钟节拍中断。但由于时钟节拍中断。但由于OSStart()OSStart()函数不会返回,用户无函数不会返回,用户无法实现这一操作。然而,可以在法实现这一操作。然而,可以在OSStart()OSStart()运行后,运行后,C/OS-C/OS-启动运行的第一个任务中初始化节拍中断。这启动运行的第一个任务中初始化节拍中断。这个任务是调用个任
46、务是调用OSStart()OSStart()之前建立的任务中优先级最高的之前建立的任务中优先级最高的任务。通常所犯的错误是在调用任务。通常所犯的错误是在调用OSInit()OSInit()和和OSStart()OSStart()之之间允许时钟节拍中断。在这种情况下,间允许时钟节拍中断。在这种情况下,C/OS-C/OS-的运行的运行状态不确定,用户的应用程序也可能会崩溃。状态不确定,用户的应用程序也可能会崩溃。97OS_CPU_A.S-OS_CPU_A.S-正确位置启动时钟节拍中断正确位置启动时钟节拍中断u示意代码分析示意代码分析int Main(void)OSInit();/初始化 /*应用程
47、序初始化代码*/*建立至少一个任务*/启动时钟节拍中断启动时钟节拍中断;OSStart();/开始多任务调度 return 0;/Main在不正确的位置启动时钟节拍中断在不正确的位置启动时钟节拍中断int Main(void)OSInit();/初始化 /*应用程序初始化代码*/*建立至少一个任务*/OSStart();/开始多任务调度 return 0;/Mainvoid 第一个任务(void*pdata)启动时钟节拍中断启动时钟节拍中断;正确的位置启动时钟节拍中断正确的位置启动时钟节拍中断98OS_CPU_A.S-OSTickISR()OS_CPU_A.S-OSTickISR()uOSTi
48、ckISR()OSTickISR()是系统时钟节拍中断服务函数。其主要任务是系统时钟节拍中断服务函数。其主要任务是负责处理时钟中断,为内核提供时钟节拍。是负责处理时钟中断,为内核提供时钟节拍。n该函数调用该函数调用OSIntEnter()OSIntEnter()时把全局变量时把全局变量OSIntNestingOSIntNesting加加1 1来记录中来记录中断嵌套的层数;断嵌套的层数;n调用调用OSTimeTick()OSTimeTick()主要做了两件事:一是给计数器主要做了两件事:一是给计数器OSTimeOSTime加加1 1;二;二是遍历任务控制块链表,了解每个任务的延时状态,使其中已经
49、是遍历任务控制块链表,了解每个任务的延时状态,使其中已经到了延时时限的非挂起任务进入就绪状态。到了延时时限的非挂起任务进入就绪状态。n调用调用OSIntExit()OSIntExit()函数目的是决定是否因为当前中断服务程序的执函数目的是决定是否因为当前中断服务程序的执行,使得更高优先级的任务就绪。如果有更高优先级任务就绪行,使得更高优先级的任务就绪。如果有更高优先级任务就绪OSIntExitOSIntExit()()就不会返回到被中断任务,而是切换到更高优先级的任务;否就不会返回到被中断任务,而是切换到更高优先级的任务;否则切换回被中断任务继续执行。则切换回被中断任务继续执行。99OS_CP
50、U_A.S-OSTickISR()OS_CPU_A.S-OSTickISR()执行流程图执行流程图重新允许中断(可选);重新允许中断(可选);给产生中断的设备清中断;给产生中断的设备清中断;调用调用OSTimeTick();OSTimeTick();调用调用OSIntExit();OSIntExit();恢复处理器寄存器恢复处理器寄存器;执行中断返回执行中断返回保存处理器寄存器;保存处理器寄存器;调用调用OSIntEnter()OSIntEnter()或者直接将或者直接将 OSIntNestingOSIntNesting加加1;1;if(OSIntNesting=1)if(OSIntNesti