2017-05-21 21 views
0

我正在为Arduino UNO(基于Atmel ATmega328p)编写一个调度程序,但我来自x86,并且我不知道如何在上下文切换上保存堆栈,以便稍后可以在返回到任务。如何在AVR架构中保存堆栈?

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

+0

AVR有很多开源的RTOS,你应该看看。另外,我认为这个问题太广泛了,因为你没有给出任何迹象表明哪部分任务会给你带来困难。例如,你知道如何编译和运行汇编代码吗?你知道AVR的堆栈指针是如何工作的吗?你知道如何将数据从堆栈复制到其他地方并更改堆栈指针吗? –

回答

-1

我所做的就是打谷歌的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++; 
    } 
} 
2

您不想在上下文切换中“保存堆栈”。

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

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

通过调用您的交换功能将PC推入堆栈。您将SP保存在某个地方,以便稍后加载它。这意味着您只需将STATUS寄存器和32个gpio寄存器推入堆栈。

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