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

📄 os_18c801_a.asm

📁 本人编写的无线电话程序,给予PIC18C801设计,包括了uCOS的移植以及菜单,自己设计的拼音注入法,完整地一级汉字库,希望对大家有所帮助
💻 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 + -