- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个带有 48kb SRAM 的 STM32F103VCT6
微 Controller ,最近我遇到了内存冲突:
我有一些静态变量(我们称它为 A
)位于堆中,大小为 0x7000
,我编写了一些简单的函数来获取有关堆栈和堆的信息:
void check(int depth) {
char c;
char *ptr = malloc(1);
printf("stack at %p, heap at %p\n", &c, ptr);
if (depth <= 0) return;
check(depth-1);
}
所以我得到了这样的东西:
stack at 2000939b, heap at 20008fd0
stack at 20009383, heap at 20008fe0
stack at 2000936b, heap at 20008ff0
stack at 20009353, heap at 20009000
stack at 2000933b, heap at 20009010
stack at 20009323, heap at 20009020
stack at 2000930b, heap at 20009030
stack at 200092f3, heap at 20009040
stack at 200092db, heap at 20009050
stack at 200092c3, heap at 20009060
stack at 200092ab, heap at 20009070
所有静态变量(包括A
)都已经得到了它们的堆,所以堆位于0x8fd0
。看起来,堆栈指针最初位于 0x939b
,远离 48kb (0xc000
)
当我将 A
变量大小更改为 0x4000
时,我得到了这张图片:
stack at 2000639b, heap at 20005fd0
stack at 20006383, heap at 20005fe0
stack at 2000636b, heap at 20005ff0
stack at 20006353, heap at 20006000
stack at 2000633b, heap at 20006010
stack at 20006323, heap at 20006020
stack at 2000630b, heap at 20006030
stack at 200062f3, heap at 20006040
stack at 200062db, heap at 20006050
stack at 200062c3, heap at 20006060
stack at 200062ab, heap at 20006070
因此,堆栈位置似乎不位于 SRAM 的末尾,而是依赖于用户定义的变量。
如何将堆栈对齐到 SRAM 的最末端(在 48kb 处)?
我正在使用带有 GNU Tools ARM Embedded
工具链的 CooCox IDE。
谢谢!
编辑:
抱歉这里有些误会,A
不是 const,我称它为 static 只是因为关键字:
static uint8_t A[A_SIZE];
printf("A is at %p\n", &A);
这表明 A
位于内存的开头:
A is at 20000c08
最佳答案
GNU 工具链使用目标特定的链接描述文件(通常带有 .ld 文件扩展名)。这将描述您的目标的内存布局,并且可以根据需要进行定制。
您推断堆栈和堆位置的方式有些不确定且过于复杂。简单地查看链接器生成的映射文件输出(ld 命令行选项 -Map <mapfile>
)要简单得多且完全准确。
根据定义,堆是用于动态分配的,因此隐含地不用于分配静态数据;这是你的误解。链接器将在构建时分配静态数据位置。链接描述文件可能会分配一个固定大小的堆栈,然后将所有剩余的和未保留用于其他目的的堆栈分配给堆。自定义脚本还可以为其他目的分配区域,例如 DMA 缓冲区或电池供电域。
无论哪种方式,堆栈的放置都不太可能解决您的实际问题;只是移动东西;它不会增加可用内存;任何堆栈溢出都会与其他东西发生碰撞。
关于c - 如何将堆栈对齐到 SRAM 的末尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30836386/
1、准备材料 开发板(正点原子stm32f407探索者开发板V2.4) 。 STM32CubeMX软件(Version 6.10.0) 。 野火DAP仿真器 。 keil µVis
我有一个带有 48kb SRAM 的 STM32F103VCT6 微 Controller ,最近我遇到了内存冲突: 我有一些静态变量(我们称它为 A)位于堆中,大小为 0x7000,我编写了一些简单
我正在对 ARM 芯片 (STM32F2)“裸机”进行编程。具体来说,我想读取保存在外部 SRAM 中的值。阅读reference manual我了解此类内存事务是通过 FSMC(灵活静态内存 Con
目前正在为 atmel tiny45 微 Controller 编码,我使用了几个查找表。存放它们的最佳地点在哪里?您能大致了解一下 sram-flash-eeprom 之间的内存速度差异吗? 最佳答
代码中声明的变量(静态或全局)首先与整个应用程序代码一起复制到片上闪存 (ROM)。然后它们依次复制到 SRAM 中。静态和全局变量在 SRAM(不是堆栈)中分配地址,而函数中的局部变量则在堆栈(SR
我正在为我的 STM32f207zg 编写一个(更好的)硬故障处理程序,并希望执行以下操作: 发生了可怕的车祸 跳转到我的 (C) 故障处理程序 在备份 SRAM 中保存各种寄存器(CFSR、HFSR
我想在 LPC1768 上的 SRAM 中有一个中断例程。 我正在使用类似于 Yagarto 的 GCC 工具链。 目前我可以从 C 执行以下操作: NVIC_SetVector(TIMER0_IRQ
我有一个带有外部 ram 的 8051 微 Controller ,我想测试 ram 以查看它是否可以正确存储和加载数据(我认为它目前不能)。 在我的程序中,我将值 80h 写入内存的第一个字节,并且
有没有办法在 Linux 中读取 SRAM 信息?我需要读取一些未初始化或已初始化字节的状态? 谢谢! 最佳答案 如果您知道您的 SRAM 起始地址,而不是像往常一样通过指针算法访问映射内存,您可以只
我在 AVR 微 Controller (ATMega328P) 上运行的 C 程序中遇到了问题。我相信这是由于堆栈/堆冲突,但我希望能够确认这一点。 有什么方法可以可视化堆栈和堆的 SRAM 使用情
细化问题 如何从删除 block 大小为零的 MTD SRAM 设备读取和写入文本信息? 笔记: 我正在使用 23K256司机 尝试使用 MTD-Util 工具失败,因为 libmtd无法处理大小为零
我在拇指模式下使用 STM32L486ZG 开发板。我正在运行一个没有任何 RTOS 的简单裸机应用程序。我使用 FSM 将外部 SRAM 连接到电路板。外部 SRAM 位于地址 0x60000000
我正在尝试保留一些地址必须在加载时知道的 sram 字节,以便它可以装入 PROGSPACE。直到现在,我通过将地址设置为 (0x1F6) 并在我执行的程序中设置地址,在 arduino nano 板
我在 android studio 中使用 NDK 工具为 android 设备编写 C 程序。我想知道如何获取 SRAM 或 DRAM samsung galaxy S7 的起始地址。 最佳答案 听
没有细节的问题: 是否可以从 Linux 复制裸机可执行文件,从 DDR 运行到处理器内部 SRAM 中并运行它?此应用程序将暂停 DDR 并禁用电源轨以修复硬件问题。 详细信息: 我正在开发一款使用
我有一个相当大的 Arduino 项目(在 eclipse 中)使用 Serial.print("some string text") 命令进行大量调试消息,以便我可以一路调试。 我注意到的一件事是我
在具有 ARM A9 处理器、L2CACHE、SRAM 的系统上。是否有可能有一个C程序来获取以下性能数据: 平均。 SRAM 数据获取延迟。 平均。指令获取延迟。 最佳答案 如果您有要运行和测量的硬
首先介绍一下背景。在 avr tiny 中,数据可以存储在寄存器、sram、eeprom 或程序空间中。寄存器和 sram 是 volatile 存储,而 eeprom 和程序空间不是。 (即:未通电
我是一名优秀的程序员,十分优秀!