为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

ucos移植到MPC860

2017-10-23 15页 doc 38KB 31阅读

用户头像

is_153723

暂无简介

举报
ucos移植到MPC860ucos移植到MPC860 目 录 ^_^ ..................................................................................................................................................... 2 一、移植环境 ......................................................................................
ucos移植到MPC860
ucos移植到MPC860 目 录 ^_^ ..................................................................................................................................................... 2 一、移植环境 ................................................................................................................................... 2 1 uC/OS-II版本 ..................................................................................................................... 2 2 处理器相关代码 ................................................................................................................. 2 3 开发工具............................................................................................................................. 2 3.1 编译 .......................................................................................................................... 2 3.2 调试 .......................................................................................................................... 3 3.3 下载 .......................................................................................................................... 3 4 目标板................................................................................................................................. 3 二、修改uC/OS-II ........................................................................................................................... 3 三、Diab ........................................................................................................................................... 4 1 dcc ....................................................................................................................................... 4 2 das ....................................................................................................................................... 4 3 dld ....................................................................................................................................... 5 4 ddump ................................................................................................................................. 5 5 windiss ................................................................................................................................ 5 四、在RAM中运行........................................................................................................................ 6 1 准备点灯............................................................................................................................. 6 2 准备串口............................................................................................................................. 6 3 生成elf文件 ...................................................................................................................... 6 4 通过MPCBDM下载 ......................................................................................................... 6 5 单任务实验 ......................................................................................................................... 6 5.1 在0x600处死循环 .................................................................................................. 7 5.2 在DEC_Hdlr中停止 .............................................................................................. 7 5.3 无法切换到IDLE任务 ........................................................................................... 7 6 多任务实验 ......................................................................................................................... 8 五、烧写FLASH ............................................................................................................................. 8 1 规划地址空间 ..................................................................................................................... 8 2 向量的位置 ..................................................................................................................... 8 3 copy_to_ram........................................................................................................................ 8 4 生成bin文件...................................................................................................................... 9 5 使用PPCBoot烧写 ............................................................................................................ 9 6 迎头棒喝............................................................................................................................. 9 6.1 部分代码未烧写成功 .............................................................................................. 9 6.2 重新点灯 ................................................................................................................ 10 6.3 栈与点灯 ................................................................................................................ 10 ^_^ 不知道这个实验有多大价值,但因为比较熟悉MPC860,又才看了uC/OS-II,所以想把它移植上去跑跑,共花了3周的时间 :-( 这是我第一次做移植实验,发现真正动手和看资料真是不一样。而且,成功之后的兴奋,也是无法铭状的 #_# 在做这个实验的时候,我没用过tornado,所有的开发调试手段都比较落后 :-/ 但也有好处,让我对底层有了更清晰的认识。 搞嵌入式,我还是个新手,发现需要学习的芯片、工具、理论太多,但如果能和大家一起探讨,将会少走不少弯路。因此,与坛子里的xdjm们共勉~ 以下,是一个简单的实验的简单的笔记,有自己的一些浅显体会。如果能对你有所帮助,那最好不过,如果没有,就请一笑了之 ^_^ 一、移植环境 1 uC/OS-II版本 移植工作本身与uC/OS-II的版本没有太大关系,基于v2.51移植成功之后,没做多少工作就能让v2.62也跑起来。因为修改的是处理器相关的部分,这部分代码并没有体现版本的变化。 2 处理器相关代码 从www.ucos-ii.com上可以下载PowerPC8xx的移植代码,BSE版本,基于此做少量更改,就可以满足自己的需求。 3 开发工具 3.1 编译 使用Diab 5.1for PowerPC套件(含编译器、汇编器、链接器、反汇编及仿真工具等)。由Tornado 2.2 for PowerPC附带。我是直接在windows下的命令行进行编译的。先要安装Tornado(如果有单独的Diab,直接用就可以了),然后运行Tornado/host/x86-win32/bin/torvars.bat,这样 就可以在命令行使用Diab了。 另,有大侠直接用tornado完成移植工作,我还没有试过,过段时间再看吧。如果能成,当然不需要像我这样折腾了 :-( 3.2 调试 MPC860没有自带的IDE,而Tornado或Single Step能否使用,因为不熟悉也没有尝试。以前用过BDM,所以继续使用,对应的软件是Linux下的MPCBDM。BDM可以看作是GDB的一个target,所以调试的实体就是GDB,版本4.18。 3.3 下载 使用BDM下载程序到RAM,使用PPCBoot烧写程序到FLASH。 这些工具都是Linux下的,而编译又要在windows下,来回的切换很是麻烦。试图在cygwin下使用BDM,编译gdb时没有成功 :-? Vmware也听说不错,但没时间试了。后来和一同事一起,2台机器方便些了。 4 目标板 使用华恒的HHPPC860-3COM-2ETH-R1开发板。 处理器: MPC860 FLASH: 2片,各2M字节 SDRAM: 16M字节 二、修改uC/OS-II 为了移植到MPC860,需要修改uC/OS-II中与处理器和编译器相关的部分代码。在这里,大部分的修改在BSE的ppc8xx移植版本里已经做好了,其它需要修改的是: bsestart.s文件: , IMMR、PLPRCR等 , 修改对UPM的配置(MCR、MDR) , 修改片选的配置(OR、BR) 首先要保证正确的配置,860才能跑得起来。 另外,BSE的移植版本,是用于在RAM中运行的,如果要烧写FLASH,要做更多改动,后面再说。 三、Diab 这是个好东东(不比gcc差吧,),对应的手册是《Diab Compiler Users Guide PPC》(tornado里有)。越来越发现,开发调试一定要清楚编译原理,从一个编译器的手册入手是最直接的了,我很多以前模糊的概念都在这里得到了解释。 用到的工具如下: 1 dcc 编译器,据称对代码的优化是最好的。 常用命令: 1. –c a) 只进行汇编步骤,生成一个目标文件(默认的后缀是.o); 2. –Dname[=value] a) 定义预处理的宏名(与#define类似),如果没有指定value,则value为1; 3. –g a) 产生符号调试信息; 4. –t a) 定义目标板配置变量; b) DTARGET、DOBJECT、DFP和DENVIRON; 5. –X a) 控制编译的细节; b) –Xlint:遇到可疑代码产生警告,它在编译时进行检查;不会影响优化,且只会增 加少量的编译时间,故通常都可以使用该选项; c) -Xstruct-min-align=n:强制结构体从一个n字节的边界开始; d) -Xstruct-max-align=n:设置结构体的成员需要对齐的最大字节边界; e) „„„„„„„„„„ f) 不说那么多了,手册里都有 2 das 汇编器。常用命令: 1. –t a) 选择目标板的微处理器; b) 使用-t可以设置4个配置变量:DTARGET(微处理器)、DOBJECT(目标模块格 式)、DFP(浮点类型的支持)和DENVIRON(目标板运行环境); c) 如:-tPPC860ES:psos i. DTARGET , PPC860; ii. DOBJECT , E(COFF)(F for ELF,N for GNU/VxWorks); iii. DFP , S(软件浮点模拟)(H for 硬件浮点,N for 不支持浮点); iv. DENVIRON , psos; d) 如果不在编译时用-t指定,则使用default.conf中的默认配置; 3 dld 链接器,通过命令行或链接命令文件(.dld)的控制生成elf可执行文件,通过-m选项也可以生成map文件,在调试的时候特别有用。 使用-#选项,可以查看默认的dld选项(如果你不显示使用dld的话)。 最好能搞清楚dld文件的语法和原理,这样会对如何生成bin文件或elf文件,如何链接,如何分配段等等有更好的理解。 4 ddump 我用它来生成烧写FLASH的bin文件,也支持S-Record和HEX文件的生成。 常用的命令: ddump -ftv file > output,生成符号表的信息至文件output ddump -Ruv file,生成bin文件:注意v选项,如果没有的话,它会将.bss段和.sbss段也输出到bin文件,则很可能产生gap越界的错误 ddump -Rv file,生成srec文件 ddump -Sv file,查看段的大小 5 windiss windiss -il label file,生成文件file中函数label的反汇编代码。 windiss -o,同时生成机器码; 没琢磨出来怎么生成整个elf文件的反汇编代码,只好一个符号(函数)一个符号的来了 :-( windiss还有仿真功能,不过用处不大,因为它是针对PowerPC的,而MPC860作为PowerPC的一个implementation,还是有不少区别的——仿真时,总说860的一SPR不存在 :-( ddump和windiss都是我调试常用的,因为底层调试,要知道符号的地址。 四、在RAM中运行 1 准备点灯 如果用汇编实现点灯,则在初始化IMMR之后,就可以使用了。 如果用C代码,想在原程序初始化栈之前就能点灯,必须在一开始先初始化好一个临时栈, 初始化IMMR之后,将DPRAM的地址赋给r1,OK,可以使用MPC860内部的DPRAM—— 现在就可以在汇编中直接跳转到点灯的C函数了。 2 准备串口 在bsetest.c中,添加对MPC860的SMC1初始化的代码,然后构造函数Print,则可以从串口打印消息,方便调试。 3 生成elf文件 使用.org将复位向量的位置固定在0x100,DEC异常固定在0x900,其它的可以不要。在dld文件中将其它代码段和数据段放在另外的RAM区。 编译生成elf文件。 4 通过MPCBDM下载 MPCBDM启动之后,MPC860停止,从BDM口等待命令。使用MPCBDM将elf文件直接下载到RAM,然后跳转到0x100处执行: 1. load file,加载文件; 2. sym file,加载符号表; 3. j *0x100,跳转运行; 5 单任务实验 该程序启动一个单任务,利用Print观察打印信息。 调试过程如下: 5.1 在0x600处死循环 该地址是对齐异常向量的偏移地址,使用windiss仿真也发现会出现对齐错误。 将OS_CPU.H中的INT16U和INT16S的类型定义改为short(原为int);将bsetest.dld中ram大小(len)的定义改为0x2000000(4字节对齐),OK。 5.2 在DEC_Hdlr中停止 停止的指令是:lbz r12,-32707(r13) 地址为:0x00007f68 由反汇编的信息得知,该指令为OSIntNesting++语句的第一条指令,作用是将全局变量OSIntNesting的值读出至r12。 编译时,编译器会将全局变量放入小数据区(SDA),故对全局变量的访问要使用r13(_SDA_BASE_)。 由ddump可知,_SDA_BASE_ = 0x1085C,而OSIntNesting的地址是0x8899,故偏移量offset = _SDA_BASE_ - 0x8899 = 0x7FC3 = 32707。则该汇编指令本身没有问题。 此时从调试端口发现r13寄存器的值为0x00000000。 可能的原因是: , DEC_Hdlr在OSTaskStkInit之前被调用,则此时栈还没有被初始化,r13为0; , DEC的中断在OSTaskStkInit之前就已经使能了; , r13没有被正确作为_SDA_BASE_; 在bsestart.s中将TBSCR_INIT的值由0x00C1改为0x00C0,即先关闭DEC,此问题解决。 5.3 无法切换到IDLE任务 让该任务(t_tx1)循环打印字符,运行正常。 但如果该任务打印一个字符后自己挂起(调用OSTimeDly延时,此时需要进行t_tx1和IDLE任务的切换),则第一次延时结束后可以重新运行,然后准备再次切换IDLE任务时,程序退出,显示ITLB异常(0x1100)。 另:单步跟踪发现,在t_tx1启动之前,恢复其堆栈的时候,因为单步调试不断更改着SRR0和SRR1,导致后续程序无法正确运行(破坏了程序所需的SRR1和SRR0的值),故调试该段程序代码时,不能使用单步调试~ 然后检查栈的问题: 因为第一次切换IDLE可以成功,而第二次不成,所以在切换处(即调用sc)设置断点,查看tx1和IDLE的栈是否正确。发现,在第二次准备切换时,IDLE的栈指针比第一次低0x10,想起在OSIntCtxSw函数中,有个调整栈指针的操作,原移植代码中调整值为0x10,将其改为0x20(调整调用DEC_Hdlr和OS_IntExit带来的栈指针的影响:进入每个函数会使栈指针下移4个入口,即4×4,16个字节),结果成功,就是这个问题~ 注意,这样调整的原因是在切换任务之前,中断处理程序(DEC的ISR)使用的仍是中断产生时运行的任务的栈,而不是系统栈(系统栈在uC/OS-II启动之后就再没有使用)。 6 多任务实验 上面的单任务与IDLE的切换问题解决之后,多任务运行起来也很顺利。 但只做了任务挂起、切换的实验,任务间的通信实验还没有做。 五、烧写FLASH 1 规划地址空间 习惯使然,将SDRAM的空间定为0x00000000起始。且程序运行之后,要求向量表在0x000nnnnn处(这,也是习惯)。FLASH可以位于不重叠于SDRAM的任何位置,延用华恒开发板中mpc.init的配置,定位于0x40000000起始。内部寄存器映射(IMMR)更无所谓了,将他也习惯性的定在0xfff00000吧~注意,在代码中许多地方用到了IMMR,如果更改,要小心。 2 向量表的位置 在系统初始化完成之后,应当将向量表从FLASH拷贝至RAM。向量表的拷贝由C函数SetVecTable完成,该函数利用指针直接完成向量处理入口的安装。在进入main的时候调用该函数。 3 copy_to_ram 代码如果一直在FLASH中运行,性能较低。MPC860初始化完毕之后,应将除初始化之外的所有代码,拷贝到SDRAM中去。 这是一个C函数,完成将代码段从FLASH拷贝至RAM的功能,并同时完成原__init_main进行的数据段的拷贝功能。为使该函数本身仍驻留在FLASH中,在C文件中定义该函数时, 要注明该函数属于特定的代码段.startup(其它名字也可),如下: #pragma section CODE ".startup" 函数定义紧跟这个编译命令,尤其注意,该函数不能再在别的位置声明~否则编译器会根据函数声明将其代码放到.text段中,而不是希望的.startup段。 拷贝时所需的段的位置信息(若干符号),在.dld文件中定义,在该函数中使用这些符号时,只需要进行外部声明。 4 生成bin文件 连接命令文件 MEMORY分为4部分,ram和rom各2部分,其第一部分均为(0x0,0x2000),是为向量表预留的空间。将.startup段(copy_to_ram的代码)以及bsestart.s和bsecrt0.s中的代码段定位到rom2。 gap越界的问题 在编译生成.bin文件时,提示段间的gap(bss和.abs.0x40000100)过大,默认的gap大小是10K字节(0x2800),gap大小可以通过设置-Ruy选项改变,但,为何加此限制,必须让rom和ram的地址空间挨在一起么,可以将ROM的地址空间改小,但这是解决问题的根本方法么,使用-v参数,可以禁止输出.bss和.sbss段,这样就避免了gap越界的问题~ 5 使用PPCBoot烧写 使用PPCBoot提供的tftp功能可以烧写bin文件到FLASH,这个PPCBoot是华恒开发板配置好了的,所以拿来主义了。 6 迎头棒喝 下载bin到0x40000100处,然后在MPCBDM侧执行跳转指令,程序没有转起来。 原来不是想象中的那么简单。还是需要按部就班地做些简单的实验: , 单步跟踪初始化MPC860的部分; , 初始化MPC860,点灯; , 初始化SDRAM,测试SDRAM; , 初始化SMC2,测试串口; 6.1 部分代码未烧写成功 去掉拷贝代码段的过程,即让代码先在FLASH中运行,程序停在__init_main处(粗略检查 主要的寄存器和SDRAM,正常——MPC860的初始化部分应该没有问题),发现FLASH中的该处内容为全F,即此后的程序代码没有烧写成功,why,使用PPCBoot烧写ppcboot.bin,OK~查看bin和map文件,OK~奇怪。 发现问题的原因:bin文件的最后0x100字节的代码丢失,没有烧入FLASH。在bsestart.s中加入一个字符串,位于绝对段.org (0x40000000),即将代码扩展。重新烧写,查看FLASH,成功。 6.2 重新点灯 从最简单的情况入手。 烧写完毕之后,在MPCBDM侧执行“j *0x40000100”,灯顺利点亮,不过闪速很慢,应当是代码在FLASH中运行的缘故。 满怀希望地reset,灯却没有亮起来。一步步设置点灯的位置,直至在配置OR0之前,都可以成功点灯,而在配置该寄存器之后,灯无法点亮。 原因:为BR0和OR0设置的值分别是0x40000801和0xffe00160。在设置OR0之前,860一直从0x000nnnnn处取指令(硬件复位),在配置之后,只有0x400nnnnn类型的地址才可以使CS0有效,而此时860依旧从0x000nnnnn处取指,故无法正确运行。 重新划分地址空间如下: , FLASH:2片,0x00000000,0x00200000,0x00200000,0x00400000 , 异常向量表位于FLASH:0x00000100,0x0005000 , SDRAM:1片,0xff000000,0xffffffff , IMMR:0x80000000 , 为尽早使用C代码设置的临时栈:immr,0x2ff0 , 系统栈位于SDRAM:0xffffffff,0xfff05000 , 在SDRAM中保留的异常向量表的位置:0xfff00100,0xfff05000 依此配置修改.dld文件、immr、BRx、ORx的初始化,以及.org段的绝对定位地址,重新烧写FLASH,OK~灯终于亮了~ 6.3 栈与点灯 起初认为在程序跳转到__init_main之前,是无法在汇编中调用C函数的,其主要原因是没有可用的栈。在bsestart.s的代码中,栈的最初初始化是在_START之后,将__SP_INIT的值给了r1(PowerPC默认的栈指针寄存器)。__SP_INIT是编译时确定值的符号,为其分配的空间是SDRAM的最顶端。所有,在对SDRAM初始化之前,是无法使用这个位于SDRAM中的栈的,即,无法使用C函数,是这样么, 不一定。 在MPC860内部,有一块RAM区,即DPRAM。本身用于存放CPM各通信模块的参数。在初始化的时候,不妨用它作为临时的栈。在初始化IMMR之后,就可以将DPRAM的地址赋给r1,此后,就可以调用C函数了。 这是一个临时栈,在随后_START中重新初始化r1时,栈就位于SDRAM了。 ―――――――――――――――― 全文完 ―――――――――――――――――― Singer 2004年7月29日
/
本文档为【ucos移植到MPC860】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索