📄 os_18c801_a.asm
字号:
;********************************************************************************************************
; uC/OS-II
; The Real-Time Kernel
;
; Jean J. Labrosse
;
; Microchip PIC18C801 Specific code
;
;
; File : OS_18C801_A.ASM
; By : Weiming Zhang
; Data : Nov 30,2002
;********************************************************************************************************
#include p18c801.inc
#include app.inc
;0x000~0x02A ----> Push to the system stack
;0x02B~0x02F ----> Move to external RAM directly
;Ext_Stack_Base ~ Ext_Stack_Base+SAVE_BANK0_START-1 ----> Save the content of the hardware stack
;Ext_Stack_Base+SAVE_BANK0_START ~ Ext_Stack_Base+EXT_SOFT_STK_SHIFT-1 ----> Save GPRs in BANK0
;Ext_Stack_Base+EXT_SOFT_STK_SHIFT ~ Ext_Stack_Top ----> Save the system stack
#define EXT_SOFT_STK_SHIFT 0x60
#define SAVE_BANK0_PUSH_END 0x37;0x2A ;0x000~~0x02A
#define SAVE_BANK0_PUSH_NUM SAVE_BANK0_PUSH_END+1
#define TASK_HD_STK_PTR 3 ;hardware stack pointer:
;0->empty;1->main()'s caller; 2->OSStart()'s; 3->OSStartHighRdy()'s
;(0x000)~~(SAVE_BANK0_START-1) pushed to system stack
;(SAVE_BANK0_START)~~(SAVE_BANK0_END) saved in external RAM
;---------------- Modified if neccessary below ----------------------------------------------------------
;#define HDSTK_ONCHIP_EN
;MAX_TASKS EQU 0x10 ;16 tasks at total
;TASK_STK_BASE_ONCHIP_H EQU 0x01 ;OnChip soft-stack address: 0x100--...
;TASK_STK_BASE_ONCHIP_L EQU 0x00
;TASK_HD_STK_PTR EQU 3 ;hardware stack pointer:
;0->empty;1->main()'s caller; 2->OSStart()'s; 3->OSStartHighRdy()'s
;---------------- Modified if neccessary above ----------------------------------------------------------
;EXT_HDSTK_ADDR_SHIFT EQU 0xC0
;SFSTK_DEPTH_ADDR_SHIFT EQU 0x18 ;shift_address of GPRs' depth
;HDSTK_DEPTH_ADDR_SHIFT EQU 0x19 ;shift_address of Hardware-stack's depth
;MAX_ONCHIP_STACK_SFR EQU 0x1A ;26
;MAX_ONCHIP_STACK_SIZE EQU 0x1A ;26
;GLOBAL OSTickISR
;GLOBAL LowInterruptHandler
GLOBAL OSStartHighRdy
GLOBAL OSCtxSw
GLOBAL OSIntCtxSw
; EXTERN _OSIntExit:FAR
; EXTERN _OSTimeTick:FAR
; EXTERN _OSTaskSwHook:FAR
; EXTERN _OSIntNesting:BYTE
; EXTERN _OSTickDOSCtr:BYTE
;EXTERN OSTCBCurSn ;Only used by myself (Weiming Zhang).
;EXTERN TxIntISR
EXTERN WriteTimer1
EXTERN OSTimeTick
EXTERN OSIntExit
;EXTERN TimerISR
;EXTERN Func_Transmit_ISR
;EXTERN Func_INT2_ISR
;EXTERN Func_TMR0_ISR
;EXTERN Func_RB_ISR
;EXTERN Func_TMR2_ISR
EXTERN pCurRxTail
;EXTERN intCurRxNum
EXTERN Func_Receive_ISR
; EXTERN TickPostSem
; EXTERN OSIntEnter
EXTERN OSPrioHighRdy,OSPrioCur
EXTERN OSTCBHighRdy,OSTCBCur
;Pay attention!
;If OSPrioCur,OSTCBHighRdy and OSTCBCur have the save "BSR" value???
EXTERN StackDepth ;Only used by myself (Weiming Zhang)
EXTERN OSSysStkBase; ;Only used by myself (Weiming Zhang)
EXTERN OSRunning
EXTERN OSIntNesting
;*********************************************************************************************************
; START MULTITASKING
; void OSStartHighRdy(void)
;
; The stack frame is assumed to look as follows:
;
; OSTCBHighRdy->OSTCBStkPtr --> [FSR2H] (high memory)
; [FSR2L]
; [FSR1H]
; [FSR1L]
; [FSR0H]
; [FSR0L]
; [STKPTR]
; [BSR]
; [WREG]
; upper address of task code address(interrupt return address)
; high address of task code address(interrupt return address)
; low address of task code address(interrupt return address)
; [STATUS]
; upper address of task code address
; high address of task code address
; low address of task code address
; upper address of 'pdata'
; high address of 'pdata'
; low address of 'pdata' (low memory)
;
; Note : OSStartHighRdy() MUST:
; a) //Call OSTaskSwHook() then,
; b) Set OSRunning to TRUE,
; c) Switch to the highest priority task.
;*********************************************************************************************************
ASMCODE CODE
;*************************************************************************************************
OSStartHighRdy
movff OSTCBHighRdy,TBLPTRL
movff OSTCBHighRdy+1,TBLPTRH
movff OSTCBHighRdy+2,TBLPTRU
;read the stack's address on ext-RAM
tblrd*+
movff TABLAT,PRODL
tblrd*+
movff TABLAT,PRODH
tblrd* ;the UPPER byte is in TABLAT
;make TBLPTR point to the external stack
movff TABLAT,TBLPTRU
movff PRODH,TBLPTRH
movff PRODL,TBLPTRL
;Set OSRunning as TRUE
movlw 0x01
movff WREG,OSRunning ;OSRunning=TRUE
;put the task's address to TOS of hard-stack
incf STKPTR,0x01,0 ;STKPTR++
tblrd*+
movf TABLAT,0x00,0
movwf TOSL,0
tblrd*+
movf TABLAT,0x00,0
movwf TOSH,0
tblrd*
movf TABLAT,0x00,0
movwf TOSU,0 ;There must be only ONE address--startup address of a task
movff FSR1L,OSSysStkBase ;Save the base address,which is used to get software-stack depth
retfie 0
;**************************************************************************************************
;*********************************************************************************************************
; PERFORM A CONTEXT SWITCH (From task level)
; void OSCtxSw(void)
;
; Note(s): 1) Upon entry,
; OSTCBCur points to the OS_TCB of the task to suspend
; OSTCBHighRdy points to the OS_TCB of the task to resume
;
; 2) The stack frame of the task to suspend looks as follows:
;
; SP -> OFFSET of task to suspend (Low memory)
; SEGMENT of task to suspend
; PSW of task to suspend (High memory)
;
; 3) The stack frame of the task to resume looks as follows:
;
;Software stack in ONCHIP RAM:
;Shift_Addr: 0x00--------0x19
;Content: SFRs,AARGBx,software_stack_depth and hardware_stack_depth
;Shift_Addr: 0x1A--------0x1F
;Content: Reserved
;Hardware stack in External RAM
;Shift_Addr: 0x00--------0xBF
;Content: GPRs
;Shift_Addr: 0xC0--------0xFF
;Content: hardware_stack
;Following is the details:
;-----------------------------------------------------------------------------
;Shift_Addr: 00 01 02 03 04 05 06 07
;Register: STATUS BSR WREG FSR2H FSR2L FSR1H FSR1L FSR0H
;-----------------------------------------------------------------------------
;Shift_Addr: 08 09 0A 0B 0C 0D 0E 0F
;Register: FSR0L STKPTR PRODH PRODL TBLPTRU TBLPTRH TBLPTRL TABLAT
;-----------------------------------------------------------------------------
;Shift_Addr: 10 11 12 13 14 15 16 17
;Register: AARGB0 AARGB1 AARGB2 AARGB3 AARGB4 AARGB5 AARGB6 AARGB7
;-----------------------------------------------------------------------------
;Shift_Addr: 18 19 1A 1B 1C 1D 1E 1F
;Register: DepthSf DepthHd (REST_ONCHIP_STACK_SFR bytes reserved......)
;-----------------------------------------------------------------------------
;Shift_Addr: 20 21 22 23 24 25 26 27
;Register: BOS_1L BOS_1H BOS_1U BOS_2L BOS_2H BOS_2U BOS_3L BOS_3H
;-----------------------------------------------------------------------------
;Shift_Addr: 28 29 2A 2B 2C 2D 2E 2F
;Register: BOS_3U (MAX_ONCHIP_STACK_ADDR address at total......)
;-----------------------------------------------------------------------------
;Shift_Addr: 30 31 32 33 34 35 36 37
;Register:
;-----------------------------------------------------------------------------
;Shift_Addr: 38 39 3A 3B 3C 3D 3E 3F
;Register:
;*********************************************************************************************************
OSCtxSw
;save some necessary registers to system soft-stack
lpush_all
GetExtStackAddr:
movff OSTCBCur,TBLPTRL
movff OSTCBCur+1,TBLPTRH
movff OSTCBCur+2,TBLPTRU
tblrd*+
movff TABLAT,PRODL
tblrd*+
movff TABLAT,PRODH
tblrd*
movff TABLAT,TBLPTRU
movff TABLAT,INDF1 ;TBLPTRU --> [FSR1] for later use
movff PRODH,TBLPTRH
movff PRODL,TBLPTRL
SaveHdStack:
movlw high StackDepth
movwf FSR0H,0
movlw low StackDepth
addwf OSPrioCur,0x00,1
addwf OSPrioCur,0x00,1
movwf FSR0L,0 ;FSR0--> Hardware_Stack_Depth
bcf INTCON,GIEH,0
movlw TASK_HD_STK_PTR ;3-> main()'s caller; OSStart()'s; OSStartHighRdy()'s
subwf STKPTR,0x00,0 ;pointer numbers is in WREG( multiplied by 3bytes each one)
movwf INDF0,0 ;save hard-stack's depth
movlw TASK_HD_STK_PTR
movwf STKPTR ;Adjust STKPTR,ready to save
movf POSTINC0,0x00,0 ;FSR0--> Software_Stack_Depth
HdStk2ExtRAM:
incf STKPTR,0x01,0 ;STKPTR++
movff TOSL,TABLAT
tblwt*+
movff TOSH,TABLAT
tblwt*+
movff TOSU,TABLAT
tblwt*+
decf WREG,0x00,0
bnz HdStk2ExtRAM
bsf INTCON,GIEH,0
SaveSoftStack:
movff INDF1,TBLPTRU ;FSR1 is 1-byte higher than originally value after this line
movff PRODH,TBLPTRH
movff PRODL,TBLPTRL
movlw EXT_SOFT_STK_SHIFT
addwf TBLPTRL,0x01,0
movlw 0x00
addwfc TBLPTRH,0x01,0
addwfc TBLPTRU,0x01,0
movff OSSysStkBase,WREG ;OSSysStkBase-->WREG
movwf FSR2L,0 ;Start location
subwf FSR1L,0,0
movwf INDF0,0 ;software stack depth
movff FSR1H,FSR2H
SfStk2ExtRAM:
movff POSTINC2,TABLAT
tblwt*+
decf WREG,0x00,0
bnz SfStk2ExtRAM
;load new task's TCB
ChangeCurrentTask:
movlw TASK_HD_STK_PTR
movwf STKPTR ;Adjust STKPTR,ready to save
movff OSTCBHighRdy,OSTCBCur
movff OSTCBHighRdy,TBLPTRL
movff OSTCBHighRdy+1,OSTCBCur+1
movff OSTCBHighRdy+1,TBLPTRH
movff OSTCBHighRdy+2,OSTCBCur+2
movff OSTCBHighRdy+2,TBLPTRU
tblrd*+
movff TABLAT,PRODL
tblrd*+
movff TABLAT,PRODH
tblrd* ;the UPPER byte is in TABLAT,MUST be 0x00
movff TABLAT,TBLPTRU
movff TABLAT,INDF1
movff PRODH,TBLPTRH
movff PRODL,TBLPTRL
;OSPrioCur=OSPrioHighRdy;
movff OSPrioHighRdy,OSPrioCur
LoadHdStack:
movlw high StackDepth
movwf FSR0H,0
movlw low StackDepth
addwf OSPrioCur,0x00,1
addwf OSPrioCur,0x00,1
movwf FSR0L,0 ;FSR0--> Hardware_Stack_Depth
bcf INTCON,GIEH,0
HdStkFromExtRAM:
incf STKPTR,0x01,0 ;STKPTR++
tblrd*+
movf TABLAT,0x00,0
movwf TOSL,0
tblrd*+
movf TABLAT,0x00,0
movwf TOSH,0
tblrd*+
movf TABLAT,0x00,0
movwf TOSU,0
decf INDF0,0x01,0 ;"Z" of STATUS is affected.
bnz HdStkFromExtRAM
bsf INTCON,GIEH,0
LoadSoftStack:
movff INDF1,TBLPTRU ;FSR1 is 1-byte higher than originally value after this line
movff PRODH,TBLPTRH
movff PRODL,TBLPTRL
movlw EXT_SOFT_STK_SHIFT
addwf TBLPTRL,0x01,0
movlw 0x00
addwfc TBLPTRH,0x01,0
addwfc TBLPTRU,0x01,0
movf POSTINC0,0x01,0 ;FSR0++,-->soft_depth
movf INDF0,0x00,0 ;software stack depth ;[(OSSysStkBase),(OSSysStkBase+1),......(TABLAT)]
movff OSSysStkBase,FSR2L ;OSSysStkBase-->WREG
movff FSR1H,FSR2H
SfStkFromExtRAM:
tblrd*+
movff TABLAT,POSTINC2
decf WREG,0x00,0
bnz SfStkFromExtRAM
PopupSFR:
movff FSR2L,FSR1L ;FSR2H=FSR1H already
lpop_all
retfie 0
;End of function "OSCtxSw()"
;=================================================================================================
OSIntCtxSw
pop
pop
goto GetExtStackAddr ;Jump into the OSCtxSw() function
retfie 0
;==========================================================================================================
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -