EK-LM3S811在Keil MDK编译环境下,分配内存空间的问题



请问一下各位大侠,我的demo板式EK-LM3S811,我使用Keil MDK编译环境,只要我使用malloc函数分配内存空间,就出现单片机不运行,这是怎么回事啊?

  • anguo wang :

      你的malloc()函数是在ucos系统下用的吗?如果是,那可能是系统移植的时候没处理好内存这一块

  • 没有在Ucos系统下,我只是建立了以恶搞时间链表,在添加链表的时候使用malloc()分配空间,在IAR编译环境下是没有问题的,就是Keil MDK下,只要使用这个malloc()函数就死机,系统不运行了。

  • 我的定义是

    typedef void (*TimerBack) (void );

    typedef struct

    {

     void *next;

     INT32U timeout;

     INT8U  task_id;

     TimerBack callBackFunc;

    } osalTimerRec_t;

    osalTimerRec_t *newTimer;

    定义好后只要文件有malloc这一句内存分配语句,系统就运行不起来,把这句注销就完全可以了。

    newTimer = (osalTimerRec_t *)malloc( sizeof( osalTimerRec_t ) );

    不知道是什么原因?

  • anguo wang :可能有这么几种情况吧:

      1.RAM空间不足?扣除已经用去的,这种可能性比较小

      2.未进行堆的初始化?如果是KEIL自带的启动代码,是进行了初始化的。

      3.堆空间太小,不够用?查看一下启动代码里的堆的初始化

  • 是堆栈空间不够用造成的,我把堆栈空间增加后,就可以了。以前都是在弄单片机很少去管堆栈的问题,一般都够用。

    在请教一下

    ; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>

    ;

    ;******************************************************************************

    Stack   EQU     0x00000200

    ;******************************************************************************

    ;

    ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>

    ;

    ;******************************************************************************

    Heap    EQU     0x00000200

    这两个都是定义堆栈大小的,他们有什么区别啊?非常感谢。

  • 还有怎么知道一个系统需要多大的堆栈空间啊。

  • anguo wang :

     回复“这两个都是定义堆栈大小的,他们有什么区别啊?”。事实上堆(Heap)和栈(Stack)是两个概念。关于这个,你可以去百度一下“堆和栈的区别”就知道了。

     回复“怎么知道一个系统需要多大的堆栈空间啊”。解答了上个问题,这个也就自然清楚了