外文文献翻译嵌入式

  • 格式:doc
  • 大小:344.10 KB
  • 文档页数:20

毕业设计翻译文献文献题目:Construction of Embedded System Platform which Based on μC/OS-Ⅱand ARM7 Kernel Microprocessor 构建基于μC/ OS-Ⅱ和ARM7内核微处理器的嵌入式系统平台摘要今天,嵌入式系统被广泛地应用于各行各业。

引入嵌入式操作系统在嵌入式发展中已经是一种趋势。

嵌入式操作系统能够适用于不同的系统硬件,并能够显著的减少开发费用,缩短研究周期。

μC/ OS-Ⅱ是一款优秀的开源,轻型内核,占用少量资源并且在实时性方面有着高性能的嵌入式操作系统。

μC/ OS-Ⅱ适用于越来越多的32位ARM7核微处理器,本文介绍了基于ARM7微处理器的μC/ OS-Ⅱ嵌入式操作系统的移植方法。

最终实现了构建基于μC/ OS-Ⅱ和ARM7内核处理器的嵌入式开发平台。

该平台能有效的简化软件程序开发流程,并缩短工程研究的周期和显著提高系统的执行效率。

关键字:嵌入式系统;嵌入式操作系统;ARM7内核;μC/ OS-Ⅱ一、介绍所谓的操作系统移植是一个实时操作系统内核可以在运行在其他微处理器上。

移植部分对于不同的CPU具有对应的不同的代码。

大多数μC / OS-Ⅱ代码是用C编程语言编写的,这对于移植μC / OS -Ⅱ是非常方便的。

但根据不同的微处理器,用户仍然需要使用汇编语言编写一些有关不同微处理器的硬件的程序。

这是因为当μC / OS-Ⅱ读或写寄存器时,它只依赖于汇编语言。

因为μC / OS -Ⅱ操作系统的要求,有三个文件需要当μC / OS-Ⅱ移植到一个特定的微处理器。

整个移植工作主要围绕创建这三个文件。

这些文件显示如下:1、在C语言中的头文件OS_CPU中,一些与编译器无关的数据类型需要定义OS_CPU中。

这些数据类型包括使用的堆栈数据类型和堆栈的增长方向。

一些与ARM7内核相关的软件中断也被定义在该文件中。

2、另一个OS_CPU_C.C是一个C源文件程序。

该文件主要包括μC / OS-Ⅱ的任务堆栈的初始化函数和一些被μC / OS-Ⅱ操作系统调用的用户函数。

3、最后一个OS_CPU_A.S文件是一个汇编程序源文件。

这是一个时钟中断服务函数在运行的时候,也包含了一个用于引起中断的任务切换函数,并且也具有总是运行最高优先级的任务当μC / OS-Ⅱ系统首次进入多任务环境时。

二、创建OS_CPU.H文件A、定义与编译器有关的数据类型因为不同的微处理器有不同的字长度,所以μC / OS-Ⅱ的移植包含一系列的数据类型的定义,这使移植能够实现。

尤其是在C语言中使用的数据类型,例如短型、整型、长型等等,这些数据类型不能直接用于μC / OS-Ⅱ。

因为这些数据类型与编译器类型有关,它们不能被移植。

所以这些数据类型都定义为整型数据结构,在许多情况下,他们是可移植的。

B、系统软中断函数的定义中断是一种硬件机制,但在μC / OS -Ⅱ操作系统,一些重要的任务函数的实现应该取决于中断级的代码。

所以,这种情况下,μC / OS-Ⅱ操作系统需要一条预处理器指令来模拟中断。

它类似于一个硬件中断,所以它被称为软中断。

大多数微处理器的内核可以提供这种类型的软中断指令。

在ARM7内核,它是“SWI”。

为了使底层接口函数是独立的处理器状态并且底层任务函数不需要知道调用函数的准确的地址当任务被调用时。

SWI指令应该用作底层接口。

并且不同的函数能够通过不同的软件中断函数编号的方法进行区分。

ADS1.2编译器总是使用“_swi”来声明一个不存在的函数。

而一旦不存在的函数被调用时,一条SWI的指令应该插入调用函数并指定函数编号的位置。

这里显示一些在μC / OS-Ⅱ中重要功能的软中断函数_swi(0x00) void OS_TASK_SW(void);//在任务间切换功能_swi(0x01) void _OSStartHighRdy(void);//首先运行最高优先级任务_swi(0x02) void OS_ENTER_CRITICAL(void);//关中断_swi(0x03) void OS_EXIT_CRITICAL(void);//开中断_swi(0x80) void ChangeToSYSMode(void);//切换到系统模式这些函数的具体代码在文件OS_CPU_C.C和OS_CPU_A.S中。

根据μC / OS-Ⅱ的要求,所有在应用系统中的C文件必须包括文件INCLUDES.H。

所以正常的做法是使INCLUDES.H文件包含OS_CPU.H文件。

三、创建OS_CPU_C.C文件在OS_CPU_C.C文件中,μC / OS-Ⅱ操作系统的移植规范要求创建十个简单的函数OSTaskStkInit(),OSTaskCreateHook(), OSTaskSwHook(), OSTaskDelHook(), OSTaskIdleHook(),OSTimeTickHook(), OSTaskStatHook(),OSInitHookBegin(), OSInitHookEnd(),OSTCBInitHook()。

除了OSTaskStkInit()函数外并非所有的函数都必须创建。

在符合μC / OS -Ⅱ操作系统的规范要求下, 如果用户不想使用这些函数,停用另外9个函数的功能并可以设置为空函数。

A. 编写OSTaskStklnit()函数在μC / OS -Ⅱ操作系统,这两个函数OSTaskCreate()和OSTaskCreateExt()通过调用OSTaskStkInit()函数的方法初始化任务的堆栈结构,并保存所有寄存器数据到各自的堆栈中。

当调用函数实现初始化后,它清除有关符合ARM7内核微处理器的实际堆栈方向寄存器(堆栈方向是降序排列),并且最后返回堆栈顶的指针值。

图1 堆栈结构初始化(参数pdata 被传递给堆栈)图1展示了OSTaskStkInit ( )函数初始化堆栈的过程当μC/OS -Ⅱ操作系统创建任务的时候。

在初始化后,OSTaskStkInit ( )最后返回了堆栈顶的指针。

B 、系统软件中断函数在文件OS_CPU_C.C 中,用C 语言写的软中断函数总是第一个被介绍。

该文件包含所有的软件中断函数除了函数编号为0的任务(OS_TASK_SW())和函数编号为1的OSStartHighRdy()。

在文件OS_CPU_A.S 中,函数编号为0和为1的是用汇编语言编写的。

这是因为C 语言不能确切提供这两个函数要求的堆栈结构。

另一个原因,如果用于切换任务的函数用汇编语言编写的话,能很方便的实现跳转。

由C 语言编写的软中断函数的性质的介绍如下:由于使用了软中断,在更改了ARM7内核SPSR 寄存器的相应控制位值后,当软中断结束后,通过将SPSR 寄存器的值复制到GPSR 寄存器中特定的方式,更改微控制器的运行模式的目的能够实现。

四、创建OS_CPU_A.S 文件根据μC / OS -Ⅱ操作系统的移植规范,有四个函数OSCtxSw(),OSIntCtxSw(),OSTickISR(),OSStartHighRdy(),需要编写,而且必须用汇编语言编写。

在这个文件中,用于提取编号0和编号1的软中断函数编号的函数也应该用汇编语言编写。

A.提取软中断的函数编号递减堆栈指针图2 提取软中断号系统根据不同的软中断函数编号总是执行不同的函数。

在ARM7内核微处理器家族,LR寄存器总是用于存储子程序或异常的返回地址。

LR寄存器可以获得SWI指令代码。

并且软件中断的编号包含在SWI指令中。

所以软中断对应的函数编号可以通过读取指令代码的对应位段来得到。

考虑到ARM7内核的三级流水线架构和程序的运行状态可能是ARM态或Thumb状态,所以他们必须对应不同的处理方式。

图2显示了具体的流程图。

B、编写OSStartHighRdy(),OSCtxSw()和OSIntCtxSw()函数μC / OS-Ⅱ操作系统的调度函数OSSched()是通过调用实现任务切换功能OS_TASK_SW()函数和OS_TASK_SW()函数完成整个任务切换,OS_TASK_SW()函数和OS_TASK_SW()函数是通过调用函数OSCtxSw()函数实现的。

OSCtxSw()函数调用了OS_TASK_SW()用于最后切换任务。

OSIntCtxSw()函数的大多数源代码几乎与OSCtxSw()函数相同。

它们具体的区别是OS_TASK_SW()函数需要存储CPU寄存器值。

根据μC / OS-Ⅱ操作系统的要求,中断服务程序(ISR)已经存储了CPU寄存器值。

所以,OSIntExit()函数将不会处理在最后的中断处理后(如果中断嵌套的存在)。

这个时候,任务切换不需要再次存储CPU寄存器的值。

在μC / OS-Ⅱ操作系统的移植过程中,为了使系统的代码高度可靠的, OSIntCtxSw()函数可以通过调用OSCtxSw()函数的方式实现。

具体的实现方法是再次保存CPU寄存器的值,但它对整个系统没有任何影响。

因为CPU寄存器必须在OSCtxSw()函数写操作的时候执行,所以OSCtxSw()函数应该用汇编语言编写。

图3显示该函数的流程图。

该函数与μC / OS -Ⅱ操作系统的要求相比有一些差异移植,但这并不影响系统的执行。

在某种程度上,这证明了μC / OS-Ⅱ是一个非常优秀的嵌入式操作系统,它可以根据系统的需要进行裁剪。

最后图3的流程图执行了‘LDMFD SP !,{R0 - R12,LR、PC } ‘ARM指令。

因为在μC / OS-Ⅱ操作系统中,任务在异常模式中执行,它只可以在用户或系统模式中执行。

μC / OS-Ⅱ操作系统通过调用OSStart()函数,OSStart()最终调用OSStartHighRdy()函数的方式开始任务环境。

OSStartHighRdy()函数的编写应遵循μC / OS-Ⅱ操作系统的移植规范。

具体的方法是通OSCtxSw()函数一样。

它们两者间唯一的区别是当第一次执行任务调度的时候OSStartHighRdy()函数不必存储寄存器的值。

图3. OSCtxsw()函数流程图创建了几个移植文件后,理论上,μC / OS -Ⅱ操作系统可以正常的在ARM7内核微处理器上执行了。

但是在μC / OS-Ⅱ操作系统第一次执行前,需要提供OSTickISR()系统时钟函数。

这是系统时间的函数一定是写。

μC / OS-Ⅱ操作系统需要用户提供周期的时钟,并且时钟可以实现延迟函数和超出时间函数。

通常,周期时钟是由中断函数OSTickISR()实现。

事实上,调用OSTimeTick()函数的实质是通过调用OSTickISR()函数实现的。

因此,中断任务OSTickISR()必须通过ARM7内核微处理器的硬件定时器实现,并且中断级应该设置为最高。