实验五(嵌入式实时操作系统实验报告)

  • 格式:doc
  • 大小:547.00 KB
  • 文档页数:5

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

学号:08083572班级:信科08-3 姓名:刘俊迪专业:电子信息科学与技术

实验五:uC/OS-II内核移植实验

1.实验目的:

⏹了解uC/OS-II内核的基本原理和主要结构

⏹掌握将uC/OS-II内核移植到ARM处理器上的基本方法

⏹掌握uC/OS-II下基本多任务应用程序的编写

2.实验内容:

学习uC/OS-II再ARM处理器上的移植过程

编写简单的多任务应用程序,同时实现跑马灯和数码管显示的功能

3.实验原理:

(1)uC/OS-II的移植

1、汇编语言、C语言代码需要移植

2、移植工作集中在多任务切换的实现上

3、在ARM处理器上的移植,需要完成的工作包括:修改三个和体系结构相关的文件,

代码量大约是500行。这三个文件是OS_CPU_C.c、OS_CPU_C.H以及OS_CPU_A.S

(2)OS_CPU.H的移植

1、数据类型定义

INT8U -> unsigned char

INT8S -> signed char

INT16U -> unsigned short

INT16S -> signed short

INT32U -> unsigned int

INT32S -> signed int

2、ARM处理器相关宏定义

退出临界区

#define OS_ENTER_CRITICAL() ARMDisableInt()

进入临界区

#define OS_EXIT_CRITICAL() ARMEnableInt()

3、堆栈增长方向

堆栈由高地址向低地址增长,这个也是和编译器有关的,当进行函数调用时,入口参数和返回地址一般都会保存在当前任务的堆栈中,编译器的编译选项和由此生成的堆栈指令就会决定堆栈的增长方向。

#define OS_STK_GROWTH 1

(3)OS_CPU.c的移植

1、任务堆栈初始化

1、由OSTaskCreate或OSTaskCreateExt调用

2、用来初始化任务的堆栈并返回新的堆栈指针stk。初始状态的堆栈模拟发生一次

中断后的堆栈结构。

3、在ARM体系结构下,任务堆栈空间由高至低依次将保存着pc、lr、r12、r11、

r10、… r1、r0、CPSR、SPSR

4、堆栈初始化结束后,OSTaskStkInit返回新的栈顶指针,OSTaskCreate或

OSTaskCreateExt将指针保存在任务的OS_TCB中。

2、系统hook函数

任务创建钩子OSSTaskCreateHook

任务删除钩子OSTaskDelHook

任务切换钩子OSTaskSwHook

任务统计钩子OSTaskStatHook

时钟节拍处理钩子OSTimeTickHook

3、中断级任务切换函数

1、该函数由OSIntExit()和OSExIntExit()调用

2、在时钟中断ISR(中断服务例程)中发现有高优先级任务等待的时钟信号到来,

则需要在中断退出后并不返回被中断任务,而是直接调度就绪的高优先级任务执

行。

3、该函数通过设置一个全局变量need_to_swap_context标志以表示在中断服务程

序中进行任务切换,然后在OSTickISR()中判断该变量以进行正确的动作。

(4)OS_CPU_A.S的移植

1、时钟节拍中断服务函数

1、时钟节拍是特定的周期性中断

2、时钟节拍率越快,系统的额外开销就越大。越慢则系统响应速度越慢

3、本系统使用定时器0作为时钟节拍源,产生间隔10mS的时钟节拍

4、OSTickISR()就是时钟节拍中断服务函数,也就是定时器0的中断处理函数

2、退出临界区和进入临界区函数ARMDisableInt/ARMEnableInt

1、直接操作CPSR的I、F位

2、ARMDisableInt将CPSR的I、F位设置为1,关闭所有中断

3、ARMEnableInt将CPSR的I、F位设置为0,打开中断

3、任务级上下文切换函数OS_TASK_SW

1、该函数当任务因为被阻塞而主动请求cpu调度时被执行,由于此时的任务切换

都是在非异常模式下进行的,因此区别于中断级别的任务切换。

2、它先将当前任务的cpu现场保存到该任务堆栈中,然后获得最高优先级任务的

堆栈指针,从该堆栈中恢复此任务的cpu现场,使之继续执行。这样就完成了一次

任务切换。

4、OSStartHighRd

1、该函数是在OSStart函数中调用

2、负责从最高优先级任务的TCB中获得该任务的堆栈指针sp,并依次将cpu现场

恢复,这时系统就将控制权交给用户创建的该任务进程,直到该任务被阻塞或者被其他更高优先级的任务抢占cpu

3、该函数仅在多任务启动时被执行一次,用来启动之前创建的第一个,也就是最

高优先级的任务执行

(5)多任务应用程序的编写

C语言入口函数

1、调用函数ARMTargetInit初始化ARM处理器;

2、调用OSInit进行操作系统初始化;

3、调用OSTaskCreate函数两个任务:TaskLED和TaskSEG;

4、调用ARMTargetStart函数启动时钟节拍中断;

5、调用OSStart启动系统任务调度。

(6)OS_CPU.H的改写

typedef unsigned char BOOLEAN;

typedef unsigned char INT8U;

typedef signed char INT8S;

typedef unsigned int INT16U;

typedef signed int INT16S;

typedef unsigned long INT32U;

typedef signed long INT32S;

typedef float FP32;

typedef double FP64;

typedef unsigned int OS_STK;

#define BYTE INT8S

#define UBYTE INT8U

#define WORD INT16S

#define UWORD INT16U

#define LONG INT32S

#define ULONG INT32U