【发布时间】:2014-06-18 04:11:50
【问题描述】:
我正在为基于 STM32F103 的 ARM 微控制器(使用 GCC 编译)开发一些软件。我的一些用户希望能够将相同的二进制文件与同一芯片的不同版本(具有更多 RAM)一起使用,因此我需要一种方法来找出我在运行时有多少 RAM。
有一个地址 (0x1FFFF7E0) 包含闪存大小,但似乎没有包含 RAM 大小的地址!
显而易见的解决方案是运行内存地址检查哪些是可读/可写的,但我已经尝试过这个和从太高的 RAM 地址读取时的芯片 HardFaults(我不知道如何恢复)。
对于解决这个问题的最佳方法有什么想法吗?理想情况下,我会进行实验,因为一些芯片(比如我现在使用的 STM32F103RCT6)实际上似乎有 64kB 的 RAM,即使数据表显示它们有 48 个。例如,0x1FFFF7E0 寄存器报告 256kB 的可用闪存,即使 512kB 是可用的.
看起来我可以在 CCR 寄存器中设置 BFHFNMIGN 位,然后尝试从软件中断中访问内存 - 但是我不知道如何在 GCC+STM32 中调用或创建软件中断
【问题讨论】:
-
好的,理想情况下我只需要一种方法来读取地址并查看它是否有效。看起来我可以通过设置 SHCSR.BUSFAULTENA 来打开 busfault 处理程序,然后我可以在 irq 处理程序中设置 SHCSR.BUSFAULTACT=0,但是从它返回后我仍然得到一个硬故障。跨度>
-
顺便说一句,但在某些芯片上,0x1FFFF7E2 处的 2 个字节显示了工厂编程的 RAM 大小。在 F103RG 上就是这种情况,但在我拥有的 F103RC 上却不是。它也不是实际 RAM 大小 - 就像闪存大小一样,它是工厂编程的大小。
-
您可能需要注意的一件事是,如果您发现 ram 不是用于用户代码的 - 我很确定某些 USB 芯片已经为用户代码不应该弄乱的芯片的usb部分。但是,如果您不使用这些功能,那也没关系...
-
是的,但是我在一个非常有限的区域内搜索。例如,我知道 STM32F1 芯片可以配备高达 96kB 的 RAM,所以我只检查高达 0x20000000+96kB。据我所知,那个家庭的所有东西要么有用户 RAM,要么在那个区域没有任何东西。
-
在生产系统上使用数据表中未提及的 RAM 是不是有点冒险?我只是想知道......当然,这部分 RAM 有 99.9% 的可能性会像其他任何部分一样,但不能保证这一点。
标签: gcc arm runtime ram cortex-m3