ARMReal-TimeLibraryTraining1Real-Time库:RTX内核ARMReal-TimeLibraryTraining2RTXKernel“RTX内核”(Real-TimeeXecutive)是一个实时操作系统“RTX内核”支持ARM7、ARM9、Cortex-M3。基于RTX的内核Source:允许创建多任务的应用程序允许系统资源弹性使用,如CPU存储器RTX内核是一个静态系统要想应用程序中使用RTX内核,必须加RTX库(可以使用菜单“options”自动加载)以下两个版本都可以使用•ARM7™/ARM9™•Cortex™-M3基于RTX内核ARMReal-TimeLibraryTraining4RTXKernel开始实时执行创建任务开始/停止任务执行从一个任务到另一个任务转换实现任务间的通讯基本功能ARMReal-TimeLibraryTraining5RTXKernel“事件标志”“信号量”“互斥”“信箱”进程间的通信提供一个任务间通信的机制:ARMReal-TimeLibraryTraining6RTXKernel/TechnicaldataSource::IRQ•调度程序可以禁止一小段时间(µs)FIQ•不能被禁止•不能从FIQ-ISR调用专用系统内核函数SWI(ARM7&ARM9设备的软件中断功能)•RTX内核保留SWI0到7•SWI功能受中断保护(FIQ除外)•自我创建的SWI功能必须用于RTX内核的处理os_clock_demon任务RTXARM7&ARM9提示ARMReal-TimeLibraryTraining9RTXKernelIRQ•不能由RTX调度程序禁止无FIQSVC(SoftwareInterruptFunctionforCortex-Mdevices)•SVC0保留给RTX内核•可以中断SVC函数•自我创建的SVC功能必须用于RTX的SVC处理无os_clock_demon任务栈空间•最小128Byte(256Byte)RTXCortex-M3提示ARMReal-TimeLibraryTraining10RTX内核:任务的使用ARMReal-TimeLibraryTraining11Tasks-Basics应用程序的每个作业都会由分割的任务来处理每个外设也可由几个分割的任务来处理任务间进程的通信几个任务可以被“同步”执行每个任务都会有自己的优先权等级任务可以移植到其他应用程序中ARMReal-TimeLibraryTraining12SystemResources在文件“RTX_Config.c”中进行配置•当前运行的任务数量•用户定义栈的任务数量•默认的栈空间系统资源ARMReal-TimeLibraryTraining13SystemResourcesRTX内核需要的周期(按时间片)ARM7和ARM9设备上的RTX内核:•使用ARM的其中一个标准定时器Cortex-M的RTX内核:•使用系统定时器(Cortex-MCPU提供专用的RTOS定时器)定时器的时间片中断ARMReal-TimeLibraryTraining14SystemResourcesos_clock_demon:•系统时间片定时器任务•调用时间片定时器中断(ARM7&ARM9)•管理其他所有任务(延时溢出,唤醒任务,挂起任务等)•具有最高的优先权•Cortex-M中不使用RTX库(Cortex-M设备有扩展的RTOS特性)os_idle_demon:•RTX内核的空闲任务•如果没有任务运行RTX内核,转换到•优先权最低RTX内核默认的任务ARMReal-TimeLibraryTraining15SystemResources每个任务由任务控制块定义TaskControlBlock(TCB)在配置文件“RTX_Config.c”中定义TCB存储池的大小•依据并发执行的任务数量来定义任务控制块Source:任务的TCB在创建任务后,根据任务的运行时间从存储池中动态分配任务的定位信息:•任务控制变量•任务状态变量任务控制块Source:RTX内核为所有任务的栈分配存储池存储池的大小取决于•默认栈的大小•当前运行任务的数量•用户自定义栈的任务数量•设备类型(Cortex-MorARM7/9)栈管理Source:附加栈:•os_clock_demon任务和•os_idle_demon任务Cortex-M:ARM7&ARM9:栈管理MemoryPoolSize=(OS_TASKCNT–OS_PRIVCNT+1)*StackSizeMemoryPoolSize=(OS_TASKCNT–OS_PRIVCNT+2)*StackSizeSource:任务创建以后,在运行时任务的栈由存储池动态分配用户定义的栈必须由程序分配,必须由新创建的任务指定栈存储块分配以后,指向其位置的指针必须写入到TCB栈管理Source:每个任务获得自己的栈并进行存储:•参数•变量•函数返回•(现场保存)任务转换:•当前运行任务的现场将会保存在本地栈中•切换到下一个任务•保存新任务的现场•新任务开始运行栈管理Source:RTX内核提供了栈溢出校对•在文件RTX_Config.c中允许/禁止此功能•当栈溢出时,RTX核进入函数stack_error_function()中,这个函数是一个死循环栈管理Source::用户/系统的栈定义在文件Startup.s中为RTX内核配置的最小栈空间为:•管理模式32bytes(0x00000020)•中断模式64bytes(0x00000040)•用户模式80bytes(0x00000050)第一个栈创建并启动后方可使用用户模式栈(UserModeStack)用户使用自己创建的中断时,必须要增加中断模式栈的空间(InterruptModeStack)用户使用自定义的SWI功能时,必须增加管理模式栈的空间(SupervisorModeStack)系统启动ARMReal-TimeLibraryTraining23SystemResourcesCortex-M3:在文件Startup.s中对主栈的大小进行配置RTX核使用系统服务调用(SystemSerViceCalls)•所有SVC函数都使用主栈•使用RTX核时主栈最小为128bytes•如果使用了中断,主栈的大小建议使用256bytes如果应用程序使用自有的SVC函数,应再增加主栈的大小系统启动ARMReal-TimeLibraryTraining24Multitasking多任务是按照操作系统的方式来处理多任务的同步,允许多任务共享系统资源。单CPU系统中,在同一时刻只允许处理一个任务。在各任务之间快速转换,感觉上是多任务在同步执行。几套多任务策略。定义ARMReal-TimeLibraryTraining25TaskManagement每个任务处于以下几个状态之一:•RUNNING•READY•INACTIVE•WAIT_DLY•WAIT_ITV•WAIT_OR•WAIT_AND•WAIT_SEM•WAIT_MUT•WAIT_MBX任务状态CPURunningT5ReadyT1ReadyT2Wait_XXT3Wait_XXT4CPURunningT5RunningT5ReadyT1ReadyT1ReadyT2ReadyT2Wait_XXT3Wait_XXT3Wait_XXT4Wait_XXT4ARMReal-TimeLibraryTraining26TaskManagementRUNNING:•当前运行的任务•同一时刻只有一个任务处于这一状态•当前CPU处理的正是这个任务READY:•任务处于准备运行状态INACTIVE:•任务还没有被执行或者是任务已经取消任务状态ARMReal-TimeLibraryTraining27TaskManagementWAIT_DLY:•任务等待延时后再执行WAIT_ITV:•任务等待设定的时间间隔到后再执行任务状态ARMReal-TimeLibraryTraining28TaskManagementWAIT_OR:•任务等待最近的事件标志WAIT_AND:•任务等待所有设置事件标志任务状态ARMReal-TimeLibraryTraining29TaskManagementWAIT_SEM:•任务等待从同步信号发来的“标志”WAIT_MUT:•任务等待可用的互斥量WAIT_MBX:•任务等待信箱消息或者等待可用的信箱空间来传送消息任务状态ARMReal-TimeLibraryTraining30Multitasking协同多任务处理抢占多任务处理循环多任务处理多任务策略ARMReal-TimeLibraryTraining31Basics任务调用自己的调度程序或者使自己进入休眠状态由程序员设计多任务操作系统不影响任务间的转换协同多任务处理ARMReal-TimeLibraryTraining32Functionsos_tsk_pass()•任务调用调度程序•调度程序决定下一个运行的任务os_dly_wait()•任务进入休眠,休眠时间预先设定•调度程序决定下一个运行的任务协同多任务处理ARMReal-TimeLibraryTraining33Basics调度程序可以抢占当前运行的任务调度程序决定下一个运行的任务因此,高优先权任务可以抢占低优先权任务当前的现场要进行保存抢占多任务处理ARMReal-TimeLibraryTraining34BasicsCPU时间被分割为时间片。处于“ready”状态的任务(与其他具有相同优先权的任务相比),调度程序会将之优先执行。使用类似os_tsk_pass()的方法,可以将循环多任务处理与协同多任务处理结合起来。当前运行的任务切换到等待状态的时候,由调度程序决定下一个运行的任务。循环多任务处理ARMReal-TimeLibraryTraining35Example两个任务有相同的优先权循环模式被禁止用示波器检测“portpin”会有什么情况发生?例1Task1:voidtask1(void)__task{while(1){portpin=1;}}Task2:voidtask2(void)__task{while(1){portpin=0;}}ARMReal