【发布时间】:2015-08-23 05:43:23
【问题描述】:
我正在使用带有裸机实现(无操作系统)的 Cortex-M0 处理器。我们有一个固件应用程序,我们希望允许第三方编写一个 C 函数,该函数将与固件的其余部分分开构建并加载到内存中(有点像 DLL),并在检测到时由主固件调用。
我遇到的问题是我想在受保护的环境中运行这个外部函数,这样如果它产生故障异常或执行时间过长,它就不会破坏主固件。所以我想做的是,从硬故障 ISR(用于故障异常)或计时器滴答 ISR(用于执行时间问题),操纵堆栈以终止外部函数并将执行返回到主固件。我意识到这在 RTOS 中是直截了当的,但主要固件已经开发完成,此时切换它需要花费大量精力。
我查看了在 c++ 中使用 try-catch,但编译器似乎不支持它。所以我看到的另一个选择是在调用外部函数之前编写一些程序集来保存堆栈指针,并从 ISR 恢复 SP 和上下文,并分支到主固件中的返回点。任何人都可以就如何最好地做到这一点给出任何指示,或者有没有更简单的方法来完成这个?
【问题讨论】:
-
使用 RTOS 不会更容易,因为它们没有动态加载/执行的规定。您仍然必须为该功能提供自己的包装器。问题不在于捕获异常并回滚堆栈,而在于防止该函数链接 RAM。 MPU是否足够完全取决于您的内存布局以及您希望允许的功能。例如,如果它不仅有自己的堆栈,它可能会破坏堆栈。
-
是否有机会使用小型解释语言而不是本机代码来防止 CPU/内存直接访问第 3 方代码?
-
Brian - 我们确实做了一个初始实现,它使用了一种解释性的汇编语言,它使用 excel 作为汇编程序。然而,逻辑要求变得如此,用汇编程序编写是繁重的。因此我们决定切换到 C。第三部分将无法直接访问任何静态内存。他们将被赋予访问固定大小的控制值数组的功能。他们在堆栈上使用局部变量是一个问题。 Cortex-m0 确实有一个我可以使用的进程堆栈,但现在我认为我们将提供一些关于局部变量使用的规则。
-
我不认为 cortex-m0 有完整的保护,所以这个覆盖的应用程序可以丢弃包括保护你的东西在内的东西。我不认为 RTOS 可以发明一些你还没有的东西(保护)(除非你的芯片中有 PMSA,请参阅 arm 文档),但你实际上正在做的是创建一个操作系统。所以你可以对你的代码进行计时器检查,看看它是否有任何时间片等,或者用某种方法来检测程序是否丢失,但我认为一个表现不佳的程序通常会让你崩溃