📄 os_sem.ls1
字号:
187 ;
188 ;
189 ; #if OS_ARG_CHK_EN > 0
190 ; if (pevent == (OS_EVENT *)0) { /* Validate 'pevent'
*/
191 ; return (0);
192 ; }
193 ; if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type
*/
194 ; return (0);
195 ; }
196 ; #endif
197 ; OS_ENTER_CRITICAL();
198 ; cnt = pevent->OSEventCnt;
199 ; if (cnt > 0) { /* See if resource is available
*/
200 ; pevent->OSEventCnt--; /* Yes, decrement semaphore and not
ify caller */
201 ; }
202 ; OS_EXIT_CRITICAL();
203 ; return (cnt); /* Return semaphore count
*/
204 ; }
205 ; #endif
206 ;
207 ; /*$PAGE*/
208 ; /*
209 ; *****************************************************************************************
****************
210 ; * CREATE A SEMAPHORE
211 ; *
212 ; * Description: This function creates a semaphore.
213 ; *
214 ; * Arguments : cnt is the initial value for the semaphore. If the value is 0,
no resource is
215 ; * available (or no event has occurred). You initialize the se
maphore to a
216 ; * non-zero value to specify how many resources are available (
e.g. if you have
217 ; * 10 resources, you would initialize the semaphore to 10).
218 ; *
219 ; * Returns : != (void *)0 is a pointer to the event control clock (OS_EVENT) associate
d with the
220 ; * created semaphore
221 ; * == (void *)0 if no event control blocks were available
222 ; *****************************************************************************************
****************
223 ; */
224 ;
225 ; OS_EVENT *OSSemCreate (INT16U cnt)LG_REENTRANT
226
---- 227 RSEG ?PR?_?OSSemCreate?OS_SEM
0000 228 _?OSSemCreate:
229 USING 0
230 ; SOURCE LINE # 83
0000 90FFFE 231 MOV DPTR,#0FFFEH
0003 120000 F 232 LCALL ?C?ADDXBP
0006 EE 233 MOV A,R6
0007 F0 234 MOVX @DPTR,A
0008 A3 235 INC DPTR
A51 MACRO ASSEMBLER OS_SEM 05/17/2005 11:19:57 PAGE 5
0009 EF 236 MOV A,R7
000A F0 237 MOVX @DPTR,A
000B 90FFFD 238 MOV DPTR,#0FFFDH
000E 120000 F 239 LCALL ?C?ADDXBP
240 ; {
241 ; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU st
atus register */
242 ; OS_CPU_SR cpu_sr;
243 ; #endif
244 ; OS_EVENT *pevent;
245 ;
246 ;
247 ; if (OSIntNesting > 0) { /* See if called from ISR ...
*/
248 ; SOURCE LINE # 91
0011 900000 F 249 MOV DPTR,#OSIntNesting
0014 E0 250 MOVX A,@DPTR
0015 D3 251 SETB C
0016 9400 252 SUBB A,#00H
0018 4009 253 JC ?C0001
254 ; return ((OS_EVENT *)0); /* ... can't CREATE from an IS
R */
255 ; SOURCE LINE # 92
001A 7B00 256 MOV R3,#00H
001C 7A00 257 MOV R2,#00H
001E 7900 258 MOV R1,#00H
0020 020000 F 259 LJMP ?C0002
260 ; }
261 ; SOURCE LINE # 93
0023 262 ?C0001:
263 ; OS_ENTER_CRITICAL();
264 ; SOURCE LINE # 94
0023 C2AF 265 CLR EA
266 ; pevent = OSEventFreeList; /* Get next free event control
block */
267 ; SOURCE LINE # 95
0025 900000 F 268 MOV DPTR,#OSEventFreeList
0028 120000 F 269 LCALL ?C?PLDXDATA
002B 850083 F 270 MOV DPH,?C_XBP
002E 850082 F 271 MOV DPL,?C_XBP+01H
0031 120000 F 272 LCALL ?C?PSTXDATA
273 ; if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB poo
l was empty */
274 ; SOURCE LINE # 96
0034 900000 F 275 MOV DPTR,#OSEventFreeList
0037 120000 F 276 LCALL ?C?PLDXDATA
003A E9 277 MOV A,R1
003B 4A 278 ORL A,R2
003C 4B 279 ORL A,R3
003D 6012 280 JZ ?C0003
281 ; OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
282 ; SOURCE LINE # 97
003F 900000 F 283 MOV DPTR,#OSEventFreeList
0042 120000 F 284 LCALL ?C?PLDXDATA
0045 900004 285 MOV DPTR,#04H
0048 120000 F 286 LCALL ?C?PLDOPTR
004B 900000 F 287 MOV DPTR,#OSEventFreeList
004E 120000 F 288 LCALL ?C?PSTXDATA
289 ; }
290 ; SOURCE LINE # 98
0051 291 ?C0003:
292 ; OS_EXIT_CRITICAL();
293 ; SOURCE LINE # 99
0051 D2AF 294 SETB EA
295 ; if (pevent != (OS_EVENT *)0) { /* Get an event control block
*/
A51 MACRO ASSEMBLER OS_SEM 05/17/2005 11:19:57 PAGE 6
296 ; SOURCE LINE # 100
0053 850083 F 297 MOV DPH,?C_XBP
0056 850082 F 298 MOV DPL,?C_XBP+01H
0059 120000 F 299 LCALL ?C?PLDXDATA
005C E9 300 MOV A,R1
005D 4A 301 ORL A,R2
005E 4B 302 ORL A,R3
005F 6052 303 JZ ?C0004
304 ; pevent->OSEventType = OS_EVENT_TYPE_SEM;
305 ; SOURCE LINE # 101
0061 850083 F 306 MOV DPH,?C_XBP
0064 850082 F 307 MOV DPL,?C_XBP+01H
0067 120000 F 308 LCALL ?C?PLDXDATA
006A 7403 309 MOV A,#03H
006C 120000 F 310 LCALL ?C?CSTPTR
311 ; pevent->OSEventCnt = cnt; /* Set semaphore value
*/
312 ; SOURCE LINE # 102
006F 900003 313 MOV DPTR,#03H
0072 120000 F 314 LCALL ?C?XBPOFF
0075 E0 315 MOVX A,@DPTR
0076 FE 316 MOV R6,A
0077 A3 317 INC DPTR
0078 E0 318 MOVX A,@DPTR
0079 FF 319 MOV R7,A
007A 850083 F 320 MOV DPH,?C_XBP
007D 850082 F 321 MOV DPL,?C_XBP+01H
0080 120000 F 322 LCALL ?C?PLDXDATA
0083 900002 323 MOV DPTR,#02H
0086 EE 324 MOV A,R6
0087 8FF0 325 MOV B,R7
0089 120000 F 326 LCALL ?C?ISTOPTR
327 ; pevent->OSEventPtr = (void *)0; /* Unlink from ECB free list
*/
328 ; SOURCE LINE # 103
008C 7B00 329 MOV R3,#00H
008E 7A00 330 MOV R2,#00H
0090 7900 331 MOV R1,#00H
0092 C003 332 PUSH AR3
0094 C002 333 PUSH AR2
0096 C001 334 PUSH AR1
0098 850083 F 335 MOV DPH,?C_XBP
009B 850082 F 336 MOV DPL,?C_XBP+01H
009E 120000 F 337 LCALL ?C?PLDXDATA
00A1 900004 338 MOV DPTR,#04H
00A4 120000 F 339 LCALL ?C?PSTOPTR
340 ; OS_EventWaitListInit(pevent); /* Initialize to 'nobody waiti
ng' on sem. */
341 ; SOURCE LINE # 104
00A7 850083 F 342 MOV DPH,?C_XBP
00AA 850082 F 343 MOV DPL,?C_XBP+01H
00AD 120000 F 344 LCALL ?C?PLDXDATA
00B0 120000 F 345 LCALL _?OS_EventWaitListInit
346 ; }
347 ; SOURCE LINE # 105
00B3 348 ?C0004:
349 ; return (pevent);
350 ; SOURCE LINE # 106
00B3 850083 F 351 MOV DPH,?C_XBP
00B6 850082 F 352 MOV DPL,?C_XBP+01H
00B9 120000 F 353 LCALL ?C?PLDXDATA
354 ; }
355 ; SOURCE LINE # 107
00BC 356 ?C0002:
00BC 900005 357 MOV DPTR,#05H
00BF 020000 F 358 LJMP ?C?ADDXBP
A51 MACRO ASSEMBLER OS_SEM 05/17/2005 11:19:57 PAGE 7
359 ; END OF _?OSSemCreate
360
361 ;
362 ; /*$PAGE*/
363 ; /*
364 ; *****************************************************************************************
****************
365 ; * DELETE A SEMAPHORE
366 ; *
367 ; * Description: This function deletes a semaphore and readies all tasks pending on the sem
aphore.
368 ; *
369 ; * Arguments : pevent is a pointer to the event control block associated with the
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -