1、作者卢有亮 图书 PPT和全部代码下载 http:/ 嵌入式实时操作系统原理与实践 嵌入式实时操作系统C /OS原理与实践教材 :嵌入式实时操作系统 C/OS原理与实践电子工业出版社作者 :卢有亮 电子科技大学能源科学与工程学院作者卢有亮 图书 PPT和全部代码下载 http:/ 嵌入式实时操作系统原理与实践 第 7章 移植 7.1 移植说明 7.2 在 VC6上实现基于 Windows的虚拟C/OS-II移植 7.3 在基于 NIOS软核的 FPGA嵌入式系统下的 C/OS-II移植 习题 作者卢有亮 图书 PPT和全部代码下载 http:/ 嵌入式实时操作系统原理与实践 7.1 移植说明C
2、/OS-II作为嵌入式实时操作系统,最终要应用在嵌入式系统上,如单片机、 ARM、 FPGA、 DSP等。本章中首先给出的就是说明如何移植到虚拟WINDOWS平台。接下来就是在一个实际的嵌入式系统,基于软核的FPGA系统下的移植。在掌握了这两个平台的移植后,移植到其他的平台都是不难实现。7.1.1 C/OS-II的代码结构作者卢有亮 图书 PPT和全部代码下载 http:/ 嵌入式实时操作系统原理与实践 移植必看的重要代码:1.操作系统配置文件 os_config.h 2.操作系统头文件 ucos_ii.h 3.操作系统内核 C文件 4.与 CPU相关代码部分 作者卢有亮 图书 PPT和全部代
3、码下载 http:/ 嵌入式实时操作系统原理与实践 7.1.2操作系统中与 CPU相关的代码解析7.1.2.1 头文件 os_cpu.h表 7.2os_cpu.h定义的数据类型表 7.3 os_cpu.h除类型定义外的其他代码示例进入临界区有三种方法 :方法 1:定义一个全局变量 FlagEn,进入临界区时中断服务程序判定该值为 0,就不进行中断服务。离开临界区时将 FlagEn置 1。这种方法只在虚拟平台上使用时使用。其缺点是不能进行中断嵌套。方法 2: OS_ENTER_CRITICAL()时将 CPU状态寄存器(如 PSW)入栈,关中断,定时器中断被禁止。 OS_EXIT_CRITICA
4、L()时退栈即可恢复 CPU状态寄存器的值,这样中断也恢复到了原来的状态。方法 3: OS_ENTER_CRITICAL()时将 CPU状态寄存器(如 PSW)的值保存到局部变量,关中断,定时器中断被禁止。 OS_EXIT_CRITICAL()时从局部变量恢复 CPU状态寄存器的值,这样中断也恢复到了原来的状态。这需要编译器支持处理状态寄存器的值的函数。作者卢有亮 图书 PPT和全部代码下载 http:/ 嵌入式实时操作系统原理与实践 7.1.2.2 包含汇编的 C文件 os_cpu.c1.OSTaskStkInit 是由 OSTaskCreate或 OSTaskCreateExt在创建任务的
5、时候,在对控制块进行初始化之前,对任务堆栈进行初始化时调用。它实现的功能是将任务参数地址、任务函数入口地址、各 CPU寄存器地址压入任务堆栈。需要注意的是,虽然这时候任务还没有运行过,不需要保存当前CPU寄存器的真实值到任务堆栈,但初始化的结果是将堆栈看起来好像刚刚发生了中断一样。请参考本书中 2.4.1和 2.4.2。2.OSStartHighRdy在多任务启动函数 OSStart中被调用。这时候没有任务在运行, OSStartHighRdy开始启动多任务。在 OSStartHighRdy运行前,OSStart已将任务控制块指针 OSTCBCur指向优先级最高的就绪任务的 TCB, OSSt
6、artHighRdy首先将 OSRunning的值设置为真,然后使用汇编语句将堆栈寄存器的值设置为该任务堆栈的地址,然后将各堆栈中内容退栈给各寄存器,接着是任务地址和任务参数,并转到任务地址去执行。 3.OSCtxSw是非中断处理情况下的任务切换函数。它在任务被阻塞、删除、创建等多种情况下被调用。直接调用它的函数就是 OS_Sched。4. OSIntCtxSw是中断处理情况下的任务切换函数。例如系统的每 10毫秒进行时钟中断,那么都要使用它进行任务切换。因为在中断产生后,所以PSW、 CS、 IP( 80x86)已经被压入了堆栈 (在其他硬件环境下应是不同的寄存器 ),而 ISR服务程序首先
7、需将其他的寄存器也压入堆栈,所以不需要再去保存环境,所以中断中任务切换和非中断的情况下是不同的。 5.用户时钟中断服务程序 OSTickISRuser。用户时钟中断服务程序也就是时钟节拍服务程序,是系统的心脏跳动。作者卢有亮 图书 PPT和全部代码下载 http:/ 嵌入式实时操作系统原理与实践 7.1.3 C/OS-II移植步骤1.选择合适的开发软件,为 C/OS-II操作系统建立一目录,将操作系统内核代码拷贝到一个目录,最好是该目录下一个子目录。2.在该目录下创建工程。加入 C/OS-II内核文件到这个工程。3.建立主程序,如 main.c。在主文件中编写 TaskStart代码,该代码能
8、设置定时器中断。在主文件中声明用户堆栈数组,创建用户堆栈。主程序中的入口函数应先执行操作系统初始化函数 os_init,然后使用 OsTaskCreate或 OsTaskCreateExt创建TaskStart。之后如果有用户任务应使用 OsTaskCreate或 OsTaskCreateExt创建所有用户任务。然后调用 OSStart()启动多任务。注意 TaskStart的优先级必须是最高的。4.根据 7.1.2中对 os_cpu.h的说明,根据用户硬件环境修改 os_cpu.h。5.根据 7.1.2中对 os_cpu.c的说明,根据用户硬件环境修改 os_cpu.c。6.编译,下载到硬件运行,查看结果和进行修改,直到成功。 作者卢有亮 图书 PPT和全部代码下载 http:/ 嵌入式实时操作系统原理与实践 7.2 在 VC6上实现基于 Windows的虚拟 C/OS-II移植作者卢有亮 图书 PPT和全部代码下载 http:/ 嵌入式实时操作系统原理与实践 作者卢有亮 图书 PPT和全部代码下载 http:/ 嵌入式实时操作系统原理与实践