UC/OS和UCGUI移植札记

来源:互联网 发布:生态文明我知我行答案 编辑:程序博客网 时间:2024/06/04 20:01
       本文移植基于STM32F103RB(内核为ARM Cortex M3);UC/OS版本:V2.86;UCGUI版本:V3.90
    对于UC/OS和UCGUI移植,网上铺天盖地都是资料,内容大部分都差不多,按步骤一步步来,一般问题不大,但是没有理解本质,一旦出现问题,就是大麻烦,下面是基于本人实践对网上资料的一些补充,如果按照网上的资料最后有问题的,可以作为参考。

 一、 UC/OS移植(网上资料有的步骤不重复)
    1. OS_CPU.h
    三个作用:(1)声明全局变量,一般不做改动;
               (2) 类型定义:就是一些typedef,对于常用的编译器一般也不做改动;
               (3) 函数声明:这里要注释掉三个函数声明:void OS_CPU_SysTickHandler(void); 
                                                       
void  OS_CPU_SysTickInit(void);
                                                       INT32U  OS_CPU_SysTickClkFreq(void);
    因为这三个函数是系统滴答定时器中断的初始化,需要自己根据不同的CPU的systick来实现。
    2. OS_cfg.h
    配置UC/OS的功能,不用的功能可以关掉,裁剪内核
    3.OS_CPU_C.c
       (1) 把SysTick寄存器的地址映射全部注释掉,我们自己提供系统的滴答时钟,所以直接用系统默认的地址映射就行。
       (2) 把void OS_CPU_SysTickInit()这个函数也注释掉,这个函数需要自己根据不同的CPU编写。
    4.编写SysTickInit()函数(这个函数要在移植之前确保正确!否则系统没有心跳,一切调度工作都没法进行)
    
void SysTick_Init(void)
    {
SystemInit(); //复位外设始终,SysTick默认使用内部高速时钟
if(SysTick_Config(SystemCoreClock/OS_TICKS_PER_SEC))    //配置并开启SysTick定时器中断
{
while(1);
}
    } 
    5.修改启动文件(*.s的文件) 
   (1) 把所有PendSVHander全部换成OS_CPU_PendSVHander
    (2)  把所有SysTickHander全部换成OS_CPU_SysTickHander
    因为OSStart()启动任务时Sys还没有初始化(系统时钟是在开始第一个任务时初始化的),进入的是PendSVHander,而任务开始后,系统服务函数进入的是SysTickHander,所以两个都要更换为OS中定义的。

    按照网上的资料一步步进行移植,一般不会有问题,如果移植完毕,任务之间不能启动,多半是PendSVHander这里有问题,如果任务可以启动但不能完成多任务切换,则可能SysTickHander有问题,或者系统时钟初始化不对,要检查SysTick的时钟源是否是使用的内部高速时钟。
    在stm32F051(Cortex M0内核)上移植过程跟上面是一样的,本人也已经移植过,没有问题。
    在stm8s207上移植的时候,主要注意是八位的单片机,堆栈结构要改;单片机的flash空间较小,要尽量裁剪内核,最小可以裁剪到3K左右;stm8没有SysTick,需要用定时器中断给OS提供系统时钟,本人也已经移植过,没有问题。

 
二、UCGUI移植(网上资料有的步骤不重复)
    UCGUI移植,没有UC/OS那么复杂,主要注意的就是LCD底层函数编写的时候,文件名和函数名都不要以LCD开头,最好以具体的驱动芯片名称开头,不然最后和UCGUI里面的文件或者函数发生冲突的时候会很麻烦。移植步骤应该是先调试好几个底层的函数之后(最重要的2个函数,读点和画点一定要正确,任何图形显示操作最后都是调用这两个函数),再进行移植,按网上资料一步步来应该不会有问题。
本人移植过程参考以下网址:
http://wenku.baidu.com/link?url=nB60DaLnXpDuX3RLFFWSg_Z2YQ-f4EturtbVpPAHD3omO1vVsLxrCq05kCmoyFdcodqxTQEjZsVpHcziZRAHDNhai5D7hLOHy9bLKUeOFju
     

0 0