uCOS-II移植到51微控制器任務切換壓棧和出棧的操作
阿新 • • 發佈:2019-01-24
UCOS-II嵌入式實時作業系統 在任務切換時,微控制器壓入堆疊和出棧結構圖
由於51系列微控制器要求堆疊必須設定在片內RAM(IDATA)中,而這種處理器的片內RAM非常有限,不可能把應用程式中的所有任務的任務堆疊都設定在片內RAM中,所以就只能把應用程式中各個任務堆疊的內容存放在片外RAM,只在片內RAM中設定一個公用的堆疊(即片內RAM只存放將要執行的任務堆疊)。在任務切換時,CPU先把當前的任務壓入系統堆疊,再把系統堆疊的任務複製到片外堆疊中儲存起來,最後再從片外堆疊把將要執行的任務堆疊映像複製到系統堆疊中。
51微控制器的外部RAM中設定任務堆疊映像,其最低地址空間用來存放使用者堆疊的長度,並使該任務的TCB中的OSTCBStkPtr指標變數指向該地址。
51微控制器的堆疊指標SP總是先加1再存資料,因此,SP初始時指向系統堆疊起始地址(OSStack)減1處(OSStkStart)。所以系統堆疊的長度為SP~OSStkStart。
在任務切換時,應先把當前任務在系統堆疊的內容複製儲存到該任務堆疊映像中。也就是計算SP~OSStkStart得出堆疊的長度,並將其寫入任務堆疊映像最低地址空間中;然後以其為長度,以任務堆疊映像最低地址為目標起始地址,以OSStkStart為源起始地址,由系統堆疊向任務堆疊映像複製資料。反之,由任務堆疊映像向系統堆疊複製資料,則相反便是。