版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1嵌入式系统设计与实例开发嵌入式系统设计与实例开发ARMARM与与 C/OS-C/OS- C/OS-C/OS-移植分析和系统初始化移植分析和系统初始化2提提 要要嵌入式系统的初始化嵌入式系统的初始化 C/OS-移植分析移植分析3初始化程序的下载执行MPUBOOT ROMRAM下载工具串口JTAG网口目标机目标机宿主机宿主机1 1)通过编程器将可执行目标文件烧写到)通过编程器将可执行目标文件烧写到BootROMBootROM(ROMROM、EPROMEPROM、FLASHFLASH)等;)等;2 2)通过串行口和网口下载执行目标文件,)通过串行口和网口下载执行目标文件,要求宿主机系统上有数据传输
2、工具程序、目要求宿主机系统上有数据传输工具程序、目标机装载器、嵌入式监视器或目标机系统上标机装载器、嵌入式监视器或目标机系统上的调试代理;的调试代理;3 3)通过)通过JTAGJTAG或或BDMBDM接口下载。接口下载。4嵌入式系统的初始化过程复位向量最小硬件初始化其余硬件初始化RTOS初始化RTOS部件初始化启动RTOS启动应用程序1234567硬件初始化RTOS初始化软件初始化最小启动代码BSPRTOS应用程序5嵌入式系统的初始化过程复位向量最小硬件初始化其余硬件初始化123最小启动代码BSP硬件初始化阶段硬件初始化阶段1. 复位向量复位向量 ENTRY b ResetHandler ;f
3、or debug b HandlerUndef ;handlerUndef b HandlerSWI ;SWI interrupt handler b HandlerPabort ;handlerPAbort b HandlerDabort ;handlerDAbort b . ;handlerReserved b HandlerIRQ b HandlerFIQ6嵌入式系统的初始化过程(2)复位向量最小硬件初始化其余硬件初始化123最小启动代码BSP硬件初始化阶段硬件初始化阶段2. 2. 最小硬件初始化最小硬件初始化1 1)设置适当的寄存器,使嵌入式处理)设置适当的寄存器,使嵌入式处理器处于一
4、个已知的状态:器处于一个已知的状态:l获得获得CPUCPU的类型。的类型。l获得或设置获得或设置CPUCPU的时钟频率。的时钟频率。2 2)禁止中断和高速缓存。)禁止中断和高速缓存。3 3)初始化内存控制器、内存芯片和高)初始化内存控制器、内存芯片和高速缓存单元,包括:速缓存单元,包括:l得到内存的开始地址。得到内存的开始地址。l得到内存的大小。得到内存的大小。l如果有要求,则还需要进行主存如果有要求,则还需要进行主存测试测试7嵌入式系统的初始化过程(3)复位向量最小硬件初始化其余硬件初始化123最小启动代码BSP硬件初始化阶段硬件初始化阶段3. 3. 其余硬件初始化其余硬件初始化引导代码调用
5、合适的函数对目标机系统引导代码调用合适的函数对目标机系统上的全部硬件部件进行初始化,包括:上的全部硬件部件进行初始化,包括:l建立执行处理程序。建立执行处理程序。l初始化中断处理程序。初始化中断处理程序。l初始化总线接口。初始化总线接口。l初始化板级外设得到内存的开始初始化板级外设得到内存的开始地址。地址。8嵌入式系统的初始化过程(4)RTOS初始化阶段初始化阶段4.RTOS4.RTOS初始化初始化1 1)RTOSRTOS初始化初始化2 2)RTOSRTOS对象和服务初始化对象和服务初始化l任务任务l信号量信号量l定时器定时器l中断中断l内存管理内存管理3 3)RTOSRTOS任务堆栈初始化任
6、务堆栈初始化4 4)RTOSRTOS扩展部件初始化扩展部件初始化5 5)启动)启动RTOSRTOSRTOS初始化RTOS部件初始化启动RTOS456RTOS初始化RTOS9嵌入式系统的初始化过程(5)应用程序初始化阶段应用程序初始化阶段5.5.应用程序初始化应用程序初始化启动应用程序7软件初始化应用程序10ARM7TDMI系统初始化的一般过程启动(系统上电启动(系统上电/ /复位)复位)从程序入口点从程序入口点关闭中断关闭中断初始化时钟等硬件相关寄存器初始化时钟等硬件相关寄存器初始化存储器系统初始化存储器系统初始化初始化C C所需要的存储器空间所需要的存储器空间调用调用C C入口函数入口函数1
7、1一、设置程序入口指针l上电复位后直接到程序入口点执行,入口点一般为一个跳转表,跳上电复位后直接到程序入口点执行,入口点一般为一个跳转表,跳转到复位处理程序处开始执行转到复位处理程序处开始执行ARM7TDMIARM7TDMI系统的初始化。系统的初始化。l启动程序首先必须定义入口指针,而且整个应用程序只有一个入口启动程序首先必须定义入口指针,而且整个应用程序只有一个入口指针。指针。例:例:AREA Boot,CODE,READONLYAREA Boot,CODE,READONLY ENTRY / ENTRY /* *设置程序入口指针设置程序入口指针* */ /12二、设置中断向量lARMARM要
8、求中断向量必须设置在从要求中断向量必须设置在从OX00000000OX00000000地址开始,连续地址开始,连续8 8* *4 4字节字节的地址空间。的地址空间。l向量表包含一系列跳转指令,跳转到相应的中断服务程序。向量表包含一系列跳转指令,跳转到相应的中断服务程序。l对各未用中断,使其指向一个含返回指令的哑函数,以防止错误中对各未用中断,使其指向一个含返回指令的哑函数,以防止错误中断引起系统的混乱。断引起系统的混乱。13中断向量表FIQ0 x1C外部快速中断IRQ0 x18一般外部中断(Reserved)0 x14保留Data Abort0 x10数据异常Frefetch Abort0 x
9、0C预取指异常Software int0 x08软件中断Undef0 x04未定义指令中断Reset0 x00复位中断14中断向量表的程序AREA Boot,CODE,READONLYAREA Boot,CODE,READONLYENTRYENTRYB Reset_handlerB Reset_handlerB UndefB Undef_Handler_HandlerB SWI_HandlerB SWI_HandlerB PreAbortB PreAbort_Handler_HandlerB . ;for reserved interrupt,stop hereB . ;for reserve
10、d interrupt,stop hereB IRQ_handlerB IRQ_handlerB FIQ_handlerB FIQ_handler15三、初始化时钟和设置相关的寄存器 通过设置时钟控制器来确定通过设置时钟控制器来确定CPUCPU的工作频率,设置中断控制寄存的工作频率,设置中断控制寄存器屏蔽中断。器屏蔽中断。16四、初始化存储器系统参考芯片手册,设置与内存映射相关的寄存器。参考芯片手册,设置与内存映射相关的寄存器。17五、初始化堆栈lARMARM处理器有好几种运行状态(模式),各种状态都需要有自己的处理器有好几种运行状态(模式),各种状态都需要有自己的堆栈,所以需要分别为这些堆栈
11、分配空间并设置好各自的堆栈指堆栈,所以需要分别为这些堆栈分配空间并设置好各自的堆栈指针。针。l如果系统使用了如果系统使用了DRAMDRAM或其他外设,需要设置一些寄存器,以确定或其他外设,需要设置一些寄存器,以确定其刷新频率、数据总线宽度等信息。有的系统还需设置一些寄存其刷新频率、数据总线宽度等信息。有的系统还需设置一些寄存器来控制器来控制SDRAMSDRAM、USBUSB、网络接口等。、网络接口等。18六、初始化C环境l在目标文件中,代码、数据放在不同的段中。源文件编译链接生成在目标文件中,代码、数据放在不同的段中。源文件编译链接生成含含.data.data、.text.text段的目标文件
12、,且链接器生成的段的目标文件,且链接器生成的.data.data段是以系统段是以系统RAMRAM为参考地址。为参考地址。l故在系统启动时需要复制故在系统启动时需要复制ROMROM或或FLASHFLASH中的中的.data.data段到段到RAMRAM,以完成对,以完成对RAMRAM的初始化。在初始化期间应将系统需要读写的数据和变量从的初始化。在初始化期间应将系统需要读写的数据和变量从ROMROM复制到复制到RAMRAM里运行。里运行。19链接器产生的符号表 符号由链接器自动产生,只读段(符号由链接器自动产生,只读段(read-only ROread-only RO)就是代码段,读)就是代码段,
13、读写段(写段(read-write RWread-write RW)是已经初始化的全局变量,而零初始化段)是已经初始化的全局变量,而零初始化段(zero-initialized section ZIzero-initialized section ZI)中存放未初始化的全局变量。)中存放未初始化的全局变量。20初始化C环境(2)lC C环境初始化,就是利用上述符号初始化环境初始化,就是利用上述符号初始化RWRW和和ZIZI段以使后面使用的段以使后面使用的全局变量的全局变量的C C程序正常运行。程序正常运行。l这里有两个循环,第一个循环把预初始化的数据段(位于代码段这里有两个循环,第一个循环把预
14、初始化的数据段(位于代码段的后面)复制到的后面)复制到RAMRAM中,另一个循环把未初始化的数据段中,另一个循环把未初始化的数据段ZIZI初始化初始化为为0 0,也就是实现把从,也就是实现把从ROMROM中的中的.data.data段复制到段复制到RAMRAM,对,对ZIZI段内的数段内的数据初始化为据初始化为0 0,以完成对,以完成对C C环境的初始化。环境的初始化。21ROM地址的重映射(remap)0 x0200(boot code)0 x0100(Reset_handler)B Reset_Handler0 x0000Flash(remap)0 x0204(boot code)0 x0
15、200(Reset_handler)B Reset_Handler0 x0000RAM22初始化C环境(3)23七、呼叫C程序l对对mainmain函数的调用进入函数的调用进入C/OS C/OS 的入口,通过这个入口就进入的入口,通过这个入口就进入C/OS C/OS 的主函数,启动对的主函数,启动对C/OS C/OS 的初始化。的初始化。l例例 IMPORT MainIMPORT Main b Main ;C Entry b Main ;C Entry24C/OS 系统的初始化l完成了前面的硬件初始化和运行环境的相关设置后,进入完成了前面的硬件初始化和运行环境的相关设置后,进入Main()Ma
16、in(), Main()Main()是是C/OS C/OS 的入口函数,启动对的入口函数,启动对C/OS C/OS 的初始化的初始化。25ARM7的硬件抽象层uHALC/OS lARMARM公司为操作系统的开发提供了一个硬件抽象层公司为操作系统的开发提供了一个硬件抽象层HALHAL,称为,称为uHALuHAL。l从结构上看,从结构上看,uHALuHAL是一组库程序,需要说明的是,是一组库程序,需要说明的是,uHALuHAL并不是专门并不是专门为为C/OS C/OS 准备的,甚至也不是专为操作系统内核准备的。准备的,甚至也不是专为操作系统内核准备的。luHALuHAL只是个针对只是个针对ARMA
17、RM核的函数库。核的函数库。lC/OS C/OS 是建立在是建立在uHALuHAL的基础之上的。的基础之上的。26C/OS 系统的初始化(2)27ARMTargetInit()函数结构ARMTargetInitARMTargetInit()()调调uHALuHAL打印接口打印系统信息打印接口打印系统信息调用调用uHALuHAL函数禁止所有中断函数禁止所有中断调用调用uHALuHAL函数对中断初始化函数对中断初始化uHALuHAL函数对函数对ARMARM计数器初始化计数器初始化结束结束28uHAL的功能luHALuHAL的作用之一是在操作系统本身进入正常运行之前,为系统提供基的作用之一是在操作系
18、统本身进入正常运行之前,为系统提供基本的输入输出手段,例如本的输入输出手段,例如uHALr_printfuHALr_printf()()等。等。luHALuHAL还要为操作系统的运行准备一个基本的运行环境,具体包括下列还要为操作系统的运行准备一个基本的运行环境,具体包括下列各种初始化:各种初始化:通过通过uHAL_ResetMMUuHAL_ResetMMU()(),将,将MMUMMU设置在一个确定的初始状态。设置在一个确定的初始状态。通过通过ARMDisableARMDisable()()关闭中断。关闭中断。通过通过uHAL_InitInterruptsuHAL_InitInterrupts(
19、)()设置中断向量处理程序。设置中断向量处理程序。通过通过uHAL_InitTimeruHAL_InitTimer()()对系统使用的计数器进行初始对系统使用的计数器进行初始 化。化。29ARMTargetStart()的分析 创建了任务之后创建了任务之后,ARMTargetStartARMTargetStart()()调用调用uHALr_InstallSystemTimeruHALr_InstallSystemTimer()()创建一个系统时钟,为时钟中断做好准备。创建一个系统时钟,为时钟中断做好准备。30提提 要要嵌入式系统的初始化嵌入式系统的初始化 C/OS-移植分析移植分析31操作系统
20、移植的概念l所谓操作系统的移植,是指使一个实时操作系统能够在某个微处理所谓操作系统的移植,是指使一个实时操作系统能够在某个微处理器平台上运行。器平台上运行。l COS-IICOS-II的主要代码都是由标准的的主要代码都是由标准的C C语言写成的,移植方便。语言写成的,移植方便。l移植的主要工作是修改部分与处理器硬件相关的代码。移植的主要工作是修改部分与处理器硬件相关的代码。32移植的层次操作系统的移植大体可以分为两个层次:操作系统的移植大体可以分为两个层次:l跨体系结构的移植。跨体系结构的移植。l针对特定处理器的移植。针对特定处理器的移植。33移植COS-II满足的条件 l处理器的处理器的C
21、C编译器能产生可重入代码。编译器能产生可重入代码。 l在程序中可以打开或者关闭中断。在程序中可以打开或者关闭中断。 l处理器支持中断,并且能产生定时中断(通常在处理器支持中断,并且能产生定时中断(通常在10-100Hz10-100Hz之间)。之间)。 l处理器支持能够容纳一定量数据的硬件堆栈。处理器支持能够容纳一定量数据的硬件堆栈。 l处理器有将堆栈指针和其他处理器有将堆栈指针和其他CPUCPU寄存器存储和读出到堆栈(或者内寄存器存储和读出到堆栈(或者内存)的指令。存)的指令。 34什么是可重入代码 l可重入的代码指的是一段代码(比如:一个函数)可以被多个任可重入的代码指的是一段代码(比如:一
22、个函数)可以被多个任务同时调用,而不必担心会破坏数据。务同时调用,而不必担心会破坏数据。l也就是说,可重入型函数在任何时候都可以被中断执行,过一段也就是说,可重入型函数在任何时候都可以被中断执行,过一段时间以后又可以继续运行,而不会因为在函数中断的时候被其他时间以后又可以继续运行,而不会因为在函数中断的时候被其他的任务重新调用,影响函数中的数据。的任务重新调用,影响函数中的数据。35可重入代码举例程序程序1 1:可重入型函数:可重入型函数void swap(int void swap(int * *x, intx, int * *y)y) intint temp; temp;temp=temp
23、=* *x;x;* *x=x=* *y;y;* *y=temp;y=temp; 36非可重入代码举例程序程序2 2:非可重入型函数:非可重入型函数intint temp; temp;void swap(int void swap(int * *x, intx, int * *y)y) temp=temp=* *x;x;* *x=x=* *y;y;* *y=temp;y=temp; 返回37不可重入函数被中断破坏38如何使函数具有可重入性 使使Swap()Swap()函数具有可重入性:函数具有可重入性:l把把TempTemp定义为局部变量。定义为局部变量。l调用调用Swap()Swap()函数之
24、前关中断,调动后再开中断。函数之前关中断,调动后再开中断。l用信号量禁止该函数在使用过程中被再次调用。用信号量禁止该函数在使用过程中被再次调用。39打开/关闭中断 在在 COS-IICOS-II中,可以通过:中,可以通过:OS_ENTER_CRITICAL() OS_ENTER_CRITICAL() OS_EXIT_CRITICAL()OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。这需要处理器的支持。宏来控制系统关闭或者打开中断。这需要处理器的支持。在在ARM7TDMIARM7TDMI的处理器上,可以设置相应的寄存器来关闭或者打开的处理器上,可以设置相应的寄存器来关闭或者打
25、开系统的所有中断。系统的所有中断。 40处理器支持中断并且能产生定时中断 l COS-IICOS-II是通过处理器产生的定时器的中断来实现多任务之间是通过处理器产生的定时器的中断来实现多任务之间的调度的。的调度的。lARM7TDMIARM7TDMI的处理器上可以产生定时器中断。的处理器上可以产生定时器中断。41处理器支持硬件堆栈 l COS-IICOS-II进行任务调度的时候,会把当前任务的进行任务调度的时候,会把当前任务的CPUCPU寄存器存放到寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个
26、任务。所以,寄存器的入栈和出栈是作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是 COS-IICOS-II多任务调度的基础。多任务调度的基础。 lARM7ARM7处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。42移植对开发工具的要求 l移植移植 COS-IICOS-II需要一个标准的需要一个标准的C C交叉编译器。交叉编译器。l由于移植时需要对由于移植时需要对CPUCPU的寄存器进行操作,所以需要的寄存器进行操作,所以需要C C交叉编译器能交叉编译器能够支持汇编语言程序。够支持汇编语言程序。l嵌入式嵌入式C C编译器一般都包括汇编器
27、、链接器和定位器。链接器是用来编译器一般都包括汇编器、链接器和定位器。链接器是用来将不同的模块(编译或汇编过的文件)链接成目标文件;定位器则将不同的模块(编译或汇编过的文件)链接成目标文件;定位器则允许将代码和数据放置在目标处理器的指定内存空间中。允许将代码和数据放置在目标处理器的指定内存空间中。43移植C/OS-II要点(1)开关中断的方式。推荐使用开关中断的方式。推荐使用method3method3 #if OS_CRITICAL_METHOD = 3#if OS_CRITICAL_METHOD = 3OS_CPU_SR cpu_srOS_CPU_SR cpu_sr; ;#endif#en
28、dif OS_ENTER_CRITICAL(); OS_ENTER_CRITICAL(); OS_EXIT_CRITICAL(); OS_EXIT_CRITICAL(); 44使用method3方式的开关中断#define OS_ENTER_CRITICAL() cpu_sr = INTS_OFF(); #define OS_EXIT_CRITICAL() if(cpu_sr = 0) INTS_ON(); 45ARM的中断模式l设备的中断在设备的中断在ARMARM中被映射到了两个异常中断中中被映射到了两个异常中断中FIQFIQ和和IRQIRQ。l通过控制通过控制CPSRCPSR中的对应数据位
29、,可以开启或者关闭中断。中的对应数据位,可以开启或者关闭中断。为了方便和统一为了方便和统一C/OS-IIC/OS-II系统中断的处理,只使用了系统中断的处理,只使用了IRQIRQ模式的模式的中断。中断。46移植C/OS-II要点(2)系统中断的处理 所有中断的调用都需要经过系统的接管。中断处理函数调用前后所有中断的调用都需要经过系统的接管。中断处理函数调用前后需要通知系统。例如:需要通知系统。例如:OSIntEnter();yourInterruptFun();OSIntExit();47OSIntExit的意义的意义48ARM的工作模式lARMARM处理器有处理器有7 7种操作模式种操作模式
30、: :l用户模式用户模式(usr(usr) ) 正常的程序执行模式。正常的程序执行模式。l快速中断模式快速中断模式( (fiqfiq) ) 支持高速数据传输或通道处理。支持高速数据传输或通道处理。l中断模式中断模式(irq(irq) ) 用于通用中断处理。用于通用中断处理。l管理员模式管理员模式(svc)(svc) 操作系统的保护模式操作系统的保护模式。l中止模式中止模式( (abtabt) ) 支持虚拟内存和支持虚拟内存和/ /或内存保护等异常。或内存保护等异常。l系统模式系统模式(sys)(sys) 支持操作系统的特殊用户模式支持操作系统的特殊用户模式( (运行操作系统任务)。运行操作系统
31、任务)。l未定义模式未定义模式(und)(und) 支持硬件协处理器的软件仿真。支持硬件协处理器的软件仿真。 l除了用户模式外,其他模式均可视为特权模式除了用户模式外,其他模式均可视为特权模式49ARM的寄存器(1)l3737个寄存器:个寄存器:u31 31 个通用个通用3232位寄存器,包括程序计数器位寄存器,包括程序计数器PCPC。u6 6 个状态寄存器。个状态寄存器。u1515个通用寄存器个通用寄存器 (R0 to R14), (R0 to R14), 以及以及2 2个状态寄存器和程序计数器(个状态寄存器和程序计数器(PCPC)在任何时候都中可见的。)在任何时候都中可见的。l可见的寄存器
32、取决于处理器的模式,不同的模式映射了不同的工可见的寄存器取决于处理器的模式,不同的模式映射了不同的工作寄存器。作寄存器。50ARM寄存器的组织注注:表明用户或系统模式使用的正常寄存器已经被异常表明用户或系统模式使用的正常寄存器已经被异常模式指定的另一个寄存器取代模式指定的另一个寄存器取代51ARM的寄存器(2)lR0 R0 到到 R15 R15 可以直接访问。可以直接访问。lR0 R0 到到 R14 R14 是通用寄存器。是通用寄存器。lR13: R13: 堆栈指针堆栈指针 (sp) (sp) (通常通常) )。u每种处理器模式都有单独的堆栈。lR14: R14: 链接寄存器链接寄存器 ( (
33、lrlr) )。lR15R15:程序计数器:程序计数器 (PC)(PC)。lCPSR CPSR :当前程序状态寄存器,包括代码标志状态和当前模式位。当前程序状态寄存器,包括代码标志状态和当前模式位。l5 5个个SPSR(SPSR(程序状态保存寄存器程序状态保存寄存器) :) :当异常发生时保存当异常发生时保存CPSRCPSR状态。状态。52C/OS-II在ARM上的任务切换l任务级的任务切换;任务级的任务切换;l中断级的任务切换。中断级的任务切换。53中断处理过程54OSIntExit()void OSIntExit (void) OS_ENTER_CRITICAL(); (1) if (-O
34、SIntNesting | OSLockNesting) = 0) (2) OSIntExitY = OSUnMapTblOSRdyGrp; (3) OSPrioHighRdy = (INT8U)(OSIntExitY OSTCBStkPtr = Stack pointer; 调用用户定义的调用用户定义的OSTaskSwHook(); OSTCBCur = OSTCBHighRdy; OSPrioCur = OSPrioHighRdy; 得到需要恢复的任务的堆栈指针得到需要恢复的任务的堆栈指针: Stack pointer = OSTCBHighRdy-OSTCBStkPtr; 将所有处理器寄
35、存器从新任务的堆栈中恢复出来将所有处理器寄存器从新任务的堆栈中恢复出来; 执行中断返回指令执行中断返回指令;77OS_TASK_SW ();任务级的任务切换函数(1)OS_TASK_SWSTMFDsp!, lr; 保存保存 pcSTMFDsp!, lr; 保存保存 lrSTMFDsp!, r0-r12; 保存寄存器和返回地址保存寄存器和返回地址MRS r4, CPSRSTMFDsp!, r4; 保存当前的保存当前的PSRMRS r4, SPSRSTMFDsp!, r4; 保存保存SPSR; OSPrioCur = OSPrioHighRdyLDR r4, addr_OSPrioCurLDR r
36、5, addr_OSPrioHighRdyLDRBr6, r5STRBr6, r478OS_TASK_SW():任务级的任务切换函数(2); 得到当前任务得到当前任务TCB地址地址LDR r4, addr_OSTCBCurLDR r5, r4STRsp, r5; 保存保存sp在被占先的任务的在被占先的任务的 TCB; 得到最高优先级任务得到最高优先级任务TCB地址地址LDR r6, addr_OSTCBHighRdyLDR r6, r6LDR sp, r6; 得到新任务堆栈指针得到新任务堆栈指针; OSTCBCur = OSTCBHighRdySTRr6, r4; 设置新的当前任务的设置新的当
37、前任务的TCB地址地址 ;保存任务方式寄存器保存任务方式寄存器 LDMFDsp!, r4MSR SPSR, r4LDMFDsp!, r4MSR CPSR, r4 ; 返回到新任务的上下文返回到新任务的上下文LDMFDsp!, r0-r12, lr, pc79中断服务中断服务80关于栈指针调整81栈指针调整栈指针调整 调整堆栈指针(加一个数在堆栈指针上)来完成的。加在堆栈调整堆栈指针(加一个数在堆栈指针上)来完成的。加在堆栈指针上的数必须是明确的,而这个数主要依赖于移植的目标处理器指针上的数必须是明确的,而这个数主要依赖于移植的目标处理器( (地址空间可能是地址空间可能是1616,3232或或6
38、464位位) ),所用的编译器,编译器选项,内存,所用的编译器,编译器选项,内存模式等等。另外,处理器状态字可能是模式等等。另外,处理器状态字可能是8 8,1616,3232甚至甚至6464位宽,并且位宽,并且OSIntExitOSIntExit()()可能会分配局部变量。有些处理器允许用户直接增加常可能会分配局部变量。有些处理器允许用户直接增加常量到堆栈指针中,而有些则不允许。在后一种情况下,可以通过简量到堆栈指针中,而有些则不允许。在后一种情况下,可以通过简单的执行一定数量的单的执行一定数量的poppop(出栈)指令来实现相同的功能。一旦堆栈(出栈)指令来实现相同的功能。一旦堆栈指针完成调
39、整,新的堆栈指针会被保存到被切换出去的任务的指针完成调整,新的堆栈指针会被保存到被切换出去的任务的OS_TCBOS_TCB中中 。82OSIntCtxSW的实现83OSIntCtxSwOSIntCtxSw()()的原型的原型void OSIntCtxSw(void) 调整堆栈指针来去掉在调用:调整堆栈指针来去掉在调用: OSIntExit(), OSIntCtxSw()过程中压入堆栈的多余内容过程中压入堆栈的多余内容; 将当前任务堆栈指针保存到当前任务的将当前任务堆栈指针保存到当前任务的OS_TCB中中: OSTCBCur-OSTCBStkPtr = 堆栈指针堆栈指针; 调用用户定义的调用用户
40、定义的OSTaskSwHook(); OSTCBCur = OSTCBHighRdy; OSPrioCur = OSPrioHighRdy; 得到需要恢复的任务的堆栈指针得到需要恢复的任务的堆栈指针: 堆栈指针堆栈指针 = OSTCBHighRdy-OSTCBStkPtr; 将所有处理器寄存器从新任务的堆栈中恢复出来将所有处理器寄存器从新任务的堆栈中恢复出来; 执行中断返回指令执行中断返回指令;84OSIntCtxSW ();中断级的任务切换函数(1)OSIntCtxSwadd r7, sp, #16 ; 保存寄存器指针保存寄存器指针LDRsp, =IRQStack;FIQ_STACK mrs
41、 r1, SPSR ; 得到暂停的得到暂停的 PSRorr r1, r1, #0 xC0 ; 关闭关闭 IRQ, FIQ.msr CPSR_cxsf, r1 ; 转换模式转换模式 (应该是应该是 SVC_MODE)ldr r0, r7, #52 ; 从从IRQ堆栈中得到堆栈中得到IRQs LR (任务任务 PC) sub r0, r0, #4 ; 当前当前PC地址是地址是(saved_LR - 4)STMFD sp!, r0 ; 保存任务保存任务 PCSTMFD sp!, lr ; 保存保存 LRmov lr, r7 ; 保存保存 FIQ 堆栈堆栈 ptr in LR (转到转到 nuke r
42、7)ldmfd lr!, r0-r12 ; 从从FIQ堆栈中得到保存的寄存器堆栈中得到保存的寄存器STMFD sp!, r0-r12 ;在任务堆栈中保存寄存器在任务堆栈中保存寄存器 85OSIntCtxSW ();中断级的任务切换函数(2);在任务堆栈上保存在任务堆栈上保存PSR 和任务和任务 PSRMRSr4, CPSRbic r4, r4, #0 xC0 ; 使中断位处于使能态使中断位处于使能态STMFD sp!, r4; 保存任务当前保存任务当前 PSRMRSr4, SPSRSTMFD sp!, r4; SPSR ; OSPrioCur = OSPrioHighRdy / 改变当前程序改
43、变当前程序LDRr4, addr_OSPrioCurLDRr5, addr_OSPrioHighRdyLDRBr6, r5STRBr6, r4; 得到被占先的任务得到被占先的任务TCBLDRr4, addr_OSTCBCurLDRr5, r4STRsp, r5; 保存保存sp 在被占先的任务的在被占先的任务的 TCB86OSIntCtxSW ();中断级的任务切换函数(3); 得到新任务得到新任务 TCB 地址地址LDRr6, addr_OSTCBHighRdyLDRr6, r6LDRsp, r6; 得到新任务堆栈指针得到新任务堆栈指针; OSTCBCur = OSTCBHighRdySTRr
44、6, r4 ; 设置新的当前任务的设置新的当前任务的TCB地址地址LDMFDsp!, r4MSRSPSR, r4LDMFDsp!, r4BIC r4, r4, #0 xC0 ; 必须退出新任务通过允许中断必须退出新任务通过允许中断MSRCPSR, r4LDMFDsp!, r0-r12, lr, pc87测试C/OS-II(1)/*任务定义任务定义*/OS_STK SYS_Task_StackSTACKSIZE= 0, ; /system task刷新任务堆刷新任务堆栈栈#define SYS_Task_Prio1void SYS_Task(void *Id);OS_STK Task1_StackSTACKSIZE=0, ; void Task1(void *Id);#define Task1_Prio 12OS_STK Task2_StackSTACKSIZE= 0, ; void Task2(void *Id); #define Task2_Prio 1388测试C/OS-II(2)int Main(int argc, char *argv)ARMTarg
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年安徽省淮北市八年级英语上册期中考试试卷及答案
- 轮椅训练方法
- 2025版视网膜脱落常见症状及护理注意事项
- 2025版冠心病症状分析及护理措施
- 幼儿看图说话训练
- 经过时间的计算教学设计
- 眼睛科眼疾病的日常预防指南
- 安全员怎样给员工培训
- 设备异常处理方法及流程
- 《资治通鉴》核心解析
- 《医疗质量安全核心制度要点》解读
- 视频制作拍摄服务方案投标文件(技术方案)
- T∕CECS 21-2024 超声法检测混凝土缺陷技术规程
- 学校食堂家长开放日活动上校长讲话:一起为孩子们的“舌尖安全”把好关
- 中西医结合治疗神经性疼痛的进展
- 园林高级工程师评审个人技术工作总结
- 《劳动教育》 课件 专题三 树立劳动精神 第一节 积淀劳动精神
- 《山西汾酒公司基于杜邦分析法的企业财务能力分析案例》15000字
- 乒乓球教案体育课件
- 《都市园艺》课程教学大纲
- 空调水系统施工方案
评论
0/150
提交评论