使用 FreeRTOS、LittleFS 和 gcc-arm-none-eabi 在固件中实现插件功能

问题描述 投票:0回答:1

我目前正在从事一个涉及 Cortex-M 微控制器 (NXP RT1175) 固件开发的项目。我的开发堆栈包括 FreeRTOS、LittleFS 和 gcc-arm-none-eabi 工具链。我希望在此固件中实现“插件”功能,我的客户可以编写自己的算法并独立部署它们。

我面临的主要挑战是设计一个系统,其中这些插件可以动态加载(仅在启动时一次)并由固件执行。插件应该能够与固件提供的现有功能(API 和函数)进行交互。以下是一些具体内容:

  • 固件基础:固件当前未编译为位置无关代码(PIC),我正在使用各种框架,例如 FreeRTOS 和 LittleFS。
  • 插件要求:这个想法是让客户使用相同的工具链(gcc-arm-none-eabi)单独编译他们的插件。插件需要调用固件中定义的函数,这意味着它们需要知道这些函数的入口点。
  • 当前方法:我正在考虑使用文件系统方法(通过 LittleFS),其中固件将在特定目录中查找插件文件并将它们加载到 RAM 中以供执行。插件可以编译为PIC。

我对此设置有一些疑问:

  1. 插件文件格式的最佳实践:考虑到当前的工具链和框架,这些插件的合适文件格式是什么?我正在考虑需要加载到不同 RAM 地址的代码和数据内存。
  2. 处理函数入口点:由于固件当前未编译为 PIC 并且函数地址可能会随着每次编译而变化,那么让插件了解这些函数入口点的最佳方法是什么?
  3. 安全稳定:如何保证系统在加载和执行第三方插件时的安全稳定?

任何指导、建议或类似实现的参考都将不胜感激。

plugins embedded cortex-m freertos
1个回答
0
投票

动态加载通常是操作系统的一项功能,而 FreeRTOS 本身并不支持该功能。

VxWorks 是一个可以动态加载和链接对象模块的 RTOS 示例。这些模块是通过“部分链接”生成的,其中生成的对象带有一些未解析的外部符号。在这种情况下,VxWorks 有一个动态加载器,它将加载对象中的外部链接解析为目标上的现有代码。 要实现该目标,需要提供完整的符号表。这不利于占用空间非常小的系统 - 特别是如果您支持链接 C++ 代码。 VxWorks 命令 shell 中使用相同的符号表来运行加载的或静态的代码。本质上,任何具有外部链接的函数都会成为入口点,因此例如在命令 shell 中键入

printf "hello"

完全符合您的预期。您只需要一个命名约定,例如

pluginMain()
。 VxWorks 有一种搜索符号表的方法,您可以使用模式匹配来查找插件。
但是我不会推荐任何这些。将链接任意代码加载到核心二进制文件从根本上来说是不安全的。

更安全、更简单、更可靠的解决方案是嵌入脚本语言解释器,例如

Lua

MicroPython。我曾经开发过一个产品,我们使用 Forth 启用了最终用户定制(尽管我不太愿意推荐它!)。然后,您可以仅公开您希望最终用户能够使用的接口,而不是在整个代码中有效地让他们自由支配。

© www.soinside.com 2019 - 2024. All rights reserved.