• 沒有找到結果。

3. 系統架構與實作

3.2. DSP System Kernel

3.2.2. Scheduler

為 了 讓 DSP 上 運 行 的 各 個 服 務 , 能 以 較 精 細 的 多 工 方 式 (fine-grain multitasking)同時運行,就必需讓各個服務反應時間儘量快速,不會因為某個服 務佔用CPU 時間過久,而造成只需要少許 CPU 時間的服務等待過久,因此採用 了CPU 時間分配最公平的 Timer-sharing 排程方式,以 Timer 倒數完後的 Interrupt service routine 來實作 scheduler。

因為這個Scheduler 為了使 DSP 能多工運行視訊碼編工作,排程的效率也是 很重要的,目標是能達到低overhead。並且隨著運行服務增加,排程也還是要很 有效率,也要達到時間複雜度是O(1),因此採用了 Round-robin 的方式,只需要 一個工作Queue,Scheduler 就可以很容易選取下一個工作。

工作Queue 是以雙向的 linked-list 實作,因為只有單向的 linked-list,要把新 增的工作加到Queue 的最後,就必需有一個 tail 的指標,指向著 Queue,但這樣 在Timer ISR 裡面就除了改 head 外,還要再多改 tail,一般來說服務在運行是有 可能會經過多次Timer ISR,但新增只有一次,沒必要在時常被呼叫的 Timer ISR 增 加 overhead 。 如 果 不 用 tail 的 指 標 , 那 每 次 新 增 工 作 就 只 能 用 迴 圈 從 head->next,測試達到最後一個節點後,再加入,但如果 Queue 裡面的工作越多,

新增工作所花費的時間會跟著增加。因此最後決定以雙向的linked-list 來實作,

其優點是不管從Queue 裡新增或移除工作都是 O(1)的時間。

Figure 30 是當發生 context switch 前後的工作 Queue,實線指向下一個工作,

虛線指向前一個工作,原本執行的順序是T1、T0、T3,context switch 時,只要 更新Head 為原本 Head 指向的下一個工作,所以新的執行順序是 T0、T3、T1。

T1

T3 T0

Head

T0

T1 T3

Head

Figure 30. Task Queue Operation for Context Switching

Figure 31 是新增工作到工作 Queue,原本的執行順序是 T1、T0、T3,新增 的 T4 則插入 Head 指向的前一個位置,需修改 T1 的前一個,T4 的下一個,和 T4 的前後,共有 4 個指標 assign 運算。之後新的執行順序是 T1、T0、T3、T4。

T1

T3 T0

T1

T4 T0

T3

Head Head

Figure 31. Adding Task to Task Queue

Figure 32 是工作 T1 執行完後,要從工作 Queue 裡移除,首先把 T1 的下一 個工作T0 和 T1 的前一個工作 T4,相互連結,只要兩個指標 assign 運算,但 Head 並不在這時更改為 T1 的下一個工作 T0,因為根據之前的 Framework,從執行 dequeue 函式後,T1 就會自願放棄 DSP 使用權,就會選取下一個工作來做 context switch,這時 Head 就會更改為 T1 的下一個工作 T0。而工作 Queue 裡沒有一個 工作會再指向T0,所以 T0 就完全被移除掉,新的工作順序是 T0、T3、T4。

T0

Figure 32. Task Queue Operation for Task Termination

因為在 Timer 的中斷發生時,被中斷的工作正運行到哪個指令,可以說是 隨機的,context switch 最直覺的做法就是把所有暫存器都 push 到 stack,等到選 出下個工作並切換stack 位置後,再 pop 回之前暫存的值。但越多暫存器被儲存,

就代表要花越多的時間來做context switch,這樣為了達到多工所帶來的 overhead 就會越高。DSP 的暫存器,如 Table 3 有這 13 類暫存器,總共有 55 個暫存器。

Table 3. DSP Registers

Register Description

AC0-AC3 Accumulator XAR0-XAR7/AR0-AR7 Auxiliary Register

BK03, BK47, BKC

BSA01, BSA23, BSA45, BSA67, BSAC Circular Buffer Register XCDP / CDP Coefficient Data Pointer XDP / DP Data Page Register DBIER0, DBIER1

IER0, IER1 IFR0, IFR1 IVPD, IVPH

Interrupt Register

PDP Peripheral Data Page Register PC, RETA, CFCT Program Flow Registers BRC0-1, BRS1, RSA0-1, REA0-1

RPTC, CSR Repeat Registers XSP / SP, XSSP / SSP Stack Pointers

ST0_55-ST3_55 Status Registers

T0-T3 Temporary Registers

TRN0, TRN1 Transition Registers

根據DSP的文件對Stack操作的描述[15],當中斷發生時,在DSP開始執行我 們的ISR之前,會把必要的暫存器PUSH進Stack,離開ISR時,會從Stack上POP 這些暫存器備份的值。這樣的自動Context switching,輔助我們去重建被中斷的 工作之context,如Figure 33,會先把ST0_55、ST2_55、DBSTAT、ST1_55、CFCT 和RETA,push到stack裡,再把PC複製到RETA,而跟Repeat指令有關的資訊則備 份在CFCT。因此這幾個暫存器,並不需要由scheduler來備份。

Figure 33. Auto Context Switch

如果我們設計的DSP Scheduler 在每次進行 context switching 時都要把所有 暫存器存到堆疊上,顯然 overhead 會太高。因此,在本論文實作的系統中,我 們針對DSP 可能會運行的服務(i.e. H.264 的 Intra frame 編碼器)所會用到的暫存 器進行分析,得知Circular Buffer Register、Interrupt Register,Data Page Register 和Peripheral Data Page Register 等等在這些服務中並不會用到。所以剩下總共 30 個暫存器需要備份。

Figure 34 是 Timer ISR 裡主要的程式碼,可分為五個部分:

1) 把正在運行工作的資訊備份在 stack。

2) 由工作 Queue 裡取得選取下一個工作,如果 Queue 裡沒有等待的工作,就選 取Idle process。

3) 切換正在目前在運行的 PCB,為被選取的 Process 的 PCB。

PSHBOTH XAR7

… PSHBOTH XAR0 PSH dbl(AC3)

… PSH dbl(AC0) PSH mmap(AC3G)

… PSH mmap(AC0G) PSH T3,T2

PSH T1,T0

PSH mmap(ST3_55) PSHBOTH XCDP PSH mmap(BRC0) PSH mmap(RSA0L) PSH mmap(RSA0H) PSH mmap(REA0L) PSH mmap(REA0H) PSH mmap(BRS1) PSH mmap(BRC1) PSH mmap(RSA1L) PSH mmap(RSA1H) PSH mmap(RA1L) PSH mmap(REA1H) PSH mmap(CSR) PSH mmap(RPTC) PSH mmap(TRN0) PSH mmap(TRN1)

MOV dbl(*(#_head)),XAR1 BCC next,AR1 != #0

MOV dbl(*(#_idle_pcb)),XAR2 MOV XAR2,dbl(*(#_select_pcb)) B noswitch

next:

// head = head->next

MOV dbl(*AR1(#0004h)),XAR2 MOV XAR2,dbl(*(#_head)) // select = head->pid

MOV *AR2,AC0

// select_pcb =&pcb[select]

SFTS AC0,#4,AC0 ADD #_pcb,AC0,AC0

MOV AC0,dbl(*(#_select_pcb)) noswitch:

4

2

1

MOV dbl(*(#_current_pcb)),XAR1

3

MOV RETA,dbl(*AR1+) MOV XSP,dbl(*AR1+) MOV SSP,*AR1+

MOV dbl(*(#_select_pcb)),XAR1 MOV XAR1,dbl(*(#_current_pcb)) MOV dbl(*AR1+),RETA

MOV dbl(*AR1+),XSP MOV *AR1+,SSP POP mmap(TRN1) POP mmap(TRN0) POP mmap(RPTC) POP mmap(CSR) POP mmap(REA1H) POP mmap(RA1L) POP mmap(RSA1H) POP mmap(RSA1L) POP mmap(BRC1) POP mmap(BRS1) POP mmap(REA0H) POP mmap(REA0L) POP mmap(RSA0H) POP mmap(RSA0L) POP mmap(BRC0) POPBOTH XCDP POP mmap(ST3_55) POP T1,T0

POP T3,T2

POP mmap(AC0G)

… POP mmap(AC3G) POP dbl(AC0)

… POP dbl(AC3) POPBOTH XAR0

… POPBOTH XAR7 NOP

5

NOP NOP NOP NOP NOP RETI

Figure 34. Context Switch 4) 把被選取工作的資訊從 stack 裡取出。

5) 返回中斷,前 6 個 NOP 指令是根據 TI 文件裡的 Advisory 要求所增加的[16]。

相關文件