FreeRTOS v7.6.0程式源碼
在source資料夾
list.c
task.c
在source/portable/SDCC/Cygnal/資料夾=>for 8051
排程由vTaskStartScheduler()開始
其流程之起始動作如下
call back
book掛勾
真正的排程在此程式
與平台有關之排程副程式,此副程式在port.c
以8051為例
在FreeRTOS/Source/portable/SDCC/Cygnal/port.c中之xPortStartSchedular之流程
XRAM表外部RAM
RAM表內部RAM
portCOPY_XRAM_TO_STACK()
pxXRAMStack=(portSTACK_TYPE *)*(pxCurrentTCB);//儲存在TCB的資料
pxRAMStack=configSTACK_START-1;//8051堆疊之起始位置,可以自行規劃,在Fre
eRTOSConfig_h 中定義,範圍為0x0e,目的要將TCB資料複製到stack
ucStackBytes=pxXRAMStack[0];
開使複製
do {
pxXRAMStack++;pxRAMStack++;
*pxRAMStack=*pxXRAMStack;
ucStackBytes--;
}while(ucStackBytes);
portRESTORE_CONTEXT()
從堆疊區將資料讀到(以下使用組合語言,因C語言無法POP或PUSH)
POP _bp
POP PSW
POP ar1//SDCC使用ar1代表R1暫存器
POP ar0
POP ar7
. .
. .
POP ar2
POP b
POP DPH
POP DPL
POP ACC
JB ACC.7,_next
CLR IE.7
JMP _end
_next:
SETB IE.7
_end:
POP ACC
RETI
以上程式接在port.c內
從堆疊區將暫存器資料存到系統暫存器之動作我們稱為文本回覆restore context
系統滴答的中斷服務程式(此為排程之核心)
8051使用Timer2作為系統計時中斷計時器,其服務程式為vTimer2ISR(),其流程如下
x有回傳值
px指標回傳值
v無回傳值
xTaskIncrementTick()
vTaskSwitchContext()
此兩副程式在task.c中
vTaskSwitchContext()之流程
檢查若堆疊益位則不切換工作
xTaskIncrementTick()之流程
沒有留言:
張貼留言
文章有誤或有問題麻煩您留言告知! 謝謝您~~