四、系统移植与测试步骤
μC/OS-II的大部分代码是用ANSI C编写的, 设计之初已经充分考虑了可移植性。它的的硬件/软件体系结构(V2.52)如下图示:
移植过程要在硬件上增加一个操作系统定时器和软件上修改下处理器相关的几个文件就可以了。基于Micriμm公司的AN-1013 Application Note,软件版本为EDK 10.1, 硬件平台为赛灵思的Spartan-3E Starter Kit进行了移植与测试,详细步骤如下:
1.把AN-1013\edk_user_repository\Micrium\bsp、uCOS-II_v2_86_a整个文件夹拷贝到EDK安装目录如C:\Xilinx\10.1\EDK\sw\lib\bsp下,这样我们就可以在OS & Library Settings选择项里选择uCOS-II了。(可以参考第二节内容)
2.把AN-1013\MICRIUM整个文件夹拷贝C盘根目录, 这是Tcl脚本产生操作系统库时默认的路径,如果放在其它目录时,必须在配制OS时的FILE LOCATION指定具体位置,否则会提示很多类似下面的错误:
Unable to find uC/OS-II source file, os_flag.c" "" "libgen_error"
3.用XPS(Xilinx Platform Studio)的BSP构建一个处理器系统,具体选项步骤按顺序为:
Select Board选择Xilinx Spartan-3E Starter Board, Board Revision为C。
Select Processor选择 microblaze。
Configure microblaze Processor里Local Memory选择16kb, 其它选择默认即可。
Configure IO interfaces仅选择RS232_DCE(波特率改为115200,禁止中断),DIP_Switches_4Bit, LEDs_8Bit。
按NEXT在software setup里去掉peripheral selftest前的钩,其它的默认即可。
最后Generate产生处理器系统。
4.在XPS 界面左边的Project Information Area点IP Catalog栏,找到XPS Interrup Controller和 XPS Timer/Counter IP,双击IP名添加到系统。
5.在XPS 界面右边的System Assembly View里点Bus Interfaces栏,点开第4步加入的两个IP,如果没有改名默认为xps_intc_0和xps_timer_0, 使SPLB信号连接到mb_plb,这样这两个IP就通过PLB总线连接到了microblaze处理器。
6.在XPS 界面右边的System Assembly View里点Addresses栏,为xps_intc_0和xps_timer_0,分配1K的地址空间,点击右上角的Generate Addresses按钮选择系统自动分配基址和外设的最高地址。
7.在XPS 界面右边的System Assembly View里点Port栏,再点击xps_timer_0图标前的加号,在Interrupt里选择New connection, 把Interrupt端口连接到信号线xps_timer_0_Interrupt
双击xps_timer_0图标,在弹出的IP配置窗口里的Use栏里勾选 “Only One Timer is Present”。点OK退出配置窗口。
8.再点击Port栏里microblaze_0图标前的加号,在INTERRUPT里选择New connection,把microblaze的中断信号线连接到microblaze_0_INTERRUPT。
9.再点击Port栏里xps_intc_0图标前的加号,在Irq里选择microblaze_0_INTERRUPT;在Intr里把xps_timer_0_Interrupt加为中断源。
10.在 XPS界面选择 Hardware → Generate Netlist,调用PlatGen 功能,生成硬件网表。
11.在XPS 界面选择Software → Software Platform Settings, 在弹出的Software Platform Settings窗口的点击左边的Software Platform ,在Processor Parameters修改CORE_CLOCK_FREQ_Hz的当前值为50MHz, 在OS & Library Settings里OS选择uCOS-II。
点击左边的OS and Libraries,在Configuration for OS: uCOS-II v2.86.a里对uCOS-II进行配置,对配置的修改由tcl脚本相应地写到OS_CFG.H文件。具体配置项可以参考Micrium-uCOS-II-V286\Micrium\SOFTWARE\uCOS-II\Doc里的uCOS-II-CfgMan.pdf (μC/OS-II配置手册)。
这里除把MISCELLANEOUS→OS_APP_HOOKS_EN 修改为0,uC_Probe选择为false外
其它取默认值不作修改。
注意移植过程中处理器相关的几个文件的修改在文件夹
MICRIUM\Software\uCOS-II\Ports\MicroBlaze\GNU里已经有了,我们不需要改动,具体的修改内容在AN-1013 Application Note文档第四章有详细介绍,可以结合代码进行研究,另外提供一篇论文供读者朋友参考:
http://www.**.com/article/09-05/72510s.html可以下载。
12.打开C:\MICRIUM\Software\EvalBoards\Xilinx\Generic\GNU\BSP\bsp.h,
修改#define BSP_INTC_TIMER1_ID为
XPAR_XPS_INTC_0_XPS_TIMER_0_INTERRUPT_INTR。
修改#define BSP_TIMER1_ADDR为
XPAR_XPS_TIMER_0_BASEADDR
修改#define BSP_GPIO_ADDR为
XPAR_LEDS_8BIT_BASEADDR
13.在XPS 界面选择Software → Generate Libraries and BSPs. 产生库和BSP包。
14. 在XPS 界面左边的Project Information Area点Applications栏,双击Add Software Application Project...
在弹出窗口填写工程名TEST后点OK,生成TEST工程。
展开TEST工程前的加号,右键单击Sources. 在弹出菜单选择Add Existing Files…,把
C:\Micrium\Software\EvalBoards\Xilinx\Generic\GNU\EX1_OS\app.c加到工程里。
15.点击TEST工程名,在右键弹出菜单选择Mark to Initialize BRAMs.
再在右键弹出菜单选择Build Project编译工程。
出现下面提示的错误:
./microblaze_0/lib//libxil.a(print.o): In function `print':
/edkgnu/head/mb/build/nt/bld_gcc/gcc/libgloss/microblaze/print.c:25: undefined reference to `outbyte'
collect2: ld returned 1 exit status
make: *** [test/executable.elf] Error 1
即print函数里调用的outbyte函数没有找到,
解决方法是在XPS 界面的Software → Software Platform Settings弹出窗口左边点击 OS and Libraries. 在Configuration for OS →BSP¬_OPTIONSX下的stdin, stdout选择为RS232_DCE。
16.在XPS 界面的Device Configuration → Update Bitstream
出现下面提示的错误:
ERROR:Data2MEM:31 - Out of bounds code segment for ram space in
'implementation\system_bd.bmm'.
Memory space 'microblaze_0.lmb_bram_combined' occupies
[0x00000000:0x00003FFF]
Code segment #4 occupies [0x00000050:0x000041F3]
ERROR:MDT - Data2Mem generated errors during execution
原因是bram空间太小,在XPS 界面右边的System Assembly View里点Addresses栏把dlmb_cntlr和ilmb_cntlr的Size改为32K,重新Hardware → Generate Netlist和Build Project编译工程一遍就可以了。
17.连接并给Spartan-3E Starter Kit开发板上电,
打开Tera Term,选择相应的串口和115200波特率
在XPS界面选择 Device Configuration → Download Bitstream
下载成功后发现LED灯只亮不灭,按AppTaskFirst任务知道应该是按300ms间隔亮灭的,最先是怀疑定时器中断没有进来,经过排查发现中断没有问题,是调用的LED_Toggle(1)程序中读出的GPIO数值一直为0,所以取反后写回去的数值一直为1(LED灯常亮)。
调试发现原因是Xilinx Spartan-3E Starter Board默认的LEDs_8Bit为输出而没有设输入连接,在XPS 界面右边的System Assembly View里点Port栏的LEDs_8Bit图标加号,把GPIO_in连接到GPIO_d_out信号就可以了,如下图示:
打开C:\MICRIUM\Software\EvalBoards\Xilinx\Generic\GNU\BSP\bsp.c在LED_Toggle函数里的led_status = XGpio_mGetDataReg(BSP_GPIO_ADDR,1);下面加行打印信息:
xil_printf("\n\rled_status: %x", led_status );
打开C:\MICRIUM\Software\EvalBoards\Xilinx\Generic\GNU\EX1_OS\app.c在AppTaskFirst函数里该延时为1s, 如下:OSTimeDlyHMSM(0,0,1,0);
然后在XPS界面选择:
①Hardware → Clean Netlist
②Hardware → Clean Bits
③Hardware → Generate Netlist
④Hardware → Generate Bitstream
⑤Software → Clean Libraries
⑥Software → Generate Libraries and BSPs
⑦点击TEST工程名,在右键弹出菜单选择Clean Project 后在选择Build Project编译工程。
⑧Device Configuration → Update Bitstream
⑨Device Configuration → Download Bitstream
下载成功后可以看到LED灯亮灭,串口同时输出LED的状态,如下图:
至此,系统的移植与测试已经基本完成,待下一步再进行详细地测试与使用。 |