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

📄 ucos_ii.asm

📁 基于TI的2407移植的ucos程序范例
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	PSHD	*
	RET

	.endfunc	354,000000000H,2

	.sym	_OSIntEnter,_OSIntEnter,32,2,0
	.globl	_OSIntEnter

	.func	379
;>>>> 	void OSIntEnter (void)
******************************************************
* FUNCTION DEF : _OSIntEnter
******************************************************
_OSIntEnter:
	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,1
	LAR	AR0,*0+

	.line	3
;>>>> 	    OS_ENTER_CRITICAL();
	SETC INTM 
	.line	4
;>>>> 	    OSIntNesting++;                              /* Increment ISR nesting level                        */
	LDPK	_OSIntNesting
	LAC	_OSIntNesting
	ADDK	1
	SACL	_OSIntNesting
	.line	5
;>>>> 	    OS_EXIT_CRITICAL();
	CLRC INTM 
EPI0_6:
	.line	6
	SBRK	2
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	384,000000000H,1

	.sym	_OSIntExit,_OSIntExit,32,2,0
	.globl	_OSIntExit

	.func	405
;>>>> 	void OSIntExit (void)
******************************************************
* FUNCTION DEF : _OSIntExit
******************************************************
_OSIntExit:
	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,1
	LAR	AR0,*0+

	.line	3
;>>>> 	    OS_ENTER_CRITICAL();
	SETC INTM 
	.line	4
;>>>> 	    if ((--OSIntNesting | OSLockNesting) == 0) { /* Reschedule only if all ISRs completed & not locked */
	LDPK	_OSIntNesting
	ZALS	_OSIntNesting
	SUBK	1
	SACL	_OSIntNesting
	OR	_OSLockNesting
	ANDK	0FFFFh
	BNZ	L15
	.line	5
;>>>> 	        OSIntExitY    = OSUnMapTbl[OSRdyGrp];
	LAC	_OSRdyGrp
	ADLK	_OSUnMapTbl+0,0
	MAR	* ,AR0
	SACL	* 
	LAR	AR3,* ,AR3
	BLDD	* ,#_OSIntExitY,AR0
	.line	6
;>>>> 	        nn=OSIntExitY;
	LDPK	_OSIntExitY
	BLDD	_OSIntExitY,#_nn
	.line	7
;>>>> 	        OSPrioHighRdy = (INT8U)((OSIntExitY << 3) + OSUnMapTbl[OSRdyTbl[OSIntExitY]]);
	LAC	_OSIntExitY
	ADLK	_OSRdyTbl+0,0
	SACL	* 
	LAR	AR3,* ,AR3
	LAC	* ,AR0
	ADLK	_OSUnMapTbl+0,0
	SACL	* 
	LAR	AR3,* ,AR3
	LAC	_OSIntExitY,3
	ADD	* 
	LDPK	_OSPrioHighRdy
	SACL	_OSPrioHighRdy
	.line	8
;>>>> 	        nn=OSPrioHighRdy;
	BLDD	_OSPrioHighRdy,#_nn
	.line	9
;>>>> 	        nn=OSPrioCur;
	BLDD	_OSPrioCur,#_nn
	.line	10
;>>>> 	        if (OSPrioHighRdy != OSPrioCur) {        /* No context switch if current task is highest ready */
	LAC	_OSPrioHighRdy
	SUB	_OSPrioCur
	BZ	L15
	.line	11
;>>>> 	            OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy];
	LAC	_OSPrioHighRdy
	ADLK	_OSTCBPrioTbl+0,0
	MAR	* ,AR0
	SACL	* 
	LAR	AR3,* ,AR3
	BLDD	* ,#_OSTCBHighRdy,AR1
	.line	12
;>>>> 	            OSCtxSwCtr++;                        /* Keep track of the number of context switches       */
	ZALS	_OSCtxSwCtr
	ADDH	_OSCtxSwCtr+1
	ADDK	1
	SACL	_OSCtxSwCtr
	SACH	_OSCtxSwCtr+1
	.line	13
;>>>> 	            OSIntCtxSw();                        /* Perform interrupt level context switch             */
	CALL	_OSIntCtxSw
L15:
	.line	16
;>>>> 	    OS_EXIT_CRITICAL();
	CLRC INTM 
EPI0_7:
	.line	17
	MAR	* ,AR1
	SBRK	2
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	421,000000000H,1

	.sym	_OSSched,_OSSched,32,2,0
	.globl	_OSSched

	.func	440
;>>>> 	void OSSched (void)
;>>>> 		INT8U     y;
******************************************************
* FUNCTION DEF : _OSSched
******************************************************
_OSSched:
	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,2
	LAR	AR0,*0+

	.line	6
;>>>> 	    OS_ENTER_CRITICAL();
	SETC INTM 
	.sym	_y,1,12,1,16
	.line	7
;>>>> 	    if ((OSLockNesting | OSIntNesting) == 0) {   /* Task scheduling must be enabled and not ISR level  */
	LDPK	_OSIntNesting
	ZALS	_OSIntNesting
	OR	_OSLockNesting
	BNZ	L17
	.line	8
;>>>> 	        y             = OSUnMapTbl[OSRdyGrp];    /* Get pointer to highest priority task ready to run  */
	LAC	_OSRdyGrp
	ADLK	_OSUnMapTbl+0,0
	MAR	* ,AR0
	SACL	* 
	LAR	AR3,* ,AR3
	LAC	* ,AR2
	LARK	AR2,1
	MAR	*0+
	SACL	* 
	.line	9
;>>>> 	        nn=y;
	BLDD	* ,#_nn
	.line	10
;>>>> 	        nn=OSRdyTbl[y];
	LAC	* ,AR0
	ADLK	_OSRdyTbl+0,0
	SACL	* 
	LAR	AR3,* ,AR3
	BLDD	* ,#_nn,AR2
	.line	11
;>>>> 	        OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);  
	LAC	* ,AR0
	ADLK	_OSRdyTbl+0,0
	SACL	* 
	LAR	AR3,* ,AR3
	LAC	* ,AR0
	ADLK	_OSUnMapTbl+0,0
	SACL	* 
	LAR	AR3,* ,AR3
	LAC	* ,AR2
	ADD	* ,3
	SACL	_OSPrioHighRdy
	.line	12
;>>>> 	        nn= OSPrioCur;
	BLDD	_OSPrioCur,#_nn
	.line	13
;>>>> 	        nn= OSPrioHighRdy;
	BLDD	_OSPrioHighRdy,#_nn
	.line	14
;>>>> 	        if (OSPrioHighRdy != OSPrioCur) {         /* No context switch if current task is highest ready */
	LAC	_OSPrioHighRdy
	SUB	_OSPrioCur
	BZ	L17
	.line	15
;>>>> 	            OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
	LAC	_OSPrioHighRdy
	ADLK	_OSTCBPrioTbl+0,0
	MAR	* ,AR0
	SACL	* 
	LAR	AR3,* ,AR3
	BLDD	* ,#_OSTCBHighRdy
	.line	16
;>>>> 	            OSCtxSwCtr++;                    /* Increment context switch counter                   */
	ZALS	_OSCtxSwCtr
	ADDH	_OSCtxSwCtr+1
	ADDK	1
	SACL	_OSCtxSwCtr
	SACH	_OSCtxSwCtr+1
	.line	17
;>>>> 	             OS_TASK_SW(); 
	intr 8 
L17:
	.line	20
;>>>> 	    OS_EXIT_CRITICAL();
	CLRC INTM 
EPI0_8:
	.line	21
	MAR	* ,AR1
	SBRK	3
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	460,000000000H,2

	.sym	_OSSchedLock,_OSSchedLock,32,2,0
	.globl	_OSSchedLock

	.func	478
;>>>> 	void OSSchedLock (void)
******************************************************
* FUNCTION DEF : _OSSchedLock
******************************************************
_OSSchedLock:
	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,1
	LAR	AR0,*0+

	.line	3
;>>>> 	    if (OSRunning == TRUE) {                     /* Make sure multitasking is running                  */
	LDPK	_OSRunning
	LAC	_OSRunning
	SUBK	1
	BNZ	L19
	.line	4
;>>>> 	        OS_ENTER_CRITICAL();
	SETC INTM 
	.line	5
;>>>> 	        OSLockNesting++;                         /* Increment lock nesting level                       */
	LAC	_OSLockNesting
	ADDK	1
	SACL	_OSLockNesting
	.line	6
;>>>> 	        OS_EXIT_CRITICAL();
	CLRC INTM 
L19:
EPI0_9:
	.line	8
	SBRK	2
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	485,000000000H,1

	.sym	_OSSchedUnlock,_OSSchedUnlock,32,2,0
	.globl	_OSSchedUnlock

	.func	502
;>>>> 	void OSSchedUnlock (void)
******************************************************
* FUNCTION DEF : _OSSchedUnlock
******************************************************
_OSSchedUnlock:
	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,1
	LAR	AR0,*0+

	.line	3
;>>>> 	    if (OSRunning == TRUE) {                           /* Make sure multitasking is running            */
	LDPK	_OSRunning
	LAC	_OSRunning
	SUBK	1
	BNZ	L20
	.line	4
;>>>> 	        OS_ENTER_CRITICAL();
	SETC INTM 
	.line	5
;>>>> 	        if (OSLockNesting > 0) {                       /* Do not decrement if already 0                */
	LAC	_OSLockNesting
	BZ	L21
	.line	6
;>>>> 	            OSLockNesting--;                           /* Decrement lock nesting level                 */
	SUBK	1
	SACL	_OSLockNesting
	.line	7
;>>>> 	            if ((OSLockNesting | OSIntNesting) == 0) { /* See if scheduling re-enabled and not an ISR  */
	ZALS	_OSIntNesting
	OR	_OSLockNesting
	BNZ	L22
	.line	8
;>>>> 	                OS_EXIT_CRITICAL();
	CLRC INTM 
	.line	9
;>>>> 	                OSSched();                             /* See if a higher priority task is ready       */
;>>>> 	            } else {
	CALL	_OSSched
	B	L20
L22:
	.line	11
;>>>> 	                OS_EXIT_CRITICAL();
;>>>> 	        } else {
	CLRC INTM 
	B	L20
L21:
	.line	14
;>>>> 	            OS_EXIT_CRITICAL();
	CLRC INTM 
L20:
EPI0_10:
	.line	17
	SBRK	2
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	518,000000000H,1

	.sym	_OSStart,_OSStart,32,2,0
	.globl	_OSStart

	.func	538
;>>>> 	void OSStart (void)
;>>>> 	    INT8U y;
;>>>> 	    INT8U x;
******************************************************
* FUNCTION DEF : _OSStart
******************************************************
_OSStart:
	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,3
	LAR	AR0,*0+

	.sym	_y,1,12,1,16
	.sym	_x,2,12,1,16
	.line	7
;>>>> 	    if (OSRunning == FALSE) {
	LDPK	_OSRunning
	LAC	_OSRunning
	BNZ	L25
	.line	8
;>>>> 	        y             = OSUnMapTbl[OSRdyGrp];        /* Find highest priority's task priority number   */
	LAC	_OSRdyGrp
	ADLK	_OSUnMapTbl+0,0
	MAR	* ,AR0
	SACL	* 
	LAR	AR3,* ,AR3
	LAC	* ,AR2
	LARK	AR2,1
	MAR	*0+
	SACL	* 
	.line	9
;>>>> 	        x             = OSUnMapTbl[OSRdyTbl[y]];
	LAC	*+,AR0
	ADLK	_OSRdyTbl+0,0
	SACL	* 
	LAR	AR3,* ,AR3
	LAC	* ,AR0
	ADLK	_OSUnMapTbl+0,0
	SACL	* 
	LAR	AR3,* ,AR3
	LAC	* ,AR2
	SACL	* 
	.line	10
;>>>> 	        OSPrioHighRdy = (INT8U)((y << 3) + x);
	LAC	*-
	ADD	* ,3,AR0
	SACL	_OSPrioHighRdy
	.line	11
;>>>> 	        OSPrioCur     = OSPrioHighRdy;
	BLKD	#_OSPrioHighRdy,_OSPrioCur
	.line	12
;>>>> 	        OSTCBHighRdy  = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run    */        
	LAC	_OSPrioHighRdy
	ADLK	_OSTCBPrioTbl+0,0
	SACL	* 
	LAR	AR3,* ,AR3
	BLDD	* ,#_OSTCBHighRdy,AR1
	.line	13
;>>>> 	        OSTCBCur      = OSTCBHighRdy;
	BLKD	#_OSTCBHighRdy,_OSTCBCur
	.line	14
;>>>> 	        OSStartHighRdy();                            /* Execute target specific code to start task     */
	CALL	_OSStartHighRdy
L25:
EPI0_11:
	.line	16
	SBRK	4
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	553,000000000H,3

	.sym	_OSStatInit,_OSStatInit,32,2,0
	.globl	_OSStatInit

	.func	576
;>>>> 	void OSStatInit (void)
******************************************************
* FUNCTION DEF : _OSStatInit
******************************************************
_OSStatInit:
	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,1
	LAR	AR0,*0+

	.line	3
;>>>> 	    OSTimeDly(2);                                /* Synchronize with clock tick                        */
	LACK	2
	SACL	*+
	CALL	_OSTimeDly
	MAR	*-
	.line	4
;>>>> 	    OS_ENTER_CRITICAL();
	SETC INTM 
	.line	5
;>>>> 	    OSIdleCtr    = 0L;                           /* Clear idle counter                                 */
	LACK	0
	LDPK	_OSIdleCtr
	SACL	_OSIdleCtr
	SACH	_OSIdleCtr+1
	.line	6
;>>>> 	    OS_EXIT_CRITICAL();
	CLRC INTM 
	.line	7
;>>>> 	    OSTimeDly(OS_TICKS_PER_SEC);                 /* Determine MAX. idle counter value for 1 second     */
	LACK	100
	SACL	*+
	CALL	_OSTimeDly
	MAR	*-
	.line	8
;>>>> 	    OS_ENTER_CRITICAL();
	SETC INTM 
	.line	9
;>>>> 	    OSIdleCtrMax = OSIdleCtr;                    /* Store maximum idle counter count in 1 second       */
	LDPK	_OSIdleCtr
	ZALS	_OSIdleCtr
	ADDH	_OSIdleCtr+1
	SACL	_OSIdleCtrMax
	SACH	_OSIdleCtrMax+1
	.line	10
;>>>> 	    OSStatRdy    = TRUE;
	LACK	1
	SACL	_OSStatRdy
	.line	11
;>>>> 	    OS_EXIT_CRITICAL();
	CLRC INTM 
EPI0_12:
	.line	12
	SBRK	2
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	587,000000000H,1

	.sym	_OSTaskIdle,_OSTaskIdle,32,2,0
	.globl	_OSTaskIdle

	.func	603
;>>>> 	void OSTaskIdle (void *pdata)
******************************************************
* FUNCTION DEF : _OSTaskIdle
******************************************************
_OSTaskIdle:

LF13	.set	0

	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,1
	LAR	AR0,*0+

	.sym	_pdata,-3+LF13,16,9,16
	.line	2
	.line	3
;>>>> 	    pdata = pdata;                               /* Prevent compiler warning for not using 'pdata'     */
;>>>> 	    for (;;) {
L26:
	.line	6
;>>>> 	        OS_ENTER_CRITICAL();
	SETC INTM 
	.line	7
;>>>> 	        OSIdleCtr++;
	LDPK	_OSIdleCtr
	ZALS	_OSIdleCtr
	ADDH	_OSIdleCtr+1
	ADDK	1
	SACL	_OSIdleCtr
	SACH	_OSIdleCtr+1
	.line	8
;>>>> 	        OS_EXIT_CRITICAL();
	CLRC INTM 
	.line	10
	B	L26
	.endfunc	613,000000000H,1

	.sym	_OSTaskStat,_OSTaskStat,32,2,0
	.globl	_OSTaskStat

	.func	642
;>>>> 	void OSTaskStat (void *pdata)
******************************************************
* FUNCTION DEF : _OSTaskStat
******************************************************
_OSTaskStat:

LF14	.set	0

	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,6
	LAR	AR0,*0+

	.sym	_pdata,-3+LF14,16,9,16
	.sym	_run,1,15,1,32
	.sym	_usage,3,2,1,16
	.line	2
;>>>> 	    INT32U run;
;>>>> 	    INT8S  usage;
	.line	7
;>>>> 	    pdata = pdata;                               /* Prevent compiler warning for not using 'pdata'     */
	.line	8
;>>>> 	    while (OSStatRdy == FALSE) {
	LDPK	_OSStatRdy
	LAC	_OSStatRdy
	BNZ	L28
L27:
	.line	9
;>>>> 	        OSTimeDly(2 * OS_TICKS_PER_SEC);             /* Wait until statistic task is ready                 */
;>>>> 	    for (;;) {
	LACK	200
	SACL	*+
	CALL	_OSTimeDly
	MAR	*-
	.line	8
	LDPK	_OSStatRdy
	LAC	_OSStatRdy
	BZ	L27
L28:
L29:
	.line	12
;>>>> 	        OS_ENTER_CRITICAL();
	SETC INTM 
	.line	13
;>>>> 	        OSIdleCtrRun = OSIdleCtr;                /* Obtain the of the idle counter for the past second */
	LDPK	_OSIdleCtr
	ZALS	_OSIdleCtr
	ADDH	_OSIdleCtr+1
	SACL	_OSIdleCtrRun
	SACH	_OSIdleCtrRun+1
	.line	14
;>>>> 	        run          = OSIdleCtr;
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	SACL	*+
	SACH	* 
	.line	15

⌨️ 快捷键说明

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