9楼: >>参与讨论
作者: ajoelee 于 2005-4-26 9:08:00 发布:
--------------------------------------------------------------------------------
OS_CPU_C.c的OSTaskStkInit
OS_STK *OSTaskStkInit (void (*task)(void *pdata), void *pdata, OS_STK *ptos, INT16U opt)
{
OS_STK *stk;
opt = opt; /* 'opt' is not used, prevent warning */
stk = ptos; /* Load stack pointer */
*(stk) = (OS_STK)task; /* Entry Point */
*(--stk) = (INT32U)0x14141414L; /* R14 (LR) */
*(--stk) = (INT32U)0x12121212L; /* R12 */
*(--stk) = (INT32U)0x11111111L; /* R11 */
*(--stk) = (INT32U)0x10101010L; /* R10 */
*(--stk) = (INT32U)0x09090909L; /* R9 */
*(--stk) = (INT32U)0x08080808L; /* R8 */
*(--stk) = (INT32U)0x07070707L; /* R7 */
*(--stk) = (INT32U)0x06060606L; /* R6 */
*(--stk) = (INT32U)0x05050505L; /* R5 */
*(--stk) = (INT32U)0x04040404L; /* R4 */
*(--stk) = (INT32U)0x03030303L; /* R3 */
*(--stk) = (INT32U)0x02020202L; /* R2 */
*(--stk) = (INT32U)0x01010101L; /* R1 */
*(--stk) = (INT32U)pdata; /* R0 : argument */
*(--stk) = (INT32U)ARM_SVC_MODE; /* CPSR (Enable both IRQ and FIQ interrupts) */
return (stk);
}
10楼: >>参与讨论
作者: ajoelee 于 2005-4-26 9:12:00 发布:
--------------------------------------------------------------------------------
OS_CPU_A.s
EXTERN OSRunning ; External references
EXTERN OSPrioCur
EXTERN OSPrioHighRdy
EXTERN OSTCBCur
EXTERN OSTCBHighRdy
EXTERN OSIntNesting
EXTERN OSIntExit
EXTERN OSTaskSwHook
EXTERN IRQ_Exception
EXTERN FIQ_Exception
import OSIntEnter
import OSTimeTick
GLOBAL OS_CPU_SR_Save ; Functions declared in this file
GLOBAL OS_CPU_SR_Restore
GLOBAL OSStartHighRdy
GLOBAL OSCtxSw
GLOBAL OSIntCtxSw
GLOBAL OS_CPU_IRQ_ISR
GLOBAL OS_CPU_FIQ_ISR
NO_INT EQU 0xC0 ; Mask used to disable interrupts (Both FIR and IRQ)
SVC32_MODE EQU 0x13
FIQ32_MODE EQU 0x11
IRQ32_MODE EQU 0x12
AREA OSCPUasm,CODE,READONLY
CODE32
OS_CPU_SR_Save
MRS R0,CPSR ; Set IRQ and FIQ bits in CPSR to disable all interrupts
ORR R1,R0,#NO_INT
MSR CPSR_c,R1
MRS R1,CPSR ; Confirm that CPSR contains the proper interrupt disable flags
BX LR ; Disabled, return the original CPSR contents in R0
OS_CPU_SR_Restore
MSR CPSR_c,R0
BX LR
OSStartHighRdy
MSR CPSR_cxsf, #0xD3 ; Switch to SVC mode with IRQ and FIQ disabled
LDR R0, =OSTaskSwHook ; ; OSTaskSwHook();
MOV LR, PC
BX R0
LDR R4, =OSRunning ; ; OSRunning = TRUE
MOV R5, #1
STRB R5, [R4]
; SWITCH TO HIGHEST PRIORITY TASK
LDR R4, =OSTCBHighRdy ; Get highest priority task TCB address
LDR R4, [R4] ; get stack pointer
LDR SP, [R4] ; switch to the new stack
LDR R4, [SP], #4 ; pop new task's CPSR
MSR SPSR_cxsf,R4
LDMFD SP!, {R0-R12,LR,PC}^ ; pop new task's context
OSCtxSw
; SAVE CURRENT TASK'S CONTEXT
STMFD SP!, {LR} ; Push return address
STMFD SP!, {LR}
STMFD SP!, {R0-R12} ; Push registers
MRS R4, CPSR ; Push current CPSR
TST LR, #1 ; &
11楼: >>参与讨论
作者: ajoelee 于 2005-4-26 9:23:00 发布:
--------------------------------------------------------------------------------
MCP工程
项目工程是基于周立功的TimeOut.mcp
1.在target.c TargetInit(void) 中
T0PR = 9;
T0MCR = 0x03;
T0MR0 = 110592/2;
T0TCR = 0x03;
VICIntSelect = 0x00;
// VICVectAddr0 = (uint32)IRQ_Exception; 这一句去掉
VICIntEnable = 0x00000010;
T0TCR = 0x01;
2.在target.c的 void __irq IRQ_Exception(void)改为void IRQ_Exception(void)
12楼: >>参与讨论
作者: ajoelee 于 2005-4-26 9:27:00 发布:
--------------------------------------------------------------------------------
vector.s
3.注意对vector.s的修改
DCD 0x0b8a06f58 ;0xb9205f80
IRQ_Addr DCD OS_CPU_IRQ_ISR ; IRQ_Handler ;IRQ_Exception
FIQ_Addr DCD OS_CPU_FIQ_ISR ; FIQ_Handler