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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值