使用YT-LINK 遇到_sbrk end问题的原因分析
-
问题描述
如图,在使用GCC+YT-LINK的时候用时候会遇到如上图的错误,发生在link阶段,提示end这个symbol没有定义问题定位
这个问题是gcc + newlib 的问题,先来看一下_sbrk这个的源码和功能
_sbrk (ptrdiff_t incr) { extern char end asm ("end"); /* Defined by the linker. */ static char * heap_end; char * prev_heap_end; if (heap_end == NULL) heap_end = & end; prev_heap_end = heap_end; if ((heap_end + incr > stack_ptr) /* Honour heap limit if it's valid. */ || (__heap_limit != 0xcafedead && heap_end + incr > (char *)__heap_limit)) { /* Some of the libstdc++-v3 tests rely upon detecting out of memory errors, so do not abort here. */ #if 0 extern void abort (void); _write (1, "_sbrk: Heap and stack collision\n", 32); abort (); #else errno = ENOMEM; return (void *) -1; #endif } heap_end += incr; return (void *) prev_heap_end; }
可以看到_sbrk 的主要功能就是从heap里面申请内存,但是YT-LINK默认没有开启HEAP,只有stack,所以任何和内存相关的函数都会用到_sbrk
- 内存相关的如:
malloc
等 sprintf
等
为什么YT-LINK默认没有定义heap
因为在汽车嵌入领域不建议使用动态内存,即使要使用动态内存,也不建议使用newlib自带的,而是使用其他轻量的内存管理库。
如何解决
下面的方法任选其一
- 移除使用到内存的相关函数如:
malloc
,sprintf
等 - 在YT-LINK里增加heap区域 (注意,heap区域必须要在stack上面,看_sbrk代码可以得知)
- 自己实现一个_sbrk函数。
- 内存相关的如:
-
-
-
帮助没办法联网的电脑使用YCT
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...