FREERTOS的启动第一个任务代码分析

来源:互联网 发布:linux 字符编码转换 编辑:程序博客网 时间:2024/05/17 03:23

1.freertos的启动第一个任务的汇编代码如下,是在一个嵌入汇编形式的C函数里面,具体如下:

__asm void vPortSVCHandler( void ){PRESERVE8ldr 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, #0msr basepri, r0orr r14, #0xdbx r14}/*-----------------------------------------------------------*/__asm void vPortStartFirstTask( void ){PRESERVE8/* Use the NVIC offset register to locate the stack. */ldr r0, =0xE000ED08ldr 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 0nop}

其中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权威指南还是要研读下。要不看不懂底层汇编代码。

0 0
原创粉丝点击