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

📄 ucos_ii.asm

📁 基于TI的2407移植的ucos程序范例
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;>>>> 	        OSIdleCtr    = 0L;                       /* Reset the idle counter for the next second         */
	LACK	0
	SACL	_OSIdleCtr
	SACH	_OSIdleCtr+1
	.line	16
;>>>> 	        OS_EXIT_CRITICAL();
	CLRC INTM 
	.line	17
;>>>> 	        if (OSIdleCtrMax > 0L) {
	ZALS	_OSIdleCtrMax
	ADDH	_OSIdleCtrMax+1
	BZ	L30
	.line	18
;>>>> 	            usage = (INT8S)(100L - 100L * run / OSIdleCtrMax);
	LACK	100
	MAR	*-,AR1
	SACL	*+
	SACH	*+
	SACL	*+,AR2
	ZALS	*+
	ADDH	* ,AR1
	MAR	*-
	CALL	L$$MPY
	MAR	* ,AR2
	ADRK	2
	SACL	*+
	SACH	*-,AR1
	ZALS	_OSIdleCtrMax
	ADDH	_OSIdleCtrMax+1
	SACL	*+
	SACH	*+,AR2
	ZALS	*+
	ADDH	* ,AR1
	CALL	L$$DIVU
	NEG
	ADDK	100
	MAR	* ,AR2
	SBRK	2
	SACL	* 
	.line	19
;>>>> 	            if (usage > 100) {
	SSXM
	LAC	* 
	SUBK	100
	BLEZ	L31
	.line	20
;>>>> 	                OSCPUUsage = 100;
	LACK	100
	SACL	_OSCPUUsage
	B	L34
L31:
	.line	21
;>>>> 	            } else if (usage < 0) {
	LAC	* 
	BGEZ	L33
	.line	22
;>>>> 	                OSCPUUsage =   0;
;>>>> 	            } else {
	LACK	0
	SACL	_OSCPUUsage
	B	L34
L33:
	.line	24
;>>>> 	                OSCPUUsage = usage;
;>>>> 	        } else {
	SACL	_OSCPUUsage
	B	L34
L30:
	.line	27
;>>>> 	            OSCPUUsage = 0;
	LACK	0
	SACL	_OSCPUUsage
L34:
	.line	29
;>>>> 	        OSTaskStatHook();                        /* Invoke user definable hook                         */
	CALL	_OSTaskStatHook,AR1
	.line	30
;>>>> 	        OSTimeDly(OS_TICKS_PER_SEC);             /* Accumulate OSIdleCtr for the next second           */
	LACK	100
	SACL	*+
	CALL	_OSTimeDly
	MAR	*-,AR2
	.line	31
	B	L29
	.endfunc	673,000000000H,6

	.sym	_OSTCBInit,_OSTCBInit,44,2,0
	.globl	_OSTCBInit

	.func	719
;>>>> 	INT8U OSTCBInit (INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT16U stk_size, void *pext, INT16U opt)
******************************************************
* FUNCTION DEF : _OSTCBInit
******************************************************
_OSTCBInit:

LF15	.set	0

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

	.sym	_prio,-3+LF15,12,9,16
	.sym	_ptos,-4+LF15,30,9,16
	.sym	_pbos,-5+LF15,30,9,16
	.sym	_id,-6+LF15,14,9,16
	.sym	_stk_size,-7+LF15,14,9,16
	.sym	_pext,-8+LF15,16,9,16
	.sym	_opt,-9+LF15,14,9,16
	.sym	_ptcb,1,24,1,16,_os_tcb
	.line	2
;>>>> 	    OS_TCB *ptcb;
	.line	6
;>>>> 	    OS_ENTER_CRITICAL();
	SETC INTM 
	.line	7
;>>>> 	    ptcb = OSTCBFreeList;                                  /* Get a free TCB from the free TCB list    */
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	BLKD	#_OSTCBFreeList,* 
	.line	8
;>>>> 	    if (ptcb != (OS_TCB *)0) {
	LAC	* 
	BZ	L35
	.line	9
;>>>> 	        OSTCBFreeList        = ptcb->OSTCBNext;            /* Update pointer to free TCB list          */
	LAR	AR3,* ,AR3
	MAR	*+
	BLDD	* ,#_OSTCBFreeList
	.line	10
;>>>> 	        OS_EXIT_CRITICAL();
	CLRC INTM 
	.line	11
;>>>> 	        ptcb->OSTCBStkPtr    = ptos;                       /* Load Stack pointer in TCB                */
	MAR	* ,AR2
	SBRK	5-LF15
	LAC	*+,AR3
	MAR	*-
	SACL	* ,AR2
	.line	12
;>>>> 	        ptcb->OSTCBPrio      = (INT8U)prio;                /* Load task priority into TCB              */
	LAC	* ,AR3
	ADRK	7
	SACL	*-
	.line	13
;>>>> 	        ptcb->OSTCBStat      = OS_STAT_RDY;                /* Task is ready to run                     */
	LACK	0
	SACL	*-
	.line	14
;>>>> 	        ptcb->OSTCBDly       = 0;                          /* Task is not delayed                      */
;>>>> 	#if OS_TASK_CREATE_EXT_EN        
;>>>> 	        ptcb->OSTCBExtPtr    = pext;                       /* Store pointer to TCB extension           */
;>>>> 	        ptcb->OSTCBStkSize   = stk_size;                   /* Store stack size                         */
;>>>> 	        ptcb->OSTCBStkBottom = pbos;                       /* Store pointer to bottom of stack         */
;>>>> 	        ptcb->OSTCBOpt       = opt;                        /* Store task options                       */
;>>>> 	        ptcb->OSTCBId        = id;                         /* Store task ID                            */
;>>>> 	#else
	SACL	* ,AR2
	.line	23
;>>>> 	        pext                 = pext;                       /* Prevent compiler warning if not used     */
	.line	24
;>>>> 	        stk_size             = stk_size;
	.line	25
;>>>> 	        pbos                 = pbos;
	.line	26
;>>>> 	        opt                  = opt;
	.line	27
;>>>> 	        id                   = id;
;>>>> 	#endif
;>>>> 	#if OS_TASK_DEL_EN        
;>>>> 	        ptcb->OSTCBDelReq    = OS_NO_ERR;
;>>>> 	#endif
	.line	34
;>>>> 	        ptcb->OSTCBY         = prio >> 3;                  /* Pre-compute X, Y, BitX and BitY          */
	RSXM
	LAC	* ,12,AR3
	ADRK	4
	SACH	* ,1
	.line	35
;>>>> 	        ptcb->OSTCBBitY      = OSMapTbl[ptcb->OSTCBY];
	LAC	* ,AR0
	ADLK	_OSMapTbl+0,0
	SACL	* 
	LAR	AR4,* ,AR4
	LAC	* ,AR3
	ADRK	2
	SACL	* ,AR2
	.line	36
;>>>> 	        ptcb->OSTCBX         = prio & 0x07;
	LACK	7
	AND	* ,AR3
	SBRK	3
	SACL	* 
	.line	37
;>>>> 	        ptcb->OSTCBBitX      = OSMapTbl[ptcb->OSTCBX];
;>>>> 	#if     OS_MBOX_EN || (OS_Q_EN && (OS_MAX_QS >= 2)) || OS_SEM_EN
	LAC	* ,AR0
	ADLK	_OSMapTbl+0,0
	SACL	* 
	LAR	AR4,* ,AR4
	LAC	* ,AR3
	ADRK	2
	SACL	* 
	.line	40
;>>>> 	        ptcb->OSTCBEventPtr  = (OS_EVENT *)0;              /* Task is not pending on an event          */
;>>>> 	#endif
;>>>> 	#if     OS_MBOX_EN || (OS_Q_EN && (OS_MAX_QS >= 2))
	LACK	0
	SBRK	7
	SACL	*+
	.line	44
;>>>> 	        ptcb->OSTCBMsg       = (void *)0;                  /* No message received                      */
;>>>> 	#endif
	SACL	* 
	.line	47
;>>>> 	        OS_ENTER_CRITICAL();
	SETC INTM 
	.line	48
;>>>> 	        OSTCBPrioTbl[prio]   = ptcb;
	MAR	* ,AR2
	LAC	* ,AR0
	ADLK	_OSTCBPrioTbl+0,0
	SACL	* 
	LAR	AR4,* ,AR3
	SBRK	4
	MAR	* ,AR4
	SAR	AR3,* ,AR3
	.line	49
;>>>> 	        ptcb->OSTCBNext      = OSTCBList;                  /* Link into TCB chain                      */
	MAR	*+
	BLKD	#_OSTCBList,*+
	.line	50
;>>>> 	        ptcb->OSTCBPrev      = (OS_TCB *)0;
	LACK	0
	SACL	* 
	.line	51
;>>>> 	        if (OSTCBList != (OS_TCB *)0) {
	LDPK	_OSTCBList
	LAC	_OSTCBList
	BZ	L36
	.line	52
;>>>> 	            OSTCBList->OSTCBPrev = ptcb;
	LAR	AR4,_OSTCBList
	SBRK	2
	MAR	* ,AR4
	ADRK	2
	SAR	AR3,* 
L36:
	.line	54
;>>>> 	        OSTCBList               = ptcb;
	MAR	* ,AR2
	ADRK	4-LF15
	BLDD	* ,#_OSTCBList
	.line	55
;>>>> 	        OSRdyGrp               |= ptcb->OSTCBBitY;         /* Make task ready to run                   */
	LAR	AR3,* ,AR3
	LAC	_OSRdyGrp
	ADRK	11
	OR	* ,AR2
	SACL	_OSRdyGrp
	.line	56
;>>>> 	        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
	LAR	AR4,* ,AR4
	ADRK	9
	LAC	* ,AR0
	ADLK	_OSRdyTbl+0,0
	SACL	* 
	LAR	AR5,* ,AR5
	LAC	* ,AR3
	MAR	*-
	OR	* ,AR5
	SACL	* 
	.line	57
;>>>> 	        OS_EXIT_CRITICAL();
	CLRC INTM 
	.line	58
;>>>> 	        return (OS_NO_ERR);
;>>>> 	    } else {
	LACK	0
	B	EPI0_15
L35:
	.line	60
;>>>> 	        OS_EXIT_CRITICAL();
	CLRC INTM 
	.line	61
;>>>> 	        return (OS_NO_MORE_TCB);
	LACK	70
EPI0_15:
	.line	63
	MAR	* ,AR1
	SBRK	3
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	781,000000000H,2

	.sym	_OSTimeTick,_OSTimeTick,32,2,0
	.globl	_OSTimeTick

	.func	797
;>>>> 	void OSTimeTick (void)
;>>>> 	    OS_TCB *ptcb;
******************************************************
* FUNCTION DEF : _OSTimeTick
******************************************************
_OSTimeTick:
	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,2
	LAR	AR0,*0+

	.sym	_ptcb,1,24,1,16,_os_tcb
	.line	6
;>>>> 	    OSTimeTickHook();                                      /* Call user definable hook                 */
	CALL	_OSTimeTickHook
	.line	7
;>>>> 	    ptcb = OSTCBList;                                      /* Point at first TCB in TCB list           */
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	BLKD	#_OSTCBList,* 
	.line	8
;>>>> 	    while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {              /* Go through all TCBs in TCB list          */
	LAR	AR3,* ,AR3
	ADRK	7
	LAC	* 
	SUBK	10
	BZ	L38
	MAR	* ,AR2
L37:
	.line	9
;>>>> 	        OS_ENTER_CRITICAL();
	SETC INTM 
	.line	10
;>>>> 	        if (ptcb->OSTCBDly != 0) {                         /* Delayed or waiting for event with TO     */
	LAR	AR3,* ,AR3
	ADRK	5
	LAC	* 
	BZ	L39
	.line	11
;>>>> 	            if (--ptcb->OSTCBDly == 0) {                   /* Decrement nbr of ticks to end of delay   */
	ZALS	* 
	SUBK	1
	SACL	* 
	ANDK	0FFFFh
	BNZ	L39
	.line	12
;>>>> 	                if (!(ptcb->OSTCBStat & OS_STAT_SUSPEND)) {    /* Is task suspended?                   */
	MAR	*+
	BIT	* ,12
	BBNZ	L41
	.line	13
;>>>> 	                    OSRdyGrp               |= ptcb->OSTCBBitY; /* No,  Make task Rdy to Run (timed out)*/
	LDPK	_OSRdyGrp
	LAC	_OSRdyGrp
	ADRK	5
	OR	* ,AR2
	SACL	_OSRdyGrp
	.line	14
;>>>> 	                    OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
;>>>> 	                } else {                                       /* Yes, Leave 1 tick to prevent ...     */
	LAR	AR4,* ,AR4
	ADRK	9
	LAC	* ,AR0
	ADLK	_OSRdyTbl+0,0
	SACL	* 
	LAR	AR5,* ,AR5
	LAC	* ,AR3
	MAR	*-
	OR	* ,AR5
	SACL	* 
	B	L39
L41:
	.line	16
;>>>> 	                    ptcb->OSTCBDly = 1;                        /* ... loosing the task when the ...    */
	LACK	1
	MAR	*-
	SACL	* 
L39:
	.line	20
;>>>> 	        ptcb = ptcb->OSTCBNext;                            /* Point at next TCB in TCB list            */
	MAR	* ,AR2
	LAR	AR3,* ,AR3
	MAR	*+
	LAC	* ,AR2
	SACL	* 
	.line	21
;>>>> 	        OS_EXIT_CRITICAL();
	CLRC INTM 
	.line	8
	LAR	AR3,* ,AR3
	ADRK	7
	LAC	* ,AR2
	SUBK	10
	BNZ	L37
L38:
	.line	23
;>>>> 	    OS_ENTER_CRITICAL();                                   /* Update the 32-bit tick counter           */
	SETC INTM 
	.line	24
;>>>> 	    OSTime++;
	LDPK	_OSTime
	ZALS	_OSTime
	ADDH	_OSTime+1
	ADDK	1
	SACL	_OSTime
	SACH	_OSTime+1
	.line	25
;>>>> 	    OS_EXIT_CRITICAL();
	CLRC INTM 
EPI0_16:
	.line	26
	MAR	* ,AR1
	SBRK	3
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	822,000000000H,2

	.sym	_OSVersion,_OSVersion,46,2,0
	.globl	_OSVersion

	.func	838
;>>>> 	INT16U OSVersion (void)
******************************************************
* FUNCTION DEF : _OSVersion
******************************************************
_OSVersion:
	POPD	*+
	SAR	AR0,*+
	SAR	AR1,*
	LARK	AR0,1
	LAR	AR0,*0+

	.line	3
;>>>> 	    return (OS_VERSION);
	LACK	200
EPI0_17:
	.line	4
	SBRK	2
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	841,000000000H,1
	.file	"Os_mbox.c"

	.sym	_OSMboxAccept,_OSMboxAccept,96,2,0
	.globl	_OSMboxAccept

	.func	37
;>>>> 	void *OSMboxAccept (OS_EVENT *pevent)
******************************************************
* FUNCTION DEF : _OSMboxAccept
******************************************************
_OSMboxAccept:

LF18	.set	0

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

	.sym	_pevent,-3+LF18,24,9,16,.fake0
	.sym	_msg,1,16,1,16
	.line	2
;>>>> 	    void  *msg;
	.line	6
;>>>> 	    OS_ENTER_CRITICAL();
	SETC INTM 
	.line	7
;>>>> 	    if (pevent->OSEventType != OS_EVENT_TYPE_MBOX) {      /* Validate event block type                 */
	MAR	* ,AR2
	LARK	AR2,-3+LF18
	MAR	*0+
	LAR	AR3,* ,AR3
	ADRK	4
	LAC	* 
	SUBK	1
	BZ	L43
	.line	8
;>>>> 	        OS_EXIT_CRITICAL();
	CLRC INTM 
	.line	9
;>>>> 	        return ((void *)0);
	LACK	0
	B	EPI0_18
L43:
	.line	11
;>>>> 	    msg = pevent->OSEventPtr; 
	SBRK	4
	LAC	* ,AR2
	ADRK	4-LF18
	SACL	* 
	.line	12
;>>>> 	    if (msg != (void *)0) {                               /* See if there is already a message         */
	LAC	* 
	BZ	L44
	.line	13
;>>>> 	        pevent->OSEventPtr = (void *)0;                   /* Clear the mailbox                         */
	LACK	0
	MAR	* ,AR3
	SACL	* 
L44:
	.line	15
;>>>> 	    OS_EXIT_CRITICAL();
	CLRC INTM 
	.line	16
;>>>> 	    return (msg);                                         /* Return the message received (or NULL)     */
	MAR	* ,AR2
	ZALS	* 
EPI0_18:
	.line	17
	MAR	* ,AR1
	SBRK	3
	LAR	AR0,*-
	PSHD	*
	RET

	.endfunc	53,000000000H,2

	.sym	_OSMboxCreate,_OSMboxCreate,104,2,0,.fake0
	.globl	_OSMboxCreate

	.func	71
;>>>> 	OS_EVENT *OSMboxCreate(void *msg)
******************************************************
* FUNCTION DEF : _OSMboxCreate
******************************************************
_OSMboxCreate:

LF19	.set	0

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

	.sym	_msg,-3+LF19,16,9,16
	.sym	_pevent,1,24,1,16,.fake0
	.line	2
;>>>> 	    OS_EVENT *pevent;
	.line	6
;>>>> 	    OS_ENTER_CRITICAL();
	SETC INTM 
	.line	7
;>>>> 	    pevent = OSEventFreeList;                    /* Get next free event control block                  */
	MAR	* ,AR2
	LARK	AR2,1
	MAR	*0+
	BLKD	#_OSEventFreeList,* 
	.line	8
;>>>> 	    if (OSEventFreeList != (OS_EVENT *)0) {      /* See if pool of free ECB pool was empty             */
	LDPK	_OSEventFreeList
	LAC	_OSEventFreeList
	BZ	L45
	.line	9
;>>>> 	        OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
	LAR	AR3,_OSEventFreeList
	MAR	* ,AR3
	BLDD	* ,#_OSEventFreeList
L45:
	.line	11
;>>>> 	    OS_EXIT_CRITICAL();
	CLRC INTM 
	.line	12
;>>>> 	    if (pevent != (OS_EVENT *)0) {
	MAR	* ,AR2
	LAC	* 
	BZ	L46
	.line	13
;>>>> 	        pevent->OSEventType = OS_EVENT_TYPE_MBOX;
	LAR	AR3,* ,AR3
	LACK	1
	ADRK	4
	SACL	* ,AR2
	.line	14
;>>>> 	        pevent->OSEventPtr  = msg;               /* Deposit message in event control block             */
	SBRK	4-LF19
	LAC	* ,AR3
	SBRK	4
	SACL	* ,AR1
	.line	15
;>>>> 	        OSEventWaitListInit(pevent);
	SAR	AR3,*+
	CALL	_OSEventWaitListInit

⌨️ 快捷键说明

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