发新话题
打印

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

本主题由 osboy 于 2010-4-9 10:02 移动

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

我在华邦的w90p710上移植了ucos,在main程序中我连续malloc了10个0x1000大小的空间,在跳转到task2中以后,发现0x1000大小的空间就分配不了了,task2我分配了10k的栈,试过100k的栈也无效果,task2只能分配不超过4k的堆,不知道这是什么原因?我把main中的malloc取消了,task2中也只能malloc不超过4k的堆,请教各位走过路过的大侠,看这个问题出在哪里。我的堆栈是重新分配过的,各都超过了4M空间,怎么调整都不行。
" A& J0 I. {/ D6 Y: t$ `) f我们只做简洁、专业的嵌入式开发技术论坛。 #include <rt_misc.h> - H- [5 u! j8 }% r/ X# _- f, V
//video buffer: 0xe00000 __value_in_regs struct __initial_stackheap __user_initial_stackheap( unsigned R0, unsigned SP, unsigned R2, unsigned SL) { struct __initial_stackheap config; www.mcuos.com8 `' k$ D, ?7 p- k! _
              config.heap_base = 0x400000; //R0 一段模式中R1>R0,R0~R1之间的做为heap
5 y0 F5 k1 {$ v5 \5 l我们只做简洁、专业的嵌入式开发技术论坛。              config.stack_base = 0xc00000; //R1 - 我们只做简洁、实用、专业的嵌入式开发技术论坛。0 Y5 Y( |( M) ?$ F7 `: u: J
              config.heap_limit = 0x800000; //R2
0 B, G" p6 y* _0 ?- `/ a# yarm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,              config.stack_limit = 0x800000; //R3
3 O$ v+ W3 b( U: f- 我们只做简洁、实用、专业的嵌入式开发技术论坛。return config; www.mcuos.com' n0 K) G; E) M
}

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,除此之外,我也想不到还有什么别的原因能够影响到。
( g1 Q" g/ V3 Rwww.mcuos.com太变态了,我单独定义了一个文件,stackmalloc.c文件,对任务的堆栈做了定义 + y3 M) ^7 f' T  R" h0 a0 n
#include "global.h"
  ^2 B) Q0 |5 O) u9 b; x8 E嵌入式开发联盟#include    "ucos_ii.h" 我们只做简洁、专业的嵌入式开发技术论坛。6 C! |4 ~6 a% V8 J9 L

2 I1 J% V, Z; A' z8 A' v/ P我们只做简洁、专业的嵌入式开发技术论坛。OS_STK   TaskStk1[512];
7 @5 Q4 ?& \8 j. D7 _5 VOS_STK   TaskStk2[10240];
# {  {7 w" t" B. K9 `嵌入式开发联盟OS_STK   TaskStk3[10240];
3 ^) E" N4 M1 ^# B- u9 G' z5 w+ J) @www.mcuos.comOS_STK   TaskStk4[10240];        /* GUI任务,堆栈一定要大于8KBytes */
; r9 l$ G' a3 _4 }arm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,
4 |/ k( G2 j6 X: Y8 ^' B嵌入式开发联盟然后,在.scf文件中把stackmallo.o加在了系统真正的堆栈之上,我在task中连续申请60个64KBytes的空间,成功了!
. [" x2 z) L! O' e我们只做简洁、专业的嵌入式开发技术论坛。RAM_LOAD 0x00000000         嵌入式开发联盟9 Z- F( Y( Y! u7 y# K2 S& _
{
) T2 K% h. t5 S; w2 }嵌入式开发联盟        VECT 0x0
+ F  l- |( u0 f* ~3 Earm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,        {
$ Y# v. Z: @2 F4 a% D嵌入式开发联盟                vectors.o(Vect, +First)
% |$ I% B" m. C$ W6 C        ;anon$$obj.o
2 K) l3 s' h' M$ qwww.mcuos.com        __main.o(!!!)                 arm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,& X- j0 s2 m* e* C
        }
- B8 n; I4 |% \) z; V1 n& P' c我们只做简洁、专业的嵌入式开发技术论坛。          - 我们只做简洁、实用、专业的嵌入式开发技术论坛。- h1 {$ r9 i8 f& J2 z
    RAM +0
7 o3 ~3 X5 {7 `6 X嵌入式开发联盟    { www.mcuos.com  K( T& M1 j$ l+ N9 H0 ~
            init.o(Init, +First)
6 r, d+ @  E$ S我们只做简洁、专业的嵌入式开发技术论坛。        * (+RO)
9 g/ j$ B. ?+ M$ o$ e7 fwww.mcuos.com        * (+RW,+ZI)
, K6 }! j' ]- d3 f嵌入式开发联盟    }
' Z/ ~( @# f" Q* q嵌入式开发联盟         
4 o! N" g0 w; F, o- x  b- [" Y' I- 我们只做简洁、实用、专业的嵌入式开发技术论坛。        HEAP 0x400000 UNINIT 嵌入式开发联盟1 L* F) F; W5 I9 f, {  {: I
        { arm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,: R- E' i$ h  o% S
                heap.o (+ZI) arm,linux,winbond,nuvoton,w90p710,w90n745,开源,嵌入式,操作系统,嵌入式开发,嵌入式联盟,linux,ecos,uclinux,t-kernel,freeos,rtems,ucos,skyeye,- v8 ?$ M& Y# o4 ]
        } www.mcuos.com4 d2 s4 E! Z" \. U  f
         嵌入式开发联盟( R; A& G& m* p* U9 |
        STACK 0xc00000 UNINIT
4 Z) U0 F. @: J我们只做简洁、专业的嵌入式开发技术论坛。        {
# A8 ?* z2 c* e0 j" p: ]3 d- 我们只做简洁、实用、专业的嵌入式开发技术论坛。                stack.o (+ZI) 嵌入式开发联盟. b& Y) t* r- i: U# r8 a9 D/ h
                stackmalloc.o (+ZI);任务的堆栈 嵌入式开发联盟7 w  y# N$ e9 Q9 q9 v
        }
& L, a8 {- |# n8 `( hwww.mcuos.com}
$ X4 X% i9 ?( r/ f1 v- m! u; j我们只做简洁、专业的嵌入式开发技术论坛。这个华邦的arm第一次用,不知道为舍会这样!!!
' x+ r+ ^; [% S5 _- 我们只做简洁、实用、专业的嵌入式开发技术论坛。$ S: v* {( |) K" S3 I
再试了一把,把stackmalloc.o (+ZI);任务的堆栈 放在大于堆的地址空间上,就行,如果任务堆栈小于堆的地址空间,就不行,不知道是不是跟一段模式中R1>R0,R0~R1之间的做为heap,这个有关。

TOP

发新话题