uCOS-II移植的大致步骤

1、配置滴答定时器(配置时钟节拍ISR)

在使用UCOS时,其中心跳时钟是由Systick来提供的,因此要实现任务调度,那么首先得配置systick时钟:主要是根据时钟节拍数(配置文件中)和systick时钟源来配置systick的LOAD值(重装载值);同时开启systick中断;使能时钟开始工作。

由于上面开启了systick中断,那么就要编写中断服务函数(异常服务函数)SysTick_Handler()在该函数中,主要是做了一件事:如果当前OS在正常运行,那么进入中断,调用UCOS的时钟服务程序,最后退出中断,触发任务切换软中断。

这里UCOS的时钟服务函数里面做的事情:
a、遍历TCB任务链表,维护其中的延时时间参数和任务状态标志。
b、首先指向第一个TCB,遍历TCB,更改当前TCB中的延时参数,如果当前TCB中的延时时间已经到了,那么就将其TCB中的状态更改为就绪态,然后指向下一个TCB,直到指向空闲任务。

这里退出中断函数中做的事情:
a、首先中断嵌套层数变量递减
b、然后从就绪表中找出优先级最高的任务
c、最后触发PENDSV实现任务切换。

2、修改OS_CPU.H文件

该代码中主要是定义了一些数据类型,这和编译器、处理器相关;

定义进入临界区的方法(开中断/关中断):和处理器有关。取决于处理器类型以及编译器的特性,

更改栈的增长方向;(大多数都是向下生长的)

定义任务切换宏(汇编实现):和处理器有关

3、修改OS_CPU_C.C文件

这里主要涉及到的是任务堆栈初始化函数,其主要是在任务创建时被调用,初始化任务的堆栈结构。因此,堆栈看起来就像是刚刚发生过中断一样,所有寄存器都保存在堆栈中。
a、模拟带参数(pdata)的函数调用;
b、模拟ISR向量;
c、按照预先设计的寄存器值初始化堆栈结构;
d、返回栈顶指针给调用该函数的函数;

也就是模拟寄存器入栈过程。这里需要注意的是入栈顺序,硬件会自动把xPSR、PC、LR、R12、R0-R3寄存器入栈、剩下的R4-R11就需要我们手动入栈。

4、修改OS_CPU_A.ASM文件

主要是对Cortex-M3的特殊寄存器进行操作,特殊寄存器分为状态寄存器、中断屏蔽寄存器、控制寄存器三种:他们只能被专用的指令访问:MSR、MRS,且没有存储器地址。

状态寄存器:

中断屏蔽寄存器:

只有在特权级下才能访问这三个寄存器,同时CM3专门设置了一条CPS指令用于开关中断

控制寄存器:用于定义特权级别和堆栈指针的使用,

关中断:OS_CPU_SR_Save
读取中断屏蔽寄存器状态,然后中断屏蔽寄存器=1(关中断:写1),返回

开中断:OS_CPU_SR_Restore
将之前保存的状态写入到中断屏蔽寄存器(写0),返回

调度器运行第一个任务(就绪态最高优先级任务):OSStartHighRdy,由OSStart()调用,用来开启多任务
设置PendSV的优先级为NVIC_PENDSV_PRI(0xFFFF);
设置线程堆栈指向0,获取将要运行的任务的堆栈指针;
将OSRuning标志量置1;
触发PendSV中断(直接给中断控制寄存器写0x10000000);
开中断(给中断屏蔽寄存器写1);

任务级上下文切换: OSCtxSw
将R4、R5寄存器压栈;
触发PendSV中断(异常);
然后出栈R4、R5寄存器;
返回;

中断级上下文切换:OSIntCtxSw
将R4、R5寄存器压栈;
触发PendSV中断(异常);
然后出栈R4、R5寄存器;
返回;

任务级切换和中断级切换代码一样,都是触发一个pendsv异常,然后具体的切换过程是在PendSV中断服务函数中进行的,与任务级切换不同的是,中断级切换任务时,CPU的所有寄存器已经入栈,不需要手动对其进行入栈。

PendSV上下文切换:

a. 按照任务堆栈初始化函数一样的顺序将处理器中的寄存器内容保存到堆栈中(部分寄存器已经自动保存);
b. 将堆栈指针(栈顶指针)保存到TCB中;
c. 将指向当前任务的指针,指向即将恢复运行的任务,即新任务取代当前任务;
d. 将新任务的优先级复制给当前任务;
e. 从新任务的TCB中得到新任务的堆栈指针;
f. 从新任务的堆栈中按既定的顺序恢复相应的寄存器到CPU;
g. 中断返回,使得PC和PSW从堆栈中弹出,从而使得用户任务恢复运行。

关中断;
判断PSP是否为0,若是0,就转移到PendSV_Handler_Nosave();
如果PSP为0,说明是第一次做任务切换,任务创建时会调用堆栈初始化函数,初始化时已经做了入栈处理,因此这里不需要再做入栈处理,而直接跳转到后面的函数PendSV_Handler_Nosave做任务切换;
做入栈处理:
R0-=0x20:SP指针先减小,再入栈;
保存剩余的R4-R11寄存器;
调整SP指向OSTCBcur;

PendSV_Handler_Nosave()函数详解:
将R14(LR)入栈,调用OSTaskSWHook(),出栈R14;
更改当前任务优先级为最高优先级任务的优先级:OSPrioCur= OSPrioHighRdy;
更改当前任务指针指向为最高优先级的就绪任务:OSTCBCur= OSTCBHighRdy;
R0 = OSTCBHighRdy;
从堆栈中恢复R4-R11;
更改SP指针为R0+=0x20:出栈以后,SP指针递增;0x20=32,8个寄存器,每一个都是4字节(32位)的,因此这里刚好;
用新的任务的R0(SP)加载到PSP;
确保LR的位2为1,返回后使用进程堆栈:因为进入中断使用的是MSP,退出中断时需要更改为PSP;
开中断,中断返回(返回的应该是LR寄存器);(这里在进入异常服务程序以后,LR的值被自动更新为特殊的EXC_RETURN,在M3中[3:0]有意义,其意义如下);

这里之所要将官方文件里面的PendSV名字进行更改,是因为ST的官方文件和启动文件里面的名字都是这个,因此要将stm32f10x_it.c中的函数屏蔽,同时更改汇编文件里面的中断名字。以保持和启动文件中的中断向量表中名字一样。

uCOS-II实时操作系统移植的大致步骤相关推荐

  1. 基于STM32的简易示波器的UCOS II嵌入式实时操作系统实现

    基于STM32的简易示波器的UCOS II嵌入式实时操作系统实现 在基于STM32的示波器的实现的基础上,在STM32上移植UCOS II嵌入式实时操作系统. 在UCOS II操作系统中将各个功能分发 ...

  2. 用C语言写ucos中断服务程序,在ARM处理器上移植uCOS II的中断处理

    uCOS II是一个源码公开.可移植.可固化.可剪裁和抢占式的实时多任务操作系统,其大部分源码是用ANSI C编写,与处理器硬件相关的部分使用汇编语言编写.总量约200行的汇编语言部分被压缩到最低限度 ...

  3. IAR中移植UCOS II系统以及sourceInsight 使用

    ucos 学习笔记 1 sourceInsight 使用 CSDN参考链接 新建工程 第一步:project中new project 第二步:在高亮部分输入工程的地址,工程文件夹与IAR工程文件夹放在 ...

  4. 基于STM32的实时操作系统FreeRTOS移植教程(手动移植)

    前言:此文为笔者FreeRTOS专栏下的第一篇基础性教学文章,其主要目的为:帮助读者朋友快速搭建出属于自己的公版FreeRTOS系统,实现后续在实时操作系统FreeRTOS上的开发与运用.操作系统的学 ...

  5. UCOS II移植到STM32F103开发板

    早期嵌入式开发没有嵌入式操作系统的概念 ,直接操作裸机,在裸机上写程序,比如用51单片机基本就没有操作系统的概念.通常把程序分为两部分:前台系统和后台系统. 简单的小系统通常是前后台系统,这样的程序包 ...

  6. 实时操作系统UCOS学习笔记1----UCOSII简介

    前面我们所有的实验都是跑的裸机程序(裸奔),从本章开始,我们开始介绍UCOSII(实时多任务操作系统内核). UCOSII简介 UCOSII的前身是UCOS,最早出自于1992年美国嵌入式系统专家Je ...

  7. 嵌入式实时操作系统μC/OS II(一)

    嵌入式实时操作系统μC/OS II 为什么要学习μC/OS-II ㈠.凡从事嵌入式系统开发工作的人,必须对嵌入式操作系统有足够的了解. ㈡.对于初学者,从μC/OS-II开始是个明智的选择. 1.μC ...

  8. 【嵌入式系统—实时操作系统】uC/OS-II 及其STM32F103移植

    你经历过吗? 背景 踏入嵌入式领域,我们往往首先接触的都是单片机编程,而51也往往成为了入门首选. 而这种单片机编程通常都是指裸机编程(轮询系统/前后台系统),即没有加入 RTOS (多任务的实时操作 ...

  9. 嵌入式实时操作系统μC/OS-Ⅱ 在DSP芯片上的移植与测试

    [摘要]为了降低DSP 系统软件的开发难度,保证系统的实时性,缩短开发周期,将嵌入式实时操作系统μC/OS-Ⅱ移植到DSP 芯片中是目前比较常用的一种方法.本文介绍了嵌入式实时操作系统μC/OS-Ⅱ的 ...

最新文章

  1. mqtt实例 php_php--mqtt实现推送
  2. 解决svn图标不显示(绝对有用)
  3. c 语言五子棋游戏代码,C语言案例:控制台版本的五子棋游戏【代码】
  4. Android NDK引用预编译的动态链接库
  5. 手把手FFmpeg入门——视频解码+解封装
  6. 详解:Sqoop的导入和导出数据
  7. 父与子python下载不了_【求助】看父与子学习Python,里面有一个滑雪小游戏,加载不出图...
  8. Hibernate不能自动建表解决办法【转载】
  9. c语言入门程序下载,c语言入门自学软件下载
  10. 【SQL】SQL的基础语法
  11. ansys中模态扩展是什么意思_ansys模态分析步骤
  12. B站视频下载:如何下载B站视频到电脑上
  13. 《UnityAPI.Vector3三维向量》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+Vector3+Lerp+Cross+Dot+Slerp+立钻哥哥++OK++)
  14. android资源文件assets
  15. mac接收gmail邮件_如何从您的Gmail帐户发送和接收Hotmail
  16. 全球机场与航空公司准点率数据报告,为五一小长假做足准备
  17. gtx1660是什么级别的_显卡天梯图秒懂GTX1660Ti性能 GTX1660Ti相当于什么显卡
  18. OnTriggerEnter与OnCollisionEnter详解
  19. 关于Niche站运营,我有几句话要说
  20. Office2013出现”停止工作“问题的解决

热门文章

  1. Wireshark协议源代码
  2. 皇家墨尔本理工大学计算机科学专业,皇家墨尔本理工大学计算机科学本科专业.pdf...
  3. 【ES6】阮一峰ES6学习之编程风格
  4. 修改本地项目svn地址
  5. Python Django断点下载(服务端/客户端)
  6. 巡检各个服务器磁盘状态和作业执行状态,服务器状态巡检脚本
  7. 【网络工程】4.企业级交换机配置
  8. OPENCV的下载和安装
  9. ubuntu桌面美化mac_Ubuntu桌面美化(一)桌面美化成MacOS
  10. STM32循迹小车系列教程(三)—— 使用灰度传感器循迹