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

📄 os_sem.lis

📁 把UCOSII移植到AVR MEGA8上的程序 应用程序为驱动1602显示器,虽说有些简单,但可测试UCOS的运行
💻 LIS
📖 第 1 页 / 共 4 页
字号:
 021E           ; *              OS_SEM_OVF          If the semaphore count exceeded its limit.  In other words, you have
 021E           ; *                                  signalled the semaphore more often than you waited on it with either
 021E           ; *                                  OSSemAccept() or OSSemPend().
 021E           ; *              OS_ERR_EVENT_TYPE   If you didn't pass a pointer to a semaphore
 021E           ; *              OS_ERR_PEVENT_NULL  If 'pevent' is a NULL pointer.
 021E           ; *********************************************************************************************************
 021E           ; */
 021E           ; 
 021E           ; INT8U  OSSemPost (OS_EVENT *pevent)
 021E           ; {
 021E                   .dbline 322
 021E           ; #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
 021E           ;     OS_CPU_SR  cpu_sr;                               
 021E           ; #endif    
 021E           ; 
 021E           ; 
 021E           ; #if OS_ARG_CHK_EN > 0
 021E           ;     if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
 021E           ;         return (OS_ERR_PEVENT_NULL);
 021E           ;     }
 021E           ;     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type                */
 021E           ;         return (OS_ERR_EVENT_TYPE);
 021E           ;     }
 021E           ; #endif
 021E           ;     OS_ENTER_CRITICAL();
 021E 00D0              rcall _OS_CPU_SR_Save
 0220 402F              mov R20,R16
 0222                   .dbline 323
 0222           ;     if (pevent->OSEventGrp != 0x00) {                      /* See if any task waiting for semaphore    */
 0222 FB01              movw R30,R22
 0224 2180              ldd R2,z+1
 0226 2220              tst R2
 0228 59F0              breq L38
 022A                   .dbline 323
 022A                   .dbline 324
 022A           ;         OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM);   /* Ready highest prio task waiting on event */
 022A 81E0              ldi R24,1
 022C 8883              std y+0,R24
 022E 2227              clr R18
 0230 3327              clr R19
 0232 8B01              movw R16,R22
 0234 00D0              rcall _OS_EventTaskRdy
 0236                   .dbline 325
 0236           ;         OS_EXIT_CRITICAL();
 0236 042F              mov R16,R20
 0238 00D0              rcall _OS_CPU_SR_Restore
 023A                   .dbline 326
 023A           ;         OS_Sched();                                   /* Find highest priority task ready to run       */
 023A 00D0              rcall _OS_Sched
 023C                   .dbline 327
 023C           ;         return (OS_NO_ERR);
 023C 0027              clr R16
 023E 16C0              rjmp L37
 0240           L38:
 0240                   .dbline 329
 0240           ;     }
 0240           ;     if (pevent->OSEventCnt < 65535) {                 /* Make sure semaphore will not overflow         */
 0240 FB01              movw R30,R22
 0242 8281              ldd R24,z+2
 0244 9381              ldd R25,z+3
 0246 8F3F              cpi R24,255
 0248 EFEF              ldi R30,255
 024A 9E07              cpc R25,R30
 024C 60F4              brsh L40
 024E                   .dbline 329
 024E                   .dbline 330
 024E           ;         pevent->OSEventCnt++;                         /* Increment semaphore count to register event   */
 024E CB01              movw R24,R22
 0250 0296              adiw R24,2
 0252 FC01              movw R30,R24
 0254 8081              ldd R24,z+0
 0256 9181              ldd R25,z+1
 0258 0196              adiw R24,1
 025A 9183              std z+1,R25
 025C 8083              std z+0,R24
 025E                   .dbline 331
 025E           ;         OS_EXIT_CRITICAL();
 025E 042F              mov R16,R20
 0260 00D0              rcall _OS_CPU_SR_Restore
 0262                   .dbline 332
 0262           ;         return (OS_NO_ERR);
 0262 0027              clr R16
 0264 03C0              rjmp L37
 0266           L40:
 0266                   .dbline 334
 0266           ;     }
 0266           ;     OS_EXIT_CRITICAL();                               /* Semaphore value has reached its maximum       */
 0266 042F              mov R16,R20
 0268 00D0              rcall _OS_CPU_SR_Restore
 026A                   .dbline 335
 026A           ;     return (OS_SEM_OVF);
 026A 02E3              ldi R16,50
 026C                   .dbline -2
 026C           L37:
 026C 2196              adiw R28,1
 026E 00D0              rcall pop_gset2
 0270                   .dbline 0 ; func end
 0270 0895              ret
 0272                   .dbsym r cpu_sr 20 c
 0272                   .dbsym r pevent 22 pS[.1]
 0272                   .dbend
 0272                   .dbfunc e OSSemQuery _OSSemQuery fc
 0272                   .dbstruct 0 6 .2
 0272                   .dbfield 0 OSCnt i
 0272                   .dbfield 2 OSEventTbl A[3:3]c
 0272                   .dbfield 5 OSEventGrp c
 0272                   .dbend
 0272           ;         cpu_sr -> R20
 0272           ;          pdest -> R12,R13
 0272           ;           psrc -> R14,R15
 0272           ;          pdata -> R22,R23
 0272           ;         pevent -> R10,R11
                        .even
 0272           _OSSemQuery::
 0272 00D0              rcall push_gset5
 0274 B901              movw R22,R18
 0276 5801              movw R10,R16
 0278                   .dbline -1
 0278                   .dbline 357
 0278           ; }
 0278           ; /*
 0278           ; *********************************************************************************************************
 0278           ; *                                          QUERY A SEMAPHORE
 0278           ; *
 0278           ; * Description: This function obtains information about a semaphore
 0278           ; *
 0278           ; * Arguments  : pevent        is a pointer to the event control block associated with the desired
 0278           ; *                            semaphore
 0278           ; *
 0278           ; *              pdata         is a pointer to a structure that will contain information about the
 0278           ; *                            semaphore.
 0278           ; *
 0278           ; * Returns    : OS_NO_ERR           The call was successful and the message was sent
 0278           ; *              OS_ERR_EVENT_TYPE   If you are attempting to obtain data from a non semaphore.
 0278           ; *              OS_ERR_PEVENT_NULL  If 'pevent' is a NULL pointer.
 0278           ; *********************************************************************************************************
 0278           ; */
 0278           ; 
 0278           ; #if OS_SEM_QUERY_EN > 0
 0278           ; INT8U  OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *pdata)
 0278           ; {
 0278                   .dbline 373
 0278           ; #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
 0278           ;     OS_CPU_SR  cpu_sr;
 0278           ; #endif    
 0278           ;     INT8U     *psrc;
 0278           ;     INT8U     *pdest;
 0278           ; 
 0278           ; 
 0278           ; #if OS_ARG_CHK_EN > 0
 0278           ;     if (pevent == (OS_EVENT *)0) {                         /* Validate 'pevent'                        */
 0278           ;         return (OS_ERR_PEVENT_NULL);
 0278           ;     }
 0278           ;     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {        /* Validate event block type                */
 0278           ;         return (OS_ERR_EVENT_TYPE);
 0278           ;     }
 0278           ; #endif
 0278           ;     OS_ENTER_CRITICAL();
 0278 00D0              rcall _OS_CPU_SR_Save
 027A 402F              mov R20,R16
 027C                   .dbline 374
 027C           ;     pdata->OSEventGrp = pevent->OSEventGrp;                /* Copy message mailbox wait list           */
 027C F501              movw R30,R10
 027E 2180              ldd R2,z+1
 0280 FB01              movw R30,R22
 0282 2582              std z+5,R2
 0284                   .dbline 375
 0284           ;     psrc              = &pevent->OSEventTbl[0];
 0284 C501              movw R24,R10
 0286 0696              adiw R24,6
 0288 7C01              movw R14,R24
 028A                   .dbline 376
 028A           ;     pdest             = &pdata->OSEventTbl[0];
 028A CB01              movw R24,R22
 028C 0296              adiw R24,2
 028E                   .dbline 378
 028E           ; #if OS_EVENT_TBL_SIZE > 0
 028E           ;     *pdest++          = *psrc++;
 028E F701              movw R30,R14
 0290 DC01              movw R26,R24
 0292 0190              ld R0,Z+
 0294 0D92              st X+,R0
 0296                   .dbline 382
 0296           ; #endif
 0296           ; 
 0296           ; #if OS_EVENT_TBL_SIZE > 1
 0296           ;     *pdest++          = *psrc++;
 0296 0190              ld R0,Z+
 0298 0D92              st X+,R0
 029A                   .dbline 386
 029A           ; #endif
 029A           ; 
 029A           ; #if OS_EVENT_TBL_SIZE > 2
 029A           ;     *pdest++          = *psrc++;
 029A 0190              ld R0,Z+
 029C 7F01              movw R14,R30
 029E 0D92              st X+,R0
 02A0 6D01              movw R12,R26
 02A2                   .dbline 408
 02A2           ; #endif
 02A2           ; 
 02A2           ; #if OS_EVENT_TBL_SIZE > 3
 02A2           ;     *pdest++          = *psrc++;
 02A2           ; #endif
 02A2           ; 
 02A2           ; #if OS_EVENT_TBL_SIZE > 4
 02A2           ;     *pdest++          = *psrc++;
 02A2           ; #endif
 02A2           ; 
 02A2           ; #if OS_EVENT_TBL_SIZE > 5
 02A2           ;     *pdest++          = *psrc++;
 02A2           ; #endif
 02A2           ; 
 02A2           ; #if OS_EVENT_TBL_SIZE > 6
 02A2           ;     *pdest++          = *psrc++;
 02A2           ; #endif
 02A2           ; 
 02A2           ; #if OS_EVENT_TBL_SIZE > 7
 02A2           ;     *pdest            = *psrc;
 02A2           ; #endif
 02A2           ;     pdata->OSCnt      = pevent->OSEventCnt;                /* Get semaphore count                      */
 02A2 F501              movw R30,R10
 02A4 2280              ldd R2,z+2
 02A6 3380              ldd R3,z+3
 02A8 FB01              movw R30,R22
 02AA 3182              std z+1,R3
 02AC 2082              std z+0,R2
 02AE                   .dbline 409
 02AE           ;     OS_EXIT_CRITICAL();
 02AE 00D0              rcall _OS_CPU_SR_Restore
 02B0                   .dbline 410
 02B0           ;     return (OS_NO_ERR);
 02B0 0027              clr R16
 02B2                   .dbline -2
 02B2           L42:
 02B2 00D0              rcall pop_gset5
 02B4                   .dbline 0 ; func end
 02B4 0895              ret
 02B6                   .dbsym r cpu_sr 20 c
 02B6                   .dbsym r pdest 12 pc
 02B6                   .dbsym r psrc 14 pc
 02B6                   .dbsym r pdata 22 pS[.2]
 02B6                   .dbsym r pevent 10 pS[.1]
 02B6                   .dbend

⌨️ 快捷键说明

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