⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_cpu_c.c~

📁 UCOS-II ATMEGA128 移殖
💻 C~
📖 第 1 页 / 共 2 页
字号:
* Note(s)    : 1) Interrupts may or may not be ENABLED during this call.
*********************************************************************************************************
*/
#if OS_CPU_HOOKS_EN > 0 && OS_VERSION > 203
void  OSTCBInitHook (OS_TCB *ptcb)
{
    ptcb = ptcb;                                           /* Prevent Compiler warning                 */
}
#endif


/*
*********************************************************************************************************
*                                               TICK HOOK
*
* Description: This function is called every tick.
*
* Arguments  : none
*
* Note(s)    : 1) Interrupts may or may not be ENABLED during this call.
*********************************************************************************************************
*/
#if (OS_CPU_HOOKS_EN > 0) && (OS_TIME_TICK_HOOK_EN > 0)
void  OSTimeTickHook (void)
{
#ifdef OS_VIEW_MODULE
    OSView_TickHook();
#endif
}
#endif  
  
/*
********************************************************************
以下是 OS_CPU_A.ASM 里的函数
*********************************************************************
*/
#define PUSH_ALL() \
                #asm ("ST -Y,R0");\
                #asm ("ST -Y,R1");\
                #asm ("ST -Y,R2");\
                #asm ("ST -Y,R3");\
                #asm ("ST -Y,R4");\
                #asm ("ST -Y,R5");\
                #asm ("ST -Y,R6");\
                #asm ("ST -Y,R7");\
                #asm ("ST -Y,R8");\
                #asm ("ST -Y,R9");\
                #asm ("ST -Y,R10");\
                #asm ("ST -Y,R11");\
                #asm ("ST -Y,R12");\
                #asm ("ST -Y,R13");\
                #asm ("ST -Y,R14");\
                #asm ("ST -Y,R15");\
                #asm ("ST -Y,R16");\
                #asm ("ST -Y,R17");\
                #asm ("ST -Y,R18");\
                #asm ("ST -Y,R19");\
                #asm ("ST -Y,R20");\
                #asm ("ST -Y,R21");\
                #asm ("ST -Y,R22");\
                #asm ("ST -Y,R23");\
                #asm ("ST -Y,R24");\
                #asm ("ST -Y,R25");\
                #asm ("ST -Y,R26");\
                #asm ("ST -Y,R27");\
                #asm ("ST -Y,R30");\
                #asm ("ST -Y,R31");\
                #asm ("IN R16,0x3B");\
                #asm ("ST -Y,R16");
                //IN      R16,RAMPZ
                //ST      -Y,R16
#define POP_ALL() \
                #asm ("LD R16,Y+");\
                #asm ("OUT 0x3B,R16");\
                #asm ("LD R31,Y+");\
                #asm ("LD R30,Y+");\
                #asm ("LD R27,Y+");\
                #asm ("LD R26,Y+");\
                #asm ("LD R25,Y+");\
                #asm ("LD R24,Y+");\
                #asm ("LD R23,Y+");\
                #asm ("LD R22,Y+");\
                #asm ("LD R21,Y+");\
                #asm ("LD R20,Y+");\
                #asm ("LD R19,Y+");\
                #asm ("LD R18,Y+");\
                #asm ("LD R17,Y+");\
                #asm ("LD R16,Y+");\
                #asm ("LD R15,Y+");\
                #asm ("LD R14,Y+");\
                #asm ("LD R13,Y+");\
                #asm ("LD R12,Y+");\
                #asm ("LD R11,Y+");\
                #asm ("LD R10,Y+");\
                #asm ("LD R9,Y+");\
                #asm ("LD R8,Y+");\
                #asm ("LD R7,Y+");\
                #asm ("LD R6,Y+");\
                #asm ("LD R5,Y+");\
                #asm ("LD R4,Y+");\
                #asm ("LD R3,Y+");\
                #asm ("LD R2,Y+");\
                #asm ("LD R1,Y+");\
                #asm ("LD R0,Y+");
                
                
//                .macro  PUSH_SP                             ; Save stack pointer
#define PUSH_SP() \
                #asm ("IN      R16,SPH");\
                #asm ("ST      -Y,R16");\
                #asm ("IN      R16,SPL");\
                #asm ("ST      -Y,R16");
 //               .endmacro

//                .macro  POP_SP                              ; Restore stack pointer
#define POP_SP() \
                #asm ("LD      R16,Y+");\
                #asm ("OUT     SPL,R16");\
                #asm ("LD      R16,Y+");\
                #asm ("OUT     SPH,R16");
//                .endmacro

//                .macro  PUSH_SREG                           ; Save status register
#define PUSH_SREG() \
                #asm ("IN      R16,SREG");\
                #asm ("ST      -Y,R16");
//                .endmacro

//                .macro  POP_SREG                            ; Restore status registers
#define POP_SREG() \
                #asm ("LD      R16,Y+");\
                #asm ("OUT     SREG,R16");
//                .endmacro

void OSStartHighRdy(void)
{
#asm
                CALL    _OSTaskSwHook               ; Invoke user defined context switch hook
                LDS     R16,_OSRunning              ; Indicate that we are multitasking
                INC     R16                         ;
                STS     _OSRunning,R16              ;

                LDS     R30,_OSTCBHighRdy           ; Let Z point to TCB of highest priority task
                LDS     R31,_OSTCBHighRdy+1         ; ready to run
                LD      R28,Z+                      ; Load Y (R29:R28) pointer
                LD      R29,Z+                      ;
#endasm
                POP_SP();                           //   ; Restore stack pointer
                POP_SREG();                          //  ; Restore status register
                POP_ALL();                           //  ; Restore all registers
//                #asm ("RET");                       //          ; Start task
}

void OSCtxSw(void)
{ 

               PUSH_ALL();//                            ; Save current task's context
                PUSH_SREG();//
                PUSH_SP();//
		#asm
                LDS     R30,_OSTCBCur               ; Z = OSTCBCur->OSTCBStkPtr
                LDS     R31,_OSTCBCur+1             ;
                ST      Z+,R28                      ; Save Y (R29:R28) pointer
                ST      Z+,R29                      ;

                CALL    _OSTaskSwHook               ; Call user defined task switch hook

                LDS     R16,_OSPrioHighRdy          ; OSPrioCur = OSPrioHighRdy
                STS     _OSPrioCur,R16

                LDS     R30,_OSTCBHighRdy           ; Let Z point to TCB of highest priority task
                LDS     R31,_OSTCBHighRdy+1         ; ready to run
                STS     _OSTCBCur,R30               ; OSTCBCur = OSTCBHighRdy
                STS     _OSTCBCur+1,R31             ;

                LD      R28,Z+                      ; Restore Y pointer
                LD      R29,Z+                      ;
        #endasm
                POP_SP();//                              ; Restore stack pointer
                POP_SREG();//                            ; Restore status register
                POP_ALL();//                             ; Restore all registers
                #asm ("RET");
}  

void OSIntCtxSw(void)
{
		#asm
                CALL    _OSTaskSwHook               ; Call user defined task switch hook

                LDS     R16,_OSPrioHighRdy          ; OSPrioCur = OSPrioHighRdy
                STS     _OSPrioCur,R16              ;

                LDS     R30,_OSTCBHighRdy           ; Z = OSTCBHighRdy->OSTCBStkPtr
                LDS     R31,_OSTCBHighRdy+1         ;
                STS     _OSTCBCur,R30               ; OSTCBCur = OSTCBHighRdy
                STS     _OSTCBCur+1,R31             ;

                LD      R28,Z+                      ; Restore Y pointer
                LD      R29,Z+                      ;
		#endasm
                POP_SP();//                              ; Restore stack pointer
                POP_SREG();//                            ; Restore status register
                POP_ALL();//                             ; Restore all registers
                #asm ("RET");
} 

OS_CPU_SR OS_CPU_SR_Save(void)
{  
	OS_CPU_SR temp;
	#asm
                IN      R16,SREG                    ; Get current state of interrupts disable flag
                MOV     R30,R16;CLI                                 ; Disable interrupts
                ;RET                                 ; Return original SREG value in R16
	#endasm
}

void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr)
{
	OS_CPU_SR temp;
	temp = cpu_sr;
	#asm 
	OUT SREG,R16;                //; Restore SREG
	#endasm
}   
#pragma savereg-
interrupt [TIM0_OVF] void OSTickISR(void)
{
                PUSH_ALL();//                            ; Save all registers and status register
			#asm
                IN      R16,SREG                    ; Save the SREG but with interrupts enabled
                SBR     R16,0x80                    
                ST      -Y,R16
            #endasm    
                PUSH_SP();//                             ; Save the task's hardware stack pointer onto task's stack

				OSIntNesting++;

				if(OSIntNesting == 1)
				{
					#asm
                	LDS     R30,_OSTCBCur               ;     OSTCBCur->OSTCBStkPtr = Y
                	LDS     R31,_OSTCBCur+1
                	ST      Z+,R28
                	ST      Z+,R29                      ; }
					#endasm
				}

                OSTickISR_Handler();//          ; Handle the tick ISR

                OSIntExit();//                  ; Notify uC/OS-II about end of ISR

                POP_SP();//                              ; Restore the hardware stack pointer from task's stack
                POP_SREG();//                            ; Restore the SREG register
                POP_ALL();//                             ; Restore all registers

                #asm ("RET");//                                 ; Note: RET instead of RETI

}
#pragma savereg+

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -