⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ucos学习报告之c8051f060移植篇.txt

📁 UCOS学习报告之C8051F060移植篇.rar UCOS学习报告之C8051F060移植篇.rar
💻 TXT
字号:
UCOS学习报告之C8051F060移植篇


   掩饰不住内心的喜悦,我用了6天就将UCOS移植到C8051F060,这期间得到了杨屹,牛毅,郝刚等广大网友的帮助,在此一并表示感谢。本文来自于网络,落叶于网络,回馈给像我一样不知该怎么入门的网友,若你能从中学到什么或有同感,我将甚感欣慰。若你要拍砖砸我,请让我死的瞑目(呵呵,开个玩笑,真心希望你的顶,我们一块讨论,一块进步)各位网友说过的已经比较明了的问题我就不说或少说
前言:我以前学过2个月的ARM7+uClinux,深知移植的难处,那时叫交叉编译,我当时就交叉编译这个概念就1个星期没搞懂,当面对开发板移植好的uClinux心里总是不甘心,心想自己也想移植一个,可眼睁睁的看了好一段时间,就是不知道怎么下手,那么多代码啊,(有同感的朋友顶一下啊)身边又没有做这一块的,别人都学VxWorks,就这样我把ARM当成了单片机用拉,看懂理解bootloader,然后遍一些简单的程序,交叉编译环境更是2个星期没搞定。郁闷之中,项目选用了C8051F060,我又被该派成学习它,干一个爱一个啊,我就努力中。ARM7+uClinux成了我心中的遗憾。
  言归正传,本文章我们主要说一下移植过程中遇到的实际问题及我的切身体会,需要源码和有疑惑者可来信,我将知无不言,言无不尽。(毕竟这是我第一篇啊)
我下面说一下我的移植体会,对于下面的问题我将给于解答,不对之处,敬请指出。说的时候头一句,脚一句,让大家笑话了^-^
1,    贝贝翻译的书可按其说名看一边,做到心中有数,以后再慢慢翻阅,知道一直要做那些工作即可。书中有个程序结构图,看好好看,知道那些代码跟移植有关,那些代码跟应用程序有关
2,    找个源吗仔细研究,对于51+KEIL推荐杨屹大侠的,他的思路比较清晰,我就是按他的程序,结构思路来的。
3,    分析一个C函数,和4个汇编函数,想一想,为什么要自己编写它,写完了干什么?它们是怎么运动的?想想这些函数名一定要定义这个样子吗,能写成其他的样子吗?
4,    仔细看看里面的C语言知识,这是你可能回发现这我们平时用的简单的C51知识点多多了。
5,    OS里面很注重保护,保护各种各样的量,重入函数本身就是一种保护它的局部变量,由于我接触过VC++,了解了里面的多线程编程,所以对这一块我比较好理解些。时间一长,大家就会明白。
6,    对移植来说我感觉一个难点是堆栈的设计,我比较了牛毅和杨屹的堆栈设计,一开始我心中有好多疑惑如何保证用户堆栈在片外,局部变量如何保存才不被破坏
7,    时间节拍函数是怎么回事,理解了其工作原理之后,我该怎么提笔写程序,这是像我这样的初学着深深体会的,(自己曾有过不少这样的体会,我学习C8051F060的CAN总线时就时这样,看了一个星期后,就感觉差不多了,就是不知道程序该怎么写,心理想谁要是能给我一个例程,我可能很快就上手,一天晚上当我得到例程,第二天我高兴的5点就起床了,一天就感觉胸有成竹了,然后就没什么了)看来,像我这样的网友们水平都一般,但好在大伙都学习的激情,相信日积月累我们会有收获的,相信有一天,我们能达到自己认为理解了的东西,都能够用程序实现出来。
8,    最后就是结合自己要移植的硬件,我原别人移植好的该程序,这期间会遇到各种各样的问题,正如不幸的家庭千奇百状。后文我会提出一些。
  不知大家看到这里有什么体会,我是针对入门着来说的,高手可不必看了,如果看,一定要提宝贵意见啊,呵呵,手都敲累了,休息5分钟。
继续,下面我解答上面的问题和针对KEIL+ C8051F060具体细节做出说明,是本文的关键。
   C8051F060有256B+4K的片内RAM,如果用户的任务消耗资源不是太多的话,应该不用外括。
1,对于KEIL我们要装上新华龙提供的驱动,并选用硬件仿真,点击一旁的SET,弹出对话框,选用COM3,其它的都默认即可。点击确定返回。这样KEIL下编译环境就建立好了,把所需文件加到工程里即可,在option for target 里面选用large模式,c429:  'data' segment too large就是没设置large模式造成的错误。我写这篇文章的时候没有keil环境(在别人的机器上),有些单词或说明的不准确,但我相信不防碍我思想的表达,设置好后,编译连接生成目标文件后,即可点击那个带d的按钮,激动人心的时刻到来了,你会发现flash正在烧写,我第一次看到时高兴的跳了起来,那种感觉太爽了。
   2,我说一下在编译过成中我遇到的问题,首先是工程里的包含文件,startup.a51要使用,并修改RAM的地址,大家看一下我的源码即可明白。对于UCOS的SOURCE源代码只包含ucos_ii.c即可,因为它里面包含了源代码。下面我将按要修改的文件分别说明。
a)    INCLUDES.h是个主包含文件你要把所有的头文件都要放在里面。
b)    OS_CFG。H决定了你编译文件的取舍
c)    OS_CPU_A.asm中只要把别人移植好的理解后,需要改动的代码只有时间节拍函数,针对C8051F060可把杨屹的serial函数去掉,直接printf即可。
d)    OS_CPU_C可不用改动。
e)    对于主测试程序,建议在每个任务中对不需要打断的代码中加上保护,这就是上文中所说的保护,否则输出的是被打断的内容,大家一看我的源码即可明白
f)    对于编译的文件就简单的说以上5点,下面说以下各位大侠给我的意见,在次一并转给各位网友。牛毅回答的(仅供参考):
问:OSStartHighRdy等4个汇编子程序是否为可重入的?
答: 不可重入好些因为它们就不占?C_XBP空间
问:typedef bit               BOOLEAN;
     我看有的说一定要把 BOOLEAN定义成char
      答:这个定义要看实际声明的变量怎么赋值
     问:在你的OS_STK  *OSTaskStkInit(。。。)中
stk      -= sizeof(void *);
         *(void **)stk   = (void *)os_pdata;  
答:stk      -= sizeof(void *);
*(void **)stk   = (void *)os_pdata;  
stk是指向?C_XBP的堆栈指针(堆栈类型是满向下的);第一句是调整其指针使其空出(void *)个空间,第二句把stk强制转换为(void *)类型后对其赋值
问:你是如何包证建立的用户任务栈在片外ram的?我知道系统栈应该在片内的
答:把SP  COPY   到?C_XBP中OSTaskStkInit()函数就是模拟入栈
问:os_pdata(R3,R2,R1)用寄存器传递os_pdata实际应用中,通常是不是没有参数
答:通常不用传递有效参数,就传递0,但必须有
     杨屹回答的(仅供参考):
     问:此外冒昧问一下你的OS_CPU_A.ASM没有包含OS_CFG.H是为什么?
     答:不需要的头文件不必包含
问:对于可重入函数,只加上那个关键字就可以吗?我看有些移植的代码中对他操作了好多,都很难看懂了,麻烦你说一下,另外我看了你的关于重入函数 说明的文档,对这个问题还是不太理解
答:重入函数加上关键字并处理仿真堆栈指针
    问:upstart51.a这个文件有什么用,和设置的堆栈关系大吗?好像是跟堆栈有关系
答:startup51是初始化文件,用于初始化指针、内存等
3,对C语言的知识我想说明2点,extrn是用来声明外部定义好的,在本程序中的应用。
   Public是声明定义在本程序中,将来让另外的文件调用的,是预留的接口。
4,有些函数名不一定要定义成书上说的样子,只要函数原型声明对了即可
5,对于时间节拍函数是用我们的硬件定时器产生的,大家一看就明白。
好了,手又敲累了,想必大家也看累了。罗嗦了这些,希望能对大家有那么一点点帮助,我这段时间来的付出就没有白费,欢迎大家和我交流。同时也希望大家多支持我的UCOS学习报告,我会继续学习,有什么体会继续发表出来,将来还会把ARM+linux的遗憾弥补掉。
语言草率之处,请大家凉解,技术错误之处,再次恳请之处,让我们共同进步。
最后感谢我的女朋友一直支持我的工作,原谅我陪她逛街的次数一压再压,以至于我们2个星期没好好玩了。

QQ:12928376
EMAIL:shan318@163.com

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -