一直以来想看看新的VxWorks 7.0有什么变化,最近抽了一段时间做了一个基于zedboard的VxWorks的操作系统镜像,刚开始就被很多新的问题困扰了很久,首先是uboot,VxWorks7不再有bootloader,变成了全新的uboot支持,有的CPU增加了一个VxBL作为系统启动引导,但是官网推荐用U-Boot引导启动,如何编译一个uboot,可以参考BSP包里面的target.ref,也可以从官网下载U-Boot源码,修改支持自己的处理器,然后重新编译,下面是关于zedboard的u-boot编译:

1、需要一台装有Linux系统或Windows系统装有Linux虚拟机的电脑,系统为Ubuntu;

2、进入Ubuntu系统,按Ctrl+Alt+T调出Terminal终端。输入sudo passwd root,会要求输入用户密码,然后重置root的密码,这里密码都不会显示。重置完后输入su root,再输入刚刚重置的root密码即可进入root

VxWorks 7 Debug based on Zedboard

这里要说明很关键的一点,一定要把目录设置好。

3、在root目录下,输入mkdir /zed,在zed下创建tool,将下载的xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin拷贝到tool目录下。

输入如下命令:


cd /root/zed/tool

然后执行如下命令:


./xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin

此时系统会提示权限不够,需要如下方式输入


chmod 777 xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin

之后再输入./xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin 弹出安装界面,每次都点击next即可。但是需要记住下图中安装的路径。

VxWorks 7 Debug based on Zedboard

VxWorks 7 Debug based on Zedboard

4、安装完成后需要设置环境变量

很多教程里面提到要下载ia32-libs的库,输入apt-get install ia32-libs。但我在实践中发现,输入这个会出现找不到库的情况,不安装也是可以进行编译的。

设置环境变量的方法是:输入如下命令


export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
export PATH=/root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin:$PATH

这里,真的是不同的教程有不同的方法,需要注意的是大家一定在指定PATH的时候按照自己的安装路径设置,这两行命令亲测没有问题,可以放心使用。

有的地方是arm-xilinx-linux-gnuadbi的写法,这个应该是有人的笔误最后流传到网上,需要大家注意鉴别。

在此要感谢想要奔跑的蜗牛提供的方法,可以在宿主目录下编辑 .bashrc文件,将设置环境变量的命令保存在.bashrc中,因为每次打开终端的时候,系统会自动运行.bashrc文件,所以保存设置过后,关闭终端再重新打开,以后就不用每次都设置环境了。

完成后输入arm-xilinx-linux-gnueabi-gcc -v 会显示相关信息

5、拷贝官网下载的源代码到linux操作系统下/home/

6、进入到源文件根部目录下:cd /home/

7、 make distclean

8、make zynq_zed_config 或者make zynq_zc702_config(取决于你的板卡)

9、make

10、这时在根目录下会生成你的u-boot、u-boot.bin

11、拷贝u-boot到你的xilinx-sdk下面:E:zynq_worksspace\xrTerminal_zynq\xrTerminal_zynq.sdk\EmbeddedPlatForm_FSBL\Debug

12、现在可以开始编译你自己的BOOT.bin,如何编译在这里就不多说,如果你能熟练使用xilinx-sdk的话,这个很简单。

然后可以通过uboot引导你的vxworks系统镜像,在系统镜像启动阶段,串口总是没有输出,搞得我很是头大,折腾了快一个礼拜,网上查各种资料,可惜的是网上关于vxworks7的资料太少,无奈只有自己琢磨吧,可以通过点灯的方法去调试,看看程序运行到哪里出了问题,不过vxworks7文档介绍增加了kprintf在usrinit阶段的打印功能,如果你敢兴趣可以自己研究,具体代码可以用汇编语言实现:


__asm(“LDR r12,=0xe000a204”);
__asm(“LDR r11,=0x00000080”);
__asm(“STR R11,[R12]”);
 
__asm(“LDR R12,=0xe000a208”);
__asm(“LDR R11,=0x00000080”);
__asm(“STR R11,[R12]”);
 
__asm(“LDR R12,=0xe000a040”);
__asm(“LDR R11,=0x00000080”);
__asm(“STR R11,[R12]”);

GPIO根据你自己的板卡选择,这里的寄存器地址查找数据手册确定,不再多少,发现程序运行到mmuEarlyInit时卡死,于是拼命的研究内存管理,查看DDR基地址配置,内存大小配置等,发现都没有问题,可就是启动后串口不显示,郁闷中。。。。。。。一个礼拜在这里折腾,始终没有解决问题,最后发现串口有输出一个乱码,感觉系统应该是正常运行了,只不过串口不能交互,现在开始研究串口,底层串口使用驱动vxbFdtZynqSio.C这个文件,检查发现系统启动配置串口波特率为115200,没有问题,串口时钟50000000,这就有问题了,我的串口配置时钟为100000000HZ,于是更改串口时钟配置,在设备树文件中增加


uart1: uart@e0001000
{
compatible = “xlnx,xuartps”;
reg = ;
clock-frequency = ;
interrupts = ;
interrupt-parent = <&intc>;
};

好了,系统正常启动,开心,不过为什么串口配置错误,导致mmuEarlyInit时卡死,不解中,后面继续研究,下次研究清楚了,再做详细介绍。