在contiki程序中使用malloc

考虑以下contiki计划。

#include #include"contiki.h" #include  static char *mem; static int x; /*---------------------------------------------------------------------------*/ PROCESS(test, "test"); AUTOSTART_PROCESSES(&test); /*---------------------------------------------------------------------------*/ PROCESS_THREAD(test, ev, data) { PROCESS_BEGIN(); printf("before malloc\n"); mem=(char*)malloc(10); for(x=0;x<10;x++) mem[x]=x+1; printf("after malloc\n"); PROCESS_END(); } 

当这个程序编译为native / z1 / wismote / cooja时,它执行得很好并且两个printf语句都被执行,但是当编译为mbxxx目标,然后在硬件上执行时,只执行第一个printf语句并且代码被卡住了在malloc。 这种行为背后的任何猜测或原因? 我也在这里附加GDB跟踪。

 (gdb) mon reset init target state: halted target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x08000efc msp: 0x20000500 (gdb) b test.c:16 Breakpoint 1 at 0x8000ec8: file test.c, line 16. (gdb) b test.c:17 Breakpoint 2 at 0x8000ece: file test.c, line 17. (gdb) b test.c:18 Breakpoint 3 at 0x8000ed8: file test.c, line 18. (gdb) load Loading section .isr_vector, size 0x84 lma 0x8000000 Loading section .text, size 0xc5c4 lma 0x8000084 Loading section .data, size 0x660 lma 0x800c648 Start address 0x8000084, load size 52392 Transfer rate: 15 KB/sec, 8732 bytes/write. (gdb) c Continuing. Note: automatically using hardware breakpoints for read-only addresses. Breakpoint 1, process_thread_test (process_pt=0x2000050c , ev=129 '\201', data=0x0) at test.c:16 16 printf("before malloc\n"); (gdb) c Continuing. Breakpoint 2, process_thread_test (process_pt=0x2000050c , ev=, data=) at test.c:17 17 mem=(char*)malloc(10); (gdb) c Continuing. ^C Program received signal SIGINT, Interrupt. Default_Handler () at ../../cpu/stm32w108/hal/micro/cortexm3/stm32w108/crt-stm32w108.c:87 87 { (gdb) bt #0 Default_Handler () at ../../cpu/stm32w108/hal/micro/cortexm3/stm32w108/crt-stm32w108.c:87 #1  #2 0x08000440 in _malloc_r () #3 0x08000ed4 in process_thread_test (process_pt=0x2000050c , ev=, data=) at test.c:17 #4 0x0800272c in call_process (p=0x20000500 , ev=, data=) at ../../core/sys/process.c:190 #5 0x080028e6 in process_post_synch (p=, ev=ev@entry=129 '\201', data=) at ../../core/sys/process.c:366 #6 0x0800291a in process_start (p=, arg=arg@entry=0x0) at ../../core/sys/process.c:120 #7 0x08002964 in autostart_start (processes=) at ../../core/sys/autostart.c:57 #8 0x08001134 in main () at ../../platform/mbxxx/./contiki-main.c:210 (gdb) 

啊……终于找到了问题所在。 这个特殊问题是因为s​​tm32w108未配置为使用动态内存。

所有需要做的是,打开以下文件:contiki-2.7 / cpu / stm32w108 / hal / micro / cortexm3 / stm32w108 / crt-stm32w108.c并在文件顶部或之前添加#define USE_HEAP _sbrk实现! 堆大小也可以在这里修改,而不是从链接器脚本修改,尽管堆栈大小

旁注: 在嵌入式系统中使用动态内存分配是一个非常糟糕的主意,所以要避免它! 它的肮脏相信我! 最后我还将删除所有动态内存分配引用! 🙂