在romStart函数中,调用copyLongs将代码从rom拷贝到ram,代码中是先用ROM_OFFSET(copyLongs)计算出copyLongs在ROM中的地址,然后再调的。但是执行ram清零操作作,为啥调用fillLongs 前没有计算它在ROM中的地址呢?
这里会VxWorks的高手好像不是很多。
顶起 !
唉,真郁闷~
那哪个bbs讨论VxWorks的氛围比较好呀
这个宏还可以这么理解:ROM_OFFSET说明是在ROM中,没添加的是不是不应该在ROM中呢?
事实上copyLongs的时候,系统还在ROM中运行,因此添加ROM_OFFSET计算在ROM中的偏移量,等到copyLongs执行完,ROM中的非压缩部分已经copy到RAM中了,调用的fillLongs是RAM中的,如果你想调用ROM中的fillLongs也是可以的,加上ROM_OFFSET就好了,不过那样系统慢多了。。。。嘿嘿
楼上的解释放在romStart()中是可解释通的,但是在romInit.s,上电复位时,在执行romInit之前,会先执行resetEntry,在resetEntry主要是初始化中断向量、TLB、LAW、Local Bus的BRx/ARx以及DDR内存控制器,而初始化DDR内存控制器是在汇编中调用了c函数——sysDramInit()。但是sysDramInit()被链接在RAM地址空间中,此时调用并没有重新计算sysDramInit在ROM中的地址,这该怎么理解?
在后面的执行过程中,从romInit跳转到romStart重新计算了romStart在ROM中的地址,按道理说,前面那次调用也应该做一下ROM_OFFSET呀?
在执行romInit之前,会先执行resetEntry
你确定你的系统ROM中执行的第一个函数不是romInit?
我的cpu是mpc85xx,是E500核,上电复位向量为0xfffffffc,而非603e核的0x100,因此上电后mpc85xx会先跳转到resetEntry,然后再执行romInit;603e核的cpu,则是上电执行romInit(romInit的链接地址为0xXXXX0100)