发新话题
打印

[问题求助] 请教在ucos移植后,main中能够malloc,任务中不能malloc的原因?

请教在ucos移植后,main中能够malloc,任务中不能malloc的原因?

我在华邦的w90p710上移植了ucos,在main程序中我连续malloc了10个0x1000大小的空间,在跳转到task2中以后,发现0x1000大小的空间就分配不了了,task2我分配了10k的栈,试过100k的栈也无效果,task2只能分配不超过4k的堆,不知道这是什么原因?我把main中的malloc取消了,task2中也只能malloc不超过4k的堆,请教各位走过路过的大侠,看这个问题出在哪里。我的堆栈是重新分配过的,各都超过了4M空间,怎么调整都不行。
#include <rt_misc.h>
//video buffer: 0xe00000 __value_in_regs struct __initial_stackheap __user_initial_stackheap( unsigned R0, unsigned SP, unsigned R2, unsigned SL) { struct __initial_stackheap config;
              config.heap_base = 0x400000; //R0 一段模式中R1>R0,R0~R1之间的做为heap
              config.stack_base = 0xc00000; //R1
              config.heap_limit = 0x800000; //R2
              config.stack_limit = 0x800000; //R3
return config;
}

TOP

调试发现,在main和task中不同的就是堆栈基地址变化了,我只建立一个任务,在main中能够malloc到,而在task中分配到的堆受限制,只有0x1004,这是malloc汇编中,上电的时候初始化的时候决定的,如果在task中申请大于0x1004的空间,如0x2000,在malloc的汇编中调用heap_full,会返回0,申请失败,而在main中则没有这个问题。heap_full汇编太多了,没有源码,不能分析,有没有大侠遇到过这样的问题啊,我用的是ucos ii V2.84版本。

TOP

在main中,SP基地址是0xc00000,而且在任务中,由于是为任务定义堆栈是以数组形式存在的,其基地址是0x147fbe,除此之外,我也想不到还有什么别的原因能够影响到。
太变态了,我单独定义了一个文件,stackmalloc.c文件,对任务的堆栈做了定义
#include "global.h"
#include    "ucos_ii.h"

OS_STK   TaskStk1[512];
OS_STK   TaskStk2[10240];
OS_STK   TaskStk3[10240];
OS_STK   TaskStk4[10240];        /* GUI任务,堆栈一定要大于8KBytes */

然后,在.scf文件中把stackmallo.o加在了系统真正的堆栈之上,我在task中连续申请60个64KBytes的空间,成功了!
RAM_LOAD 0x00000000         
{
        VECT 0x0
        {
                vectors.o(Vect, +First)
        ;anon$$obj.o
        __main.o(!!!)                 
        }
         
    RAM +0
    {
            init.o(Init, +First)
        * (+RO)
        * (+RW,+ZI)
    }
         
        HEAP 0x400000 UNINIT
        {
                heap.o (+ZI)
        }
         
        STACK 0xc00000 UNINIT
        {
                stack.o (+ZI)
                stackmalloc.o (+ZI);任务的堆栈
        }
}
这个华邦的arm第一次用,不知道为舍会这样!!!

再试了一把,把stackmalloc.o (+ZI);任务的堆栈 放在大于堆的地址空间上,就行,如果任务堆栈小于堆的地址空间,就不行,不知道是不是跟一段模式中R1>R0,R0~R1之间的做为heap,这个有关。

TOP

发新话题
最近访问的版块