函数调用较多时系统无响应

来源:互联网 发布:free book 知乎 编辑:程序博客网 时间:2024/05/16 17:48

FL2440开发板操作系统的进度已经进行了将近一半,一小半吧。。。遇到不少问题,抓紧在的过程中总结,恐怕等到完成的时候也不能全部回想起来了。。

      下午本来是来测试刚完成的buddy分配功能的,可是将可执行文件烧到板子上总是不能按预期执行(当然这也是所有写程序的人遇到的最多的问题了,呵呵)现象是:如果将动态内存管理模块编译、链接,那么板子上电就会没反应,如果不编译链接动态内存管理模块,就没有问题。最初以为是该模式下(当时CPU是在SVC32模式下)的堆栈空间不够,后来想想不是,堆栈是向下增长的,对于我的程序来说,仅仅调用了几层函数,局部变量几乎都能挨个数过来,应该不是堆栈的问题。继续寻找问题的根源:可能是代码段不够长,不能容纳所有的代码?查看链接脚本,也排除了这种可能。对于启动部分,也就是bootloader部分确实有这个问题,代码段、数据段、bss段都要限制在4K以内,这部分当系统上电时会交给硬件加载到CPU去执行,但是对于启动后的内核代码,是没有这个限制的,在链接脚本中和内核代码部分相关的链接是这样写的:.kernel 0x30000000 : AT(0x1000) { *(.text .rodata* .data .bss) },也就是说,从4K开始往后,有多少就存多少,FL2440板子相对于我的不到10K的程序而言,几乎不存在空间限制问题。所以,问题也不在这里。然后又接着往下找,怀疑是内存的问题,一般的,如果裸板程序不能正常执行,内存没有正确初始化是有着很大嫌疑的。查看初始化代码,当然都是汇编,首先查到的是,初始化内存控制器时,设置的对SDRAM的刷新率为8e07a3,这个数字是对于CPU跑在12M赫兹下的内存刷新率,现在CPU在400Mhz,当然是不对的,应该设置成8e04f5。但是这应该也不是主要原因,因为如果是这个原因,之前所有的程序也不会正常运行的(其实设置成这个刷新率是由于当初初始化CPU的时候遇到麻烦,由于始终不能把CPU频率拉到400Mhz,所以就先把内存也设置成外部晶振的12Mhz频率满足暂时使用需要的,当然后来CPU初始化成功了,但是这里却忘了改回来了,直到现在才发现)。所以改掉这个小bug继续找。最后终于在拷贝代码的部分找到的造成这个问题的真正元凶:在从nand拷贝代码到内存时,只拷贝了4K的代码,在最初的时候,写的程序还比较短,4K足够了,但是现在,编译完看看二进制文件大小:9084字节!前4K是属于bootloader的,由硬件替我加载到CPU内部的STEPSTONE中执行,我从4K+1开始拷贝4K到内存,也才拷到8096而已,很多代码或者数据都还静静地躺在nand中没被加载到内存,被加载的程序在内存中缺胳膊少腿,当然不能跑起来了。最后,将加载大小改为8K,满足需求就OK。 终于解决了问题,虽然原因很简单,但是却着实费了一番功夫

      到目前为止,还有两个待解决的问题:先说第一个,轻量级的,初始化buddy链表头数组时,对链表头不能正常初始化,总是卡在INIT_LIST_HAND宏上边,其实这个宏就一个简单功能:把传入的链表元素的两个指针都指向自身。为什么不能初始化?不解。第二个问题,困扰了我将近3个礼拜了,不能初始化中断,就是在使能中断时,不能将清除了irq位的cpsr值写会cspr_c中。费解啊,之前就是这个坎实在是迈步过去才先做动态内存管理的。。。努力解决中。