我正在为Arduino UNO(基于Atmel ATmega328p)编写一个调度程序,但我来自x86,并且我不知道如何在上下文切换上保存堆栈,以便稍后可以在返回到任务。如何在AVR架构中保存堆栈?
有人可以请解释如何做到这一点?
我正在为Arduino UNO(基于Atmel ATmega328p)编写一个调度程序,但我来自x86,并且我不知道如何在上下文切换上保存堆栈,以便稍后可以在返回到任务。如何在AVR架构中保存堆栈?
有人可以请解释如何做到这一点?
我所做的就是打谷歌的Arduino的堆栈转储,并得到这样的:
How do I dump my stack in 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++;
}
}
您不想在上下文切换中“保存堆栈”。
相反,您希望将处理器的状态保存到堆栈,然后将堆栈指针更改为不同的堆栈并从那里恢复上下文。
处理器状态的相关数据是SP,PC,STATUS寄存器和所有gpio寄存器。
通过调用您的交换功能将PC推入堆栈。您将SP保存在某个地方,以便稍后加载它。这意味着您只需将STATUS寄存器和32个gpio寄存器推入堆栈。
每个任务都需要自己的堆栈和变量来保存SP。您可以将这些保存在一个结构数组中。
AVR有很多开源的RTOS,你应该看看。另外,我认为这个问题太广泛了,因为你没有给出任何迹象表明哪部分任务会给你带来困难。例如,你知道如何编译和运行汇编代码吗?你知道AVR的堆栈指针是如何工作的吗?你知道如何将数据从堆栈复制到其他地方并更改堆栈指针吗? –