Get preeprocessor working correctly.
parent
1217e8ce06
commit
5cb4e9b5a6
@ -0,0 +1,148 @@
|
|||||||
|
#include "FreeRTOSConfig.h"
|
||||||
|
|
||||||
|
.extern pxCurrentTCB
|
||||||
|
.extern vTaskSwitchContext
|
||||||
|
.extern vTaskIncrementTick
|
||||||
|
.extern vPortISRHandler
|
||||||
|
|
||||||
|
.global vPortStartFirstTask
|
||||||
|
.global vPortYield
|
||||||
|
.global vPortTickISR
|
||||||
|
.global vPortISRWrapper
|
||||||
|
|
||||||
|
.set BChainField, 0
|
||||||
|
.set NextLRField, BChainField + 4
|
||||||
|
.set MSRField, NextLRField + 4
|
||||||
|
.set PCField, MSRField + 4
|
||||||
|
.set LRField, PCField + 4
|
||||||
|
.set CTRField, LRField + 4
|
||||||
|
.set XERField, CTRField + 4
|
||||||
|
.set CRField, XERField + 4
|
||||||
|
.set USPRG0Field, CRField + 4
|
||||||
|
.set r0Field, USPRG0Field + 4
|
||||||
|
.set r2Field, r0Field + 4
|
||||||
|
.set r3r31Field, r2Field + 4
|
||||||
|
.set IFrameSize, r3r31Field + ( ( 31 - 3 ) + 1 ) * 4
|
||||||
|
|
||||||
|
|
||||||
|
.macro portSAVE_STACK_POINTER_AND_LR
|
||||||
|
|
||||||
|
/* Get the address of the TCB. */
|
||||||
|
xor R0, R0, R0
|
||||||
|
addis R2, R0, pxCurrentTCB@ha
|
||||||
|
lwz R2, pxCurrentTCB@l( R2 )
|
||||||
|
|
||||||
|
/* Store the stack pointer into the TCB */
|
||||||
|
stw SP, 0( R2 )
|
||||||
|
|
||||||
|
/* Save the link register */
|
||||||
|
stwu R1, -24( R1 )
|
||||||
|
mflr R0
|
||||||
|
stw R31, 20( R1 )
|
||||||
|
stw R0, 28( R1 )
|
||||||
|
mr R31, r1
|
||||||
|
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro portRESTORE_STACK_POINTER_AND_LR
|
||||||
|
|
||||||
|
/* Restore the link register */
|
||||||
|
lwz R11, 0( R1 )
|
||||||
|
lwz R0, 4( R11 )
|
||||||
|
mtlr R0
|
||||||
|
lwz R31, -4( R11 )
|
||||||
|
mr R1, R11
|
||||||
|
|
||||||
|
/* Get the address of the TCB. */
|
||||||
|
xor R0, R0, R0
|
||||||
|
addis SP, R0, pxCurrentTCB@ha
|
||||||
|
lwz SP, pxCurrentTCB@l( R1 )
|
||||||
|
|
||||||
|
/* Get the task stack pointer from the TCB. */
|
||||||
|
lwz SP, 0( SP )
|
||||||
|
|
||||||
|
.endm
|
||||||
|
|
||||||
|
|
||||||
|
vPortStartFirstTask:
|
||||||
|
|
||||||
|
/* Get the address of the TCB. */
|
||||||
|
xor R0, R0, R0
|
||||||
|
addis SP, R0, pxCurrentTCB@ha
|
||||||
|
lwz SP, pxCurrentTCB@l( SP )
|
||||||
|
|
||||||
|
/* Get the task stack pointer from the TCB. */
|
||||||
|
lwz SP, 0( SP )
|
||||||
|
|
||||||
|
/* Restore MSR register to SRR1. */
|
||||||
|
lwz R0, MSRField(R1)
|
||||||
|
mtsrr1 R0
|
||||||
|
|
||||||
|
/* Restore current PC location to SRR0. */
|
||||||
|
lwz R0, PCField(R1)
|
||||||
|
mtsrr0 R0
|
||||||
|
|
||||||
|
/* Save USPRG0 register */
|
||||||
|
lwz R0, USPRG0Field(R1)
|
||||||
|
mtspr 0x100,R0
|
||||||
|
|
||||||
|
/* Restore Condition register */
|
||||||
|
lwz R0, CRField(R1)
|
||||||
|
mtcr R0
|
||||||
|
|
||||||
|
/* Restore Fixed Point Exception register */
|
||||||
|
lwz R0, XERField(R1)
|
||||||
|
mtxer R0
|
||||||
|
|
||||||
|
/* Restore Counter register */
|
||||||
|
lwz R0, CTRField(R1)
|
||||||
|
mtctr R0
|
||||||
|
|
||||||
|
/* Restore Link register */
|
||||||
|
lwz R0, LRField(R1)
|
||||||
|
mtlr R0
|
||||||
|
|
||||||
|
/* Restore remaining GPR registers. */
|
||||||
|
lmw R3,r3r31Field(R1)
|
||||||
|
|
||||||
|
/* Restore r0 and r2. */
|
||||||
|
lwz R0, r0Field(R1)
|
||||||
|
lwz R2, r2Field(R1)
|
||||||
|
|
||||||
|
/* Remove frame from stack */
|
||||||
|
addi R1,R1,IFrameSize
|
||||||
|
|
||||||
|
/* Return into the first task */
|
||||||
|
rfi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
vPortYield:
|
||||||
|
|
||||||
|
portSAVE_STACK_POINTER_AND_LR
|
||||||
|
bl vTaskSwitchContext
|
||||||
|
portRESTORE_STACK_POINTER_AND_LR
|
||||||
|
blr
|
||||||
|
|
||||||
|
vPortTickISR:
|
||||||
|
|
||||||
|
portSAVE_STACK_POINTER_AND_LR
|
||||||
|
bl vTaskIncrementTick
|
||||||
|
|
||||||
|
#if configUSE_PREEMPTION == 1
|
||||||
|
bl vTaskSwitchContext
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Clear the interrupt */
|
||||||
|
lis R0, 2048
|
||||||
|
mttsr R0
|
||||||
|
|
||||||
|
portRESTORE_STACK_POINTER_AND_LR
|
||||||
|
blr
|
||||||
|
|
||||||
|
vPortISRWrapper:
|
||||||
|
|
||||||
|
portSAVE_STACK_POINTER_AND_LR
|
||||||
|
bl vPortISRHandler
|
||||||
|
portRESTORE_STACK_POINTER_AND_LR
|
||||||
|
blr
|
Loading…
Reference in New Issue