【嵌入式】uCOS-II在STM32上的移植

本文详细介绍了如何将uCOS-II实时操作系统移植到STM32F103C8T6微控制器上,包括源码获取、工程配置、硬件相关文件编写,以及任务堆栈初始化等关键步骤。通过对OS_CPU_H.C和OS_CPU_C.C的修改,实现了中断管理和任务切换等功能。在完成移植后,通过一个简单的LED灯控制程序验证了系统的正确运行。
摘要由CSDN通过智能技术生成

本文主要提供uCOS在STM32上的移植的一些步骤和个人见解,只涉及具体实操加一点解释,不讲原理,如有不当之处敬请指出。

文中使用的STM32型号为STM32F103C8T6,使用的uCOS版本为V2.91

零、

关于使用MDK创建STM32工程的步骤,在本人的另一篇文章,有兴趣的可以参考一下。

http://blog.csdn.net/d521000121/article/details/53107579


一、

先从网上下载下来uCOS-II的源码(官网可能在国内下不了,随便百度一搜多的是了),反正STM32是满足移植条件的了,我们直接就进行移植吧。

为了便于使用,我把源码分成三个目录,建好了工程后如下图:


这里解释一下,

UCOSII-PORT将是我们要自己写的一些文件,它和我们使用的芯片有关。

UCOSII-CONFIG是uCOS-II的一些相关设置文件,我们分别把两个头文件放在里面。

UCOSII-CORE是uCOS-II内核功能实现的代码,这一部分我们是不用理会的。

剩下的目录意思可以参考前面我提到的另一篇博文。


二、

工程建好了之后,我们就可以开始写一些与硬件相关的部分,使uCOS能泡在我们的STM32上。

这里分三个文件,就是在UCOSII-PORT里面的三个文件

1.OS_CPU.H

1).定义与编译器相关的数据类型,因为为了保证移植性,源码中是没有直接使用C语言的数据另行的,所以我们需要定义一下。

2).定义允许和禁止终端的宏,uCOS-II在访问临界区代码时,需要先关闭终端,后再打开中断,实现这两个功能的宏,也需要我们写。

就是定义OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL()这两个宏。

3).定义栈的增长方向,其实对于ARM的处理器都是支持的,但是C语言编译器GCC只支持从上往下生长,所以要这样定义

#define  OS_STK_GROWTH        1 

4).定义OS_TASK_SW()宏

这个宏是任务从低优先级切换到高优先级时候用的,可以使用软中断将中断向量指向OSCtxSW()函数,或者直接调用OSCtxSW()函数就好了。

/************************ (C) COPYLEFT 2010 Leafgrass *************************

* File Name		: os_cpu_c.c 
* Author		: Librae
* Date			: 06/10/2010
* Description	: μCOS-II在STM32上的移植代码C语言部分,
*				  包括任务堆栈初始化代码和钩子函数等

******************************************************************************/

#ifndef	__OS_CPU_H__
#define	__OS_CPU_H__

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

/******************************************************************************
*                    定义与编译器无关的数据类型
******************************************************************************/

typedef unsigned char  BOOLEAN;
typedef unsigned char  INT8U;			/* Unsigned  8 bit quantity       */
typedef signed   char  INT8S;			/* Signed    8 bit quantity       */
typedef unsigned short INT16U;			/* Unsigned 16 bit quantity       */
typedef signed   short INT16S;			/* Signed   16 bit quantity       */
typedef unsigned int   INT32U;			/* Unsigned 32 bit quantity       */
typedef signed   int   INT32S;			/* Signed   32 bit quantity       */
typedef float          FP32;			/* Single precision floating point*/
typedef double         FP64;			/* Double precision floating point*/

//STM32是32位位宽的,这里OS_STK和OS_CPU_SR都应该为32位数据类型
typedef unsigned int   OS_STK;			/* Each stack entry is 32-bit wide*/
typedef unsigned int   OS_CPU_SR;		/* Define size of CPU status register*/
/* 
*******************************************************************************
*                             Cortex M3
*                     Critical Section Management
*******************************************************************************
*/


/*
*******************************************************************************
*                               PROTOTYPES
*                           (see OS_CPU_A.ASM)
*******************************************************************************
*/
//OS_CRITICAL_METHOD = 1 :直接使用处理器的开关中断指令来实现宏 
//OS_CRITICAL_METHOD = 2 :利用堆栈保存和恢复CPU的状态 
//OS_CRITICAL_METHOD = 3 :利用编译器扩展功能获得程序状态字,保存在局部变量cpu_sr

#define  OS_CRITICAL_METHOD   3	 	//进入临界段的方法

#if OS_CRITICAL_METHOD == 3
#define  OS_ENTER_CRITICAL()  {cpu_sr = OS_CPU_SR_Save();}
#define  OS_EXIT_CRITICAL()   {OS_CPU_SR_Restore(cpu_sr);}
#endif

#if OS_CRITICAL_METHOD == 3u                      /* See OS_CPU_A.ASM                                  */
OS_CPU_SR  OS_CPU_SR_Save(void);
void       OS_CPU_SR_Restore(OS_CPU_SR cpu_sr);
#endif


/*
*******************************************************************************
*                          ARM Miscellaneous
*******************************************************************************
*/


//定义栈的增长方向.
//CM3中,栈是由高地址向低地址增长的,所以OS_STK_GROWTH设置为1
#define  OS_STK_GROWTH        1      /* Stack grows from HIGH to LOW memory on ARM    */


//任务切换宏,由汇编实现.
#define  OS_TASK_SW()         OSCtxSw()


void       OSCtxSw(void);
void       OSIntCtxSw(void);
void       OSStartHighRdy(void);

void       OSPendSV(void);


OS_CPU_EXT INT32U OSInterrputSum;

#endif

/************************ (C) COPYLEFT 2010 Leafgrass ************************/


2.OS_CPU_A.ASM
1).编写在OS_CPU.H中提到的一些需要用汇编语言实现的函数代码。

2).编写OSSTartHighRdy()函数,这时一个运行优先级最高的就绪任务。

它会在OSStart()启动后就执行,负责从最高优先级任务的TCB控制块中获得该任务的堆栈指针SP,然后进行CPU的现场恢复。这时系统会将控制权交给用户创建的任务。要写这个函数主要是因为SP操作会因CPU而异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值