如何在 AVR 架构中保存堆栈



我正在为 Arduino UNO(基于 Atmel ATmega 328p(编写一个调度程序,但我来自 x86,我不知道如何将堆栈保存在上下文切换上,以便以后可以在返回任务时恢复它。

有人可以解释一下如何做到这一点吗?

您不希望在上下文切换中"保存堆栈"。

相反,您希望将处理器的状态保存到堆栈,然后将堆栈指针更改为其他堆栈并从那里还原上下文。

处理器状态的相关数据是 SP、PC、STATUS 寄存器和所有 GPIO 寄存器。

PC 通过调用您的切换函数被推送到堆栈上。将 SP 保存在某个位置,以便以后可以加载它。这意味着您只需将 STATUS 寄存器和 32 个 gpio 寄存器推送到堆栈上。

每个任务都需要自己的堆栈和变量来容纳 SP。您可以将这些保存在结构数组中。

我所做的只是点击谷歌的Arduino堆栈转储并得到这个:

如何在 Arduino 中转储我的堆栈?

这是链接的代码形式,因为他们甚至不喜欢链接到自己的网站。

uint8_t stackArray[30];
void createStackDump() 
{
  volatile uint8_t* mSP = (uint8_t*)SP;
  for (int i = 0; i < 30; i++) 
  {
    stackArray[i] = *mSP;
    mSP++;
  }
}

最新更新