在ARM处理器上移植uCOS II的中断处理

发布者:二进制游侠最新更新时间:2011-12-06 关键字:ARM处理器  移植uCOSII  中断处理 手机看文章 扫描二维码
随时随地手机看文章

uCOS II是一个源码公开、可移植、可固化、可剪裁和抢占式的实时多任务操作系统,其大部分源码是用ANSI C编写,与处理器硬件相关的部分使用汇编语言编写。总量约200行的汇编语言部分被压缩到最低限度,以便于移植到任何一种其它的CPU上。

uCOS II最多可支持56个任务,其内核为占先式,总是执行就绪态的优先级最高的任务,并支持Semaphore (信号量)、Mailbox (邮箱)、MessageQueue(消息队列)等多种常用的进程间通信机制。与大多商用RTOS不同的是,uCOS II公开所有的源代码.并可以免费获得,只对商业应用收取少量License费用。

uCOS II移植跟OS_CUP_C.C、OS_CPU_A.S、OS_CPU.H 3个文件有关,中断处理的移植占据了很大一部分内容。作为移植的一个重点,本文以标准中断(IRQ)为例讨论了移植中的中断处理。

1 uCOS II系统结构

uCOS II的软硬件体系结构如图1。应用程序处于整个系统的顶层.每个任务都可以认为自己独占了CPU,因而可以设计成为一个无限循环。大部分代码是使用ANSI C语言书写的,因此uCOS II的可移植性较好。尽管如此,仍然需要使用C和汇编语言写一些处理器相关的代码。uCOS II的移植需要满足以下要求:

1)处理器的C编译器可以产生可重入代码:可以使用C调用进入和退出Critical Code(临界区代码);

2)处理器必须支持硬件中断,并且需要一个定时中断源;

3)处理器需能容纳一定数据的硬件堆栈;

4)处理器需有能在CPU寄存器与内存和堆栈交换数据的指令。

移植uCOS II的主要工作就是处理器和编译器相关代码以及BSP(Board Support Package)的编写。uCOS II处理器无关的代码提供uCOS II的系统服务,应用程序可以使用这些API函数进行内存管理、任务间通信以及创建、删除任务等。

2 uCOS II移植过程中需要注意的几个问题

uCOS II移植的中断处理跟ARM体系结构和uCOS II处理中断的过程有关,必须注意这2个方面的问题才能高效移植。

2.1 ARM 处理器7种操作模式

用户模式(USER MODE)是ARM 通常执行状态,用于执行大多数应用程序;快速中断模式(FIQ MODE)支持数据传输或通道处理;中断模式(IRQ MODE)用于通用中断处理;超级用户模式(SVC MODE)是一种操作系统受保护的模式:数据中止模式(ABT MODE)指令预取指中止、数据中止时进入该模式;未定义模式(UND MODE)当执行未定义的指令时进入该模式;系统模式(SYS MODE)是操作系统一种特许的用户模式。

除了用户模式之外,其他模式都归为特权模式,特权模式用于中断服务、异常或者访问受保护的资源

特权模式中除系统模式之外另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_Handler()被调用来检测中断源并执行中断。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())。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 的最底部,其地址范围为0X00000000~0X0000001C,设置如下:

VECTORS:LDR PC,RESET_ADDR

LDR PC,UNDEF_ADDR

LDR PC,SWI_ADDR

LDR PC,PABT_ADDR

LDR PC,DABT_ADDR

NOP /*保留向量*/

LDR PC,IRQ_ADDR

LDR PC,FIQ_ADDR

RESET_ADDR:. WORD RESET_HANDLER

UNDEF_ADDR:.WORD UNDEF—HANDLER

SWI_ADDR:.WORD SWI HANDLER

PABT_ADDR:.WORD PABT_HANDLER

DABT_ADDR:.WORD DABT_ HANDLER

.WORD 0 /*保留地址*/

IRQ_ADDR:.WORD IRQ_HANDLER

FIQ_ADDR:.WORD FIQ HANDLER

UNDEF_HANDLER:B UNDEF_HANDLER

SWI_HANDLER: B SWI_HANDLER

PABT_HANDLER: B PABT_HANDLER

DABT_HANDLER: B DABT_HANDLER

IRQ_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 移植中断任务切换

中断任务切换(OSIntCtxSw)和任务切换函数(OSCtxSw)比较相似,主要有以下几步组成:

1)调用OSTask SwHook()

2)OSPrioCur=OSPrioHighRdy

3)OSTCBCur=OSTCBHighRdy

4)SP=OSTCBHighRdy->OSTCBStkPtr

//获取高优先级的任务堆栈指针

5)从高优先级的任务的堆栈中弹出高优先级的任务上下文

6)执行高优先级的任务[page]

3.3 移植中断服务程序

以IRQ中断为例中断服务程序(OS_CPU_IRQ_ISR)主要依据上面所描述的“uCOS II中断响应的过程”编写,其主要代码如下:

……

LDR R0,OS_IntNesting

LDRB R1,[R0]

ADD R1,R1,#1

STRB R1,[R0]

CMP R1,#l

BNE OS_CPU_IRQ_ISR_1

LDR R4,OS_TCBCur

LDR R5,[R4]

STR SP,[R5]

OS_CPU_IRQ_ISR_1:

MSR CPSR_c,#(NO_INT | IRQ32_MODE)

//切换到SVC模式

LDR R0,OS_CPU_IRQ_ISR_Handler

MOV LR,PC

BX R0

MSR CPSR_c,#(NO_INT | SVC32_MODE)

//切换到SVC模式

LDRR0,OS_IntExit //OSIntExit()

MOV LR,PC

BX R0

……

在代码中省略了现场工作寄存器的保护与恢复及工作模式的切换。

3.4 移植中断处理程序

以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()归属于用户程序的一部分。在中断返回之前,中断处理程序要处理完所有的中断响应,以避免在多个中断同时响应或中断处理过程中响应中断的情况下, 进入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建议中断函数应尽量短,一般做法是在中断函数中缓存数据,给任务发送一个信号来处理数据。中断函数的地址在系统初始化的时候要置人中断向量寄存器(VICVectAddr0~15)。由于向量中断控制器(VIC)的特殊结构,在中断函数中要写一次中断向量寄存器(VICVectAddr)。

4 中断处理的应用示例

uCOS II要提供周期性信号源,用于实现时间延时和确认超时。节拍率应为10~100 Hz。时钟节拍源可以由专门的硬件定时器产生,以下就以IRQ中断方式产生节拍源为示例。

初始化中断控制器:

C程序

void VICInit(void)

{

VICIntEnClr=0xfffff;

VICDefVectAddr=-(INT32U)Non_Vect_IRQ_Handler;

VICVectAddr0= (INT32U)OSTickISR;

VICVectCntl0= (0x20 | 0x04);

VICIntEnable= 1<<4;

}

 

定时器0中断函数:

C程序

 

void OSTickISR(void)

{

TO_IR = 0xff;

OSTimeTick(); //调用OSTimeTick()

VICVectAddr=0; //通知中断控制器中断结束

}

 

当定时中断发生时调用OS_CPU_IRQ_ISR Handler(),得到OSTickISR()的地址并执行,在OSTickISR()中调用OSTimeTick()为uCOS II提供周期性信号源。

此代码在GNU工具链ARM-GCC下编译通过,并在EasyARM2100开发实验板上得到验证。

5 结束语

通过示例讲述了在uCOS II移植过程中的中断处理所需要注意的几个问题和通用方法,经笔者在GNU工具链下编译、调试,并在实验板上得到很好的验证。这种移植方案的中断函数都

使用C语言编写,具有较好的移植性,有利于对不同需求的用户进行中断扩充,增强了中断嵌套时uCOS II运行的稳定性,使移植具有更好的通用性。

 

 

关键字:ARM处理器  移植uCOSII  中断处理 引用地址:在ARM处理器上移植uCOS II的中断处理

上一篇:ARM:低调的隐形超级芯片帝国,谁在革英特尔的命
下一篇:uC/GUI在ARM内核S3C44B0X的移植实例

推荐阅读最新更新时间:2024-03-16 12:48

亚马逊AWS面向云服务开发全新ARM处理器 最多可达32核心
多年来, ARM 架构一直希望冲出移动领域,进入桌面乃至是服务器市场,也有不少厂商先后推出了各种设计。现在, 亚马逊 AWS正在面向云服务开发全新的ARM处理器。 亚马逊已经有了一款ARM架构处理器“Gravi ti on”,基于ARM A72核心魔改,主频2.3GHz,最多16核心,分成四个四核集群,每个集群2MB共享二级缓存。 新一代处理器暂无名字,使用了ARM的下一代架构Neove rs e N1,最多可达32核心,并通过Fabirc总线连接各种外部特定目的加速器,以提升特定工作负载的效率。 ARM Neoverse N1(又名ARES)架构基于消费级的A76,4宽度拾取/解码,11级流水线(需要时可改为9级),高频率
[手机便携]
亚马逊AWS面向云服务开发全新<font color='red'>ARM处理器</font> 最多可达32核心
ATtiny13 复位与中断处理
AVR有不同的中断源。每个中断和复位在程序空间都有独立的中断向量。所有的中断事件 都有自己的使能位。当使能位置位,且状态寄存器的全局中断使能位 I 也置位时,中断可以发生。 程序存储区的最低地址缺省为复位向量和中断向量。完整的向量列表请参见P40“中断” 。 列表也决定了不同中断的优先级。向量所在的地址越低,优先级越高。RESET 具有最高的优先级,第二个为 INT0 – 外部中断请求 0。 任一中断发生时全局中断使能位 I 被清零,从而禁止了所有其他的中断。用户软件可以在 中断程序里置位 I 来实现中断嵌套。此时所有的中断都可以中断当前的中断服务程序。执行 RETI 指令后I 自动置位。 从根本上说有两种类型的中断。第一种由事件
[单片机]
ARM处理器NEON编程及优化技巧——数据加载和存储
ARM的NEON协处理器技术是一个64/128-bit的混合SIMD架构,用于加速包括视频编码解码、音频解码编码、3D图像、语音和图像等多媒体和信号处理应用。本文主要介绍如何使用NEON的汇编程序来写SIMD的代码,包括如何开始NEON的开发,如何高效的利用NEON。首先会关注内存操作,即如何变更指令来灵活有效的加载和存储数据。接下来是由于SIMD指令的应用而导致剩下的若干个单元的处理,最后是一个例子来说明用NEON来进行SIMD优化。 SIMD的例子 首先看一个实例,24-bit的RGB图像,像素在内存里的组织方式是R, G, B, R, G, B...,如果你想做一个简单的图像处理,比如把R和B通道互换,你该如何高效的使用NE
[单片机]
<font color='red'>ARM处理器</font>NEON编程及优化技巧——数据加载和存储
arm-Linux中断处理体系结构与处理流程分析
异常,就是可以打断CPU正常运行流程的一些事情,比如外部中断、未定义指令、试图修改只读的数据、执行swi指令(Software Interrupt Instruction ,软件中断指令)等。当这些事情发生时,CPU暂停当前的程序,先处理异常事件,然后再继续执行被中断的程序。操作系统中经常通过异常来完成一些特定的功能。其中的中断也占有很大的一部分。例如下面的这几种情况: * 当CPU执行未定义的机器指令时将触发 未定义指令异常 ,操作系统可以利用这个特点使用一些自定义的机器指令,它们在异常处理函数中实现。 * 当用户程序试图读写的数据或执行的指令不在内存中时,也会触发一个 数据访问中止异常 或 指令预取中止异常 ,在异
[单片机]
arm-Linux<font color='red'>中断处理</font>体系结构与处理流程分析
基于AT89S52的交通灯综合实验设计
随着各种车辆的增多,经常遇到交通堵塞问题,作为交通控制主要工具的交通灯,扮演着重要的角色,本文设计了一种交通灯控制系统综合实验,该系统包括:主控制器AT89S52、键盘模块、数码管显示模块、LED灯模块等,为使学习能综合练习从输入到输出的完整过程。系统中可采用主控器的外部中断功能、定时中断功能、动态扫描功能等,这些功能放入一个程序中,可使学习者能更深刻地理解它们的实际应用。 1 实验的设计目的 (1)通过学习该实验,掌握单片机并行口传输数据的方法,以控制数码管和发光二极管的亮灭。(2)掌握用动态扫描方法解决多位LED共用一个P口显示的问题。(3)通过单片机程序的编写,熟练掌握计数器/定时器和中断的使用方法。(4)通过系统
[电源管理]
基于AT89S52的交通灯综合实验设计
ARM处理器学习之GPIO操作篇(gnu link script)
1:主要内容 本文主要介绍了VMA、LMA的相关概念,gnu link script的作用和使用方法。 2:引言 我们程序员刚开始学习编写程序时,都会接触到一个 *.C 文件要经过编译、链接等过程才能变成可以执行的程序。至于这里的链接到底怎么回事,我们今天就来谈谈这方面的内容。现在,我们有这样一套ARM7的硬件开发环境,0X80000000地址开始BANK0 我们用的是NorFlash,0X40000000地址是芯片内部的RAM。我编译、链接的程序下载到0x80000000地址处。而真正运行时,一部分初始化代码在0X80000000运行,初始化完毕后,将主要工作的代码copy到内部RAM 0X40000000开始的地方运
[单片机]
<font color='red'>ARM处理器</font>学习之GPIO操作篇(gnu link script)
ARM的中断处理 [二]
中断源的状态 GIC对一个中断源的处理过程包含Inactive, Pending, Active和Active and Pending四种状态。 中断源没有被assert(触发)的时候,处于初始的 Inactive 状态。如果某个中断源被触发,GIC会将IAR寄存器(Interrupt Acklowlege Register)中该中断源对应的bit置1,然后通知CPU core(PE)。在CPU尚未做出应答之前,该中断源处于 Pending (待处理)状态。这里IAR可理解为中断标志寄存器。 在Pending状态中,GIC会关闭对该中断源的响应,在此期间,如果该中断源上有新的中断到来,所有连接GIC的CPU都无法收到。
[单片机]
ARM的<font color='red'>中断处理</font> [二]
MPC860的中断处理技术研究
摘要:MPC860是网络通信设备中应用最广的一款RISC嵌入式处理器。本文介绍MPC860的中断体系结果及中断发生后服务程序的处理流程;以SMC1的接收中断为例,阐述在设计操作系统管理的条件下,中断初始化程序和中断服务程序的编写。 关键词:嵌入式处理器 MPC860 中断体系结构 中断处理技术 引言 Motorola公司推出的MPC860 PowerQUICC是目前在通信领域应用得非常广泛的一款嵌入式处理器,被誉为MC68360 PowerQUICC在网络和数据通信领域的新一代产品。与MC68360相比,MPC860 PowerQUICC在各方面的性能,包括器件的适应性、外部扩展能力和芯片集成度等都得到了提高。 MPC8
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved