毕业论文论文范文课程设计实践报告法律论文英语论文教学论文医学论文农学论文艺术论文行政论文管理论文计算机安全
您现在的位置: 毕业论文 >> 论文 >> 正文

arm嵌入式系统设计论文 第10页

更新时间:2009-4-12:  来源:毕业论文
arm嵌入式系统设计论文 第10页
执行用户代码做中断服务;
4.调用OSIntExit;
5.恢复所有CPU寄存器;
6.执行中断返回指令; }
如此代码,μC/OS-II中的中断处理与PC的中断处理类似,当发生中断时,应首先保护现场,将CPU寄存器入栈,再执行中断服务程序,然后恢复现场,将CPU寄存器出栈,最后执行中断返回指令实现中断返回。不同的是现场保护后,需要调用OSIntEnter()函数通知内核已经进入了中断服务程序;执行完中断服务后和恢复现场前,应该调用OSIntExit()函数判断是否需要进行任务调度并实现中断级任务调度。调用OSIntEnter()将共享变量OSIntNesting加l,内核通过OSIntNesting的值是否大于0来判断系统是否处于中断状态,大于1表示有中断嵌套。在退出中断服务程序之前,首先应该将OSIntNesting减1;如果中断服务程序使更高优先级的任务就绪且不处于中断嵌套(OSIntNesting为0),还必须进行中断级的任务调度将CPU切换到高优先级的任务,OSIntExit的程序结构如图4-6。这里需要注意的是中断的上下文切换和任务中的不同之处,任务中上下文的切换前面已经介绍,中断的上下文切换采用OSIntCtxSw(),具体实现在移植μC/OS-II会详细介绍。时钟节拍是周期性发生的特殊中断(时钟中断)。操作系统通过时钟中断来确定时间间隔,实现时间延时及确定超时。时钟中断的频率越高,系统的额外负荷越多,通常将频率设置在10-100Hz之间。当时钟中断发生,OSTime值加1,所以OSTime的值是操作系统启动后的时钟滴答数目。
 
图4.6 OSIintExit的程序流程
μC/OS-II的时钟中断服务程序结构与上述的普通中断服务程序一样,其服务程序核心是调用OSTimetick()函数。OSTimetick()函数用来判断延时任务是否延时结束从而将其置于就绪态,其程序结构如图4-7所示。
 

图4.7 OSTimeTickt()程序流程
5 μC/OS-II在S3C44BOX上的移植
5.1μC/OS-II系统移植概述
所谓移植就是使一个实时内核能够在其他微处理器或微控制器上运行。为了提高可移植性,大部分的μC/OS-II代码是用C语言写的,但仍需要汇编语言编写一些与处理器相关的代码,因为μC/OS-II在读写处理器寄存器时只能通过汇编语言来实现。μC/OS-II在设计时就己经充分考虑了可移植性,所以μC/OS-II的移植相对而言来说是比较容易的,图5-1说明了μC/OS-II的体系结构及它与系统硬件之间的关系。应用程序软件μC/OS-II(与处理器无关的代码)
 
图5.1μC/OS-II硬件与软件体系结构图
要使μC/OS-II系统正常运行,处理器必须满足以下要求:
1.处理器的C编译器能产生可重入代码。可重入的代码指的是一段代码(如一个函数)可以被多个任务同时调用,而不必担心会破坏数据。这种代码的重入性是保证完成多任务的基础,除了在C程序中使用局部变量外,还需要C编译器的支持。
2.处理器支持中断,并能产生定时中断(通常在10到100HZ)。μC/OS-II是通过处理器产生的定时器中断来实现多任务之间的调度的,在ARM7TDMI的处理器上可以产生定时器中断。
3.用C语言就可以打开和关闭中断。在μC/OS-II中,可以通OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()两个宏来控制系统关闭或者打开中断。这需要处理器的支持,在ARM7TDMI的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。
4.处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。
5.处理器有将堆栈指针和其他CPU寄存器读出和存储到堆栈或内存的指令。μC/OS-II进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以寄存器的入栈和出栈是μC/OS-II多任务调度的基础。ARM7TDMI处理器是一种完全满足上述要求的处理器。本文主要工作之一就是研究如何将μC/OS-II移植到Samsung公司的一款基于ARM7TDMI内核的嵌入式处理器—S3C44B0X上。
5.2 移植方法
5.2.1 编制OS_CPU.H文件
OS_CPU.H文件包括了与处理器相关的常量、宏和类型定义。移植时需要在这个文件中用#define设置一个常量(OS_STK_GROWTH)的值,声明10个数据类型,并声明两个宏(OS_ENTER_CRITICAI()和OS_EXIT_CRITICAL())。因为不同的微处理有不同的字长[33],所以μC/OS-II的移植包括了一系列的数据类型定义,为确保可移植性,OS_CPU.H中数据类型定义如下:
typedef unsigned char INT8U
typedef char INT8S
typedef unsigned int INT16U//GCC中short为16
typedef int INT16S
typedef unsigned long INT32U
typedef long INT32S
typedef float FP32
typedef float FP64
typedef int BOOLEAN
常量OS_STK_GROWTH用来指定堆栈的生长方式,绝大多数微处理器和微控制器的堆栈是从上往下长的,但是某些处理器使用另外一种方式工作。μC/OS-II被设计成两种情况都可以处理,只需要给OS_STK_GROWTH赋不同的值。当OS_STK_GROWTH置0时,表示堆栈从下往上长;当OS_STK_GROWTH置1时,表示堆栈从上往下长,这里OS_STK_GROWTH定义如下:
#define OS_STK_GROWTH 1
宏OS_ENTER_CRITICA()和OS_EXIT_CRITICAL()用来禁止和允许中断。和所有的实时内核一样,μC/OS-II需要先禁止中断再访问代码的临界区,并在访问完毕后重新允许中断。在ARM平台上有两种办法实现对中断的屏蔽,第一种通过修改状态字屏蔽中断,另一种通过SWI功能来实现,这里采用较为简单的第一种方法来实现。程序状态寄存器CPSR包含条件码标志、中断禁止位和当前处理器模式以及其它状态和控制信息,其中的N(Negative)、Z(Zero)、C(Carry)和V(Overflow)位为条件码标志,经常作为标志位引用,可供大多数指令作为是否执行的检测标志。CPSR的最低8位I、F、T和M[4:0]用作控制位,其中的I、F为中断禁止位,当I位置1禁止IRQ中断,而F位置1则禁止FRQ中断。通过给CPSR相应的位赋值就可以实现开关中断的功能。

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ... 下一页  >> 

arm嵌入式系统设计论文 第10页下载如图片无法显示或论文不完整,请联系qq752018766
设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©751com.cn 辣文论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。