WHAT:
v1.6+++++++带来的---如何配置vxworks的BSP使其正常引导bootrom/vxworks.
WHY:
BSP(board support packet)是学习vxworks必须学习的基础之一. 可以说没有学好vxworks的BSP就等于windows编程中只会应用程序编程一样, that is 不了解底层是怎么工作的. 而且对于一个嵌入式程序员来说如果不了解底层就没办法对系统进行软硬件的裁剪,这样就失去了嵌入式以应用为中心的目的了. 说说我为什么要学习vxworks的BSP. 从一开始接手vxworks时, 就遇到BSP这个东东,认为既然它的名字叫board supprot packet就是做板子的人提供的, 与搞嵌入式软件的我应该没什么关系, 再加上第一块板子的BSP是现成的, 所以一直没有理会它. 直到有一天(就是上个星期), 要换板子. 本来觉得这挺简单的, 直接把vxworks系统一直过去就行了. 可没想到出现在屏幕的却是v1.6+++++++,后面的加号有八九行. 重启了好几次还是同样的现象. 一点辙都没有,没办法只能开始从头学习BSP. HOW:
(1) 从vxworks提供的help contents中取经吧, 从中了解到最关键的一点是BSP的作用: BSP是用来提供系统引导程序和提供驱动程序的. 提供系统引导程序使系统与CPU和内存分隔开来; 提供驱动程序使vxworks与所有外设分隔开来. 这样BSP就相当于vxworks与硬件之间的中间层被独立出来, 这样模块化的好处就不言而喻了, 开发好的软件就可以在任意的硬件平台上"肆无忌惮"的跑了, 只需动动中间层即BSP来匹配硬件即可. 说了半天, 就是 BSP提供系统引导程序和驱动程序带来的是硬件平台的可移植性超强.
其中常用的是Makefile和config.h基本上就可以实现对BSP的完整配置.
*现象1:当移植时屏幕出现v1.6++++++++并不断重启. 这是属于显存内存冲突或自动检测大小内存.
解决方案: file(Makefile)-line(74)-RAM_HIGH_ADRS/RAM_LOW-ADRS+4M(可能不一样, 根据显存分配的,bios可查到)
解决方案: file(config.h)-line(890)-LOCAL_MEM_LOACAL_ADRS/SYSTEM_RAM_SIZE+4M(可能不一样, 根据显存分配的,bios可查到)
解决方案: 自动检测是先向每页中写入固定值再读出固定值, 而有些内存会映射到ROM中,导致无法写. 所以屏蔽自动检测内存, file(config.h)-line(923)-undef LOCAL_MEM_AUTOSIZE
*现象2:当移植时屏幕出现v1.6++++++++并挂死. 这是属于CPU检测或硬件初始化问题
解决方案-CPU : 阻止CPU检测, file(config.h)-line(257)-#undef INCLUDE_CPU_PROBE
解决方案-控制台: 添加输出到显示器和从键盘输入, file(config.h)-line(865)-#define INCLUDE_PC_CONSOLE
v1.6+++++++带来的---如何配置vxworks的BSP使其正常引导bootrom/vxworks.
WHY:
BSP(board support packet)是学习vxworks必须学习的基础之一. 可以说没有学好vxworks的BSP就等于windows编程中只会应用程序编程一样, that is 不了解底层是怎么工作的. 而且对于一个嵌入式程序员来说如果不了解底层就没办法对系统进行软硬件的裁剪,这样就失去了嵌入式以应用为中心的目的了. 说说我为什么要学习vxworks的BSP. 从一开始接手vxworks时, 就遇到BSP这个东东,认为既然它的名字叫board supprot packet就是做板子的人提供的, 与搞嵌入式软件的我应该没什么关系, 再加上第一块板子的BSP是现成的, 所以一直没有理会它. 直到有一天(就是上个星期), 要换板子. 本来觉得这挺简单的, 直接把vxworks系统一直过去就行了. 可没想到出现在屏幕的却是v1.6+++++++,后面的加号有八九行. 重启了好几次还是同样的现象. 一点辙都没有,没办法只能开始从头学习BSP. HOW:
(1) 从vxworks提供的help contents中取经吧, 从中了解到最关键的一点是BSP的作用: BSP是用来提供系统引导程序和提供驱动程序的. 提供系统引导程序使系统与CPU和内存分隔开来; 提供驱动程序使vxworks与所有外设分隔开来. 这样BSP就相当于vxworks与硬件之间的中间层被独立出来, 这样模块化的好处就不言而喻了, 开发好的软件就可以在任意的硬件平台上"肆无忌惮"的跑了, 只需动动中间层即BSP来匹配硬件即可. 说了半天, 就是 BSP提供系统引导程序和驱动程序带来的是硬件平台的可移植性超强.
(2) help contents中的次重要的一点是引导过程. 既然BSP提供引导程序,我们就必须了解引导过程. 引导过程大体分为五步: romInit.s->bootInit.c->sysInit()->usrInit()->usrRoot( ).如图:
第一, romInit.s 初步初始化CPU, MEM, INT, CACHE的, 是用汇编编写的. 第二, bootInit.c加载vxworks到RAM中, 第三, sysInit()重复romInit.s 的工作(原因:当使用ROM monitor/hardware debugger时设置vxworks允许状态). 第四, usrInit()完全CPU的初始化和关闭其他所有硬件以及初始化vxworks kernel. 第五, 启动第一个线程usrRoot(), 来完成其他所有硬件和kernel的初始化, 然后启动应用程序. 以上是启动过程, 个人觉得了解这个过程是比较爽的, 感觉vxworks在你面前就没有那么神秘了.
其中常用的是Makefile和config.h基本上就可以实现对BSP的完整配置.
*现象1:当移植时屏幕出现v1.6++++++++并不断重启. 这是属于显存内存冲突或自动检测大小内存.
解决方案: file(Makefile)-line(74)-RAM_HIGH_ADRS/RAM_LOW-ADRS+4M(可能不一样, 根据显存分配的,bios可查到)
解决方案: file(config.h)-line(890)-LOCAL_MEM_LOACAL_ADRS/SYSTEM_RAM_SIZE+4M(可能不一样, 根据显存分配的,bios可查到)
解决方案: 自动检测是先向每页中写入固定值再读出固定值, 而有些内存会映射到ROM中,导致无法写. 所以屏蔽自动检测内存, file(config.h)-line(923)-undef LOCAL_MEM_AUTOSIZE
*现象2:当移植时屏幕出现v1.6++++++++并挂死. 这是属于CPU检测或硬件初始化问题
解决方案-CPU : 阻止CPU检测, file(config.h)-line(257)-#undef INCLUDE_CPU_PROBE
解决方案-控制台: 添加输出到显示器和从键盘输入, file(config.h)-line(865)-#define INCLUDE_PC_CONSOLE
解决方案-网卡: 查看datasheet获取网卡型号,修改网卡驱动, file(config.h)-line(520)-#define INCLUDE_LN_97X_END
REFERENCE:
[1] help contents
NOTE:
我分享总结, 欢迎你分享意见和评论 (关于内容, 写作, 个人情感的什么都可以), 这样我们才能共同进步.