搞了三天的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];
什么鸟问题呢??????继续搞吧!白搭了!忙碌中。。。。。
|