looking more into the memory allocation debug, there is a lot more
dynamic allocation (obviously)  when loading the elf program than
when loading the same program as built-in..
So, seems the problem is due to a high heap fragmentation, what
explains that a call to dmesg can also make the system crash..
So, maybe my question should be, is increasing the heap a solution for
that? If yes, how do I increase it?
BR,
Florian
prints of debug output with my comments:
calling the Elf program (Neo_Ledtest):
  PID PRI POLICY   TYPE    NPX STATE    EVENT     SIGMASK   STACK
COMMAND       
    0   0 FIFO     Kthread N-- Ready              00000000 000000 Idle
Task     
    1 224 FIFO     Kthread --- Waiting  Signal    00000000 002028
hpwork        
    2 100 FIFO     Task    --- Running            00000000 002028
init          
    3  80 RR       pthread --- Waiting  Semaphore 00000000 001564
netinit 0x0   
    4 100 FIFO     Task    --- Waiting  Semaphore 00000000 002004
Telnet daemon0
    6 100 FIFO     Task    --- Waiting  Semaphore 00000000 006116
Neo_Ledtest   
nsh> cat
/proc/6/stack                                                          
StackBase:  0x0x200214b0                                               
         
StackSize:  6116 
StackEnd = 0x200214b0 - 6116d = 0x2001FCCC
nsh> dmesg            //called right after calling the elf program,
after flushing the
syslog..                                                          
mm_free: Freeing
0x2001d010                                                     
mm_malloc: Allocated 0x2000cbd0, size
64                                        
mm_malloc: Allocated 0x20009710, size
32                                        
mm_malloc: Allocated 0x2000cc10, size
48                                        
mm_malloc: Allocated 0x2001d010, size
48                                        
mm_malloc: Allocated 0x2001d040, size
528                                       
mm_malloc: Allocated 0x2001d250, size
448                                       
mm_malloc: Allocated 0x2001d410, size
6624                                      
mm_malloc: Allocated 0x2001edf0, size
528                                       
mm_malloc: Allocated 0x2001f000, size
2064                                      
mm_malloc: Allocated 0x2001f810, size
48                                        
mm_malloc: Allocated 0x2001f840, size
48                                        
mm_malloc: Allocated 0x2001f870, size
48                                        
mm_malloc: Allocated 0x2001f8a0, size
48                                        
mm_malloc: Allocated 0x2001f8d0, size
48                                        
mm_malloc: Allocated 0x2001f900, size
48                                        
mm_malloc: Allocated 0x2001f930, size
48                                        
mm_malloc: Allocated 0x2001f960, size
48                                        
mm_malloc: Allocated 0x2001f990, size
48                                        
mm_malloc: Allocated 0x2001f9c0, size
48                                        
mm_malloc: Allocated 0x2001f9f0, size
48                                        
mm_malloc: Allocated 0x2001fa20, size
48                                        
mm_malloc: Allocated 0x2001fa50, size
48                                        
mm_malloc: Allocated 0x2001fa80, size
48                                        
mm_malloc: Allocated 0x2001fab0, size
48                                        
mm_malloc: Allocated 0x2001fae0, size
48                                        
mm_malloc: Allocated 0x2001fb10, size
48                                        
mm_malloc: Allocated 0x2001fb40, size
48                                        
mm_malloc: Allocated 0x2001fb70, size
48                                        
mm_malloc: Allocated 0x2001fba0, size
48                                        
mm_malloc: Allocated 0x2001fbd0, size
48                                        
mm_malloc: Allocated 0x2001fc00, size
48                                        
mm_malloc: Allocated 0x2001fc30, size
48                                        
mm_malloc: Allocated 0x2001fc60, size
48                                        
mm_malloc: Allocated 0x2001fc90, size
48                                        
mm_malloc: Allocated 0x2001fcc0, size
48                                        
mm_malloc: Allocated 0x2001fcf0, size
48                                        
mm_malloc: Allocated 0x2001fd20, size
48                                        
mm_malloc: Allocated 0x2001fd50, size
48                                        
mm_malloc: Allocated 0x2001fd80, size
48                                        
mm_malloc: Allocated 0x2001fdb0, size
48                                        
mm_malloc: Allocated 0x2001fde0, size
48                                        
mm_malloc: Allocated 0x2001fe10, size
48                                        
mm_malloc: Allocated 0x2001fe40, size
48                                        
mm_malloc: Allocated 0x2001fe70, size
48                                        
mm_malloc: Allocated 0x2001fea0, size
48                                        
mm_malloc: Allocated 0x2001fed0, size
48                                        
mm_malloc: Allocated 0x2001ff00, size
48                                        
mm_malloc: Allocated 0x2001ff30, size
48                                        
mm_malloc: Allocated 0x2001ff60, size
48                                        
mm_malloc: Allocated 0x2001ff90, size
48                                        
mm_malloc: Allocated 0x2001ffc0, size
48                                        
mm_malloc: Allocated 0x2001fff0, size
48                                        
mm_malloc: Allocated 0x20020020, size
48                                        
mm_free: Freeing
0x2001f000                                                     
mm_free: Freeing
0x2001f930                                                     
mm_free: Freeing
0x2001fd50                                                     
mm_free: Freeing
0x2001fa50                                                     
mm_free: Freeing
0x20020020                                                     
mm_free: Freeing
0x2001fff0                                                     
mm_free: Freeing
0x2001f840                                                     
mm_free: Freeing
0x2001f9c0                                                     
mm_free: Freeing
0x2001ffc0                                                     
mm_free: Freeing
0x2001ff90                                                     
mm_free: Freeing
0x2001fab0                                                     
mm_free: Freeing
0x2001fa80                                                     
mm_free: Freeing
0x2001fed0                                                     
mm_free: Freeing
0x2001fd20                                                     
mm_free: Freeing
0x2001fe70                                                     
mm_free: Freeing
0x2001fe40                                                     
mm_free: Freeing
0x2001ff30                                                     
mm_free: Freeing
0x2001ff60                                                     
mm_free: Freeing
0x2001fea0                                                     
mm_free: Freeing
0x2001ff00                                                     
mm_free: Freeing
0x2001fba0                                                     
mm_free: Freeing
0x2001fb40                                                     
mm_free: Freeing
0x2001fae0                                                     
mm_free: Freeing
0x2001fe10                                                     
mm_free: Freeing
0x2001fcf0                                                     
mm_free: Freeing
0x2001fb10                                                     
mm_free: Freeing
0x2001fde0                                                     
mm_free: Freeing
0x2001fdb0                                                     
mm_free: Freeing
0x2001fd80                                                     
mm_free: Freeing
0x2001fa20                                                     
mm_free: Freeing
0x2001fcc0                                                     
mm_free: Freeing
0x2001fc90                                                     
mm_free: Freeing
0x2001fc60                                                     
mm_free: Freeing
0x2001fc30                                                     
mm_free: Freeing
0x2001fc00                                                     
mm_free: Freeing
0x2001fbd0                                                     
mm_free: Freeing
0x2001fb70                                                     
mm_free: Freeing
0x2001f9f0                                                     
mm_free: Freeing
0x2001f990                                                     
mm_free: Freeing
0x2001f960                                                     
mm_free: Freeing
0x2001f900                                                     
mm_free: Freeing
0x2001f8d0                                                     
mm_free: Freeing
0x2001f8a0                                                     
mm_free: Freeing
0x2001f870                                                     
mm_free: Freeing
0x2001f810                                                     
mm_free: Freeing
0x2001d250                                                     
mm_free: Freeing
0x2001edf0                                                     
mm_free: Freeing
0x2001d040                                                     
mm_free: Freeing
0x2001d010                                                     
mm_free: Freeing
0x2000cc10                                                     
mm_free: Freeing
0x20009710                                                     
mm_malloc: Allocated 0x2001d010, size
256                                       
mm_malloc: Allocated 0x2001edf0, size
2064                                      
mm_malloc: Allocated 0x2001f600, size
832                                       
mm_malloc: Allocated 0x2000cc10, size
64                                        
mm_malloc: Allocated 0x2001d110, size
80                                        
mm_malloc: Allocated 0x2001d160, size
80                                        
mm_malloc: Allocated 0x2001d1b0, size
80                                        
mm_malloc: Allocated 0x2001d200, size
256                                       
mm_malloc: Allocated 0x2001f940, size
832                                       
mm_malloc: Allocated 0x2001d300, size
64                                        
mm_malloc: Allocated 0x2001d340, size
80                                        
mm_malloc: Allocated 0x2001d390, size
80                                        
mm_malloc: Allocated 0x2001fc80, size
80                                        
mm_malloc: Allocated 0x2001fcd0, size 6160   //here allocating my (ELF)
tasks stack, just befor my stack-end 0x2001FCCC
mm_malloc: Allocated 0x20009710, size
32                                        
mm_free: Freeing
0x2001d110                                                     
mm_free: Freeing
0x2001d160                                                     
mm_free: Freeing
0x2001d1b0                                                     
mm_free: Freeing
0x2000cc10                                                     
mm_free: Freeing
0x2001d410                                                     
mm_free: Freeing
0x2000cbd0                                                     
mm_free: Freeing
0x2001edf0                                                     
mm_free: Freeing
0x2001d010                                                     
mm_free: Freeing
0x2001f600                                                     
mm_free: Freeing
0x20009710                                                     
mm_malloc: Allocated 0x2001d3e0, size 1008  //here allocating 1K in my
task, heap not within my
stack                                                                  
    
mm_free: Freeing 0x2001d3e0                 //after short usage test,
freeing the memory within my task                                    
mm_malloc: Allocated 0x2000cbd0, size 64    //allocation for dmesg:
CONFIG_STDIO_BUFFER_SIZE                                     
mm_malloc: Allocated 0x20009710, size 32    //allocation for dmesg
mm_malloc: Allocated 0x2000a8d0, size
32    //also                                    
mm_free: Freeing
0x2000a8d0                                                     
mm_free: Freeing
0x20009710                                                     
mm_free: Freeing
0x2000cbd0                                                     
mm_malloc: Allocated 0x2001d3e0, size 528 //also caused by dmesg, maybe
CONFIG_NSH_IOBUFFER_SIZE
                                           //16K space left to my
stack-end
                                           //all other tasks, pthreads
etc shown by ps command have stack allocated before this address!!
----------------------------
calling the Neo_Ledtest as builtin:
nsh>
ps                                                                     
    
  PID PRI POLICY   TYPE    NPX STATE    EVENT     SIGMASK   STACK
COMMAND       
    0   0 FIFO     Kthread N-- Ready              00000000 000000 Idle
Task     
    1 224 FIFO     Kthread --- Waiting  Signal    00000000 002028
hpwork        
    2 100 FIFO     Task    --- Running            00000000 002028
init          
    3  80 RR       pthread --- Waiting  Semaphore 00000000 001564
netinit 0x0   
    4 100 FIFO     Task    --- Waiting  Semaphore 00000000 002004
Telnet daemon0
    6 100 FIFO     Task    --- Waiting  Semaphore 00000000 006116
Neo_Ledtest   
nsh>                                                                   
         
nsh>                                                                   
         
nsh> cat
/proc/6/stack                                                          
StackBase:  0x0x20020a50                                               
         
StackSize:  6116
StackEnd = 0x200214b0 - 6116d = 0x2001F26C
nsh>
dmesg                                                                  
    
mm_free: Freeing
0x2001d010                                                     
mm_malloc: Allocated 0x2000cbd0, size
64                                        
mm_malloc: Allocated 0x20009710, size
32                                        
mm_malloc: Allocated 0x2000cc10, size
48                                        
mm_free: Freeing
0x2000cc10                                                     
mm_free: Freeing
0x20009710                                                     
mm_free: Freeing
0x2000cbd0                                                     
mm_malloc: Allocated 0x2001d010, size
256                                       
mm_malloc: Allocated 0x2001d110, size
832                                       
mm_malloc: Allocated 0x2000cbd0, size
64                                        
mm_malloc: Allocated 0x2000cc10, size
80                                        
mm_malloc: Allocated 0x2001d450, size
80                                        
mm_malloc: Allocated 0x2001d4a0, size
80                                        
mm_malloc: Allocated 0x2001d4f0, size
6160                                      
mm_malloc: Allocated 0x2001ed00, size
256                                       
mm_malloc: Allocated 0x2001ee00, size
832                                       
mm_malloc: Allocated 0x2001f140, size
64                                        
mm_malloc: Allocated 0x2001f180, size
80                                        
mm_malloc: Allocated 0x2001f1d0, size
80                                        
mm_malloc: Allocated 0x2001f220, size
80                                        
mm_malloc: Allocated 0x2001f270, size 6160 //here is my builtin task
stack allocated, just before calculated stack-
end                                     
mm_malloc: Allocated 0x20009710, size
32                                        
mm_free: Freeing
0x2000cc10                                                     
mm_free: Freeing
0x2001d450                                                     
mm_free: Freeing
0x2001d4a0                                                     
mm_free: Freeing
0x2000cbd0                                                     
mm_free: Freeing
0x2001d4f0                                                     
mm_free: Freeing
0x2001d010                                                     
mm_free: Freeing
0x2001d110                                                     
mm_free: Freeing
0x20009710                                                     
mm_malloc: Allocated 0x2001d010, size 7008   //allocating 7000Bytes in
my task                                   
mm_free: Freeing
0x2001d010                  //freeing                                  
 
mm_malloc: Allocated 0x2000cbd0, size 64     //dmesg
stuff..                                   
mm_malloc: Allocated 0x20009710, size 32     //dmesg
stuff..                                   
mm_malloc: Allocated 0x2000a8d0, size 32     //dmesg
stuff..                                   
mm_free: Freeing
0x2000a8d0                                                     
mm_free: Freeing
0x20009710                                                     
mm_free: Freeing
0x2000cbd0                                                     
mm_malloc: Allocated 0x2001d010, size 528    //dmesg stuff..
                                                                        
                 //8.5K left until my stack-end         

-- 
Florian WehmeyerTFW Tech-SolutionsOn Seg, 2020-05-11 at 11:35 -0300, Florian 
Wehmeyer wrote:
> Hi all, 
> 
> again a question related to the execution of external / elf
> programs: 
> 
> When I use malloc within the running elf program, allocating more
> than
> 1K bytes, malloc seems to work (doesn't return NULL), but when I use
> that memory (memset) I get a assertion/Kernel panic..
> 
> Funnily this does not happen if I use the same program as built-in
> program (the one which is already in ROM flash).. Here I can allocate
> and use 8K or more without any problem..
> 
> So, it seems the binary loader itself consumes a lot of memory,
> decreasing the available heap.. I was not able to solve that problem
> even increasing all available and possibly related stacksizes in
> .config
> After loading the elf file, even running dmesg can cause that
> assertion.. (using RAMLOG with 8K buffer and memory debug output) .
> free shows about 130K of free RAM..
> 
> in the  memory debug output I can see that the periodical allocation
> at
> about 10K of distance of the next stack-end (means stackbase minus
> stacksize, knowing stack decreases), which is my app..
> so, I thought allocate 2K on the heap should not be a problem.
> 
> 
> Any ideas about any configuration that's important here? 
> 
> 
> Many thanks & BR,
> 
> 
> --
> Florian WehmeyerTFW Tech-Solutions

Reply via email to