您的位置 首页 报告

uCOS-II的移植过程

说明:将V292移植到STM32F107ZET6和STM32F107VCT6关于uCOS的移植,其实要说难也难,要说简单也简单。简单的是现在官方都已经移植好

阐明:将V2.92移植到STM32F107ZET6和STM32F107VCT6.

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

第一步:到官网下载最新版其他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_CRIT%&&&&&%AL() {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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/baogao/257555.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部