【问题标题】:Should I disable interrupts when executing code from RAM?从 RAM 执行代码时我应该禁用中断吗?
【发布时间】:2016-09-29 23:52:21
【问题描述】:

我正在构建一个更新功能,它可以完全擦除我的程序代码用完程序闪存,并在其位置上闪存一个新图像。为此,需要将更新功能复制到 RAM 中并在其 RAM 位置分支到它以执行实际的擦除/编程功能。

void update(){
  //Erase flash
  //Program flash
}

void main(){
  // ...

  ramfunction = copytoram((int)update);
  ramfunction();
}

这个过程似乎应该对我有用,但由于某种原因,当我运行它时,它失败了。我似乎可以用调试器单步执行它,但是当我运行它时失败了。

我是否应该通过禁用中断来保护ramfunction();?我确实有其他任务在后台运行。还有其他可能的问题吗?

非常感谢!

编辑 - 所有其他任务都从闪存运行。更新功能也链接到从闪存运行,但我可以成功地将它复制到 ram 并分支到它。我什至可以单步执行(至少是反汇编代码),只有在执行时才会遇到问题。

【问题讨论】:

  • 我觉得这是一个非常有趣的问题,虽然它可能会因为它相当广泛而被关闭。
  • @xxbbcc:假设会添加必要的细节,它仍然不会普遍适用。这个主题的变量太多了。
  • 我可以为您提供什么以使其更具体?
  • 其他任务是否从闪存运行?中断向量是否指向闪存中的代码?更新函数的位置是独立的,还是链接到从 ram 运行,即使它是在闪存中加载的?更新功能(或任何其他任务)是否使用存储在闪存中的任何常量?这是一个多核 CPU,禁用中断不会停止其他内核上的任务?
  • 是的,所有其他任务都从闪存运行。更新功能也链接到从闪存运行,但我可以成功地将它复制到 ram 并分支到它。我什至可以单步执行它(至少是反汇编代码),只有当我运行它时才会遇到问题。

标签: c ram


【解决方案1】:

如果您有其他任务同时运行,它们可能会中断 ramfunction 的编程阶段。这可能导致灾难性故障。我会尝试这样的事情:

void main(){
  // ...

  ramfunction = copytoram((int)update);
  disable_interrupts();
  ramfunction();
  enable_interrupts();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 2022-08-08
    • 2013-12-09
    • 1970-01-01
    • 2011-09-13
    • 2014-01-01
    • 2022-06-17
    相关资源
    最近更新 更多