|
搞了三天的UCOS的移植,真是悲劇了,第一天忙著到處找源碼!第二天忙著搭建平臺(tái),第三天開(kāi)始調(diào)試,本想到會(huì)一帆風(fēng)順,怎曾想出現(xiàn)了一個(gè)讓我很傻比的問(wèn)題,那就是出現(xiàn)了一個(gè)異常 HardFault_Handler ,這個(gè)異常,找資料啊看代碼,找資料啊看代碼,一天都在這樣循環(huán)著。這個(gè)異常網(wǎng)上說(shuō)是堆棧溢出或者內(nèi)存越界,開(kāi)始我也把這兩句話(huà)封為這個(gè)毛病的要點(diǎn),開(kāi)始單步跟蹤。第一次跟蹤發(fā)現(xiàn)在加載main函數(shù)的時(shí)候PC指針直接彈入0X0000000,導(dǎo)致程序跳轉(zhuǎn)到起始地址,然后緊接著調(diào)到0X00000FC這個(gè)地址,這個(gè)地址就是HardFault_Handler 的入口地址,顯然,沒(méi)有棧溢出的問(wèn)題,那么就是內(nèi)存越界老?顯然也不成立,因?yàn)樵赽ootlodaeli里我并沒(méi)有定義非法指針和數(shù)據(jù),所以不會(huì)是這個(gè)問(wèn)題!那又是什么問(wèn)題呢?后來(lái)稀里糊涂的也不知道怎么搞的竟然可以加載MAIN函數(shù),但是加載完了又跳到HardFault_Handler ,真他媽的悲劇啊,然后又是一通單步,結(jié)果是找到了出異常的地方在內(nèi)核文件中的任務(wù)控制塊TCB處,初始化就緒表正常,一旦到了TCB鏈表池就會(huì)出現(xiàn)錯(cuò)誤,很頭疼,開(kāi)始鎖定數(shù)組越界問(wèn)題!但是實(shí)在是沒(méi)數(shù)組或者指針沒(méi)有初始化,全部是正常的!他就是不好用!怎么辦?既不是內(nèi)存越界也不是棧溢出(為了防止棧溢出我特意吧Stack_Size EQU 0x00000800改成512字節(jié)),什么原因?。。。。。。。。。我估計(jì)應(yīng)該是別的什么的,編譯器或者lin什么的吧!總之這個(gè)得要大神級(jí)別的人來(lái)解決吧!
下面貼出代碼出錯(cuò)的段:
MOVS R1, #0
STR R1, [R0]
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
第二處:
ptcb1->OSTCBNext = (OS_TCB *)0; /* Last OS_TCB */
#if OS_TASK_NAME_SIZE > 1
ptcb1->OSTCBTaskName[0] = '?'; /* Unknown name */
ptcb1->OSTCBTaskName[1] = OS_ASCII_NUL;
#endif
OSTCBList = (OS_TCB *)0; /* TCB lists initializations */
OSTCBFreeList = &OSTCBTbl[0];
什么鳥(niǎo)問(wèn)題呢??????繼續(xù)搞吧!白搭了!忙碌中。。。。。
|
|