天嵌 ARM开发社区

 找回密码
 注册
查看: 6823|回复: 12

UCOSII移植详细步骤

[复制链接]
扫帚菜~~ 发表于 2012-5-13 11:37:44 | 显示全部楼层 |阅读模式
本帖最后由 扫帚菜~~ 于 2012-5-13 11:47 编辑

一定要看的说明:          
     1:本人用ucosii的是什么版本说实话我也不太清楚,因为我是从网上得到的源码。可能是2.52的。因为我发现在ucosii.h里有这句话:#define  OS_VERSION   252   
另我这是写给和我一样没有移植经验的菜鸟的,老鸟可以给些指点,在下不胜感激。
        2:它的原始代码我以上传到我的网盘:http://115.com/file/bej7uebg  (以下有关Ucosii的所有的操作都是在此源码的基础上,如果哥们你用的是别的源码可能还会有其他修改)
        3:我还上传一个空的工程构架,以下所说的所有工程目录都是按此目录的组织方式来。
         下载地址:http://115.com/file/c2k28azn
        4:下文件还将提到TQ2440开发板光盘中移植好的UCOSII,考虑到有的哥们可能没有此光盘,或光盘内容不同,我把此源码也上传到我的网盘:http://115.com/file/e7i78cze
以上所说的所有光盘目录都可以以此目录代替。
        5:因为本人以前从没移植过东西,此次移植为本人人生的第一次移植,简称:处女移
所以请不用怀疑,它肯定会有很多不足之处,但它确实是在我的开发板上运行成功,并且能顺利的切换任务。至于其他的BUG我想是可以慢慢改的。
        6:本次总结,只是为了说明一个步骤,至于代码的修改, 完全是参照TQ2440开发板送的光盘来的,并且大部分的非UCOSII内容是来自此光盘己移植好的源码。也就是说工程目录中:S3c2440这个目录下的文件大都来自光盘
        7:本人做的是一个最简系统,也就是去掉了所有的不必须驱动(如LCD,RTC等)只保留了UART和定时器,UART是为了向电脑输出调试信息,定时器是为了产生系统时钟。
        8:所有的注释都应该这样的:
        /*   XXXXX
        XXXXX
        XXXX    */
        而不应该是这样的:
        /*
        XXXX
        XXXX
        */
        因为这样会引起代码行的改变,而我说的修改,只说我修改哪几行。这样注释可能会引起我说的行数我你的不一样,另外,一切代码的‘删除’都应当成注释来看。
        即使这样,也可能会有很多不同之处,需朋友你自行斟酌
        
        
        9:也是最重要的一点(嘿嘿):如果觉得尚可,给点回复吧(作为90后的老男人,咱也喜欢被围观),如果觉得很次的话,欢迎提出意见。

Seyp1:获取源码,建立工程
         
        
        1:解压主目录SOFTWARE到一个很随便地方,进入此目录会看到三个子目录:BLOCKS,TO,和UCOS-II,咱需要的东西全部在UCOS-II这个目录中。打开ADS1.2,在一个很随便的地方创建一个名为UCOS-II   (其实什么名字都可以)   的工程并设置工程(具体设置方法不作过多废话)。
        
        2:进入        UCOS-II这个目录,会看到有一个名为source的目录,此目录中存放了全部与处理器无关的代码。把此目录复制到刚才建的那个工程目录下,把其中除UCOS-II.c这个文件外所有的文件添加到工程中。注意一定不要添加UCOS-II.c这个文件,具体原因一会再啦。
进入\SOFTWARE\uCOS-II\Ix86L\BC45目录,复制此目录下的三个文件(也就是ucosii中与处理器相关的文件:OS_CPU.h,OS_CPU_A.asm,OS_CPU_C.c)到工程目录的UCOSII\ARM目录中。进入\SOFTWARE\uCOS-II\EX1_x86L\BC45\SOURCE复制此目录中的OS_CFG.h到工程目录UCOSII\SOURCE目录中。

        3:现在添加与s3c2440启动,定时,串口相关的代码。进入TQ2440开发板所赠送的第一张光盘的:\配套1\uCOS-II\uCOS-II_20091031\把此目录下的s3c2440目录复制到工程目录下。最后添加相应的文件如下图所示
        
        
        
        这时会出现一个错误:

     这是因为ucosii自带的OS_CPU_A.s可能格式不支持,哥们可以自己建一文档,命名为:OS_CPU_A.s。放入工程目录下的uCOS_II\ARM  目录,文件内容先不管。
Stype2:修改与处理器相关的代码
   1:进入OS_CPU.h
        第42行修改为:typedef   INT32U      OS_STK; 此表示的是堆栈的位数,s3c2440的寄存器是32位的,其对应的栈也应是32位的
        
        第43行修改为:typedef    INT32U                   OS_CPU_SR;                此句的原翻        译为:/* Define size of CPU status register */我理解是定义CPU的状态寄存        器(CPSR)的位数,但只是我认为,由于在下英语水平问题可能认为错了。        大家莫怪。
        
        第70行修改为:#define  OS_CRITICAL_METHOD    3  此句表示关中断        的方法使用第3种
        
        屏蔽第95行
        
        第97行修改为:#define  OS_TASK_SW()         OSCtxSw()此句为任务切        换函数
        
        屏蔽第105行
        保存退出
        
        2:进入OS_CPU_C.c
        第21行修改为:#include "ucos_ii.h" 不解释了
        
        第165行-190行修改为如下代码:
        OS_STK  *OSTaskStkInit (void (*task)(void *pd), void *p_arg, OS_STK                         *ptos, INT16U opt)
        {
            OS_STK *stk;
        
            Op                =  opt;                     
            stk   =         ptos;                                             
            
            *(stk)   = (OS_STK)task;      
            *(--stk) = (INT32U)0;                 
            *(--stk) = (INT32U)0;                 
            *(--stk) = (INT32U)0;        
            *(--stk) = (INT32U)0;                 
            *(--stk) = (INT32U)0;         
            *(--stk) = (INT32U)0;        
            *(--stk) = (INT32U)0;                 
            *(--stk) = (INT32U)0;        
            *(--stk) = (INT32U)0;         
            *(--stk) = (INT32U)0;        
            *(--stk) = (INT32U)0;        
            *(--stk) = (INT32U)0;        
            *(--stk) = (INT32U)0;         
            *(--stk) = (INT32U)p_arg;               
            *(--stk) = (INT32U)0x00000013L;
                                         
            return (stk);
        }
        此段代码的意义是初始化堆栈,堆栈是用OS_STK定义的数组。进行堆栈操        作时注意s3c2440是满递减堆栈,此代码后面会有所讲解,在家此先完成移植        工作。
        
        
        第247到273行删掉不要。
        保存退出
        
        3:进入OS_CPU_A.s文件
        方便起见,直接把此文件的内容全部用光盘里的OS_CPU_A.s中的内容代替
        此段代码主要是任务的切换,中断处理,用时钟的切换的实现
        由于小弟没学过汇编,所以在看此段代码的时候没少费了事,到现在都不是多        明白,移植的时候我也是直接从TQ2440的的光盘文件里复制过来的。此段代        码等会会做大体的讲解。
        
Stype3:修改与处理器无关的代码
        1:进入各各文件(也就是第一个图:UCOS_II/source目录下的文件)把文件中的#include "includes.h"
        修改为以下三句:
        #include    "os_cpu.h"
        #include    "os_cfg.h"
        #include    "ucos_ii.h"
        也可以建立一个名为"includes.h"的文件,里面包含以上三句,这样就可以不用修改        每个文件了。
        2:进入UCOS_II.h
        在开头处添加:
        #include    "os_cpu.h"
        #include    "os_cfg.h"
        
        保存退出。
Stype4:修改Main.c
        进入main.c这个文件
        屏蔽12,14行:此两行为LCD的初始化和测试,咱只是作最简单的移植,暂        时不加驱动。
        屏蔽第22到29行
        屏蔽63,65行
        屏蔽81行
        屏蔽101行
        屏蔽89到97行:实时时钟的不要
        屏蔽103到117行:蜂鸣器的不要
        屏蔽124到136行                关闭LCD
        屏蔽140到164行:
        在166行之前处添加:Uart_Printf("Enter Task 2\n");不要屏蔽此行
        把Main.c文件里的所有OSPrintf();修改为:Uart_Printf();
        进入此工程目录下的 \S3C2440\includes 打工config.h屏蔽53行。
        进入光盘目录:\配套1\uCOS-II\uCOS-II_20091031\uCOS_II\API
        复制app_cfg.h到工程目录下的:\S3C2440\includes目录
        
进行编译:这时会发现如下图所示的40个错误:

        
        这个错误着实让我找了好长时间,最后发现是在OS_CFG.h中出现的错误,
        进入此文件,到最后一行处有这么一个定义:
        typedef       INT16U             OS_FLAGS;聪明的你会发现此文件里        只有这一个地方定义了一个数据类型,其它全是宏常量,但这个INT16U是从        哪里来的呢,当然是从OS_CPU.h中来的咯。所以还要在OS_CFG.h这个文件        开头包含OS_CPU.h这个文件。保存退出,再次编译,这时会只有几个警告了。
        
对部分内容作的简单说明
        0:前面讲到不要把:UCOS_II.c这个文件添加到工工程中是因为,此文件里的内容为此:
        #define  OS_GLOBALS                           /* Declare GLOBAL variables                              */
        #include <ucos_ii.h>
        
        
        #define  OS_MASTER_FILE                       /* Prevent the following files from including includes.h */
        #include <os_core.c>
        #include <os_flag.c>
        #include <os_mbox.c>
        #include <os_mem.c>
        #include <os_mutex.c>
        #include <os_q.c>
        #include <os_sem.c>
        #include <os_task.c>
        #include <os_time.c>
        #include <os_tmr.c>
        它包含了这些文件,如果添加进来,就会出现重定义的错误,大家可以试一下,这个错误也着实让我困惑了一下。
        1:进入system.c,这个文件里定义了对各个IO口的初始化化的函数,main.c所用的Uart_Printf()就是从这里而来
        2:进入Target.c,此文件里定义了一个void TargetInit(void)函数,此函数主要是初始化开发板,包括MMU,UART。
        3:进入Timer.c,  此文件定义的TIMER0的初始化函数,TIMER0用作UCOSII的系统时钟,在ISRInit()函数中有这么一句:pISR_TIMER0= (uint32) OSTickISR;
在OSTickISR上右键GOTO一下,便来到了OS_CPU_A.s中,OSTickISR是时钟节拍处理函数,向下看,会看到:BL OSTimeTick 。此句的意思是跳转到OSTimeTick函数中运行,运行完之后要再返回到这,在OSTimeTick上GOTO一下来到OS_CORE.c文件中。如果你学过UCOSII,那第这个函数一定不陌生。在此不作过多说明。
        
        
        
        

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
liang 发表于 2012-5-13 17:41:34 | 显示全部楼层
好贴子,不过有点长,顶一个!
 楼主| 扫帚菜~~ 发表于 2012-5-13 22:43:27 | 显示全部楼层
liang 发表于 2012-5-13 17:41
好贴子,不过有点长,顶一个!

嘿嘿,第一次移植,做的不够好。。。。
 楼主| 扫帚菜~~ 发表于 2012-5-17 12:32:37 | 显示全部楼层
谢谢各位!!
 楼主| 扫帚菜~~ 发表于 2012-5-22 07:57:35 | 显示全部楼层
谢谢各位:)
xingqing540 发表于 2012-5-23 20:07:05 | 显示全部楼层
我用的开发板里2440的代码,但是出现以下的错误,请帮忙查看下是什么问题哈,谢谢了哈

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 扫帚菜~~ 发表于 2012-5-24 22:58:08 | 显示全部楼层
xingqing540 发表于 2012-5-23 20:07
我用的开发板里2440的代码,但是出现以下的错误,请帮忙查看下是什么问题哈,谢谢了哈

我也遇上这种情况了,但不是这个文件,原因是UCOSII的文件里多添加了别的文件。你看看吧。
 楼主| 扫帚菜~~ 发表于 2012-5-24 22:59:44 | 显示全部楼层
扫帚菜~~ 发表于 2012-5-24 22:58
我也遇上这种情况了,但不是这个文件,原因是UCOSII的文件里多添加了别的文件。你看看吧。

另外,TQ2440开发板带的第9张光盘里有一个很好的Ucosii 移植视频讲解,你可以看看
xingqing540 发表于 2012-5-25 09:00:17 | 显示全部楼层
谢谢了兄弟,找到原因了,我用的win7下ADS1.2支持不好,用台式电脑上的xp就没问题了
 楼主| 扫帚菜~~ 发表于 2012-5-28 12:28:01 | 显示全部楼层
xingqing540 发表于 2012-5-25 09:00
谢谢了兄弟,找到原因了,我用的win7下ADS1.2支持不好,用台式电脑上的xp就没问题了

WIN 7 兼容性就是不不如XP好
半棵苗 发表于 2012-8-13 16:30:28 | 显示全部楼层
我也遇到这样的问题,原来是因为win7啊!
wjw123abc 发表于 2013-9-12 12:11:46 | 显示全部楼层
mark mark mark
kevin_SCM 发表于 2015-8-25 11:46:27 | 显示全部楼层
{:2_172:  mark```
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-28 23:26 , Processed in 1.046875 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表