0

我有一个支持 SD 卡连接器的评估板 ( Olimex STM32-P103 )。我想将我的程序放入 SD 存储器而不是微控制器的内部闪存;并从那里运行它。我不知道是否可以根据引导加载程序问题来做到这一点!

PS我的目标是在这块板上运行linux,然后将我的应用程序移植到它上面。

4

4 回答 4

6

一般来说,要从 SD 卡运行程序,您应该知道不能“立即”运行它们。这意味着,您必须将其加载到地址空间中某处的可执行内存中,这由(或多或少)简单的bootloader完成。在最简单的情况下,引导加载程序能够从 SD 卡中读取特定的二进制文件并将其复制到内存中。

话虽如此,考虑到您的板上只有 20k 的 RAM 和 128k 的闪存,您应该考虑这一点。那么你的程序应该去哪里呢?或者更好:为什么不从一开始就用 128k 的 Flash 烧写程序?特别是你应该知道 Linux 在内存方面有点“饿”。

如果你的目标是在这个板上运行一个“普通”的 Linux,恐怕你就完蛋了。这是因为据我所知,Linux 需要一个MMU才能运行,而这块板上的芯片不提供一个(就可研究而言,无需访问 ST 的数据表)。

如果幸运的话,您可以使用uCLinux。我不确定 STM32 是否存在已完成的端口,但似乎有一些基于谷歌搜索“STM32 uCLinux”的资源。但是,即使您设法运行 uCLinux,恐怕您的系统中没有多少可用于您的应用程序,因此结果可能有点令人失望。

根据您寻找在此 MCU 上运行 Linux 的原因,可能还有其他解决方案,例如FreeRTOS与 lwIP 堆栈(如果需要联网)或 FAT 库(如FullFAT )(如果您正在寻找读取 SD 卡和东西。

编辑:我想补充的一件事是,从 SD 卡引导通常是您使用“更大”(不多但略微)系统所做的事情,您有足够的 RAM 来保存您想要运行的整个映像在其中,仍然为您要处理的数据留有一些空间。

于 2013-02-19T15:55:31.860 回答
3

SD卡上的数据不是内存映射的,所以不能直接执行。

可以将卡中的数据动态加载到 RAM 中执行。WindRiver 的 VxWorks RTOS 支持动态加载和链接对象模块,我知道没有其他操作系统可以扩展到直接支持它的 Cortex-M,但可以编写自己的。

但是,我建议对于您使用的微控制器,这个想法是不明智的;当代码在片上闪存中并且数据在 RAM 中时,Cortex-M 上的最佳性能可以实现,从而允许在单独的总线上同时获取数据和指令(哈佛架构)。如果您从 RAM 执行代码,性能将受到严重影响,因为必须在同一总线上按顺序获取数据和指令。

该板完全不适合运行 Linux,只有 128K 字节的程序闪存,而 20K 字节的 RAM 根本不可行。即使是最小的 Linux 发行版也需要 600Kb RAM 加上应用程序代码所需的任何东西。uClinux 几乎可以在具有外部 RAM 和 Flash 的高端 STM32 上运行,但这会受到相同的总线争用性能影响,而且没有 MMU 的 Linux 完全没有使用 Linux 的一个主要好处。您板上的部件缺少外部存储器接口,因此无法扩展以支持 Linux。

如果您需要操作系统,请考虑使用 RTOS,例如 uC/OS-II、FreeRTOS 或 emBOS。

于 2013-02-19T21:21:00.893 回答
3

您将不得不在 STM 的板载闪存(通常称为“引导加载程序”)中有一些代码来实现这一点,因为“裸机”很可能无法从 SD 卡引导。

您将不得不构建该代码,该代码弄清楚如何使用 STM 的板载外围设备与 SD 卡通信,找到您想要在文件系统中运行的文件(您还必须实现),并加载它。

我想包含一个指向 STM 标准外围库的链接,但它似乎已关闭(正在移动)。:/

于 2013-02-19T14:42:39.027 回答
0

正如其他人所说,您不能直接从 SD 卡直接执行代码。但就像那些“linux board”一样,您可以将存储的内核/程序加载到可以映射并从那里执行的外部 SDRAM 中。您仍然需要编写该“引导加载程序”并将其存储在内部闪存中。

对于有限的应用程序,我认为这是很多工作。如果您想在 linux 环境中编写应用程序,然后将其移植到小目标,我宁愿使用依赖注入来设计我的应用程序,甚至使用模拟器。

于 2019-07-22T15:10:26.583 回答