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

📄 os_q.lst

📁 AVR平台下的ucos版本
💻 LST
📖 第 1 页 / 共 5 页
字号:
   1               		.file	"os_q.c"
   2               		.arch atmega128
   3               	__SREG__ = 0x3f
   4               	__SP_H__ = 0x3e
   5               	__SP_L__ = 0x3d
   6               	__tmp_reg__ = 0
   7               	__zero_reg__ = 1
   8               		.global __do_copy_data
   9               		.global __do_clear_bss
  11               		.text
  12               	.Ltext0:
 131               	.global	OSQAccept
 133               	OSQAccept:
   1:os/source/os_q.c **** /*
   2:os/source/os_q.c **** ***************************************************************************************************
   3:os/source/os_q.c **** *                                                uC/OS-II
   4:os/source/os_q.c **** *                                          The Real-Time Kernel
   5:os/source/os_q.c **** *                                        MESSAGE QUEUE MANAGEMENT
   6:os/source/os_q.c **** *
   7:os/source/os_q.c **** *                          (c) Copyright 1992-2001, Jean J. Labrosse, Weston, FL
   8:os/source/os_q.c **** *                                           All Rights Reserved
   9:os/source/os_q.c **** *
  10:os/source/os_q.c **** * File : OS_Q.C
  11:os/source/os_q.c **** * By   : Jean J. Labrosse
  12:os/source/os_q.c **** ***************************************************************************************************
  13:os/source/os_q.c **** */
  14:os/source/os_q.c **** 
  15:os/source/os_q.c **** #ifndef  OS_MASTER_FILE
  16:os/source/os_q.c **** #include <include.h>
  17:os/source/os_q.c **** #endif
  18:os/source/os_q.c **** 
  19:os/source/os_q.c **** #if (OS_Q_EN > 0) && (OS_MAX_QS > 0)
  20:os/source/os_q.c **** /*
  21:os/source/os_q.c **** ***************************************************************************************************
  22:os/source/os_q.c **** *                                      ACCEPT MESSAGE FROM QUEUE
  23:os/source/os_q.c **** *
  24:os/source/os_q.c **** * Description: This function checks the queue to see if a message is available.  Unlike OSQPend(),
  25:os/source/os_q.c **** *              OSQAccept() does not suspend the calling task if a message is not available.
  26:os/source/os_q.c **** *
  27:os/source/os_q.c **** * Arguments  : pevent        is a pointer to the event control block
  28:os/source/os_q.c **** *
  29:os/source/os_q.c **** * Returns    : != (void *)0  is the message in the queue if one is available.  The message is remov
  30:os/source/os_q.c **** *                            from the so the next time OSQAccept() is called, the queue will contai
  31:os/source/os_q.c **** *                            one less entry.
  32:os/source/os_q.c **** *              == (void *)0  if the queue is empty or,
  33:os/source/os_q.c **** *                            if 'pevent' is a NULL pointer or,
  34:os/source/os_q.c **** *                            if you passed an invalid event type
  35:os/source/os_q.c **** ***************************************************************************************************
  36:os/source/os_q.c **** */
  37:os/source/os_q.c **** 
  38:os/source/os_q.c **** #if OS_Q_ACCEPT_EN > 0
  39:os/source/os_q.c **** void  *OSQAccept (OS_EVENT *pevent)
  40:os/source/os_q.c **** {
 135               	.LM1:
 136               	/* prologue: frame size=0 */
 137 0000 CF93      		push r28
 138 0002 DF93      		push r29
 139               	/* prologue end (size=2) */
 140 0004 FC01      		movw r30,r24
  41:os/source/os_q.c **** #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register       
  42:os/source/os_q.c ****     OS_CPU_SR  cpu_sr;
  43:os/source/os_q.c **** #endif    
  44:os/source/os_q.c ****     void      *msg;
  45:os/source/os_q.c ****     OS_Q      *pq;
  46:os/source/os_q.c **** 
  47:os/source/os_q.c **** 
  48:os/source/os_q.c **** #if OS_ARG_CHK_EN > 0
  49:os/source/os_q.c ****     if (pevent == (OS_EVENT *)0) {               /* Validate 'pevent'                              
  50:os/source/os_q.c ****         return ((void *)0);
  51:os/source/os_q.c ****     }
  52:os/source/os_q.c ****     if (pevent->OSEventType != OS_EVENT_TYPE_Q) {/* Validate event block type                      
  53:os/source/os_q.c ****         return ((void *)0);
  54:os/source/os_q.c ****     }
  55:os/source/os_q.c **** #endif
  56:os/source/os_q.c ****     OS_ENTER_CRITICAL();
 142               	.LM2:
 143               	/* #APP */
 144 0006 F894      		cli
  57:os/source/os_q.c ****     pq = (OS_Q *)pevent->OSEventPtr;             /* Point at queue control block                   
 146               	.LM3:
 147               	/* #NOAPP */
 148 0008 A481      		ldd r26,Z+4
 149 000a B581      		ldd r27,Z+5
  58:os/source/os_q.c ****     if (pq->OSQEntries != 0) {                   /* See if any messages in the queue               
 151               	.LM4:
 152 000c ED01      		movw r28,r26
 153 000e 2C85      		ldd r18,Y+12
 154 0010 3D85      		ldd r19,Y+13
 155 0012 2115      		cp r18,__zero_reg__
 156 0014 3105      		cpc r19,__zero_reg__
 157 0016 A9F0      		breq .L2
  59:os/source/os_q.c ****         msg = *pq->OSQOut++;                     /* Yes, extract oldest message from the queue     
 159               	.LM5:
 160 0018 E885      		ldd r30,Y+8
 161 001a F985      		ldd r31,Y+9
 162 001c 8191      		ld r24,Z+
 163 001e 9191      		ld r25,Z+
 164 0020 F987      		std Y+9,r31
 165 0022 E887      		std Y+8,r30
 166 0024 AC01      		movw r20,r24
  60:os/source/os_q.c ****         pq->OSQEntries--;                        /* Update the number of entries in the queue      
 168               	.LM6:
 169 0026 2150      		subi r18,lo8(-(-1))
 170 0028 3040      		sbci r19,hi8(-(-1))
 171 002a 3D87      		std Y+13,r19
 172 002c 2C87      		std Y+12,r18
  61:os/source/os_q.c ****         if (pq->OSQOut == pq->OSQEnd) {          /* Wrap OUT pointer if we are at the end of the qu
 174               	.LM7:
 175 002e 8C81      		ldd r24,Y+4
 176 0030 9D81      		ldd r25,Y+5
 177 0032 E817      		cp r30,r24
 178 0034 F907      		cpc r31,r25
 179 0036 31F4      		brne .L4
  62:os/source/os_q.c ****             pq->OSQOut = pq->OSQStart;
 181               	.LM8:
 182 0038 8A81      		ldd r24,Y+2
 183 003a 9B81      		ldd r25,Y+3
 184 003c 9987      		std Y+9,r25
 185 003e 8887      		std Y+8,r24
 186 0040 01C0      		rjmp .L4
 187               	.L2:
  63:os/source/os_q.c ****         }
  64:os/source/os_q.c ****     } else {
  65:os/source/os_q.c ****         msg = (void *)0;                         /* Queue is empty                                 
 189               	.LM9:
 190 0042 A901      		movw r20,r18
 191               	.L4:
  66:os/source/os_q.c ****     }
  67:os/source/os_q.c ****     OS_EXIT_CRITICAL();
 193               	.LM10:
 194               	/* #APP */
 195 0044 7894      		sei
  68:os/source/os_q.c ****     return (msg);                                /* Return message received (or NULL)              
  69:os/source/os_q.c **** }
 197               	.LM11:
 198               	/* #NOAPP */
 199 0046 CA01      		movw r24,r20
 200               	/* epilogue: frame size=0 */
 201 0048 DF91      		pop r29
 202 004a CF91      		pop r28
 203 004c 0895      		ret
 204               	/* epilogue end (size=3) */
 205               	/* function OSQAccept size 41 (36) */
 211               	.Lscope0:
 215               	.global	OSQCreate
 217               	OSQCreate:
  70:os/source/os_q.c **** #endif
  71:os/source/os_q.c **** /*$PAGE*/
  72:os/source/os_q.c **** /*
  73:os/source/os_q.c **** ***************************************************************************************************
  74:os/source/os_q.c **** *                                        CREATE A MESSAGE QUEUE
  75:os/source/os_q.c **** *
  76:os/source/os_q.c **** * Description: This function creates a message queue if free event control blocks are available.
  77:os/source/os_q.c **** *
  78:os/source/os_q.c **** * Arguments  : start         is a pointer to the base address of the message queue storage area.  T
  79:os/source/os_q.c **** *                            storage area MUST be declared as an array of pointers to 'void' as fol
  80:os/source/os_q.c **** *
  81:os/source/os_q.c **** *                            void *MessageStorage[size]
  82:os/source/os_q.c **** *
  83:os/source/os_q.c **** *              size          is the number of elements in the storage area
  84:os/source/os_q.c **** *
  85:os/source/os_q.c **** * Returns    : != (OS_EVENT *)0  is a pointer to the event control clock (OS_EVENT) associated with
  86:os/source/os_q.c **** *                                created queue
  87:os/source/os_q.c **** *              == (OS_EVENT *)0  if no event control blocks were available or an error was detected
  88:os/source/os_q.c **** ***************************************************************************************************
  89:os/source/os_q.c **** */
  90:os/source/os_q.c **** 
  91:os/source/os_q.c **** OS_EVENT  *OSQCreate (void **start, INT16U size)
  92:os/source/os_q.c **** {
 219               	.LM12:
 220               	/* prologue: frame size=0 */
 221 004e CF93      		push r28
 222 0050 DF93      		push r29
 223               	/* prologue end (size=2) */
 224 0052 9C01      		movw r18,r24
  93:os/source/os_q.c **** #if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register       
  94:os/source/os_q.c ****     OS_CPU_SR  cpu_sr;
  95:os/source/os_q.c **** #endif    
  96:os/source/os_q.c ****     OS_EVENT  *pevent;
  97:os/source/os_q.c ****     OS_Q      *pq;
  98:os/source/os_q.c **** 
  99:os/source/os_q.c **** 
 100:os/source/os_q.c ****     if (OSIntNesting > 0) {                      /* See if called from ISR ...                     
 226               	.LM13:
 227 0054 8091 0000 		lds r24,OSIntNesting
 228 0058 8823      		tst r24
 229 005a 19F0      		breq .L6
 101:os/source/os_q.c ****         return ((OS_EVENT *)0);                  /* ... can't CREATE from an ISR                   
 231               	.LM14:
 232 005c 80E0      		ldi r24,lo8(0)
 233 005e 90E0      		ldi r25,hi8(0)
 234 0060 47C0      		rjmp .L5
 235               	.L6:
 102:os/source/os_q.c ****     }
 103:os/source/os_q.c ****     OS_ENTER_CRITICAL();
 237               	.LM15:
 238               	/* #APP */
 239 0062 F894      		cli
 104:os/source/os_q.c ****     pevent = OSEventFreeList;                    /* Get next free event control block              
 241               	.LM16:
 242               	/* #NOAPP */
 243 0064 C091 0000 		lds r28,OSEventFreeList
 244 0068 D091 0000 		lds r29,(OSEventFreeList)+1
 105:os/source/os_q.c ****     if (OSEventFreeList != (OS_EVENT *)0) {      /* See if pool of free ECB pool was empty         
 246               	.LM17:
 247 006c 2097      		sbiw r28,0
 248 006e 31F0      		breq .L7
 106:os/source/os_q.c ****         OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
 250               	.LM18:
 251 0070 8C81      		ldd r24,Y+4
 252 0072 9D81      		ldd r25,Y+5
 253 0074 9093 0000 		sts (OSEventFreeList)+1,r25
 254 0078 8093 0000 		sts OSEventFreeList,r24
 255               	.L7:
 107:os/source/os_q.c ****     }
 108:os/source/os_q.c ****     OS_EXIT_CRITICAL();
 257               	.LM19:
 258               	/* #APP */
 259 007c 7894      		sei
 109:os/source/os_q.c ****     if (pevent != (OS_EVENT *)0) {               /* See if we have an event control block          
 261               	.LM20:
 262               	/* #NOAPP */
 263 007e 2097      		sbiw r28,0
 264 0080 B1F1      		breq .L8
 110:os/source/os_q.c ****         OS_ENTER_CRITICAL();                     /* Get a free queue control block                 
 266               	.LM21:
 267               	/* #APP */
 268 0082 F894      		cli
 111:os/source/os_q.c ****         pq = OSQFreeList;
 270               	.LM22:
 271               	/* #NOAPP */
 272 0084 E091 0000 		lds r30,OSQFreeList
 273 0088 F091 0000 		lds r31,(OSQFreeList)+1
 112:os/source/os_q.c ****         if (OSQFreeList != (OS_Q *)0) {
 275               	.LM23:
 276 008c 3097      		sbiw r30,0
 277 008e 31F0      		breq .L9
 113:os/source/os_q.c ****             OSQFreeList = OSQFreeList->OSQPtr;
 279               	.LM24:
 280 0090 8081      		ld r24,Z
 281 0092 9181      		ldd r25,Z+1
 282 0094 9093 0000 		sts (OSQFreeList)+1,r25

⌨️ 快捷键说明

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