📄 os_sem.lst
字号:
C51 COMPILER V7.02b OS_SEM 07/08/2007 20:25:04 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE OS_SEM
OBJECT MODULE PLACED IN OS_SEM.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE OS_SEM.C LARGE BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*
2 *********************************************************************************************************
3 * uC/OS-II
4 * The Real-Time Kernel
5 * SEMAPHORE MANAGEMENT
6 *
7 * (c) Copyright 1992-1998, Jean J. Labrosse, Plantation, FL
8 * All Rights Reserved
9 *
10 * V2.00
11 *
12 * File : OS_SEM.C
13 * By : Jean J. Labrosse
14 *********************************************************************************************************
15 */
16
17 #ifndef OS_MASTER_FILE
18 #include "includes.h"
19 #endif
20
21 #if OS_Sem_EN
22
23 //无等待地请求一个信号量
24 #if OS_Sem_Accept_EN
INT16U OSSemAccept (OS_EVENT *pevent)reentrant
{
INT16U cnt;
OS_ENTER_CRITICAL();
if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
OS_EXIT_CRITICAL();
return (0);
}
cnt = pevent->OSEventCnt;
if (cnt > 0) { /* See if resource is available */
pevent->OSEventCnt--; /* Yes, decrement semaphore and notify caller */
}
OS_EXIT_CRITICAL();
return (cnt); /* Return semaphore count */
}
#endif
43
44 //建立一个信号量
45 #if OS_Sem_Create_EN
46 OS_EVENT *OSSemCreate (INT16U cnt)reentrant
47 {
48 1 OS_EVENT *pevent;
49 1
50 1
51 1 OS_ENTER_CRITICAL();
52 1 pevent = OSEventFreeList; /* Get next free event control block */
53 1 if (OSEventFreeList != (OS_EVENT *)0)
54 1 {
55 2 OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
C51 COMPILER V7.02b OS_SEM 07/08/2007 20:25:04 PAGE 2
56 2 }
57 1 OS_EXIT_CRITICAL();
58 1 if (pevent != (OS_EVENT *)0)
59 1 {
60 2 pevent->OSEventType = OS_EVENT_TYPE_SEM;
61 2 pevent->OSEventCnt = cnt; /* Set semaphore value */
62 2 OSEventWaitListInit(pevent);
63 2 }
64 1 return (pevent);
65 1 }
66 #endif
67
68 //等待一个信号量
69 #if OS_Sem_Pend_EN
70 void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)reentrant
71 {
72 1 OS_ENTER_CRITICAL();
73 1 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) /* Validate event block type */
74 1 {
75 2 OS_EXIT_CRITICAL();
76 2 *err = OS_ERR_EVENT_TYPE;
77 2 }
78 1 if (pevent->OSEventCnt > 0) /* If sem. is positive, resource available ... */
79 1 {
80 2 pevent->OSEventCnt--; /* ... decrement semaphore only if positive. */
81 2 OS_EXIT_CRITICAL();
82 2 *err = OS_NO_ERR;
83 2 }
84 1 else if (OSIntNesting > 0) /* See if called from ISR ... */
85 1 {
86 2 OS_EXIT_CRITICAL(); /* ... can't PEND from an ISR */
87 2 *err = OS_ERR_PEND_ISR;
88 2 }
89 1 else
90 1 { /* Otherwise, must wait until event occurs */
91 2 OSTCBCur->OSTCBStat |= OS_STAT_SEM; /* Resource not available, pend on semaphore */
92 2 OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB */
93 2 OSEventTaskWait(pevent); /* Suspend task until event or timeout occurs */
94 2 OS_EXIT_CRITICAL();
95 2 OSSched(); /* Find next highest priority task ready */
96 2 OS_ENTER_CRITICAL();
97 2 if (OSTCBCur->OSTCBStat & OS_STAT_SEM)
98 2 {
99 3 OSEventTO(pevent);
100 3 OS_EXIT_CRITICAL();
101 3 *err = OS_TIMEOUT; /* Indicate that didn't get event within TO */
102 3 }
103 2 else
104 2 {
105 3 OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
106 3 OS_EXIT_CRITICAL();
107 3 *err = OS_NO_ERR;
108 3 }
109 2 }
110 1 }
111 #endif
112
113 //发送一个信号量
114 #if OS_Sem_Post_EN
115 INT8U OSSemPost (OS_EVENT *pevent)reentrant
116 {
117 1 OS_ENTER_CRITICAL();
C51 COMPILER V7.02b OS_SEM 07/08/2007 20:25:04 PAGE 3
118 1 if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
119 2 OS_EXIT_CRITICAL();
120 2 return (OS_ERR_EVENT_TYPE);
121 2 }
122 1 if (pevent->OSEventGrp) { /* See if any task waiting for semaphore */
123 2 OSEventTaskRdy(pevent, (void *)0, OS_STAT_SEM); /* Ready highest prio task waiting on event */
124 2 OS_EXIT_CRITICAL();
125 2 OSSched(); /* Find highest priority task ready to run */
126 2 return (OS_NO_ERR);
127 2 } else {
128 2 if (pevent->OSEventCnt < 65535) { /* Make sure semaphore will not overflow */
129 3 pevent->OSEventCnt++; /* Increment semaphore count to register event */
130 3 OS_EXIT_CRITICAL();
131 3 return (OS_NO_ERR);
132 3 } else { /* Semaphore value has reached its maximum */
133 3 OS_EXIT_CRITICAL();
134 3 return (OS_SEM_OVF);
135 3 }
136 2 }
137 1 }
138 #endif
139
140 //查询一个信号量的状态
141 #if OS_Sem_Query_EN
INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *dataptr)reentrant
{
INT8U i;
INT8U *psrc;
INT8U *pdest;
OS_ENTER_CRITICAL();
if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
OS_EXIT_CRITICAL();
return (OS_ERR_EVENT_TYPE);
}
dataptr->OSEventGrp = pevent->OSEventGrp; /* Copy message mailbox wait list *
-/
psrc = &pevent->OSEventTbl[0];
pdest = &dataptr->OSEventTbl[0];
for (i = 0; i < OS_EVENT_TBL_SIZE; i++) {
*pdest++ = *psrc++;
}
dataptr->OSCnt = pevent->OSEventCnt; /* Get semaphore count *
-/
OS_EXIT_CRITICAL();
return (OS_NO_ERR);
}
#endif
165 #endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 678 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -