|
本帖最后由 扫帚菜~~ 于 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
|