📄 os_sem.lst
字号:
1 .file "os_sem.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 OSSemAccept
133 OSSemAccept:
1:os/source/os_sem.c **** /*
2:os/source/os_sem.c **** ***************************************************************************************************
3:os/source/os_sem.c **** * uC/OS-II
4:os/source/os_sem.c **** * The Real-Time Kernel
5:os/source/os_sem.c **** * SEMAPHORE MANAGEMENT
6:os/source/os_sem.c **** *
7:os/source/os_sem.c **** * (c) Copyright 1992-2001, Jean J. Labrosse, Weston, FL
8:os/source/os_sem.c **** * All Rights Reserved
9:os/source/os_sem.c **** *
10:os/source/os_sem.c **** * File : OS_SEM.C
11:os/source/os_sem.c **** * By : Jean J. Labrosse
12:os/source/os_sem.c **** ***************************************************************************************************
13:os/source/os_sem.c **** */
14:os/source/os_sem.c ****
15:os/source/os_sem.c **** #ifndef OS_MASTER_FILE
16:os/source/os_sem.c **** #include <include.h>
17:os/source/os_sem.c **** #endif
18:os/source/os_sem.c ****
19:os/source/os_sem.c **** #if OS_SEM_EN > 0
20:os/source/os_sem.c **** /*
21:os/source/os_sem.c **** ***************************************************************************************************
22:os/source/os_sem.c **** * ACCEPT SEMAPHORE
23:os/source/os_sem.c **** *
24:os/source/os_sem.c **** * Description: This function checks the semaphore to see if a resource is available or, if an event
25:os/source/os_sem.c **** * occurred. Unlike OSSemPend(), OSSemAccept() does not suspend the calling task if th
26:os/source/os_sem.c **** * resource is not available or the event did not occur.
27:os/source/os_sem.c **** *
28:os/source/os_sem.c **** * Arguments : pevent is a pointer to the event control block
29:os/source/os_sem.c **** *
30:os/source/os_sem.c **** * Returns : > 0 if the resource is available or the event did not occur the semaphore is
31:os/source/os_sem.c **** * decremented to obtain the resource.
32:os/source/os_sem.c **** * == 0 if the resource is not available or the event did not occur or,
33:os/source/os_sem.c **** * if 'pevent' is a NULL pointer or,
34:os/source/os_sem.c **** * if you didn't pass a pointer to a semaphore
35:os/source/os_sem.c **** ***************************************************************************************************
36:os/source/os_sem.c **** */
37:os/source/os_sem.c ****
38:os/source/os_sem.c **** #if OS_SEM_ACCEPT_EN > 0
39:os/source/os_sem.c **** INT16U OSSemAccept (OS_EVENT *pevent)
40:os/source/os_sem.c **** {
135 .LM1:
136 /* prologue: frame size=0 */
137 /* prologue end (size=0) */
138 0000 FC01 movw r30,r24
41:os/source/os_sem.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register
42:os/source/os_sem.c **** OS_CPU_SR cpu_sr;
43:os/source/os_sem.c **** #endif
44:os/source/os_sem.c **** INT16U cnt;
45:os/source/os_sem.c ****
46:os/source/os_sem.c ****
47:os/source/os_sem.c **** #if OS_ARG_CHK_EN > 0
48:os/source/os_sem.c **** if (pevent == (OS_EVENT *)0) { /* Validate 'pevent'
49:os/source/os_sem.c **** return (0);
50:os/source/os_sem.c **** }
51:os/source/os_sem.c **** if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type
52:os/source/os_sem.c **** return (0);
53:os/source/os_sem.c **** }
54:os/source/os_sem.c **** #endif
55:os/source/os_sem.c **** OS_ENTER_CRITICAL();
140 .LM2:
141 /* #APP */
142 0002 F894 cli
56:os/source/os_sem.c **** cnt = pevent->OSEventCnt;
144 .LM3:
145 /* #NOAPP */
146 0004 8281 ldd r24,Z+2
147 0006 9381 ldd r25,Z+3
57:os/source/os_sem.c **** if (cnt > 0) { /* See if resource is available
149 .LM4:
150 0008 0097 sbiw r24,0
151 000a 21F0 breq .L2
58:os/source/os_sem.c **** pevent->OSEventCnt--; /* Yes, decrement semaphore and notify caller
153 .LM5:
154 000c 0197 sbiw r24,1
155 000e 9383 std Z+3,r25
156 0010 8283 std Z+2,r24
157 0012 0196 adiw r24,1
158 .L2:
59:os/source/os_sem.c **** }
60:os/source/os_sem.c **** OS_EXIT_CRITICAL();
160 .LM6:
161 /* #APP */
162 0014 7894 sei
163 /* #NOAPP */
164 /* epilogue: frame size=0 */
165 0016 0895 ret
166 /* epilogue end (size=1) */
167 /* function OSSemAccept size 14 (13) */
172 .Lscope0:
175 .global OSSemCreate
177 OSSemCreate:
61:os/source/os_sem.c **** return (cnt); /* Return semaphore count
62:os/source/os_sem.c **** }
63:os/source/os_sem.c **** #endif
64:os/source/os_sem.c ****
65:os/source/os_sem.c **** /*$PAGE*/
66:os/source/os_sem.c **** /*
67:os/source/os_sem.c **** ***************************************************************************************************
68:os/source/os_sem.c **** * CREATE A SEMAPHORE
69:os/source/os_sem.c **** *
70:os/source/os_sem.c **** * Description: This function creates a semaphore.
71:os/source/os_sem.c **** *
72:os/source/os_sem.c **** * Arguments : cnt is the initial value for the semaphore. If the value is 0, no resourc
73:os/source/os_sem.c **** * available (or no event has occurred). You initialize the semaphore to
74:os/source/os_sem.c **** * non-zero value to specify how many resources are available (e.g. if yo
75:os/source/os_sem.c **** * 10 resources, you would initialize the semaphore to 10).
76:os/source/os_sem.c **** *
77:os/source/os_sem.c **** * Returns : != (void *)0 is a pointer to the event control clock (OS_EVENT) associated with the
78:os/source/os_sem.c **** * created semaphore
79:os/source/os_sem.c **** * == (void *)0 if no event control blocks were available
80:os/source/os_sem.c **** ***************************************************************************************************
81:os/source/os_sem.c **** */
82:os/source/os_sem.c ****
83:os/source/os_sem.c **** OS_EVENT *OSSemCreate (INT16U cnt)
84:os/source/os_sem.c **** {
179 .LM7:
180 /* prologue: frame size=0 */
181 0018 CF93 push r28
182 001a DF93 push r29
183 /* prologue end (size=2) */
184 001c 9C01 movw r18,r24
85:os/source/os_sem.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status regis
86:os/source/os_sem.c **** OS_CPU_SR cpu_sr;
87:os/source/os_sem.c **** #endif
88:os/source/os_sem.c **** OS_EVENT *pevent;
89:os/source/os_sem.c ****
90:os/source/os_sem.c ****
91:os/source/os_sem.c **** if (OSIntNesting > 0) { /* See if called from ISR ...
186 .LM8:
187 001e 8091 0000 lds r24,OSIntNesting
188 0022 8823 tst r24
189 0024 19F0 breq .L4
92:os/source/os_sem.c **** return ((OS_EVENT *)0); /* ... can't CREATE from an ISR
191 .LM9:
192 0026 80E0 ldi r24,lo8(0)
193 0028 90E0 ldi r25,hi8(0)
194 002a 18C0 rjmp .L3
195 .L4:
93:os/source/os_sem.c **** }
94:os/source/os_sem.c **** OS_ENTER_CRITICAL();
197 .LM10:
198 /* #APP */
199 002c F894 cli
95:os/source/os_sem.c **** pevent = OSEventFreeList; /* Get next free event control block
201 .LM11:
202 /* #NOAPP */
203 002e C091 0000 lds r28,OSEventFreeList
204 0032 D091 0000 lds r29,(OSEventFreeList)+1
96:os/source/os_sem.c **** if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empt
206 .LM12:
207 0036 2097 sbiw r28,0
208 0038 31F0 breq .L5
97:os/source/os_sem.c **** OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
210 .LM13:
211 003a 8C81 ldd r24,Y+4
212 003c 9D81 ldd r25,Y+5
213 003e 9093 0000 sts (OSEventFreeList)+1,r25
214 0042 8093 0000 sts OSEventFreeList,r24
215 .L5:
98:os/source/os_sem.c **** }
99:os/source/os_sem.c **** OS_EXIT_CRITICAL();
217 .LM14:
218 /* #APP */
219 0046 7894 sei
100:os/source/os_sem.c **** if (pevent != (OS_EVENT *)0) { /* Get an event control block
221 .LM15:
222 /* #NOAPP */
223 0048 2097 sbiw r28,0
224 004a 39F0 breq .L6
101:os/source/os_sem.c **** pevent->OSEventType = OS_EVENT_TYPE_SEM;
226 .LM16:
227 004c 83E0 ldi r24,lo8(3)
228 004e 8883 st Y,r24
102:os/source/os_sem.c **** pevent->OSEventCnt = cnt; /* Set semaphore value
230 .LM17:
231 0050 3B83 std Y+3,r19
232 0052 2A83 std Y+2,r18
103:os/source/os_sem.c **** OS_EventWaitListInit(pevent);
234 .LM18:
235 0054 CE01 movw r24,r28
236 0056 0E94 0000 call OS_EventWaitListInit
237 .L6:
104:os/source/os_sem.c **** }
105:os/source/os_sem.c **** return (pevent);
239 .LM19:
240 005a CE01 movw r24,r28
241 .L3:
242 /* epilogue: frame size=0 */
243 005c DF91 pop r29
244 005e CF91 pop r28
245 0060 0895 ret
246 /* epilogue end (size=3) */
247 /* function OSSemCreate size 39 (34) */
252 .Lscope1:
257 .global OSSemPend
259 OSSemPend:
106:os/source/os_sem.c **** }
107:os/source/os_sem.c ****
108:os/source/os_sem.c **** /*$PAGE*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -