Uc/os-ii在tms470上的移植规划
1. uc/os-ii简介:
uC/OS-Ⅱ是一个实时操作系统内核,包含了任务调度、任务管理、时间管理、内存管理和任务间的通信与同步等基本功能。没有提供输入输出管理、文件系统、网络之类的额外服务。但是由于uC/OS-Ⅱ的可移植性和开源性,用户可以自己添加所需的各种服务。
图一 Uc/os-ii体系结构
2. uc/os-ii在tms470上可移植性分析
要使uc/os-ii正常工作,处理器必须满足以下要求:
1. 处理器的c编译器能产生可重入代码
2. 在程序中可以打开或者关闭中断
3. 处理器支持中断,并且能够产生定时中断
4. 处理器支持能够容纳一定量数据的硬件堆栈
5. 处理器有将堆栈指针和其他cpu寄存器存储和读出到堆栈(或者内存)的指令
Tms470处理器完全满足上述要求。
3. 移植uc/os-ii所需要做的工作
uc/os-ii的全部代码大约是6000-7000行,一共有15个文件。将uc/os-ii移植到tms470上所要做的工作就是修改3个与处理器相关的文件。下面就分别介绍这三个文件的移植工作:
3.1 os_cpu.h移植分析
3.1.1 数据类型的定义
这部分修改是和编译器类型相关的,因为不同的编译器会使用不同的字节长度来
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示同一数据类型。在这里使用的是IAR Embedded Workbench,相关数据类型的定义如下:
typedef unsigned char BOOLEAN;
typedef unsigned char INT8U;
typedef signed char INT8S;
typedef unsigned short INT16U;
typedef signed short INT16S;
typedef unsigned int INT32U;
typedef signed int INT32S;
typedef float FP32;
typedef double FP64;
3.1.2 堆栈增长方向
置os_stk_growth为0表示堆栈从下往上增长
置os_stk_growth为1表示堆栈从上往下增长
在tms470当中,堆栈增长方向是从上往下,#define OS_STK_GROWTH 1。
3.1.3 宏定义
uc/os定义了两个宏来进行开关中断
#define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();}
#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}
3.2 os_cpu_c.c移植分析
Uc/os-ii移植需要在os_cpu_c.c文件中改写6个c
函
关于工期滞后的函关于工程严重滞后的函关于工程进度滞后的回复函关于征求同志党风廉政意见的函关于征求廉洁自律情况的复函
数。
os_cpu_c.c包括1个堆栈初始化函数和5个钩子函数。其中只有堆栈初始化函数ostaskstkinit()在uc/os中是必要的,其余5个钩子函数是对系统内核扩展时用的,在移植时可全为空函数。
3.2.1 任务堆栈初始化函数ostaskstkinit()
在编写任务堆栈初始化函数ostaskstkinit()之前,必需先根据处理器的结构和特点确定任务的堆栈结构。在目前系统当中,任务堆栈空间如图所示:
图2 任务堆栈空间结构
任务堆栈初始化函数的任务是在任务进行初始化的时候,在堆栈增长方向上定义每个需要保存寄存器的位置。这样做的目的是在进行任务切换的时候能够将当时的处理器现场保存到任务的堆栈空间当中,在下次执行的时候能够恢复过来。所以在每次现场保存的时候,都需要按照一定的顺序进行堆栈操作。
3.3 os_cpu.asm移植思路分析
3.3.1 osstarthighrdy:运行优先级最高的就绪任务
此函数是在多任务启动之后,负责从高优先级任务的控制快中获得该任务的堆栈指针sp,通过sp依次将cpu现场恢复,这时系统就将控制权交给用户创建的该任务进程,直到该任务被阻塞或者被其他更高优先级的任务抢占cpu。该函数仅仅在多任务启动时被执行一次,用来启动第一个,也就是高优先级的任务执行。
3.3.2 os_task_sw():任务级的任务切换函数
任务级的上下文切换,它是当任务因为被阻塞而主动请求cpu调度时被执行,由于此时任务切换都是在非异常模式下进行的,因此区别于中断级别任务切换。它的工作是先将当前任务的cpu现场保存到该任务堆栈中,然后获得最高优先级任务的堆栈指针,从该堆栈中恢复此任务的cpu现场,使之继续执行。这样就完成了一次任务切换。
3.3.3 osintctxsw():终端级的任务切换函数
中断级的任务切换,它是在时钟中断(中断服务历程)中发现有高优先级任务等待的时钟信号到来,则需要在中断退出后并不返回被中断任务,而是直接调度就绪的高优先级任务执行。其原理基本上与任务级的切换相同。
4. 测试移植代码
移植完成以后,编写一个简单的多任务程序来测试一下移植是否成功。
_1305792082.vsd
�������������
�
Uc/os-ii�������������������
Os_core.c�
Os_flag.c�
Os_mbox.c�
Os_mem.c�
Os_mutex.c�
Os_q.c�
Os_sem.c�
Os_task.c�
Os_time.c�
Ucos_ii.c�
Ucos_ii.h�
�
Includes.h�
�
Os_cpu.h�
�����
�����
Uc/os-ii�������������������
Os_cfg.h�
Includes.h�
Uc/os-ii�����������������������������������
Os_cpu_a.asm�
Os_cpu_c.c�
Cpu�
�������
Uc/os-ii�
_1305982807.vsd
Pc�
Lr�
R12�
R11�
��.�
��.�
R1�
R0�
CPSR�
SPSR�
�������
�������
���������������