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 的集成开发环境,均可以生成可重入的代码。
在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