2017-05-21 19 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。您可以將這些保存在一個結構數組中。