转:uCOS-II 2.52在LPC2104移植的flash源代码

本文详细介绍了μC/OS-II实时操作系统中任务初始化函数OSTaskStkInit的具体实现过程,包括栈空间的初始化及寄存器的设置。此外,还深入探讨了上下文切换函数OSCtxSw的工作原理,以及如何保存和恢复任务的上下文环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值