UCOSii(六)——移植

来源:互联网 发布:淘宝买鱼雷怎么搜索 编辑:程序博客网 时间:2024/05/29 10:12

一、前言

UCOSii官方已经提供了许多移植范例,在这种情况下自己移植UCOSii是一种不经济的做法。但为了了解一个RTOS在移植时面临的兼容性问题,知道如何移植UCOSii依然是有必要的。

那么,RTOS在编译和运行时,在不同的chip上,会面临哪些问题呢?

编译类问题

不同的芯片可能会使用不同的编译器,而不同的编译在许多处理细节上会有所不同。比如有些编译器会将函数行参推入堆栈,而另外一些则会使用寄存器传递行参以加快速度。

芯片结构类问题

芯片的工作模式是16位还是32位?堆栈向下生长还是向下生长?如何产生时钟节拍?

汇编代码

有些情况下必须使用汇编来编写程序,一是这样可以使得一个经常被调用的子程序具有极高的效率。二是C语言不提供一些类似入栈、出栈这样的操作,一些寄存器的访问不得不通过汇编来执行。

二、移植

这里写图片描述

上图可以一览在移植过程中相关的文件。只有处理器相关的代码,才是移植中需要改动的。也就是OS_CPU.H,OS_CPU_A.ASM,OS_CPU_C.C,接下来是分析它们各自包含哪些内容。

移植相关文件即内容:
这里写图片描述

2.1 OS_CPU.H

如上图所示,OS_CPU.H首先要定义一些数据类型,这一般都没有多大的改动。

OS_STK和OS_STK_GROWTH要定义出系统堆栈的大小和堆栈的生长方向。

OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL()要定义系统开关中断的方法。

OS_CRITICAL_METHOD定义在以上开关中断前,是否需要保存一些寄存器的值。

OS_TASK_SW()定义系统软中断的方法,用以进行任务调度。

2.2 OS_CPU_A.ASM

OS_CPU_A.ASM包含的是四个汇编函数,由于它们需要操作堆栈,所以必须用汇编编写。

OSStartHighRdy()运行当前优先级最高的任务,需要恢复堆栈。

OSCtxSw()执行任务级别的切换,先保存当前寄存器,再恢复新任务的寄存器。

OSIntCtxSw()执行中断里的任务切换。这里有一个特别需要注意的地方,一旦决定要保存哪些寄存器的值,在恢复任务环境时,必须要将堆栈指针调整到正确的问题。

OSTickISR()产生时钟节拍。

2.3 OS_CPU_C.C

OSTaskStkInit()用于在任务被创建时,初始化堆栈。它会返回堆栈指针,这样OSTaskCreate()和 OSTaskCreateExt()就会将Tcb存在栈里。

其他的Hook函数是一些钩子,可以让用户对OS进行一些扩展,一般只声明即可。

三、结语

RTOS是非常棒的工具,它使用户可以灵活利用信号量、邮箱、消息队列等工具,实现任务的通信与同步。这样,程序员可以利用RTOS的特性快速设计出自己需要的系统结构,而不用在任务调度的结构性代码上耗费时间。虽然国内UCOSii使用得比较多,但在国外似乎freertos更火一些,毕竟开源和免费嘛。等过段时间,再来分析下freertos的特性吧。

0 0