新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > uCOS-II的移植步骤

uCOS-II的移植步骤

作者:时间:2016-11-27来源:网络收藏
说明:将V2.92移植到STM32F107ZET6和STM32F107VCT6.

关于uCOS的移植,其实要说难也难,要说简单也简单。简单的是现在官方都已经移植好了,难的是自己写那个汇编的移植代码。废话不多说,直接上移植步骤和注意事项。

本文引用地址:http://www.eepw.com.cn/article/201611/322487.htm

第一步:到官网下载最新版本的uCOS-II V2.92,在uCOS-II的文件夹下有三个这样的文件主要有这两个移植的文件,在DOC文件夹下主要是移植的说明和性能的测试结果,

其中uCOS-II-RefMan和uCOS-II-CfgMan比较有参考价值,第一个文件对每个函数进行了说明,重要的是给出了大部分函数的应用实例。第二个就是我们移植好后的配置文件了。还有一个重要的文件就是很重要的文件就是AN-1018,这个是官方的移植说明(针对的Cortex-M3处理器)。

第二步:Source文件夹下面都是源代码,不用管他们,Ports文件夹下面就是我们移植的时候需要弄的文件了,有以下几个文件,

os_cpu.h,os_cpu_c.c,os_cpu_a.asm这三个文件在移植过程中最重要。

os_cpu.h:定义数据类型,处理器相关代码和声明函数原型。

#ifndef OS_CPU_H
#define OS_CPU_H

#ifdef OS_CPU_GLOBALS
#define OS_CPU_EXT
#else
#define OS_CPU_EXT extern
#endif

#ifndef OS_CPU_EXCEPT_STK_SIZE
#define OS_CPU_EXCEPT_STK_SIZE 128u//默认的异常堆栈大小
#endif

typedef unsigned char BOOLEAN;//数据类型的说明
typedef unsigned char INT8U;

typedef signed char INT8S;

typedef unsigned short INT16U;

typedef signed short INT16S;

typedef unsigned int INT32U;

typedef signed int INT32S;

typedef float FP32;

typedef double FP64;

typedef unsigned int OS_STK;

typedef unsigned int OS_CPU_SR;

临界代码

和其它内核一样,μC/OS-Ⅱ为了处理临界段代码需要关中断,处理完毕后再开中断。这使得μC/OS-Ⅱ能够避免同时有其它任务或中断服务进入临界段代码。关中断的时间是实时内核开发商应提供的最重要的指标之一,因为这个指标影响用户系统对实时事件的响应性。μC/OS-Ⅱ努力使关中断时间降至最短,但就使用μC/OS-Ⅱ而言,关中断的时间很大程度上取决于微处理器的架构以及编译器所生成的代码质量。

μC/OS-Ⅱ中的这两个宏调用分别是:OS_ENTER_CRITICAL()和 OS_EXIT_CRI TICAL()。因为这两个宏的定义取决于所用的微处理器,故在文件 OS_CPU.H 中可以找到相应宏定义。每种微处理器都有自己的os_cpu.h,

#define OS_CRITICAL_METHOD 3u//临界代码的处理方法,有3种,一般都选三

#if OS_CRITICAL_METHOD == 3u
#define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();}//进入临界代码
#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}//推出临界代码
#endif

开关中断的具体实现,在os_cpu_a.asm文件中,下面会讲到。

#define OS_STK_GROWTH 1u//中断的生长方向,从高地址到低地址

#define OS_TASK_SW() OSCtxSw() //用户级的任务切换。

//申明外部函数定义的申一个额外的异常堆栈空间,

OS_CPU_EXT OS_STK OS_CPU_ExceptStk[OS_CPU_EXCEPT_STK_SIZE];
OS_CPU_EXT OS_STK *OS_CPU_ExceptStkBase;

void OSCtxSw(void);//用户任务的任务切换
void OSIntCtxSw(void);//中断任务的任务切换
void OSStartHighRdy(void);//在操作系统第一次启动的时候调用的任务切换

void OS_CPU_PendSVHandler(void);//用户任务和中断任务的在可悬起系统调用中断里面实现任务的切换。
void OS_CPU_SysTickHandler(void);//这个函数是时钟节拍中断函数。
void OS_CPU_SysTickInit(INT32U cnts);//这个是滴答定时器的初始化,

第三步:OS_CPU_C.C

这个文件里面有9个钩子函数和一个堆栈初始化函数。

钩子函数:钩子函数说白就是为了扩展函数的功能。别的没什么,用得到就往里面加入自己设计的代码,不需要就不用设置。

堆栈的初始化函数需要根据不同的处理器进行设置。关于堆栈函数的处理首先要明白几点,

  • xPSR, PC, LR, R12, R0-R3 这几个寄存器在中断的时候实现自动的保存
  • 剩下的几个寄存器需要手动保存。
  • uCOS-II初始化的时,是如何在任务切换的时候,实现将变量存入到自己的任务堆栈里面
  • 关键就在每个任务初始化堆栈的时候,将堆栈指针R13指向相应的任务地址,这样初始化以后进行任务切换的时候,就能将变量存入好自己的任务堆栈。

*(stk) = (INT32U)0x01000000uL;
*(--stk) = (INT32U)task;
*(--stk) = (INT32U)OS_TaskReturn;
*(--stk) = (INT32U)0x12121212uL;
*(--stk) = (INT32U)0x03030303uL;
*(--stk) = (INT32U)0x02020202uL;
*(--stk) = (INT32U)0x01010101uL;
*(--stk) = (INT32U)p_arg;

*(--stk) = (INT32U)0x11111111uL;
*(--stk) = (INT32U)0x10101010uL;
*(--stk) = (INT32U)0x09090909uL;
*(--stk) = (INT32U)0x08080808uL;
*(--stk) = (INT32U)0x07070707uL;
*(--stk) = (INT32U)0x06060606uL;
*(--stk) = (INT32U)0x05050505uL;
*(--stk) = (INT32U)0x04040404uL;

return (stk); //返回任务的栈顶

第四步:是移植中最重要的部分,也就是汇编底层函数的编写。

主要有一下这几个函数

(一)开中断和关中断函数的实现。

OS_CPU_SR_Save ;用于实现关中断的汇编指令
MRS R0, PRIMASK ;读取PRIMASK到R0,R0是返回值
CPSID I ;PRIMASK=1,关中断(NMI和硬fault可以响应)
BX LR

OS_CPU_SR_Restore ;用于实现开中断的汇编指令
MSR PRIMASK, R0 ;读取R0到PRIMASK中,R0为参数
BX LR


上一页 1 2 下一页

关键词: uCOS-II移植步

评论


相关推荐

技术专区

关闭