UCOS-II移植到三星S3C44B0X(ARM7)

本文介绍了如何将UCOS-II实时操作系统移植到三星S3C44B0X(ARM7)处理器上。主要涉及了处理器必须满足的条件,例如中断支持、堆栈管理和硬件寄存器的存储恢复。移植过程中需要关注的文件包括os_cpu.h、os_cpu_a.s和os_cpu_c.c,以及相关配置文件os_cfg.h和includes.h。内容详细阐述了移植所需的步骤和处理器相关代码的修改。
摘要由CSDN通过智能技术生成
一、欲移植UCOS II,处理器必须满足的条件:
1) 处理器的c编译器支持可重入函数
可重入的代码指的是一段代码(如一个函数)可以被多个任务同时调用,而不必担心会破坏数据。也就是说,可重入型函数在任何时候都可以被中断执行,过一段时间以后又可以继续运行,而不会因为在函数中断的时候被其他的任务重新调用,影响函数中的数据。下面的两个例子可以比较可重入型函数和非可重入型函数:
程序1:可重入型函数
void swap(int *x, int *y)
int temp;
temp=*x;
*x=*y;
*y=temp;
程序2:非可重入型函数
int temp;
void swap(int *x, int *y)
temp=*x;
*x=*y;
*y=temp;
程序1 中使用的是局部变量temp 作为变量。通常的C 编译器,把局部变量分配在栈中。
所以,多次调用同一个函数,可以保证每次的temp 互不受影响。而程序2 中temp 定义的是全局变量,多次调用函数的时候,必然受到影响。代码的可重入性是保证完成多任务的基础,除了在C 程序中使用局部变量以外,还需要C 编译器的支持。笔者使用的是ARM SDT 以及ADS 的集成开发环境,均可以生成可重入的代码。
2)在程序中可以打开和关闭中断
在ucos Ⅱ中,可以通过OS_ENTER_CRITICAL()或者OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。这需要处理器的支持,在ARM7TDMI 的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。

3)处理器支持中断,并且能产生定时器中断(ucos Ⅱ是通过定时器中断来实现多任务的调度,即时间片的产生 )ucos Ⅱ 是通过处理器产生的定时器的中断来实现多任务之间的调度的。在ARM7TDMI 的处理器上可以产生定时器中断。

4)处理器要具有一定的硬件堆栈数量
5)处理器要有将堆栈指针和其他cpu寄存器存储和读出堆栈(或者内存)的指令(如51的pop,push指令,ARM7的STMFD,LDMFD等)。
ucos Ⅱ进行任务调度的时候,会把当前任务的CPU 寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是ucos Ⅱ多任务调度的基础。
ARM7TDMI 处理器完全满足上述要求。

 

二、需要移植的文件

ucos Ⅱ中与处理器有关的代码: os_cpu.h   os_cpu_a.s  os_cpu_c.c
ucos Ⅱ的设置 :                     os_cfg.h   inludes.h
1、includes.h

//与UCOSII声明配置相关的头文件
#include    "../uhal/uhal.h"
#include    "os_cpu.h"
#include    "os_cfg.h"
#include    "ucos_ii.h"

//与处理器相关的头文件
#include "../inc/44b.h"
#include "../inc/44blib.h"
#include "../inc/def.h"
#include "../inc/option.h"


#ifdef      EX3_GLOBALS
#define   EX3_EXT
#else
#define   EX3_EXT  extern
#endif

/*
*********************************************************************************************************
*                                             DATA TYPES
*********************************************************************************************************
*/

typedef struct {
    char    TaskName[30];
    INT16U  TaskCtr;
    INT16U  TaskExecTime;
    INT32U  TaskTotExecTime;
} TASK_USER_DATA;

/*
*********************************************************************************************************
*                                              VARIABLES
*********************************************************************************************************
*/

EX3_EXT  TASK_USER_DATA  TaskUserData[10];

/*
*********************************************************************************************************
*                                         FUNCTION PROTOTYPES
*********************************************************************************************************
*/

void   DispTaskStat(INT8U id);

 

2、os_cpu.h  //定义与编译器无关的数据类型,与ARM体系结构相关的处理函数声明

 

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

/*
*********************************************************************************************************
*                                              DATA TYPES
*                                         (Compiler Specific)
*********************************************************************************************************
*/

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

typedef unsigned int   OS_STK;                   /* Each stack entry is 16-bit wide                    */

#define BYTE           INT8S                     /* Define data types for backward compatibility ...   */
#define UBYTE          INT8U                     /* ... to uC/OS V1.xx.  Not actually needed f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值