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

📄 os_cpu_a.~s

📁 武汉创维特的arm培训例程试验程序
💻 ~S
📖 第 1 页 / 共 2 页
字号:
@/*************************************************************************/
@/*                                                                       */
@/*     FILE                                        VERSION               */
@/*                                                                       */
@/*      os_cpu_a.s                              S3C2410X 1.00            */
@/*                                                                       */
@/* Project name: EB44B0(S3C44B0X) Main board                             */
@/* Description : Functions defined in this module                        */
@/*                                                                       */
@/*	                                                                      */
@/*	    void ARMDisableInt(void)	---    disable interrupts when in SVC */
@/*	    void ARMEnableInt(void)		---    enable interrupts when in SVC  */
@/*	    void OS_TASK_SWAP(void)		---    context switch                 */
@/*	    void OSStartHighRdy(void)	---    start highest priority task    */
@/*                                                                       */
@/* AUTHOR                                                                */
@/*                                                                       */
@/*      cooljet                                                          */
@/* DATE:                                                                 */
@/*      2003-06-07                                                       */
@/*                                                                       */
@/* HISTORY                                                               */
@/*                                                                       */
@/*         NAME            DATE                    REMARKS               */
@/*         cooljet    2003-06-06 13:10        Modify for PBI-2           */
@/*************************************************************************/

.EQU SwiV		,	0x08
.EQU IrqV		,	0x18
.EQU FiqV		,	0x1C
.EQU NoInt		,	0x80

.EQU SVC32Mode	,	0x13
.EQU IRQ32Mode	,	0x12
.EQU FIQ32Mode	,	0x11

.EQU OSEnterSWI	,	0x00


@
@ These defines are use in the INT_IRQ processing for UART,
@ and Timer0 Interrupts
@
.EQU IRQ_TIMER1      , 12

@/*************************************************************************/
@/* External symbols we need the addresses of                             */
@/*************************************************************************/
	.EXTERN	OSTCBCur
addr_OSTCBCur :
	.LONG	OSTCBCur
	.EXTERN	OSTCBHighRdy
addr_OSTCBHighRdy :
	.LONG	OSTCBHighRdy
	.EXTERN	OSPrioCur
addr_OSPrioCur :
	.LONG	OSPrioCur
	.EXTERN	OSPrioHighRdy
addr_OSPrioHighRdy :
	.LONG	OSPrioHighRdy
   
	.EXTERN	need_to_swap_context
	.EXTERN	IrqStart
	.EXTERN	OSTimeTick
	.EXTERN	IrqFinish
	.EXTERN  irq_entry

	.EXTERN	OutDebug
	.EXTERN	BreakPoint
	
@/*************************************************************************/
@/*                                                                       */
@/* FUNCTION                                                              */
@/*                                                                       */
@/*      TickHandler                                                      */
@/*                                                                       */
@/* DESCRIPTION                                                           */
@/*                                                                       */
@/*      This function will be called when every tick is expired          */
@/*                                                                       */
@/*             -    	Call	IrqStart                                  */
@/*             -       Call	OSTimeTick                           	  */
@/*             -       Call 	IrqFinish                                 */
@/*             -       Context switching when necessaryly                */
@/*                                                                       */
@/* AUTHOR                                                                */
@/*                                                                       */
@/*      @                                                     */
@/* DATE:                                                                 */
@/*      2003-06-05                                                       */
@/* CALLED BY                                                             */
@/*                                                                       */
@/*                                                                       */
@/* CALLS                                                                 */
@/*                                                                       */
@/*      none                                                             */
@/*                                                                       */
@/* INPUTS                                                                */
@/*                                                                       */
@/*      None                                                             */
@/*                                                                       */
@/* OUTPUTS                                                               */
@/*                                                                       */
@/*      None                                                             */
@/*                                                                       */
@/* HISTORY                                                               */
@/*                                                                       */
@/*         NAME            DATE                    REMARKS               */
@/*                                                                       */
@/*                                                                       */
@/*************************************************************************/
@VOID    TickHandler(void)
@{
	.GLOBAL	OSTickISR
OSTickISR :
	STMDB    sp!,{r0-r11,lr}

	@ interrupt disable(not nessary)
	mrs		r0, CPSR
	orr		r0, r0, #0x80		@ and set IRQ disable flag
	msr		CPSR_cxsf, r0
	
	@End of interrupt
	@(Clear pending bit of INTPEND that don't accessed it.)
	@	rI_ISPC= BIT_TIMER0;
	mov r0, #IRQ_TIMER1
	BL Irq_Clear

	BL	IrqStart
	
	BL	OSTimeTick

	BL	IrqFinish

	
	LDR		r0, =need_to_swap_context
	LDR		r2, [r0]
	CMP		r2, #1
	LDREQ	pc, =_CON_SW


_NOT_CON_SW :
	@not context switching
	LDMIA    sp!,{r0-r11, lr}
	SUBS	pc, lr, #4


_CON_SW:
	@set need_to_swap_context is '0'
	MOV		r1, #0
	STR		r1, [r0]


	@now context switching
	LDMIA    sp!,{r0-r11,lr}
	SUB		lr, lr, #4

	STR				lr, SAVED_LR

	@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	@Change Supervisor mode
	@!!!r12 register don't preserved. (r12 that PC of task)

    MRS             lr, SPSR
	AND				lr, lr, #0xFFFFFFE0
	ORR				lr, lr, #0x13
    MSR             CPSR_cxsf, lr


	@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	@Now  Supervisor mode
	@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	STR		r12, [sp, #-8]	@ saved r12
	LDR		r12, SAVED_LR
	STMFD	sp!, {r12}		@ r12 that PC of task
	SUB		sp, sp, #4		@ inclease stack point
	LDMIA	sp!, {r12}		@ restore r12
	STMFD	sp!, {lr}		@ save lr
	STMFD	sp!, {r0-r12}	@ save register file and ret address
	MRS		r4, CPSR
	STMFD	sp!, {r4}		@ save current PSR
	MRS		r4, SPSR		@ YYY+
	STMFD	sp!, {r4}		@ YYY+ save SPSR


	@ OSPrioCur = OSPrioHighRdy
	LDR	r4, addr_OSPrioCur
	LDR	r5, addr_OSPrioHighRdy
	LDRB	r6, [r5]
	STRB	r6, [r4]
	
	@ Get current task TCB address
	LDR	r4, addr_OSTCBCur

⌨️ 快捷键说明

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