📄 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:
108 .global OSSemAccept
110 OSSemAccept:
1:../OSsrc/os_sem.c **** /*
2:../OSsrc/os_sem.c **** ***************************************************************************************************
3:../OSsrc/os_sem.c **** * uC/OS-II
4:../OSsrc/os_sem.c **** * The Real-Time Kernel
5:../OSsrc/os_sem.c **** * SEMAPHORE MANAGEMENT
6:../OSsrc/os_sem.c **** *
7:../OSsrc/os_sem.c **** * (c) Copyright 1992-2007, Jean J. Labrosse, Weston, FL
8:../OSsrc/os_sem.c **** * All Rights Reserved
9:../OSsrc/os_sem.c **** *
10:../OSsrc/os_sem.c **** * File : OS_SEM.C
11:../OSsrc/os_sem.c **** * By : Jean J. Labrosse
12:../OSsrc/os_sem.c **** * Version : V2.85
13:../OSsrc/os_sem.c **** *
14:../OSsrc/os_sem.c **** * LICENSING TERMS:
15:../OSsrc/os_sem.c **** * ---------------
16:../OSsrc/os_sem.c **** * uC/OS-II is provided in source form for FREE evaluation, for educational use or for peaceful re
17:../OSsrc/os_sem.c **** * If you plan on using uC/OS-II in a commercial product you need to contact Micri祄 to properly l
18:../OSsrc/os_sem.c **** * its use in your product. We provide ALL the source code for your convenience and to help you expe
19:../OSsrc/os_sem.c **** * uC/OS-II. The fact that the source is provided does NOT mean that you can use it without pa
20:../OSsrc/os_sem.c **** * licensing fee.
21:../OSsrc/os_sem.c **** ***************************************************************************************************
22:../OSsrc/os_sem.c **** */
23:../OSsrc/os_sem.c ****
24:../OSsrc/os_sem.c **** #ifndef OS_MASTER_FILE
25:../OSsrc/os_sem.c **** #include <ucos_ii.h>
26:../OSsrc/os_sem.c **** #endif
27:../OSsrc/os_sem.c ****
28:../OSsrc/os_sem.c **** #if OS_SEM_EN > 0
29:../OSsrc/os_sem.c **** /*$PAGE*/
30:../OSsrc/os_sem.c **** /*
31:../OSsrc/os_sem.c **** ***************************************************************************************************
32:../OSsrc/os_sem.c **** * ACCEPT SEMAPHORE
33:../OSsrc/os_sem.c **** *
34:../OSsrc/os_sem.c **** * Description: This function checks the semaphore to see if a resource is available or, if an event
35:../OSsrc/os_sem.c **** * occurred. Unlike OSSemPend(), OSSemAccept() does not suspend the calling task if th
36:../OSsrc/os_sem.c **** * resource is not available or the event did not occur.
37:../OSsrc/os_sem.c **** *
38:../OSsrc/os_sem.c **** * Arguments : pevent is a pointer to the event control block
39:../OSsrc/os_sem.c **** *
40:../OSsrc/os_sem.c **** * Returns : > 0 if the resource is available or the event did not occur the semaphore is
41:../OSsrc/os_sem.c **** * decremented to obtain the resource.
42:../OSsrc/os_sem.c **** * == 0 if the resource is not available or the event did not occur or,
43:../OSsrc/os_sem.c **** * if 'pevent' is a NULL pointer or,
44:../OSsrc/os_sem.c **** * if you didn't pass a pointer to a semaphore
45:../OSsrc/os_sem.c **** ***************************************************************************************************
46:../OSsrc/os_sem.c **** */
47:../OSsrc/os_sem.c ****
48:../OSsrc/os_sem.c **** #if OS_SEM_ACCEPT_EN > 0
49:../OSsrc/os_sem.c **** INT16U OSSemAccept (OS_EVENT *pevent)
50:../OSsrc/os_sem.c **** {
112 .LM1:
113 /* prologue: frame size=0 */
114 /* prologue end (size=0) */
115 0000 FC01 movw r30,r24
51:../OSsrc/os_sem.c **** INT16U cnt;
52:../OSsrc/os_sem.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register
53:../OSsrc/os_sem.c **** OS_CPU_SR cpu_sr = 0;
54:../OSsrc/os_sem.c **** #endif
55:../OSsrc/os_sem.c ****
56:../OSsrc/os_sem.c ****
57:../OSsrc/os_sem.c ****
58:../OSsrc/os_sem.c **** #if OS_ARG_CHK_EN > 0
59:../OSsrc/os_sem.c **** if (pevent == (OS_EVENT *)0) { /* Validate 'pevent'
117 .LM2:
118 0002 0097 sbiw r24,0
119 0004 09F4 brne .L2
60:../OSsrc/os_sem.c **** return (0);
121 .LM3:
122 0006 0895 ret
123 .L2:
61:../OSsrc/os_sem.c **** }
62:../OSsrc/os_sem.c **** #endif
63:../OSsrc/os_sem.c **** if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type
125 .LM4:
126 0008 8081 ld r24,Z
127 000a 8330 cpi r24,lo8(3)
128 000c 19F0 breq .L3
64:../OSsrc/os_sem.c **** return (0);
130 .LM5:
131 000e 80E0 ldi r24,lo8(0)
132 0010 90E0 ldi r25,hi8(0)
133 0012 0895 ret
134 .L3:
65:../OSsrc/os_sem.c **** }
66:../OSsrc/os_sem.c **** OS_ENTER_CRITICAL();
136 .LM6:
137 /* #APP */
138 0014 F894 cli
67:../OSsrc/os_sem.c **** cnt = pevent->OSEventCnt;
140 .LM7:
141 /* #NOAPP */
142 0016 8381 ldd r24,Z+3
143 0018 9481 ldd r25,Z+4
68:../OSsrc/os_sem.c **** if (cnt > 0) { /* See if resource is available
145 .LM8:
146 001a 0097 sbiw r24,0
147 001c 21F0 breq .L4
69:../OSsrc/os_sem.c **** pevent->OSEventCnt--; /* Yes, decrement semaphore and notify caller
149 .LM9:
150 001e 0197 sbiw r24,1
151 0020 9483 std Z+4,r25
152 0022 8383 std Z+3,r24
153 0024 0196 adiw r24,1
154 .L4:
70:../OSsrc/os_sem.c **** }
71:../OSsrc/os_sem.c **** OS_EXIT_CRITICAL();
156 .LM10:
157 /* #APP */
158 0026 7894 sei
72:../OSsrc/os_sem.c **** return (cnt); /* Return semaphore count
73:../OSsrc/os_sem.c **** }
160 .LM11:
161 /* #NOAPP */
162 0028 0895 ret
163 /* epilogue: frame size=0 */
164 /* epilogue: noreturn */
165 /* epilogue end (size=0) */
166 /* function OSSemAccept size 23 (23) */
171 .Lscope0:
174 .global OSSemCreate
176 OSSemCreate:
74:../OSsrc/os_sem.c **** #endif
75:../OSsrc/os_sem.c ****
76:../OSsrc/os_sem.c **** /*$PAGE*/
77:../OSsrc/os_sem.c **** /*
78:../OSsrc/os_sem.c **** ***************************************************************************************************
79:../OSsrc/os_sem.c **** * CREATE A SEMAPHORE
80:../OSsrc/os_sem.c **** *
81:../OSsrc/os_sem.c **** * Description: This function creates a semaphore.
82:../OSsrc/os_sem.c **** *
83:../OSsrc/os_sem.c **** * Arguments : cnt is the initial value for the semaphore. If the value is 0, no resourc
84:../OSsrc/os_sem.c **** * available (or no event has occurred). You initialize the semaphore to
85:../OSsrc/os_sem.c **** * non-zero value to specify how many resources are available (e.g. if yo
86:../OSsrc/os_sem.c **** * 10 resources, you would initialize the semaphore to 10).
87:../OSsrc/os_sem.c **** *
88:../OSsrc/os_sem.c **** * Returns : != (void *)0 is a pointer to the event control block (OS_EVENT) associated with the
89:../OSsrc/os_sem.c **** * created semaphore
90:../OSsrc/os_sem.c **** * == (void *)0 if no event control blocks were available
91:../OSsrc/os_sem.c **** ***************************************************************************************************
92:../OSsrc/os_sem.c **** */
93:../OSsrc/os_sem.c ****
94:../OSsrc/os_sem.c **** OS_EVENT *OSSemCreate (INT16U cnt)
95:../OSsrc/os_sem.c **** {
178 .LM12:
179 /* prologue: frame size=0 */
180 002a CF93 push r28
181 002c DF93 push r29
182 /* prologue end (size=2) */
183 002e 9C01 movw r18,r24
96:../OSsrc/os_sem.c **** OS_EVENT *pevent;
97:../OSsrc/os_sem.c **** #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status regis
98:../OSsrc/os_sem.c **** OS_CPU_SR cpu_sr = 0;
99:../OSsrc/os_sem.c **** #endif
100:../OSsrc/os_sem.c ****
101:../OSsrc/os_sem.c ****
102:../OSsrc/os_sem.c ****
103:../OSsrc/os_sem.c **** if (OSIntNesting > 0) { /* See if called from ISR ...
185 .LM13:
186 0030 8091 0000 lds r24,OSIntNesting
187 0034 8823 tst r24
188 0036 19F0 breq .L6
104:../OSsrc/os_sem.c **** return ((OS_EVENT *)0); /* ... can't CREATE from an ISR
190 .LM14:
191 0038 80E0 ldi r24,lo8(0)
192 003a 90E0 ldi r25,hi8(0)
193 003c 1DC0 rjmp .L5
194 .L6:
105:../OSsrc/os_sem.c **** }
106:../OSsrc/os_sem.c **** OS_ENTER_CRITICAL();
196 .LM15:
197 /* #APP */
198 003e F894 cli
107:../OSsrc/os_sem.c **** pevent = OSEventFreeList; /* Get next free event control block
200 .LM16:
201 /* #NOAPP */
202 0040 C091 0000 lds r28,OSEventFreeList
203 0044 D091 0000 lds r29,(OSEventFreeList)+1
108:../OSsrc/os_sem.c **** if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empt
205 .LM17:
206 0048 2097 sbiw r28,0
207 004a 31F0 breq .L7
109:../OSsrc/os_sem.c **** OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
209 .LM18:
210 004c 8981 ldd r24,Y+1
211 004e 9A81 ldd r25,Y+2
212 0050 9093 0000 sts (OSEventFreeList)+1,r25
213 0054 8093 0000 sts OSEventFreeList,r24
214 .L7:
110:../OSsrc/os_sem.c **** }
111:../OSsrc/os_sem.c **** OS_EXIT_CRITICAL();
216 .LM19:
217 /* #APP */
218 0058 7894 sei
112:../OSsrc/os_sem.c **** if (pevent != (OS_EVENT *)0) { /* Get an event control block
220 .LM20:
221 /* #NOAPP */
222 005a 2097 sbiw r28,0
223 005c 61F0 breq .L8
113:../OSsrc/os_sem.c **** pevent->OSEventType = OS_EVENT_TYPE_SEM;
225 .LM21:
226 005e 83E0 ldi r24,lo8(3)
227 0060 8883 st Y,r24
114:../OSsrc/os_sem.c **** pevent->OSEventCnt = cnt; /* Set semaphore value
229 .LM22:
230 0062 3C83 std Y+4,r19
231 0064 2B83 std Y+3,r18
115:../OSsrc/os_sem.c **** pevent->OSEventPtr = (void *)0; /* Unlink from ECB free list
233 .LM23:
234 0066 1A82 std Y+2,__zero_reg__
235 0068 1982 std Y+1,__zero_reg__
116:../OSsrc/os_sem.c **** #if OS_EVENT_NAME_SIZE > 1
117:../OSsrc/os_sem.c **** pevent->OSEventName[0] = '?'; /* Unknown name
237 .LM24:
238 006a 8FE3 ldi r24,lo8(63)
239 006c 8E87 std Y+14,r24
118:../OSsrc/os_sem.c **** pevent->OSEventName[1] = OS_ASCII_NUL;
241 .LM25:
242 006e 1F86 std Y+15,__zero_reg__
119:../OSsrc/os_sem.c **** #endif
120:../OSsrc/os_sem.c **** OS_EventWaitListInit(pevent); /* Initialize to 'nobody waiting' on sem
244 .LM26:
245 0070 CE01 movw r24,r28
246 0072 0E94 0000 call OS_EventWaitListInit
247 .L8:
121:../OSsrc/os_sem.c **** }
122:../OSsrc/os_sem.c **** return (pevent);
249 .LM27:
250 0076 CE01 movw r24,r28
251 .L5:
252 /* epilogue: frame size=0 */
253 0078 DF91 pop r29
254 007a CF91 pop r28
255 007c 0895 ret
256 /* epilogue end (size=3) */
257 /* function OSSemCreate size 44 (39) */
262 .Lscope1:
267 .global OSSemDel
269 OSSemDel:
123:../OSsrc/os_sem.c **** }
124:../OSsrc/os_sem.c ****
125:../OSsrc/os_sem.c **** /*$PAGE*/
126:../OSsrc/os_sem.c **** /*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -