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

📄 os_q.lst

📁 AVR平台下的ucos版本
💻 LST
📖 第 1 页 / 共 5 页
字号:
 283 0098 8093 0000 		sts OSQFreeList,r24
 284               	.L9:
 114:os/source/os_q.c ****         }
 115:os/source/os_q.c ****         OS_EXIT_CRITICAL();
 286               	.LM25:
 287               	/* #APP */
 288 009c 7894      		sei
 116:os/source/os_q.c ****         if (pq != (OS_Q *)0) {                   /* See if we were able to get a queue control bloc
 290               	.LM26:
 291               	/* #NOAPP */
 292 009e 3097      		sbiw r30,0
 293 00a0 C9F0      		breq .L10
 117:os/source/os_q.c ****             pq->OSQStart        = start;         /* Yes, initialize the queue                      
 295               	.LM27:
 296 00a2 3383      		std Z+3,r19
 297 00a4 2283      		std Z+2,r18
 118:os/source/os_q.c ****             pq->OSQEnd          = &start[size];
 299               	.LM28:
 300 00a6 CB01      		movw r24,r22
 301 00a8 860F      		add r24,r22
 302 00aa 971F      		adc r25,r23
 303 00ac 820F      		add r24,r18
 304 00ae 931F      		adc r25,r19
 305 00b0 9583      		std Z+5,r25
 306 00b2 8483      		std Z+4,r24
 119:os/source/os_q.c ****             pq->OSQIn           = start;
 308               	.LM29:
 309 00b4 3783      		std Z+7,r19
 310 00b6 2683      		std Z+6,r18
 120:os/source/os_q.c ****             pq->OSQOut          = start;
 312               	.LM30:
 313 00b8 3187      		std Z+9,r19
 314 00ba 2087      		std Z+8,r18
 121:os/source/os_q.c ****             pq->OSQSize         = size;
 316               	.LM31:
 317 00bc 7387      		std Z+11,r23
 318 00be 6287      		std Z+10,r22
 122:os/source/os_q.c ****             pq->OSQEntries      = 0;
 320               	.LM32:
 321 00c0 1586      		std Z+13,__zero_reg__
 322 00c2 1486      		std Z+12,__zero_reg__
 123:os/source/os_q.c ****             pevent->OSEventType = OS_EVENT_TYPE_Q;
 324               	.LM33:
 325 00c4 82E0      		ldi r24,lo8(2)
 326 00c6 8883      		st Y,r24
 124:os/source/os_q.c ****             pevent->OSEventPtr  = pq;
 328               	.LM34:
 329 00c8 FD83      		std Y+5,r31
 330 00ca EC83      		std Y+4,r30
 125:os/source/os_q.c ****             OS_EventWaitListInit(pevent);
 332               	.LM35:
 333 00cc CE01      		movw r24,r28
 334 00ce 0E94 0000 		call OS_EventWaitListInit
 335 00d2 0DC0      		rjmp .L8
 336               	.L10:
 126:os/source/os_q.c ****         } else {                                 /* No,  since we couldn't get a queue control bloc
 127:os/source/os_q.c ****             OS_ENTER_CRITICAL();                 /* Return event control block on error            
 338               	.LM36:
 339               	/* #APP */
 340 00d4 F894      		cli
 128:os/source/os_q.c ****             pevent->OSEventPtr = (void *)OSEventFreeList;
 342               	.LM37:
 343               	/* #NOAPP */
 344 00d6 8091 0000 		lds r24,OSEventFreeList
 345 00da 9091 0000 		lds r25,(OSEventFreeList)+1
 346 00de 9D83      		std Y+5,r25
 347 00e0 8C83      		std Y+4,r24
 129:os/source/os_q.c ****             OSEventFreeList    = pevent;
 349               	.LM38:
 350 00e2 D093 0000 		sts (OSEventFreeList)+1,r29
 351 00e6 C093 0000 		sts OSEventFreeList,r28
 130:os/source/os_q.c ****             OS_EXIT_CRITICAL();
 353               	.LM39:
 354               	/* #APP */
 355 00ea 7894      		sei
 131:os/source/os_q.c ****             pevent = (OS_EVENT *)0;
 357               	.LM40:
 358               	/* #NOAPP */
 359 00ec EF01      		movw r28,r30
 360               	.L8:
 132:os/source/os_q.c ****         }
 133:os/source/os_q.c ****     }
 134:os/source/os_q.c ****     return (pevent);
 362               	.LM41:
 363 00ee CE01      		movw r24,r28
 364               	.L5:
 365               	/* epilogue: frame size=0 */
 366 00f0 DF91      		pop r29
 367 00f2 CF91      		pop r28
 368 00f4 0895      		ret
 369               	/* epilogue end (size=3) */
 370               	/* function OSQCreate size 90 (85) */
 376               	.Lscope1:
 379               	.global	OSQFlush
 381               	OSQFlush:
 135:os/source/os_q.c **** }
 136:os/source/os_q.c **** /*$PAGE*/
 137:os/source/os_q.c **** /*
 138:os/source/os_q.c **** ***************************************************************************************************
 139:os/source/os_q.c **** *                                        DELETE A MESSAGE QUEUE
 140:os/source/os_q.c **** *
 141:os/source/os_q.c **** * Description: This function deletes a message queue and readies all tasks pending on the queue.
 142:os/source/os_q.c **** *
 143:os/source/os_q.c **** * Arguments  : pevent        is a pointer to the event control block associated with the desired
 144:os/source/os_q.c **** *                            queue.
 145:os/source/os_q.c **** *
 146:os/source/os_q.c **** *              opt           determines delete options as follows:
 147:os/source/os_q.c **** *                            opt == OS_DEL_NO_PEND   Delete the queue ONLY if no task pending
 148:os/source/os_q.c **** *                            opt == OS_DEL_ALWAYS    Deletes the queue even if tasks are waiting.
 149:os/source/os_q.c **** *                                                    In this case, all the tasks pending will be re
 150:os/source/os_q.c **** *
 151:os/source/os_q.c **** *              err           is a pointer to an error code that can contain one of the following va
 152:os/source/os_q.c **** *                            OS_NO_ERR               The call was successful and the queue was dele
 153:os/source/os_q.c **** *                            OS_ERR_DEL_ISR          If you tried to delete the queue from an ISR
 154:os/source/os_q.c **** *                            OS_ERR_INVALID_OPT      An invalid option was specified
 155:os/source/os_q.c **** *                            OS_ERR_TASK_WAITING     One or more tasks were waiting on the queue
 156:os/source/os_q.c **** *                            OS_ERR_EVENT_TYPE       If you didn't pass a pointer to a queue
 157:os/source/os_q.c **** *                            OS_ERR_PEVENT_NULL      If 'pevent' is a NULL pointer.
 158:os/source/os_q.c **** *
 159:os/source/os_q.c **** * Returns    : pevent        upon error
 160:os/source/os_q.c **** *              (OS_EVENT *)0 if the queue was successfully deleted.
 161:os/source/os_q.c **** *
 162:os/source/os_q.c **** * Note(s)    : 1) This function must be used with care.  Tasks that would normally expect the prese
 163:os/source/os_q.c **** *                 the queue MUST check the return code of OSQPend().
 164:os/source/os_q.c **** *              2) OSQAccept() callers will not know that the intended queue has been deleted unless
 165:os/source/os_q.c **** *                 they check 'pevent' to see that it's a NULL pointer.
 166:os/source/os_q.c **** *              3) This call can potentially disable interrupts for a long time.  The interrupt disa
 167:os/source/os_q.c **** *                 time is directly proportional to the number of tasks waiting on the queue.
 168:os/source/os_q.c **** *              4) Because ALL tasks pending on the queue will be readied, you MUST be careful in
 169:os/source/os_q.c **** *                 applications where the queue is used for mutual exclusion because the resource(s)
 170:os/source/os_q.c **** *                 will no longer be guarded by the queue.
 171:os/source/os_q.c **** *              5) If the storage for the message queue was allocated dynamically (i.e. using a mall
 172:os/source/os_q.c **** *                 type call) then your application MUST release the memory storage by call the coun
 173:os/source/os_q.c **** *                 call of the dynamic allocation scheme used.  If the queue storage was created sta
 174:os/source/os_q.c **** *                 then, the storage can be reused.
 175:os/source/os_q.c **** ***************************************************************************************************
 176:os/source/os_q.c **** */
 177:os/source/os_q.c **** 
 178:os/source/os_q.c **** #if OS_Q_DEL_EN > 0
 179:os/source/os_q.c **** OS_EVENT  *OSQDel (OS_EVENT *pevent, INT8U opt, INT8U *err)
 180:os/source/os_q.c **** {
 181:os/source/os_q.c **** #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status regis
 182:os/source/os_q.c ****     OS_CPU_SR  cpu_sr;
 183:os/source/os_q.c **** #endif    
 184:os/source/os_q.c ****     BOOLEAN    tasks_waiting;
 185:os/source/os_q.c ****     OS_Q      *pq;
 186:os/source/os_q.c **** 
 187:os/source/os_q.c **** 
 188:os/source/os_q.c ****     if (OSIntNesting > 0) {                                /* See if called from ISR ...           
 189:os/source/os_q.c ****         *err = OS_ERR_DEL_ISR;                             /* ... can't DELETE from an ISR         
 190:os/source/os_q.c ****         return ((OS_EVENT *)0);
 191:os/source/os_q.c ****     }
 192:os/source/os_q.c **** #if OS_ARG_CHK_EN > 0
 193:os/source/os_q.c ****     if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                    
 194:os/source/os_q.c ****         *err = OS_ERR_PEVENT_NULL;
 195:os/source/os_q.c ****         return (pevent);
 196:os/source/os_q.c ****     }
 197:os/source/os_q.c ****     if (pevent->OSEventType != OS_EVENT_TYPE_Q) {          /* Validate event block type            
 198:os/source/os_q.c ****         *err = OS_ERR_EVENT_TYPE;
 199:os/source/os_q.c ****         return (pevent);
 200:os/source/os_q.c ****     }
 201:os/source/os_q.c **** #endif
 202:os/source/os_q.c ****     OS_ENTER_CRITICAL();
 203:os/source/os_q.c ****     if (pevent->OSEventGrp != 0x00) {                      /* See if any tasks waiting on queue    
 204:os/source/os_q.c ****         tasks_waiting = TRUE;                              /* Yes                                  
 205:os/source/os_q.c ****     } else {
 206:os/source/os_q.c ****         tasks_waiting = FALSE;                             /* No                                   
 207:os/source/os_q.c ****     }
 208:os/source/os_q.c ****     switch (opt) {
 209:os/source/os_q.c ****         case OS_DEL_NO_PEND:                               /* Delete queue only if no task waiting 
 210:os/source/os_q.c ****              if (tasks_waiting == FALSE) {
 211:os/source/os_q.c ****                  pq                  = pevent->OSEventPtr; /* Return OS_Q to free list             
 212:os/source/os_q.c ****                  pq->OSQPtr          = OSQFreeList;
 213:os/source/os_q.c ****                  OSQFreeList         = pq;
 214:os/source/os_q.c ****                  pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
 215:os/source/os_q.c ****                  pevent->OSEventPtr  = OSEventFreeList;    /* Return Event Control Block to free li
 216:os/source/os_q.c ****                  OSEventFreeList     = pevent;             /* Get next free event control block    
 217:os/source/os_q.c ****                  OS_EXIT_CRITICAL();
 218:os/source/os_q.c ****                  *err = OS_NO_ERR;
 219:os/source/os_q.c ****                  return ((OS_EVENT *)0);                   /* Queue has been deleted               
 220:os/source/os_q.c ****              } else {
 221:os/source/os_q.c ****                  OS_EXIT_CRITICAL();
 222:os/source/os_q.c ****                  *err = OS_ERR_TASK_WAITING;
 223:os/source/os_q.c ****                  return (pevent);
 224:os/source/os_q.c ****              }
 225:os/source/os_q.c **** 
 226:os/source/os_q.c ****         case OS_DEL_ALWAYS:                                /* Always delete the queue              
 227:os/source/os_q.c ****              while (pevent->OSEventGrp != 0x00) {          /* Ready ALL tasks waiting for queue    
 228:os/source/os_q.c ****                  OS_EventTaskRdy(pevent, (void *)0, OS_STAT_Q);
 229:os/source/os_q.c ****              }
 230:os/source/os_q.c ****              pq                  = pevent->OSEventPtr;     /* Return OS_Q to free list             
 231:os/source/os_q.c ****              pq->OSQPtr          = OSQFreeList;
 232:os/source/os_q.c ****              OSQFreeList         = pq;
 233:os/source/os_q.c ****              pevent->OSEventType = OS_EVENT_TYPE_UNUSED;
 234:os/source/os_q.c ****              pevent->OSEventPtr  = OSEventFreeList;        /* Return Event Control Block to free li
 235:os/source/os_q.c ****              OSEventFreeList     = pevent;                 /* Get next free event control block    
 236:os/source/os_q.c ****              OS_EXIT_CRITICAL();
 237:os/source/os_q.c ****              if (tasks_waiting == TRUE) {                  /* Reschedule only if task(s) were waiti
 238:os/source/os_q.c ****                  OS_Sched();                               /* Find highest priority task ready to r
 239:os/source/os_q.c ****              }
 240:os/source/os_q.c ****              *err = OS_NO_ERR;
 241:os/source/os_q.c ****              return ((OS_EVENT *)0);                       /* Queue has been deleted               
 242:os/source/os_q.c **** 
 243:os/source/os_q.c ****         default:
 244:os/source/os_q.c ****              OS_EXIT_CRITICAL();
 245:os/source/os_q.c ****              *err = OS_ERR_INVALID_OPT;
 246:os/source/os_q.c ****              return (pevent);
 247:os/source/os_q.c ****     }
 248:os/source/os_q.c **** }
 249:os/source/os_q.c **** #endif
 250:os/source/os_q.c **** 
 251:os/source/os_q.c **** /*$PAGE*/
 252:os/source/os_q.c **** /*
 253:os/source/os_q.c **** ***************************************************************************************************
 254:os/source/os_q.c **** *                                           FLUSH QUEUE
 255:os/source/os_q.c **** *
 256:os/source/os_q.c **** * Description : This function is used to flush the contents of the message queue.
 257:os/source/os_q.c **** *
 258:os/source/os_q.c **** * Arguments   : none
 259:os/source/os_q.c **** *
 260:os/source/os_q.c **** * Returns     : OS_NO_ERR           upon success
 261:os/source/os_q.c **** *               OS_ERR_EVENT_TYPE   If you didn't pass a pointer to a queue
 262:os/source/os_q.c **** *               OS_ERR_PEVENT_NULL  If 'pevent' is a NULL pointer
 263:os/source/os_q.c **** ***************************************************************************************************
 264:os/source/os_q.c **** */
 265:os/source/os_q.c **** 
 266:os/source/os_q.c **** #if OS_Q_FLUSH_EN > 0
 267:os/source/os_q.c **** INT8U  OSQFlush (OS_EVENT *pevent)
 268:os/source/os_q.c **** {
 383               	.LM42:
 384               	/* prologue: frame size=0 */
 385               	/* prologue end (size=0) */
 386 00f6 FC01      		movw r30,r24
 269:os/source/os_q.c **** #if OS_CRITICAL_METHOD == 3                           /* Allocate storage for CPU status register  
 270:os/source/os_q.c ****     OS_CPU_SR  cpu_sr;
 271:os/source/os_q.c **** #endif    
 272:os/source/os_q.c ****     OS_Q      *pq;
 273:os/source/os_q.c **** 
 274:os/source/os_q.c **** 
 275:os/source/os_q.c **** #if OS_ARG_CHK_EN > 0
 276:os/source/os_q.c ****     if (pevent == (OS_EVENT *)0) {                    /* Validate 'pevent'                         
 277:os/source/os_q.c ****         return (OS_ERR_PEVENT_NULL);

⌨️ 快捷键说明

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