uCOS-II移植

  今天终于把uCOS-II在LPC1788上的移植给搞出来了,之前上网搜了很多资料,又把《嵌入式操作系统uC/OS-II》这本书通读了一下,然后开始尝试uCOS-II的移植。
  在uCOS-II在不同CPU之间的移植只需要更改三个文件:os_cpu.h,os_cpu_c.c,os_cpu_a.asm。其中os_cpu.h是关于可移植数据类型的定义、uCOS-II的主堆栈的定义、开关中断宏的定义以及os_cpu_c.c和os_cpu_a.asm中的函数声明;os_cpu_c.c是关于系统钩子函数、系统节拍初始化函数及设置函数还有任务栈初始化函数的定义;os_cpu_a.asm是关于开关中断函数、开始最高优先级任务函数及任务切换函数的定义。这三个函数的模板有很多,我用的是MDK5.15中自带的,MDK5.15版本中有个Manage Run-Time Environment模块,能在建立工程时为所选的MCU提供RTOS的运行环境支持。由于我用的开发环境是MDK4.72,所以我将uCOS-II的内核源码及移植文件都复制到了MDK4.72下建立的工程中,分别在MDK5.15的安装路径如下:E:\Program Files (x86)\Keil_v5\ARM\PACK\Micrium\RTOS\1.0.0\Software\uCOS-II\Source和E:\Program Files (x86)\Keil_v5\ARM\PACK\Micrium\RTOS\1.0.0\Software\uCOS-II\Ports\ARM-Cortex-M3\Generic\RealView。其中Source文件夹下的ucos_ii.h不要添加到工程中,否则会出现函数重定义的错误,从官网上下载下来的源码也不包括这个文件;Ports文件夹下的os_dbg.c也不要添加的工程中,在Source文件夹中已经包括了os_dbg_r.c,这两个文件一样。之后还要复制一个文件os_cfg.h,这个是关于uCOS-II内核功能的相当配置,uCOS-II通过宏的条件编译实现内核裁剪,这些宏就定义在os_cfg.h中,在E:\Program Files (x86)\Keil_v5\ARM\PACK\Micrium\RTOS\1.0.0\Software\uCOS-II\Cfg\Template有个模板,基本不需要修改,如果哪些功能不需要可以将相应的宏定义为0u,在MDK4.72中的工程建立相应目录结构后如下:
uCOS-II移植_第1张图片
  移植基本就涉及这些文件,另外还有个includes.h,这是个主头文件,包括C标准头文件和uCOS-II内核文件,作用就是在编写uCOS-II应用程序时省点事,少写几个头文件预处理。
《嵌入式操作系统uCOS-II》第309页有个典型includes.h

#include 
#include 
#include 
#include 

#include “os_cpu.h”
#include “os_cfg.h”
#include “ucos_ii.h”

app_cfg.h是应用程序的头文件。app_hooks.c包括应用程序钩子函数,在os_cfg.h中将OS_APP_HOOKS_EN定义为1u后需要包含这个C文件。这三个文件都是关于应用的,和移植关系不大。

将uCOS-II文件都复制到工程后开始调试,根据《嵌入式操作系统uCOS-II》中第13章测试移植代码部分的描述开始测试移植是否成功,先建立第一个调试程序,如下

#include “include.h”

void main(void) 
{
    OSInit();
    OSStat();
}

验证OSTaskStkInit()和OSStartHighRdy()函数。
  一开始我是在外部RAM中调试的,开始全速运行后老是跑飞,最后到HardFault中了,单步后发现程序死循环在os_cpu_a.asm中的B OSStartHang处,执行完OSStartHighRdy后并没有进入OS_CPU_PendSVHandler执行任务切换,上网查资料也没解决,搞了半天才发现在外部RAM中无法进入中断,只有下载到flash中运行了,下载到再单步时又没法进入中断,百度了一下发现JLink单步调试中断会出各种问题,最后只有在中断处理程序中打个断点,然后全速运行后在断点处停止,再运行后空任务成功开始运行,第一步测试成功。
  之后依次测试OSCtxSw()、OSIntCtxSw()和OSTickISR()函数都没问题,到此uCOS-II移植成功。
  在这之前我先移植的UCGUI,是在没有操作系统的环境下移植的,现在移植了uCOS-II后要将UCGUI的GUI_X.c文件替换为GUI_X_uCOS.c,这在UCGUI390a\Sample\GUI_X文件夹下有模板,由于我用的开发板没有键盘,所以将GUI_X_uCOS.c文件 KEYBOARD INTERFACE FUNCTIONS部分的函数的函数体都注释掉,然后添加三个函数

void GUI_X_Log(const char *s){}
void GUI_X_Warn(const char *s){}
void GUI_X_ErrorOut(const char *s){}

然后将GUIConf.h中的GUI_OS定义为1,这样UCGUI就能在多任务下运行了。

你可能感兴趣的:(嵌入式学习之LPC1788)