跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Blogs
  3. 使用YT-LINK 遇到_sbrk end问题的原因分析

使用YT-LINK 遇到_sbrk end问题的原因分析

已定时 已固定 已锁定 已移动 Blogs
7 帖子 6 发布者 603 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • FrankieF 离线
    FrankieF 离线
    Frankie YunTu
    写于 最后由 编辑
    #1

    问题描述

    67ced6c8-bdf1-4679-83b1-1f5968bc0524-image.png
    如图,在使用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函数。
    1 条回复 最后回复
    0
    • FrankieF Frankie 在 中 引用了 这个主题
    • FrankieF 离线
      FrankieF 离线
      Frankie YunTu
      写于 最后由 编辑
      #2

      在YT-LINK 增加heap的方法

      依次增加Memory->Group->Section
      一定要在STACK上面

      1f35e973-872c-4d7b-b976-0e6479a9f738-image.png

      增加alt symbol startend

      1a5b03d5-c076-4780-ae1c-5471208e2cf9-image.png

      f521a3c2-df6d-46b5-a2ec-c7fb03299209-image.png

      1 条回复 最后回复
      0
      • FrankieF Frankie 在 中 引用了 这个主题
      • kasselK 离线
        kasselK 离线
        kassel
        写于 最后由 编辑
        #3

        你好,目前有个客户需要使用MALLOC函数做动态内存分配,但是照上述方法还是无法正常使用
        image.png
        反馈无法编译

        image.png

        runR 1 条回复 最后回复
        0
        • qinzhaoQ qinzhao 在 中 引用了 这个主题
        • wang2023W 离线
          wang2023W 离线
          wang2023
          写于 最后由 编辑
          #4

          厉害了我的歌。。。。。

          1 条回复 最后回复
          0
          • gaoShengG 在线
            gaoShengG 在线
            gaoSheng
            写于 最后由 编辑
            #5

            感觉好高级的样子

            1 条回复 最后回复
            0
            • runR 离线
              runR 离线
              run YunTu
              在 回复了 kassel 最后由 编辑
              #6

              kassel 可以试试增加下面的定义。

              extern uint32_t Image$$HEAP_start$$Base;
              extern uint32_t Image$$HEAP_end$$Limit;
              uint32_t __heap_base =  (uint32_t)&Image$$HEAP_start$$Base;
              uint32_t __heap_limit = (uint32_t)&Image$$HEAP_end$$Limit;
              
              1 条回复 最后回复
              0
              • 涂俊伟涂 离线
                涂俊伟涂 离线
                涂俊伟
                写于 最后由 编辑
                #7

                image.png
                使用molloc 一直返回NULL

                1 条回复 最后回复
                0
                • yifeng_xieY yifeng_xie 在 中 引用了 这个主题

              • 云途论坛规则/Yuntu Forum Rules

                发帖前请查看

              • YCT离线License申请流程

                帮助没办法联网的电脑使用YCT

              • YT CONFIG TOOL调查问卷

                帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

              • demo
                12
                can
                8
                lin stack
                6
                yt-link
                5
                vscode
                3
                adc模块
                2
                i2c
                2
                uuid
                2
                Online Users
                gaoShengG
                gaoSheng
                mcM
                mc
                nuseavaN
                nuseava
                BillYinB
                BillYin
                • 登录

                • 登录或注册以进行搜索。
                • 第一个帖子
                  最后一个帖子
                0
                • 版块
                • 最新
                • 标签
                • 热门