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

📄 os_task.s

📁 把UCOSII移植到AVR MEGA8上的程序 应用程序为驱动1602显示器,虽说有些简单,但可测试UCOS的运行
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module OS_TASK.c
	.area text(rom, con, rel)
	.dbfile F:\AVRPRA~1\ucosii-port2-mega8\OS_TASK.c
	.dbfunc e OSTaskChangePrio _OSTaskChangePrio fc
	.dbstruct 0 9 .1
	.dbfield 0 OSEventType c
	.dbfield 1 OSEventGrp c
	.dbfield 2 OSEventCnt i
	.dbfield 4 OSEventPtr pV
	.dbfield 6 OSEventTbl A[3:3]c
	.dbend
	.dbstruct 0 16 os_tcb
	.dbfield 0 OSTCBStkPtr pc
	.dbfield 2 OSTCBNext pS[os_tcb]
	.dbfield 4 OSTCBPrev pS[os_tcb]
	.dbfield 6 OSTCBEventPtr pS[.1]
	.dbfield 8 OSTCBDly i
	.dbfield 10 OSTCBStat c
	.dbfield 11 OSTCBPrio c
	.dbfield 12 OSTCBX c
	.dbfield 13 OSTCBY c
	.dbfield 14 OSTCBBitX c
	.dbfield 15 OSTCBBitY c
	.dbend
;         pevent -> R20,R21
;           bity -> R14
;           bitx -> R10
;              x -> R22
;              y -> y+1
;         cpu_sr -> y+0
;           ptcb -> R12,R13
;        newprio -> y+12
;        oldprio -> R20
	.even
_OSTaskChangePrio::
	st -y,r19
	st -y,r18
	rcall push_gset5
	mov R20,R16
	sbiw R28,2
	.dbline -1
	.dbline 43
; /*
; *********************************************************************************************************
; *                                                uC/OS-II
; *                                          The Real-Time Kernel
; *                                            TASK MANAGEMENT
; *
; *                          (c) Copyright 1992-2001, Jean J. Labrosse, Weston, FL
; *                                           All Rights Reserved
; *
; * File : OS_TASK.C
; * By   : Jean J. Labrosse
; *********************************************************************************************************
; */
; 
; #include <string.h>
; 
; #ifndef  OS_MASTER_FILE
; #include "includes.h"
; #endif
; 
; /*
; *********************************************************************************************************
; *                                        CHANGE PRIORITY OF A TASK
; *
; * Description: This function allows you to change the priority of a task dynamically.  Note that the new
; *              priority MUST be available.
; *
; * Arguments  : oldp     is the old priority
; *
; *              newp     is the new priority
; *
; * Returns    : OS_NO_ERR        is the call was successful
; *              OS_PRIO_INVALID  if the priority you specify is higher that the maximum allowed
; *                               (i.e. >= OS_LOWEST_PRIO)
; *              OS_PRIO_EXIST    if the new priority already exist.
; *              OS_PRIO_ERR      there is no task with the specified OLD priority (i.e. the OLD task does
; *                               not exist.
; *********************************************************************************************************
; */
; 
; #if OS_TASK_CHANGE_PRIO_EN > 0
; INT8U  OSTaskChangePrio (INT8U oldprio, INT8U newprio)
; {
	.dbline 66
; #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
;     OS_CPU_SR    cpu_sr;
; #endif
; 
; #if OS_EVENT_EN > 0
;     OS_EVENT    *pevent;
; #endif
; 
;     OS_TCB      *ptcb;
;     INT8U        x;
;     INT8U        y;
;     INT8U        bitx;
;     INT8U        bity;
; 
; 
; 
; #if OS_ARG_CHK_EN > 0
;     if ((oldprio >= OS_LOWEST_PRIO && oldprio != OS_PRIO_SELF)  ||
;          newprio >= OS_LOWEST_PRIO) {
;         return (OS_PRIO_INVALID);
;     }
; #endif
;     OS_ENTER_CRITICAL();
	rcall _OS_CPU_SR_Save
	std y+0,R16
	.dbline 67
;     if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) {                 /* New priority must not already exist */
	ldi R24,2
	ldd R0,y+12
	mul R24,R0
	movw R30,R0
	ldi R24,<_OSTCBPrioTbl
	ldi R25,>_OSTCBPrioTbl
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	tst R2
	brne X0
	tst R3
	breq L4
X0:
	.dbline 67
	.dbline 68
;         OS_EXIT_CRITICAL();
	ldd R16,y+0
	rcall _OS_CPU_SR_Restore
	.dbline 69
;         return (OS_PRIO_EXIST);
	ldi R16,40
	rjmp L3
L4:
	.dbline 70
;     } else {
	.dbline 71
;         OSTCBPrioTbl[newprio] = (OS_TCB *)1;                    /* Reserve the entry to prevent others */
	ldi R24,2
	ldd R0,y+12
	mul R24,R0
	movw R30,R0
	ldi R24,<_OSTCBPrioTbl
	ldi R25,>_OSTCBPrioTbl
	add R30,R24
	adc R31,R25
	ldi R24,1
	ldi R25,0
	std z+1,R25
	std z+0,R24
	.dbline 72
;         OS_EXIT_CRITICAL();
	ldd R16,y+0
	rcall _OS_CPU_SR_Restore
	.dbline 73
;         y    = newprio >> 3;                                    /* Precompute to reduce INT. latency   */
	ldd R2,y+12
	lsr R2
	lsr R2
	lsr R2
	std y+1,R2
	.dbline 74
;         bity = OSMapTbl[y];
	ldi R24,<_OSMapTbl
	ldi R25,>_OSMapTbl
	mov R30,R2
	clr R31
	add R30,R24
	adc R31,R25
	lpm R14,Z
	.dbline 75
;         x    = newprio & 0x07;
	ldd R22,y+12
	andi R22,7
	.dbline 76
;         bitx = OSMapTbl[x];
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	lpm R10,Z
	.dbline 77
;         OS_ENTER_CRITICAL();
	rcall _OS_CPU_SR_Save
	std y+0,R16
	.dbline 78
;         if (oldprio == OS_PRIO_SELF) {                          /* See if changing self                */
	cpi R20,255
	brne L6
	.dbline 78
	.dbline 79
;             oldprio = OSTCBCur->OSTCBPrio;                      /* Yes, get priority                   */
	lds R30,_OSTCBCur
	lds R31,_OSTCBCur+1
	ldd R20,z+11
	.dbline 80
;         }
L6:
	.dbline 81
;         if ((ptcb = OSTCBPrioTbl[oldprio]) != (OS_TCB *)0) {    /* Task to change must exist           */
	ldi R24,2
	mul R24,R20
	movw R30,R0
	ldi R24,<_OSTCBPrioTbl
	ldi R25,>_OSTCBPrioTbl
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	movw R12,R2
	tst R12
	brne X1
	tst R13
	brne X3
	rjmp L8
X3:
X1:
	.dbline 81
	.dbline 82
;             OSTCBPrioTbl[oldprio] = (OS_TCB *)0;                /* Remove TCB from old priority        */
	ldi R24,2
	mul R24,R20
	movw R30,R0
	ldi R24,<_OSTCBPrioTbl
	ldi R25,>_OSTCBPrioTbl
	add R30,R24
	adc R31,R25
	clr R2
	clr R3
	std z+1,R3
	std z+0,R2
	.dbline 83
;             if ((OSRdyTbl[ptcb->OSTCBY] & ptcb->OSTCBBitX) != 0x00) {  /* If task is ready make it not */
	ldi R24,<_OSRdyTbl
	ldi R25,>_OSRdyTbl
	movw R30,R12
	ldd R30,z+13
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	movw R30,R12
	ldd R3,z+14
	and R2,R3
	brne X4
	rjmp L10
X4:
	.dbline 83
	.dbline 84
;                 if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0x00) {
	movw R30,R12
	ldd R2,z+13
	clr R3
	add R2,R24
	adc R3,R25
	movw R30,R12
	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 L12
	.dbline 84
	.dbline 85
;                     OSRdyGrp &= ~ptcb->OSTCBBitY;
	movw R30,R12
	ldd R2,z+15
	com R2
	lds R3,_OSRdyGrp
	and R3,R2
	sts _OSRdyGrp,R3
	.dbline 86
;                 }
L12:
	.dbline 87
;                 OSRdyGrp    |= bity;                            /* Make new priority ready to run      */
	lds R2,_OSRdyGrp
	or R2,R14
	sts _OSRdyGrp,R2
	.dbline 88
;                 OSRdyTbl[y] |= bitx;
	ldi R24,<_OSRdyTbl
	ldi R25,>_OSRdyTbl
	ldd R2,y+1
	clr R3
	add R2,R24
	adc R3,R25
	movw R30,R2
	ldd R4,z+0
	or R4,R10
	std z+0,R4
	.dbline 90
	rjmp L11
L10:
	.dbline 90
; #if OS_EVENT_EN > 0
;             } else {
	.dbline 91
;                 if ((pevent = ptcb->OSTCBEventPtr) != (OS_EVENT *)0) { /* Remove from event wait list  */
	movw R30,R12
	ldd R2,z+6
	ldd R3,z+7
	movw R20,R2
	cpi R20,0
	cpc R20,R21
	brne X5
	rjmp L14
X5:
X2:
	.dbline 91
	.dbline 92
;                     if ((pevent->OSEventTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) {
	movw R24,R20
	adiw R24,6
	movw R30,R12
	ldd R2,z+13
	clr R3
	add R2,R24
	adc R3,R25
	movw R30,R12
	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 L16
	.dbline 92
	.dbline 93
;                         pevent->OSEventGrp &= ~ptcb->OSTCBBitY;
	movw R24,R20
	adiw R24,1
	movw R30,R12
	ldd R4,z+15
	com R4
	movw R30,R24
	ldd R5,z+0
	and R5,R4
	std z+0,R5
	.dbline 94
;                     }
L16:
	.dbline 95
;                     pevent->OSEventGrp    |= bity;              /* Add new priority to wait list       */
	movw R24,R20

⌨️ 快捷键说明

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