μC/OS-II在LPC213X上的多种移植方案
发布时间:2008/5/27 0:00:00 访问次数:372
1 与μc/os-ii移植工作相关的主要特性
arm体系结构分为7种运行模式,arm和thumb两种工作状态。lpc213x的编程模型就是标准的arm7体系结构;同时lpc213x也具备arm的标准异常模式irq和fiq。稍具特色的是其vic向量中断控制器。分别对irq、fiq、非向量中断和软件中断进行了分类,具有对32个中断输入的可编程分配机制。这对于μc/os-ii的移植至关重要。
芯片内部的rtc实时时钟可由独立的32 mhz晶振或基于vpb时钟的可编程预分频提供,作为实时系统的时钟节拍来源。
2 μc/os-ii移植的主要工作
移植工作分为编译器相关和处理器相关两部分。前者主要涉及数据类型定义、代码格式、头文件组织、条件编译选项及混合编程等;后者主要涉及开关中断、堆栈方向、任务栈结构初始化、任务调度、中断控制和响应、时钟节拍处理和高优先级任务执行等。
主要是编写3个文件:os_cpu.h、os_cpu_c.c和os_cpu_a.s。其中l主要包含以下几个重要函数;ostaskstkinit()、osstarthighrdy()、osctxsw()、os-intctxsw()和ostickisr()等。另外,还须编写配置文件、引导及初始化代码和调试等。
3 两个可行的移植方案
针对arm所具有的7种不同运行模式,移植μc/os-ii系统时采用的处理器模式方案是多样的。例如,可以让系统运行在svc管理模式,swi软中断也用svc模式,其他为异常模式;也可以使μc/os-ii运行在sys系统模式;还可以使μc/os-il运行于用户模式,任务或中断切换时将其从svc模式或irq、flq模式切换到sys模式处理堆栈。在此形成以下两种方案,并结合移植过程进行简要分析。
方案一:系统运行于svc管理模式,异常运行于异常模式。
①开关中断。设置这种方案中os_critical_method为3,则开中断过程为先保存cpsr寄存器值到ro,通过设置cpsr6、cpsr7两位禁止fiq和irq,关中断则恢复原先开中断时保存在r0中的cpsr。
②任务切换。因为非异常任务都运行在svc模式,所以任务切换要做的只是保存旧任务的寄存器状态到堆栈,并且恢复新任务的堆栈状态到寄存器当中,相关函数为osctxsw()。要注意在这里上下文切换中无须对spsr负责,因为spsr是备份cpsr寄存器,只有当模式切换从fiq、irq模式退出时才发生作用。换句话讲,spsr总是在中断禁止时才发生作用。
③中断级任务切换和相应中断机制。中断异常分为fiq和irq异常。irq的中断级任务切换过程os_cpu_irq_isr()如图1所示。
由图1可知,该函数作为μc/os-ii系统的中断调度函数,进入中断irq模式后立即返回svc模式保存原先任务状态;再回到irq执行用户级中断处理代码os_cpu_irq_isr_handler();完成后返回svc模式运行最高优先级任务。
lpc213x具有vic向量中断控制器,把所有中断分为fiq、向最中断和非向量中断。fiq从中断向量表处开始处理程序,直接在用户中断处理代码os_cpu_ftq_isr_handler()里调用中断处理程序;而向量中断irq在响应时会在vicvectaddr(0xfffff030)寄存器上出现该中断处理程序的首地址。所以作为μc/os-ii的irq的用户中断处理代码,必须进行如下处理:
④中断向量表。在该方案的中断向量表中,fiq和irq中断向量填写的是程序跳转指令。其中fiq跳到os_cpu_fiq_isr(),irq跳到os_cpu_irq_isr()。
⑤时钟节拍的产生。μc/os-ii时钟节拍需要lo~100ms一次的精确间隔。lpc213x使用11 mhz的外部晶振,外设时钟与系统时钟频分比设为l,而rtc设置外设时钟为时钟源,然后把timer0作为向量中断irq,编写时钟中断处理程序实现时钟节拍。
方案二:系统运行于sys系统模式,异常服务程序处理在sys系统模式下执行,软中断处理在管理模式下执行。
①开关中断。该方案下os_critical_method为2,具体过程不直接从汇编代码实现,而是通过软件中断swi系统服务来实现。开关中断在svc管理模式下进行,因为arm决定cpsr可以在任意模式下被访问。
②任务切换。任务切换包括任务级调度切换和中断处理程序调度切换。任务级切换采用软中断swi方式实现,需要注意的是此时swi中断处理程序并不返回,所以每次swi中断一开始就重新初始化svc管理模式的堆栈地址空间,否则会造成内存泄漏或溢出。其流程如图2所示。
1 与μc/os-ii移植工作相关的主要特性
arm体系结构分为7种运行模式,arm和thumb两种工作状态。lpc213x的编程模型就是标准的arm7体系结构;同时lpc213x也具备arm的标准异常模式irq和fiq。稍具特色的是其vic向量中断控制器。分别对irq、fiq、非向量中断和软件中断进行了分类,具有对32个中断输入的可编程分配机制。这对于μc/os-ii的移植至关重要。
芯片内部的rtc实时时钟可由独立的32 mhz晶振或基于vpb时钟的可编程预分频提供,作为实时系统的时钟节拍来源。
2 μc/os-ii移植的主要工作
移植工作分为编译器相关和处理器相关两部分。前者主要涉及数据类型定义、代码格式、头文件组织、条件编译选项及混合编程等;后者主要涉及开关中断、堆栈方向、任务栈结构初始化、任务调度、中断控制和响应、时钟节拍处理和高优先级任务执行等。
主要是编写3个文件:os_cpu.h、os_cpu_c.c和os_cpu_a.s。其中l主要包含以下几个重要函数;ostaskstkinit()、osstarthighrdy()、osctxsw()、os-intctxsw()和ostickisr()等。另外,还须编写配置文件、引导及初始化代码和调试等。
3 两个可行的移植方案
针对arm所具有的7种不同运行模式,移植μc/os-ii系统时采用的处理器模式方案是多样的。例如,可以让系统运行在svc管理模式,swi软中断也用svc模式,其他为异常模式;也可以使μc/os-ii运行在sys系统模式;还可以使μc/os-il运行于用户模式,任务或中断切换时将其从svc模式或irq、flq模式切换到sys模式处理堆栈。在此形成以下两种方案,并结合移植过程进行简要分析。
方案一:系统运行于svc管理模式,异常运行于异常模式。
①开关中断。设置这种方案中os_critical_method为3,则开中断过程为先保存cpsr寄存器值到ro,通过设置cpsr6、cpsr7两位禁止fiq和irq,关中断则恢复原先开中断时保存在r0中的cpsr。
②任务切换。因为非异常任务都运行在svc模式,所以任务切换要做的只是保存旧任务的寄存器状态到堆栈,并且恢复新任务的堆栈状态到寄存器当中,相关函数为osctxsw()。要注意在这里上下文切换中无须对spsr负责,因为spsr是备份cpsr寄存器,只有当模式切换从fiq、irq模式退出时才发生作用。换句话讲,spsr总是在中断禁止时才发生作用。
③中断级任务切换和相应中断机制。中断异常分为fiq和irq异常。irq的中断级任务切换过程os_cpu_irq_isr()如图1所示。
由图1可知,该函数作为μc/os-ii系统的中断调度函数,进入中断irq模式后立即返回svc模式保存原先任务状态;再回到irq执行用户级中断处理代码os_cpu_irq_isr_handler();完成后返回svc模式运行最高优先级任务。
lpc213x具有vic向量中断控制器,把所有中断分为fiq、向最中断和非向量中断。fiq从中断向量表处开始处理程序,直接在用户中断处理代码os_cpu_ftq_isr_handler()里调用中断处理程序;而向量中断irq在响应时会在vicvectaddr(0xfffff030)寄存器上出现该中断处理程序的首地址。所以作为μc/os-ii的irq的用户中断处理代码,必须进行如下处理:
④中断向量表。在该方案的中断向量表中,fiq和irq中断向量填写的是程序跳转指令。其中fiq跳到os_cpu_fiq_isr(),irq跳到os_cpu_irq_isr()。
⑤时钟节拍的产生。μc/os-ii时钟节拍需要lo~100ms一次的精确间隔。lpc213x使用11 mhz的外部晶振,外设时钟与系统时钟频分比设为l,而rtc设置外设时钟为时钟源,然后把timer0作为向量中断irq,编写时钟中断处理程序实现时钟节拍。
方案二:系统运行于sys系统模式,异常服务程序处理在sys系统模式下执行,软中断处理在管理模式下执行。
①开关中断。该方案下os_critical_method为2,具体过程不直接从汇编代码实现,而是通过软件中断swi系统服务来实现。开关中断在svc管理模式下进行,因为arm决定cpsr可以在任意模式下被访问。
②任务切换。任务切换包括任务级调度切换和中断处理程序调度切换。任务级切换采用软中断swi方式实现,需要注意的是此时swi中断处理程序并不返回,所以每次swi中断一开始就重新初始化svc管理模式的堆栈地址空间,否则会造成内存泄漏或溢出。其流程如图2所示。
上一篇:车载操作系统的调度算法分析与改进
上一篇:嵌入式系统中串口通信帧的同步方法
深圳服务热线:13751165337 13692101218
粤ICP备09112631号-6(miitbeian.gov.cn)

深圳市碧威特网络技术有限公司
付款方式