1. 程式人生 > >FREERTOS的啟動第一個任務程式碼分析

FREERTOS的啟動第一個任務程式碼分析

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權威指南還是要研讀下。要不看不懂底層彙編程式碼。