是否可以在ARM Cortex-M4体系结构(如STM32 F4)上分离基本FW和应用程序代码。我想做的是运行应用程序从外部闪光灯和基础FW从内部闪光灯。应用程序都实现了相同的"API“(单个头文件),但功能不同。
想法是基本的FW提供驱动程序,引擎和用户界面,可以作为独立的工作。当需要时,应用程序将提供额外的功能来将FW作为基础。所有应用程序都不能在内部闪存上闪烁,因为所有应用程序的总代码大小对于内部闪存来说太大了。另一个原因是,我们希望在不重新闪烁设备的情况下动态更新/添加应用程序。
所以,到目前为止,我对如何做到这一点几乎没有什么想法,但是这些方法中的任何一个可行还是有其他的选择?
感谢所有提示、提示和示例代码!
编辑:感谢您的回答,需要一些时间来消化这些。
这次试验的主要原因是允许更新设备功能而不闪烁基本FW,而不是节省SRAM/内部闪存。一种插件架构,提供简单的接口来扩展系统功能,而不需要改变底层系统。如果我不能建立系统执行代码从外部闪存(SD卡,NAND),我将尝试首次加载应用程序的动态SRAM/内部闪存。但我也会更深入地挖掘制造解决方案。
没有必要坚持STM芯片,我只是碰巧有他们的装备在我的桌子上。最后的目标是从SD卡或NAND内存中加载应用程序,因此在这一点上,我不想将实现限制为只使用或闪存。
通过使用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我还没有想到最终的操作系统,但很可能是免费/OpenRTOS
发布于 2015-01-14 15:16:20
编辑:实际上,您的芯片有一个外部内存映射(FMC/FSMC)。这将允许直接执行,所以如果您可以让它工作,这可能是最简单的方法。
如果您坚持使用这个芯片,那么将整个应用程序加载到SRAM中可能是最简单的。在RAM和Flash执行之间跳转不是一个问题,RAM和flash被映射到不同的地址。为了保持简单,您应该始终将应用程序加载到相同的RAM地址,并且您的应用程序需要在这个特定的地址上运行(通常使用链接器设置)。您可以尝试实现部分加载系统,它可以在需要时加载应用程序的部分,但这将需要一些努力,以设计主机FW和构建应用程序。
写到内部闪存可以工作,并可能是更好的,如果你是缺乏RAM。通常,内部闪存可以在执行时写入,但这通常会导致CPU延迟(CPU等待到flash操作完成),这可能不是问题。如果您查看您的芯片数据表,闪存的特征是至少10,000个擦除/写入周期。这意味着,如果你的芯片应该持续5年,你应该每天加载不到6个应用程序(你可以合理地加倍这个数量,也许更多,为典型的耐力,但没有保证)。
发布于 2015-01-14 14:58:33
皮质-M4与你所说的没有任何关系,大脑皮层-M4和所有arm处理器核一样,只是处理器核心--仅此而已,arm制造IP而不是芯片。您必须查看芯片供应商的实现,它们中的任何一个都提供了在外部闪存接口上执行代码的能力。我认为不会,就像很难找到一个从外部ram执行的微控制器,但它们比闪存更常见。几乎所有的代码都可以复制和运行,或者闪存和运行,运行在内部芯片资源上的代码将代码从外部资源复制到内部(rom/ram),然后在内部运行它,这些代码可以再次复制和跳转,或者返回到主片上固件以复制和加载下一个覆盖层。
芯片销售商应该能够告诉你闪光灯的寿命,闪光灯磨损了,设计成定期/不断擦除的代码,写闪光灯的代码会在几天、几周或几个月内耗尽,这取决于你惩罚闪光灯的严重程度。例如,当一辆汽车上的里程表读数时,可以将状态保存到prom或flash,这是一天一次或几次的事情,或者可能每隔几年就一次,但每隔十分之一英里节省一次就会在车辆寿命之前耗尽这部分。
m4s很难调用内置所有功能(浮点、缓存、mmu之类的东西)的微控制器,而且与皮层-M0兄弟姐妹相比,它往往有大量的内存和闪存。所以你最好的选择就是买一个有更多内存的,然后复制和跳跃。应该有很多适合你的零件.
发布于 2015-01-14 15:43:26
有些实现使用Cortex M3/M4微控制器,其中内部固件仅用于配置外部RAM并将其映射到内部内存映射,然后将主程序从外部媒体(如闪存芯片、SD卡等)加载到该RAM中并从其中执行(就像基于ARM处理器的Linux板一样,内部固件不过是一个初始引导加载程序)。
这家公司这样做:http://www.emcraft.com/
看一看,他们甚至使用STM32F4
最大的问题是Cortex M没有MMU,所以您不能在它上运行完全成熟的linux,将它限制在uClinux上。
编辑:这篇文章对你来说也很有趣:http://electronicdesign.com/embedded/practical-advice-running-uclinux-cortex-m3m4
https://stackoverflow.com/questions/27945069
复制相似问题