首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

uC/OS-II在ADSP—BF531上的移植2

uC/OS-II在ADSP—BF531上的移植2

不同的处理器有不同的字长,μC/OS-II不使用C的short、int、long等与编译器相关的数据类型,而是重新定义了一系列类型以确保系统的可移植性,在系统移植时必须在OS_CPU.H头文件中对这些数据类型重新定义,具体内容如下:
typedef unsigned char BOOLEAN
typedef unsigned char INT8U
typedef signed char INT8S
typedef unsigned short INTl6U
typedef signed short INTl6S
typedef unsigned int INT32U
typedef signed int INT32S
μC/OS-II中的指针根据处理器堆栈数据入口宽度定义为OS_STK类型:
typedef unsigned int OS_STK
4.1.2临界代码
RTOS在进入系统临界区之前都必须先关中断,退出后再开中断,μC/OS-II定义了2个宏指令来关闭/打开中断:
#define OS_ENTER_CRITICAL0
asm(“cli%O:”:”=d”(InterrupLach))
#define OS_EXIT_CRITICAL()
asm(“sti%0:”::”=d”(InterrupLaeh))
其中InterrupLaeh为一全局变量,用于开关中断时
IMASK寄存器内容的恢复和保存。
4.1.3堆栈增长方向设定
在OS CPU.H头文件中还必须根据处理器堆栈的增长方向对OS_STK_GROWTH进行宏定义,由于Adsp-BF531是按照由高地址到低地址的结构组织处理器堆栈,因此宏定义如下:
#define OS_STK_GROWTH 1
4.1.4 OS_TASK_SW0宏定义
OS_TASK_SW0在μC/OS-II从低优先级任务切换到高优先级任务时被调用,定义如下:
#define OS_TASK_sw() asm(“raise 13;”)
4.2编写OS_CPU_C.C文件
μC/OS-lI的移植要求用户在OS_CPU_C.C文件中编写6个简单的C函数,其中主要是完成OS-TaskStkInit (),其余5个函数可以不作处理。OS-TaskStkInit()负责任务堆栈的初始化,使得任务堆栈看起来就像刚发生过中断并将所有的寄存器保存到堆栈中的情形一样。不同的编译器在函数调用时有不同的入栈方法,因此在具体实现时必须根据处理器的编译环境进行调整。Visualdsp++3.0在函数调用时的堆栈结构如图2所示。
OSTaskStkInit()调用时需要传递任务代码起始地址(task)、用户参数指针(pdata)、任务堆栈顶端的地址(堆栈栈顶指针ptos)、返回参数为新任务堆栈栈顶指针,函数原型如下:
返回列表