首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > VxWorks >

为什么小弟我的vxWorks内核无法执行,上载到板下,执行就有错误,请大侠指点

2013-01-06 
为什么我的vxWorks内核无法执行,下载到板上,执行就有异常,请大侠指点问题描述: 小弟有1块开发板,里面有现

为什么我的vxWorks内核无法执行,下载到板上,执行就有异常,请大侠指点
问题描述: 
小弟有1块开发板,里面有现成的Boot。CPU是是MPC852,上面跑vxworks5.5。 
 欲采用bootRom + vxworks image的方式,通过网口下载一个loadable vxWorks image进行开发。采用Tornado工具编译选项如下(RAM_LOW_ADR=0x10000): 
 

得到一个vxWorks 映像文件。将此文件下载到开发板中,并执行得到,立刻出现异常,执行不下去。有如下提示信息: 

Loading... vxworks
 Starting at 0x10000... 
Implementation Dependent Software Emulation
Exception current instruction address: 0x00010000
Machine Status Register: 0x00001000
。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。

r0     =   a041dc   sp     =   fd0e98   r2     =        0   r3     =     9000
r4     =     1000   r5     =        1   r6     =        2   r7     =   faad0c
r8     =       40   r9     =   ab0000   r10    = ffffffff   r11    =   fd0e98
r12    = 20002042   r13    =        0   r14    =        0   r15    =        0
r16    =        0   r17    =        0   r18    =        0   r19    =        0
r20    =        0   r21    =        0   r22    =        0   r23    =        0
r24    =        0   r25    =        0   r26    =        0   r27    =        0
r28    =        0   r29    =    10000   r30    =        0   r31    =   fd0e98
msr    =     1000   lr     =   a041ec   ctr    =        0   pc     =    10000
cr     = 20000084   xer    =        0

出现异常“Exception current instruction address”的地址就是我将内核链接到的地址“0x00010000”,我的Tornado环境的宏定义如下:(注: 地址就在0x00010000)。
 
所以我怀疑我的内核文件被加载后,一执行就异常。

我再将vxWorks 映像文件反汇编,得到如下: 



vxworks:     file format elf32-powerpc
Disassembly of section .text:
00010000 <_sysInit>:               //vxWorks加载后,跳到0x10000处欲执行的系统初始
//此处执行不下去了
   10000:3c c0 00 00 lisr6,0
   10004:38 c6 30 00 addir6,r6,12288
   10008:90 66 00 00 stwr3,0(r6)
   1000c:7c 60 00 a6 mfmsrr3
   10010:54 64 04 5e rlwinmr4,r3,0,17,15
   10014:54 84 07 32 rlwinmr4,r4,0,28,25
   10018:54 84 06 b0 rlwinmr4,r4,0,26,24
   1001c:7c 80 01 24 mtmsrr4
   10020:4c 00 01 2c isync
   10024:3c 80 04 00 lisr4,1024
   10028:38 84 00 00 addir4,r4,0
   1002c:7c 90 8b a6 mtspr560,r4
   10030:7c 98 8b a6 mtspr568,r4
   10034:3c 80 0a 00 lisr4,2560
   10038:38 84 00 00 addir4,r4,0
   1003c:7c 90 8b a6 mtspr560,r4
   10040:7c 98 8b a6 mtspr568,r4
   10044:3c 80 0c 00 lisr4,3072
   10048:38 84 00 00 addir4,r4,0
   1004c:7c 90 8b a6 mtspr560,r4
   10050:7c 98 8b a6 mtspr568,r4
   10054:7c 00 02 e4 tlbia
   10058:3c 80 3e 00 lisr4,15872
   1005c:3c a0 fa 40 lisr5,-1472
   10060:90 85 00 00 stwr4,0(r5)
   10064:3c 20 00 01 lisr1,1
   10068:38 21 00 00 addir1,r1,0
   1006c:38 21 ff f0 addir1,r1,-16
   10070:3c 60 00 00 lisr3,0
   10074:38 63 00 00 addir3,r3,0
   10078:48 00 66 b4 b1672c <usrInit>  //跳到用户初始化阶段

0001007c <_sysMemProbeSup>:
   1007c:39 43 00 00 addir10,r3,0
   。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

我怀疑是否是我编译环境的问题,可是我对编译环境没什么研究:
 

请大侠指点。

[解决办法]
执行第一条指令就异常,这个有些奇怪,按道理说不应该啊。

你在boot的命令行中用l将VxWorks加载到内存,然后再d 0x10000,检查一下第一条指令是不是
  3c c0 00 00 (lis r6,0)

 
[解决办法]
所以啊,你0x10000地址处根本不是可执行的指令,而是ELF头,你的入口程序其实是在0x10060处!

boot启动后通过网络将VxWorks映像下载到内存,你应该将ELF的头剥掉,将可执行段代码拷贝到0x10000处,然后再go 0x10000.

你可以使用bootLoadModule (fd, pEntry)函数, 执行后,pEntry即为VxWorks入口地址可以从那执行。

ps:我也是新手,不是什么大侠,大家多多交流,呵呵~
[解决办法]
其实是因为生成的内核是ELF格式的文件,楼主可以看看是不是在选择编译vxWorks内核的时候某些选项有点问题?或者用elfToBin这个工具转换一下试试看。

热点排行