基础FW提供驱动程序、引擎和UI,并可以作为独立运行。当需要时,应用程序将为基础FW提供额外的功能。所有应用程序不能全部烧录到内部闪存中,因为所有应用程序的总代码大小对于内部闪存来说太大了。另一个原因是我们希望在不重新烧录设备的情况下即可更新/添加应用程序。
到目前为止,我有一些如何做到这一点的想法,但这些想法是否可行或是否有其他选择?
1. 将应用程序动态加载到内部SRAM中 - RAM消耗可能会成为问题。 - 不确定基础FW和应用程序代码是否可以同时执行。应用程序代码函数可以从基础FW中调用,反之亦然吗?我已经看到过使用flash-loader的技术,但一旦你开始从RAM中运行代码,就不能再执行来自flash的代码了?
2. 从外部闪存将应用程序烧录到内部闪存中。 - 不确定内部闪存的寿命有多长。内部闪存的最大写入次数是多少?需要每天更改应用程序1-20次。 - 当从中执行代码(应用程序加载器)时,是否可以烧录内部闪存的一部分?
3. 查找支持在内部闪存和外部闪存同时运行代码的Cortex-M4。 - 我没有找到任何可能性,可能不可能使用Cortex-M4架构?
欢迎提供所有提示、建议和示例代码!
编辑:感谢回答,需要一些时间来消化这些。
这个试验的主要原因是允许更新设备功能而无需刷新基础FW,而不是为了节省SRAM/内部闪存。这是一种插件架构,提供简单的接口以扩展系统功能,而无需修改底层系统。如果我不能构建执行来自外部闪存(SD卡、NAND)的代码的系统,我将首先尝试将应用程序动态加载到SRAM/内部闪存中。但我也会深入挖掘emcraft解决方案。
没有必要坚持使用STM芯片,我只是碰巧在我的桌子上有他们的开发套件。最终目标是从SD卡或NAND存储器加载应用程序,因此在这一点上,我不想限制实现仅适用于NOR闪存。
我将使用STM32 F4 devkit进行最小实现。首先,我需要在其上包装一些NAND/SD卡。我将尝试将应用程序加载到SRAM和内部闪存中的两个选项,以查看它们的工作原理以及对性能的影响。正如Clifford所说,挑战更多地在于链接、构建和工具集设置。即使我可以强制应用程序始终位于内存的同一位置,但函数将位于不同的位置,需要找出如何处理这个问题。示例/演示将很有帮助。
我的最小实现规范。
Project 1: Base FW
Driver for accessing applications from external flash
Minimal filesystem to write and read applications to/from external flash
UART commands -- Write applications to external flash -- Load applications from external flash to SRAM/Internal flash -- Execute application and print result to UART
Interface.h
int functionWrapper(int functionNumber)
bool initApplication()
int executeMathOperation1(int a, int b)
int executeMathOperation2(int a, int b)
Project 2: Application 1
MathOp1: Sums up two values
MathOp2: Multiply up two values
Project 3: Application 2
MathOp1: Subtracts two values
MathOp2: Divide two values
我还没有确定最终的操作系统,但很可能会选择自由/开放源代码的RTOS。