搞了三天的UCOS的移植,真是悲劇了,第一天忙著到處找源碼!第二天忙著搭建平臺,第三天開始調試,本想到會一帆風順,怎曾想出現了一個讓我很傻比的問題,那就是出現了一個異常 HardFault_Handler ,這個異常,找資料啊看代碼,找資料啊看代碼,一天都在這樣循環著。這個異常網上說是堆棧溢出或者內存越界,開始我也把這兩句話封為這個毛病的要點,開始單步跟蹤。第一次跟蹤發現在加載main函數的時候PC指針直接彈入0X0000000,導致程序跳轉到起始地址,然后緊接著調到0X00000FC這個地址,這個地址就是HardFault_Handler 的入口地址,顯然,沒有棧溢出的問題,那么就是內存越界老?顯然也不成立,因為在bootlodaeli里我并沒有定義非法指針和數據,所以不會是這個問題!那又是什么問題呢?后來稀里糊涂的也不知道怎么搞的竟然可以加載MAIN函數,但是加載完了又跳到HardFault_Handler ,真他媽的悲劇啊,然后又是一通單步,結果是找到了出異常的地方在內核文件中的任務控制塊TCB處,初始化就緒表正常,一旦到了TCB鏈表池就會出現錯誤,很頭疼,開始鎖定數組越界問題!但是實在是沒數組或者指針沒有初始化,全部是正常的!他就是不好用!怎么辦?既不是內存越界也不是棧溢出(為了防止棧溢出我特意吧Stack_Size EQU 0x00000800改成512字節),什么原因?。。。。。。。。。我估計應該是別的什么的,編譯器或者lin什么的吧!總之這個得要大神級別的人來解決吧!
下面貼出代碼出錯的段:
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];
什么鳥問題呢??????繼續搞吧!白搭了!忙碌中。。。。。
|