FREERTOS的啟動第一個任務程式碼分析
阿新 • • 發佈:2019-01-25
1.freertos的啟動第一個任務的彙編程式碼如下,是在一個嵌入彙編形式的C函式裡面,具體如下:
__asm void vPortSVCHandler( void ) { PRESERVE8 ldr r3, =pxCurrentTCB /* Restore the context. */ ldr r1, [r3] /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ ldmia r0!, {r4-r11} /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ msr psp, r0 /* Restore the task stack pointer. */ mov r0, #0 msr basepri, r0 orr r14, #0xd bx r14 } /*-----------------------------------------------------------*/ __asm void vPortStartFirstTask( void ) { PRESERVE8 /* Use the NVIC offset register to locate the stack. */ ldr r0, =0xE000ED08 ldr r0, [r0] ldr r0, [r0] /* Set the msp back to the start of the stack. */ msr msp, r0 /* Globally enable interrupts. */ cpsie i /* Call SVC to start the first task. */ svc 0 nop }
其中vPortStartFirstTask()裡面呼叫svc 0指令觸發一個svc中斷,然後執行vPortSVCHandler中斷服務函式,因為裡面有載入任務列表最高優先順序的任務,前面的幾條有英文註釋,基本能懂,接著就是把任務的堆疊指標存入PSP暫存器,然後寫入0到basepri暫存器,遮蔽所有中斷,最後兩條的意思可以參考如下連結:
http://bbs.csdn.net/topics/390690297
精華部分摘錄如下:
svc 0
nop
現在的cpu都是多流水的,前一個指令執行的時候,後一條指定已經在譯碼了,所以svc 0後面必須跟條指令,不讓cpu譯碼的時候出錯就行
orr r14, #0xd
bx r14
當r14為0xFFFFFFFX,執行是中斷返回指令,cortext-m3的做法,X的bit0為1表示返回thumb狀態,bit1和bit2分別表示返回後sp用msp還是psp、以及返回到特權模式還是使用者模式
有本書叫做 cortex-m3權威指南,既然搞M3,那本書是必讀的。。
cortex-m3權威指南還是要研讀下。要不看不懂底層彙編程式碼。