uCOS II在ARM处理器上移植过程中的中断处理_第1页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ucos ii在arm处理器上移植过程中的中断处理ucos ii是一个源码藏匿、可移植、可固化、可剪裁和抢占式的实时多任务操作系统,其大部分源码是用ansi c编写,与处理器硬件相关的部分用法汇编语言编写。总量约200行的汇编语言部分被压缩到最低限度,以便于移植到任何一种其它的cpu上。ucos ii最多可支持56个任务,其内核为占先式,总是执行就绪态的优先级最高的任务,并支持semaphore (信号量)、mailbox (邮箱)、messagequeue(消息队列)等多种常用的进程间通信机制。与大多商用rtos不同的是,ucos ii藏匿全部的源代码.并可以免费获得,只对商业应用收取少量l

2、icense费用。ucos ii移植跟os_cup_c.c、os_cpu_a.s、os_cpu.h 3个文件有关,中断处理的移植占领了很大一部分内容。作为移植的一个重点,本文以标准中断(irq)为例研究了移植中的中断处理。1 ucos ii系统结构ucos ii的软硬件体系结构1。应用程序处于囫囵系统的顶层.每个任务都可以认为自己独占了cpu,因而可以设计成为一个无限循环。大部分代码是用法ansi 书写的,因此ucos ii的可移植性较好。尽管如此,仍然需要用法c和汇编语言写一些处理器相关的代码。ucos ii的移植需要满足以下要求:1)处理器的c编译器可以产生可重入代码:可以用法c调用进入和

3、退出critical code(临界区代码);2)处理器必需支持硬件中断,并且需要一个定时中断源;3)处理器需能容纳一定数据的硬件堆栈;4)处理器需有能在cpu寄存器与内存和堆栈交换数据的命令。移植ucos ii的主要工作就是处理器和编译器相关代码以及bsp(board support package)的编写。ucos ii处理器无关的代码提供ucos ii的系统服务,应用程序可以用法这些api函数举行内存管理、任务间通信以及创建、删除任务等。2 ucos ii移植过程中需要注重的几个问题ucos ii移植的中断处理跟体系结构和ucos ii处理中断的过程有关,必需注重这2个方面的问题才干高效

4、移植。2.1 arm 处理器7种操作模式用户模式(user mode)是arm 通常执行状态,用于执行大多数应用程序;迅速中断模式(fiq mode)支持数据传输或通道处理;中断模式(irq mode)用于通用中断处理;超级用户模式(svc mode)是一种操作系统受庇护的模式:数据中止模式(abt mode)命令预取指中止、数据中止时进入该模式;未定义模式(und mode)当执行未定义的命令时进入该模式;系统模式(sys mode)是操作系统一种特许的用户模式。除了用户模式之外,其他模式都归为特权模式,特权模式用于中断服务、异样或者拜访受庇护的资源。特权模式中除系统模式之外另5种模式又称为

5、异样模式,在移植过程中必需设置中断向量表来处理异样。ucos ii的移植主要处理标准中断(irq)、迅速中断(fiq)和软件中断(swi)。2.2 ucos ii中断响应的过程以irq中断为例,假设crps中i_bit位为0,当有irq中断时,cpu强制进入irq模式,当前的cpsr拷贝到spsr_irq中,pc值保存在lr_irq中,置cpsr中的i位以关闭irq中断。数据保存之后,cpu强行从0x00000018开头执行,pc值保存了os_cpu_irq_isr()的地址, 然后执行os_cpu_irq_isr()。在os_cpu_irq_isr()中os_cpu_irq_isr_hand

6、ler()被调用来检测中断源并执行中断。os_cpu_irq_isr_handler()返回以后,os_cpu_irq_isr()又调用osintexit()来确认是否有比isr优先级更高的任务要执行。假如当前中断任务仍然是优先级最高的任务,osintexit()返回,os_cpu_irq_isr()弹出中断堆栈,假如优先级更高的任务需要执行,osintexit()调用osintctxsw()执行优先级更高的任务。2.3 ucos ii的临界段代码ucos ii用法关中断来庇护临界代码。它定义了2个宏来开中断(os_exit_critical(),关中断(os_enter_critical()

7、。os_enter_critical()和os_exit_critical()有3种办法来实现,ucos ii建议用法第3种办法可以保存当前处理器状态的值。3 ucos ii移植过程中的中断处理ucos ii中断处理跟crt.s、os_cpu_a.s和bsp.c有关,其移植过程主要有以下几个步骤。3.1 在crt.s中设置中断向量表arm的中断向量表位于rom 的最底部,其地址范围为0x000000000x0000001c,设置如下:vectors:ldr pc,reset_addrldr pc,undef_addrldr pc,swi_addrldr pc,pabt_addrldr pc,d

8、abt_addrnop /*保留向量*/ldr pc,irq_addrldr pc,fiq_addrreset_addr:. word reset_handlerundef_addr:.word undefhandlerswi_addr:.word swi handlerpabt_addr:.word pabt_handlerdabt_addr:.word dabt_ handler.word 0 /*保留地址*/irq_addr:.word irq_handlerfiq_addr:.word fiq handlerundef_handler:b undef_handlerswi_handle

9、r: b swi_handlerpabt_handler: b pabt_handlerdabt_handler: b dabt_handlerirq_handler: b os_cpu_irq_isr/*跳转到os_cpu_irq_isr(在os_cpu_a.s中)*/fiq_handler: b os_cpu_fiq_isr/*跳转到os_cpu_fiq_isr(在os_cpu_a.s中) */这里设置了标准中断异样(irq)和迅速中断异样(fiq)的中断入口,其余异样都设置为死循环,当发生这些异样的时候,必需使系统复位才干退出死循环。3.2 移植中断任务切换中断任务切换(osintctx

10、sw)和任务切换函数(osctxsw)比较相像,主要有以下几步组成:1)调用ostask swhook()2)ospriocur=ospriohighrdy3)ostcbcur=ostcbhighrdy4)sp=ostcbhighrdy-ostcbstkptr/猎取高优先级的任务堆栈指针5)从高优先级的任务的堆栈中弹出高优先级的任务上下文6)执行高优先级的任务3.3 移植中断服务程序以irq中断为例中断服务程序(os_cpu_irq_isr)主要依据上面所描述的“ucos ii中断响应的过程”编写,其主要代码如下:ldr r0,os_intnestingldrb r1,r0add r1,r1,

11、1strb r1,r0cmp r1,lbne os_cpu_irq_isr_1ldr r4,os_tcbcurldr r5,r4str sp,r5os_cpu_irq_isr_1:msr cpsr_c,(no_int | irq32_mode)/切换到svc模式ldr r0,os_cpu_irq_isr_handlermov lr,pcbx r0msr cpsr_c,(no_int | svc32_mode)/切换到svc模式ldrr0,os_intexit /osintexit()mov lr,pcbx r0在代码中省略了现场工作寄存器的庇护与复原及工作模式的切换。3.4 移植中断处理程序以

12、irq中断为例,移植中断处理程序:c程序void os_cpu_irq_isr_handler(void)pfnct pfnct; /定义中断函数指针pfnct=(pfnct)vicvectaddr; /猎取函数地址while(pfnct!=(pfnct)0)(*pfnct)(); /调用中断函数pfnct=(pfnct)vicvectaddr; /猎取新的中断函数 /全部中断都执行完毕退出中断处理程序依靠中断控制器的中断响应挨次,所以ucos ii把os_cpu_irq_isr_handler()归属于用户程序的一部分。在中断返回之前,中断处理程序要处理完全部的中断响应,以避开在多个中断同时

13、响应或中断处理过程中响应中断的状况下, 进入os_cpu_irq_isr () 和退出os_cpu_irq_isr()时,os_cpu_irq_isr()耗尽保存cpu寄存器的堆栈空间。另外,在os_cpu_irq_isr_handler()中不要清cpsr的i位来开放中断,由于没有须要用法中断嵌套,os_cpu_irq_isr_handler()在返回之前会检查并处理全部的中断。3.5 编写中断函数中断函数普通采纳c语言编写,ucos ii建议中断函数应尽量短,普通做法是在中断函数中缓存数据,给任务发送一个信号来处理数据。中断函数的地址在系统初始化的时候要置人中断向量寄存器(vicvecta

14、ddr015)。因为向量中断控制器(vic)的特别结构,在中断函数中要写一次中断向量寄存器(vicvectaddr)。4 中断处理的应用示例ucos ii要提供周期性信号源,用于实现时光延时和确认超时。节拍率应为10100 hz。时钟节拍源可以由特地的硬件定时器产生,以下就以irq中断方式产生节拍源为示例。初始化中断控制器:c程序void vicinit(void)vicintenclr=0xfffff;vicdefvectaddr=-(int32u)non_vect_irq_handler;vicvectaddr0= (int32u)ostickisr;vicvectcntl0= (0x20 | 0x04);vicintenable= 14;定时器0中断函数:c程序void ostickisr(void)to_ir = 0xff;ostimetick(); /调用ostimetick()vicvectaddr=0; /通知中断控制器中断结束当定时中断发生时调用os_cpu_irq_isr handler(),得到ostickisr()的地址并执行,在ostickisr()中调用ostimetick()为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论