找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

裸机的情况下malloc疑问

[复制链接]
跳转到指定楼层
楼主
匿名  发表于 2021-10-10 17:54:53 回帖奖励 |正序浏览 |阅读模式
有两个问题:
问题1.
程序在裸机情况下, 我用的是 arm-none-eabi-gcc 工具链, 里面的 malloc 是 Newlib-Nano 实现的, 现在的问题是, 去哪里设定 malloc的最大 stack 的大小?  是不是在 startup_M451Series.S 里修改?

针对问题1.
我看到此文件有以下内容:

=============================

#ifdef __STACK_SIZE
        .equ        Stack_Size, __STACK_SIZE
#else
        .equ        Stack_Size, 0x00000800
=============================
#ifdef __HEAP_SIZE
        .equ        Heap_Size, __HEAP_SIZE
#else
        .equ        Heap_Size, 0x00000100

于是我修改了那个文件的 0x00000800和 0x00000100这两个值, 最后编译出来的hex的md5(哈希校验值) 跟改之前编译的hex的md5 一样, 我就在想, 会不是是哪里定义了这两个变量(__STACK_SIZE和 __HEAP_SIZE), 导致我这里改了也没用. 于是我全局查找关键字, 也没查到哪里定义了这两个宏.... 这就奇怪了, 我改了代码, 可是编译后的hex跟改前的竟然一模一样. 为了排除 makefile 写漏了依赖, 我把所有目标删除, 从 0 开始编译. 结果也是一样, hex 没有任何不同.

问题2.
请问这个 __STACK_SIZE __HEAP_SIZE到底在哪定义了? 谢谢各位大侠~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 顶 踩
回复

使用道具

8#
匿名  发表于 2021-10-19 15:37:20
Angus 发表于 2021-10-12 21:56
编译后,你看map文件里,ZI-data的空间占用是否有变化。这个是包含栈区在内的内存空间占用量。 ...

谢谢你, 我查了 map, 虽然没找到 ZI data 区(全文件搜索 ZI 都没有关键字, 可能是我用 gcc 的缘故吧..), 但是我发现 .map 文件有变化, .map 文件的 stack_dummy 会跟着 startup 文件的内容发生变化, 但是编译出来 .hex 文件还是一模一样, 所以可能填0是不影响的.
回复 支持 反对

使用道具

7#
匿名  发表于 2021-10-19 15:11:45
Angus 发表于 2021-10-12 21:56
编译后,你看map文件里,ZI-data的空间占用是否有变化。这个是包含栈区在内的内存空间占用量。 ...

哦哦, 谢谢你的回答, 我大概明白你的意思了, 就是说 ZI-data(填 0 区) 其实是不算空间的, 是这个意思吧? 我先去看看这个值
回复 支持 反对

使用道具

6#
Angus 发表于 2021-10-12 21:56:50 | 只看该作者
游客 14.211.86.x 发表于 2021-10-12 11:39
奇怪的是, 我修改了 0x00000800 这个数值, 改成了 0x00000200, 然后保存文件, 编译得到一个新的hex, 这个 ...

编译后,你看map文件里,ZI-data的空间占用是否有变化。这个是包含栈区在内的内存空间占用量。
回复 支持 反对

使用道具 举报

5#
匿名  发表于 2021-10-12 11:39:21
Angus 发表于 2021-10-11 21:34
你使用的不是新唐的 BSP吧?
新唐的BSP 中,Stack_Size 和 Heap_Size  都是在文件startup_M451Series.s 中 ...

奇怪的是, 我修改了 0x00000800 这个数值, 改成了 0x00000200, 然后保存文件, 编译得到一个新的hex, 这个新的 hex 文件与 原来的 hex 文件的 md5 校验是一致的. 那岂不是说明我这里的修改失效了, 那是不是意味着某个地方定义了 __STACK_SIZE ? 可我没找到哪里定义 __STACK_SIZE ..疑惑就在这里
回复 支持 反对

使用道具

地板
匿名  发表于 2021-10-12 11:33:47
Angus 发表于 2021-10-11 21:34
你使用的不是新唐的 BSP吧?
新唐的BSP 中,Stack_Size 和 Heap_Size  都是在文件startup_M451Series.s 中 ...

谢谢回答, 我用的是新唐官网下载的 bsp. (M451_Series_BSP_CMSIS_V3.01.005.zip)
startup_M451Series.S 文件路径:
M451_Series_BSP_CMSIS_V3.01.005.zipibrary/Device/Nuvoton/M451Series/Source/GCC/startup_M451Series.S
里面的宏如下:

#ifdef __STACK_SIZE
        .equ        Stack_Size, __STACK_SIZE
#else
        .equ        Stack_Size, 0x00000800
回复 支持 反对

使用道具

板凳
Angus 发表于 2021-10-11 21:34:02 | 只看该作者
你使用的不是新唐的 BSP吧?
新唐的BSP 中,Stack_Size 和 Heap_Size  都是在文件startup_M451Series.s 中直接定义数值,没有 #if 宏定义

你用的编译环境中,这两个定义可能在环境变量中配置,若找不到,你可以先注释掉不需要的#if 语句
回复 支持 反对

使用道具 举报

沙发
Angus 发表于 2021-10-11 21:28:10 | 只看该作者
你使用的不是新唐的BSP吧?
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU