advertisement

2014年12月26日

2014/12/26進階微控制器應用

需下載
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()之流程







沒有留言:

張貼留言

文章有誤或有問題麻煩您留言告知! 謝謝您~~