FreeRTOS源码分析-异常处理

来源:互联网 发布:淘宝怎么买电鸡 编辑:程序博客网 时间:2024/05/17 04:13
__asm void vPortSVCHandler( void ){PRESERVE8ldrr3, =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, #0msrbasepri, r0orr r14, #0xdbx r14}/*-----------------------------------------------------------*/__asm void prvStartFirstTask( 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}__asm void xPortPendSVHandler( void ){extern uxCriticalNesting;extern pxCurrentTCB;extern vTaskSwitchContext;PRESERVE8mrs r0, pspldrr3, =pxCurrentTCB/* Get the location of the current TCB. */ldrr2, [r3]stmdb r0!, {r4-r11}/* Save the remaining registers. */str r0, [r2]/* Save the new top of stack into the first member of the TCB. */stmdb sp!, {r3, r14}mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITYmsr basepri, r0bl vTaskSwitchContextmov r0, #0msr basepri, r0ldmia sp!, {r3, r14}ldr r1, [r3]ldr r0, [r1]/* The first item in pxCurrentTCB is the task top of stack. */ldmia r0!, {r4-r11}/* Pop the registers and the critical nesting count. */msr psp, r0bx r14nop}void xPortSysTickHandler( void ){/* The SysTick runs at the lowest interrupt priority, so when this interruptexecutes all interrupts must be unmasked.  There is therefore no need tosave and then restore the interrupt mask value as its value is alreadyknown. */( void ) portSET_INTERRUPT_MASK_FROM_ISR();{/* Increment the RTOS tick. */if( xTaskIncrementTick() != pdFALSE ){/* A context switch is required.  Context switching is performed inthe PendSV interrupt.  Pend the PendSV interrupt. */portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;}}portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 );}
                AREA    RESET, DATA, READONLY                EXPORT  __Vectors__Vectors       DCD     __initial_sp              ; Top of Stack                DCD     Reset_Handler             ; Reset Handler                DCD     NMI_Handler               ; NMI Handler                DCD     HardFault_Handler         ; Hard Fault Handler                DCD     MemManage_Handler         ; MPU Fault Handler                DCD     BusFault_Handler          ; Bus Fault Handler                DCD     UsageFault_Handler        ; Usage Fault Handler                DCD     0                         ; Reserved                DCD     0                         ; Reserved                DCD     0                         ; Reserved                DCD     0                         ; Reserved                DCD     vPortSVCHandler           ; SVCall Handler                DCD     DebugMon_Handler          ; Debug Monitor Handler                DCD     0                         ; Reserved                DCD     xPortPendSVHandler        ; PendSV Handler                DCD     xPortSysTickHandler       ; SysTick Handler


 

 


 

0 0
原创粉丝点击