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

📄 os_core.s

📁 把UCOSII移植到AVR MEGA8上的程序 应用程序为驱动1602显示器,虽说有些简单,但可测试UCOS的运行
💻 S
📖 第 1 页 / 共 5 页
字号:
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                             MAKE TASK READY TO RUN BASED ON EVENT OCCURING
; *
; * Description: This function is called by other uC/OS-II services and is used to ready a task that was
; *              waiting for an event to occur.
; *
; * Arguments  : pevent    is a pointer to the event control block corresponding to the event.
; *
; *              msg       is a pointer to a message.  This pointer is used by message oriented services
; *                        such as MAILBOXEs and QUEUEs.  The pointer is not used when called by other
; *                        service functions.
; *
; *              msk       is a mask that is used to clear the status byte of the TCB.  For example,
; *                        OSSemPost() will pass OS_STAT_SEM, OSMboxPost() will pass OS_STAT_MBOX etc.
; *
; * Returns    : none
; *
; * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if OS_EVENT_EN > 0
; INT8U  OS_EventTaskRdy (OS_EVENT *pevent, void *msg, INT8U msk)
; {
	.dbline 586
;     OS_TCB *ptcb;
;     INT8U   x;
;     INT8U   y;
;     INT8U   bitx;
;     INT8U   bity;
;     INT8U   prio;
; 
; 
;     y    = OSUnMapTbl[pevent->OSEventGrp];            /* Find highest prio. task waiting for message   */
	ldi R24,<_OSUnMapTbl
	ldi R25,>_OSUnMapTbl
	movw R30,R16
	ldd R30,z+1
	clr R31
	add R30,R24
	adc R31,R25
	lpm R10,Z
	.dbline 587
;     bity = OSMapTbl[y];
	ldi R24,<_OSMapTbl
	ldi R25,>_OSMapTbl
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	lpm R12,Z
	.dbline 588
;     x    = OSUnMapTbl[pevent->OSEventTbl[y]];
	movw R24,R16
	adiw R24,6
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	ldd R30,z+0
	clr R31
	ldi R24,<_OSUnMapTbl
	ldi R25,>_OSUnMapTbl
	add R30,R24
	adc R31,R25
	lpm R20,Z
	.dbline 589
;     bitx = OSMapTbl[x];
	ldi R24,<_OSMapTbl
	ldi R25,>_OSMapTbl
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	lpm R22,Z
	.dbline 590
;     prio = (INT8U)((y << 3) + x);                     /* Find priority of task getting the msg         */
	mov R2,R20
	clr R3
	mov R20,R10
	clr R21
	lsl R20
	rol R21
	lsl R20
	rol R21
	lsl R20
	rol R21
	add R20,R2
	adc R21,R3
	.dbline 591
;     if ((pevent->OSEventTbl[y] &= ~bitx) == 0x00) {   /* Remove this task from the waiting list        */
	movw R24,R16
	adiw R24,6
	mov R2,R10
	clr R3
	add R2,R24
	adc R3,R25
	mov R4,R22
	com R4
	movw R30,R2
	ldd R5,z+0
	and R5,R4
	mov R4,R5
	std z+0,R4
	tst R5
	brne L48
	.dbline 591
	.dbline 592
;         pevent->OSEventGrp &= ~bity;                  /* Clr group bit if this was only task pending   */
	movw R24,R16
	adiw R24,1
	mov R4,R12
	com R4
	movw R30,R24
	ldd R5,z+0
	and R5,R4
	std z+0,R5
	.dbline 593
;     }
L48:
	.dbline 594
;     ptcb                 =  OSTCBPrioTbl[prio];       /* Point to this task's OS_TCB                   */
	ldi R24,2
	mul R24,R20
	movw R30,R0
	ldi R24,<_OSTCBPrioTbl
	ldi R25,>_OSTCBPrioTbl
	add R30,R24
	adc R31,R25
	ldd R14,z+0
	ldd R15,z+1
	.dbline 595
;     ptcb->OSTCBDly       =  0;                        /* Prevent OSTimeTick() from readying task       */
	clr R2
	clr R3
	movw R30,R14
	std z+9,R3
	std z+8,R2
	.dbline 596
;     ptcb->OSTCBEventPtr  = (OS_EVENT *)0;             /* Unlink ECB from this task                     */
	movw R30,R14
	std z+7,R3
	std z+6,R2
	.dbline 600
; #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
;     ptcb->OSTCBMsg       = msg;                       /* Send message directly to waiting task         */
; #else
;     msg                  = msg;                       /* Prevent compiler warning if not used          */
	.dbline 602
; #endif
;     ptcb->OSTCBStat     &= ~msk;                      /* Clear bit associated with event type          */
	movw R24,R14
	adiw R24,10
	ldd R4,y+10
	com R4
	movw R30,R24
	ldd R5,z+0
	and R5,R4
	std z+0,R5
	.dbline 603
;     if (ptcb->OSTCBStat == OS_STAT_RDY) {             /* See if task is ready (could be susp'd)        */
	movw R30,R14
	ldd R2,z+10
	tst R2
	brne L50
	.dbline 603
	.dbline 604
;         OSRdyGrp        |=  bity;                     /* Put task in the ready to run list             */
	lds R2,_OSRdyGrp
	or R2,R12
	sts _OSRdyGrp,R2
	.dbline 605
;         OSRdyTbl[y]     |=  bitx;
	ldi R24,<_OSRdyTbl
	ldi R25,>_OSRdyTbl
	mov R2,R10
	clr R3
	add R2,R24
	adc R3,R25
	movw R30,R2
	ldd R4,z+0
	or R4,R22
	std z+0,R4
	.dbline 606
;     }
L50:
	.dbline 607
;     return (prio);
	mov R16,R20
	.dbline -2
L47:
	rcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r bity 12 c
	.dbsym r bitx 22 c
	.dbsym r prio 20 c
	.dbsym r x 20 c
	.dbsym r ptcb 14 pS[os_tcb]
	.dbsym r y 10 c
	.dbsym l msk 10 c
	.dbsym r msg 18 pV
	.dbsym r pevent 16 pS[.1]
	.dbend
	.dbfunc e OS_EventTaskWait _OS_EventTaskWait fV
;         pevent -> R16,R17
	.even
_OS_EventTaskWait::
	.dbline -1
	.dbline 627
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                   MAKE TASK WAIT FOR EVENT TO OCCUR
; *
; * Description: This function is called by other uC/OS-II services to suspend a task because an event has
; *              not occurred.
; *
; * Arguments  : pevent   is a pointer to the event control block for which the task will be waiting for.
; *
; * Returns    : none
; *
; * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if OS_EVENT_EN > 0
; void  OS_EventTaskWait (OS_EVENT *pevent)
; {
	.dbline 628
;     OSTCBCur->OSTCBEventPtr = pevent;            /* Store pointer to event control block in TCB        */
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	std z+7,R17
	std z+6,R16
	.dbline 629
;     if ((OSRdyTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) {   /* Task no longer ready      */
	ldi R24,<_OSRdyTbl
	ldi R25,>_OSRdyTbl
	ldd R2,z+13
	clr R3
	add R2,R24
	adc R3,R25
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R4,z+14
	com R4
	movw R30,R2
	ldd R5,z+0
	and R5,R4
	mov R4,R5
	std z+0,R4
	tst R5
	brne L53
	.dbline 629
	.dbline 630
;         OSRdyGrp &= ~OSTCBCur->OSTCBBitY;        /* Clear event grp bit if this was only task pending  */
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R2,z+15
	com R2
	lds R3,_OSRdyGrp
	and R3,R2
	sts _OSRdyGrp,R3
	.dbline 631
;     }
L53:
	.dbline 632
;     pevent->OSEventTbl[OSTCBCur->OSTCBY] |= OSTCBCur->OSTCBBitX;          /* Put task in waiting list  */
	movw R24,R16
	adiw R24,6
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R2,z+13
	clr R3
	add R2,R24
	adc R3,R25
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R4,z+14
	movw R30,R2
	ldd R5,z+0
	or R5,R4
	std z+0,R5
	.dbline 633
;     pevent->OSEventGrp                   |= OSTCBCur->OSTCBBitY;
	movw R24,R16
	adiw R24,1
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R4,z+15
	movw R30,R24
	ldd R5,z+0
	or R5,R4
	std z+0,R5
	.dbline -2
L52:
	.dbline 0 ; func end
	ret
	.dbsym r pevent 16 pS[.1]
	.dbend
	.dbfunc e OS_EventTO _OS_EventTO fV
;         pevent -> R16,R17
	.even
_OS_EventTO::
	.dbline -1
	.dbline 653
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                              MAKE TASK READY TO RUN BASED ON EVENT TIMEOUT
; *
; * Description: This function is called by other uC/OS-II services to make a task ready to run because a
; *              timeout occurred.
; *
; * Arguments  : pevent   is a pointer to the event control block which is readying a task.
; *
; * Returns    : none
; *
; * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if OS_EVENT_EN > 0
; void  OS_EventTO (OS_EVENT *pevent)
; {
	.dbline 654
;     if ((pevent->OSEventTbl[OSTCBCur->OSTCBY] &= ~OSTCBCur->OSTCBBitX) == 0x00) {
	movw R24,R16
	adiw R24,6
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R2,z+13
	clr R3
	add R2,R24
	adc R3,R25
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R4,z+14
	com R4
	movw R30,R2
	ldd R5,z+0
	and R5,R4
	mov R4,R5
	std z+0,R4
	tst R5
	brne L56
	.dbline 654
	.dbline 655
;         pevent->OSEventGrp &= ~OSTCBCur->OSTCBBitY;
	movw R24,R16
	adiw R24,1
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R4,z+15
	com R4
	movw R30,R24
	ldd R5,z+0
	and R5,R4
	std z+0,R5
	.dbline 656
;     }
L56:
	.dbline 657
;     OSTCBCur->OSTCBStat     = OS_STAT_RDY;       /* Set status to ready                                */
	clr R2
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	std z+10,R2
	.dbline 658
;     OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;     /* No longer waiting for event                        */
	clr R3
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	std z+7,R3
	std z+6,R2
	.dbline -2
L55:
	.dbline 0 ; func end
	ret
	.dbsym r pevent 16 pS[.1]
	.dbend
	.dbfunc e OS_EventWaitListInit _OS_EventWaitListInit fV
;           ptbl -> R20,R21
;         pevent -> R16,R17
	.even
_OS_EventWaitListInit::
	rcall push_gset1
	.dbline -1
	.dbline 677
; }
; #endif
; /*$PAGE*/
; /*
; *********************************************************************************************************
; *                                 INITIALIZE EVENT CONTROL BLOCK'S WAIT LIST
; *
; * Description: This function is called by other uC/OS-II services to initialize the event wait list.
; *
; * Arguments  : pevent    is a pointer to the event control block allocated to the event.
; *
; * Returns    : none
; *
; * Note       : This function is INTERNAL to uC/OS-II and your application should not call it.
; *********************************************************************************************************
; */
; #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0)
; void  OS_EventWaitListInit (OS_EVENT *pevent)
; {
	.dbline 681
;     INT8U  *ptbl;
; 
; 
;     pevent->OSEventGrp = 0x00;                   /* No task waiting on event                           */
	clr R2
	movw R30,R16
	std z+1,R2
	.dbline 682
;     ptbl               = &pevent->OSEventTbl[0];
	movw R20,R16
	subi R20,250  ; offset = 6
	sbci R21,255
	.dbline 685
; 
; #if OS_EVENT_TBL_SIZE > 0
;     *ptbl++            = 0x00;
	movw R30,R20
	st Z+,R2
	.dbline 689
; #endif
; 
; #if OS_EVENT_TBL_SIZE > 1
;     *ptbl++            = 0x00;
	st Z+,R2
	.dbline 693
; #endif
; 
; #if OS_EVENT_TBL_SIZE > 2
;     *ptbl++            = 0x00;
	st Z+,R2
	movw R20,R30
	.dbline -2
L58:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r ptbl 20 pc
	.dbsym r pevent 16 pS[.1]
	.dbend
	.dbfunc e OS_Sched _OS_Sched fV
;              y -> R12
;         cpu_sr -> R10
	.even
_OS_Sched::
	rcall push_gset4
	.dbline -1
	.dbline 736
; #endif

⌨️ 快捷键说明

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