📄 lib_mem.lst
字号:
152 *
153 * Note(s) : none.
154 *********************************************************************************************************
155 */
156
\ In segment CODE, align 4, keep-with-next
157 void Mem_Init (void)
158 {
159 #if (LIB_MEM_CFG_POOL_EN == DEF_ENABLED)
160 MEM_POOL *pmem_pool;
161
162 /* --------- INIT MEM HEAP SEG / POOL --------- */
163 pmem_pool = (MEM_POOL *)&Mem_PoolHeap;
164 pmem_pool->Type = (LIB_MEM_TYPE) LIB_MEM_TYPE_HEAP;
165 pmem_pool->SegPrevPtr = (MEM_POOL *) 0;
166 pmem_pool->SegNextPtr = (MEM_POOL *) 0;
167 pmem_pool->PoolPrevPtr = (MEM_POOL *) 0;
168 pmem_pool->PoolNextPtr = (MEM_POOL *) 0;
169 pmem_pool->PoolAddrStart = (void *) 0;
170 pmem_pool->PoolAddrEnd = (void *) 0;
171 pmem_pool->PoolPtrs = (void **) 0;
172 pmem_pool->BlkSize = (CPU_SIZE_T ) 0;
173 pmem_pool->BlkNbr = (CPU_SIZE_T ) 0;
174 pmem_pool->BlkIx = (MEM_POOL_IX ) 0;
175 pmem_pool->SegAddr = (void *)&Mem_Heap[0];
176 pmem_pool->SegAddrNextAvail = (void *)&Mem_Heap[0];
177 pmem_pool->SegSizeTot = (CPU_SIZE_T ) LIB_MEM_CFG_HEAP_SIZE;
178 pmem_pool->SegSizeRem = (CPU_SIZE_T ) LIB_MEM_CFG_HEAP_SIZE;
179
180 /* ------------ INIT MEM POOL TBL ------------- */
181 Mem_PoolTbl = &Mem_PoolHeap;
182 #endif
183 }
\ Mem_Init:
\ 00000000 7047 BX LR ;; return
184
185
186 /*$PAGE*/
187 /*
188 *********************************************************************************************************
189 * Mem_Clr()
190 *
191 * Description : Clear data buffer (see Note #2).
192 *
193 * Argument(s) : pmem Pointer to memory buffer to clear.
194 *
195 * size Number of data buffer octets to clear.
196 *
197 * Return(s) : none.
198 *
199 * Caller(s) : Application.
200 *
201 * Note(s) : (1) Null clears allowed (i.e. 0-octet size).
202 *
203 * See also 'Mem_Set() Note #1'.
204 *
205 * (2) Clear data by setting each data octet to 0.
206 *********************************************************************************************************
207 */
208
\ In segment CODE, align 4, keep-with-next
209 void Mem_Clr (void *pmem,
210 CPU_SIZE_T size)
211 {
\ Mem_Clr:
\ 00000000 00B5 PUSH {LR}
212 Mem_Set((void *)pmem,
213 (CPU_INT08U)0, /* See Note #2. */
214 (CPU_SIZE_T)size);
\ 00000002 0A00 MOVS R2,R1
\ 00000004 0021 MOVS R1,#+0
\ 00000006 ........ BL Mem_Set
215 }
\ 0000000A 00BD POP {PC} ;; return
216
217
218 /*$PAGE*/
219 /*
220 *********************************************************************************************************
221 * Mem_Set()
222 *
223 * Description : Fill data buffer with specified data octet.
224 *
225 * Argument(s) : pmem Pointer to memory buffer to fill with specified data octet.
226 *
227 * data_val Data fill octet value.
228 *
229 * size Number of data buffer octets to fill.
230 *
231 * Return(s) : none.
232 *
233 * Caller(s) : Application.
234 *
235 * Note(s) : (1) Null sets allowed (i.e. 0-octet size).
236 *
237 * (2) For best CPU performance, optimized to fill data buffer using 'CPU_ALIGN'-sized data
238 * words.
239 *
240 * (a) Since many word-aligned processors REQUIRE that multi-octet words be accessed on
241 * word-aligned addresses, 'CPU_ALIGN'-sized words MUST be accessed on 'CPU_ALIGN'd
242 * addresses.
243 *
244 * (3) Modulo arithmetic is used to determine whether a memory buffer starts on a 'CPU_ALIGN'
245 * address boundary.
246 *
247 * Modulo arithmetic in ANSI-C REQUIREs operations performed on integer values. Thus,
248 * address values MUST be cast to an appropriately-sized integer value PRIOR to any
249 * mem_align_modulo arithmetic operation.
250 *********************************************************************************************************
251 */
252
\ In segment CODE, align 4, keep-with-next
253 void Mem_Set (void *pmem,
254 CPU_INT08U data_val,
255 CPU_SIZE_T size)
256 {
\ Mem_Set:
\ 00000000 30B5 PUSH {R4,R5,LR}
257 CPU_SIZE_T size_rem;
258 CPU_ALIGN data_align;
259 CPU_ALIGN *pmem_align;
260 CPU_INT08U *pmem_08;
261 CPU_INT08U mem_align_modulo;
262 CPU_INT08U i;
263
264
265 if (size < 1) { /* See Note #1. */
\ 00000002 002A CMP R2,#+0
\ 00000004 23D0 BEQ.N ??Mem_Set_0
266 return;
267 }
268 if (pmem == (void *)0) {
\ 00000006 0028 CMP R0,#+0
\ 00000008 21D0 BEQ.N ??Mem_Set_0
269 return;
270 }
271
272
273 data_align = 0;
\ 0000000A 0023 MOVS R3,#+0
274 for (i = 0; i < sizeof(CPU_ALIGN); i++) { /* Fill each data_align octet with data val. */
\ 0000000C 1C00 MOVS R4,R3
\ 0000000E 02E0 B.N ??Mem_Set_1
275 data_align <<= DEF_OCTET_NBR_BITS;
276 data_align |= (CPU_ALIGN)data_val;
\ ??Mem_Set_2:
\ 00000010 51EA0323 ORRS R3,R1,R3, LSL #+8
277 }
\ 00000014 641C ADDS R4,R4,#+1
\ ??Mem_Set_1:
\ 00000016 042C CMP R4,#+4
\ 00000018 FAD3 BCC.N ??Mem_Set_2
278
279 size_rem = (CPU_SIZE_T)size;
280 mem_align_modulo = (CPU_INT08U)((CPU_ADDR)pmem % sizeof(CPU_ALIGN)); /* See Note #3. */
\ 0000001A 0400 MOVS R4,R0
\ 0000001C A407 LSLS R4,R4,#+30
\ 0000001E A40F LSRS R4,R4,#+30
281
282 pmem_08 = (CPU_INT08U *)pmem;
283 if (mem_align_modulo != 0) { /* If leading octets avail, ... */
\ 00000020 0DD0 BEQ.N ??Mem_Set_3
284 i = mem_align_modulo;
\ 00000022 04E0 B.N ??Mem_Set_4
285 while ((size_rem > 0) && /* ... start mem buf fill with leading octets ... */
286 (i < sizeof(CPU_ALIGN ))) { /* ... until next CPU_ALIGN word boundary. */
287 *pmem_08++ = data_val;
\ ??Mem_Set_5:
\ 00000024 0170 STRB R1,[R0, #+0]
\ 00000026 401C ADDS R0,R0,#+1
288 size_rem -= sizeof(CPU_INT08U);
\ 00000028 521E SUBS R2,R2,#+1
289 i++;
\ 0000002A 641C ADDS R4,R4,#+1
\ 0000002C E4B2 UXTB R4,R4
290 }
\ ??Mem_Set_4:
\ 0000002E 002A CMP R2,#+0
\ 00000030 05D0 BEQ.N ??Mem_Set_3
\ 00000032 042C CMP R4,#+4
\ 00000034 F6D3 BCC.N ??Mem_Set_5
291 }
292
293 pmem_align = (CPU_ALIGN *)pmem_08; /* See Note #2a. */
\ 00000036 02E0 B.N ??Mem_Set_3
294 while (size_rem >= sizeof(CPU_ALIGN)) { /* While mem buf aligned on CPU_ALIGN word boundaries, */
295 *pmem_align++ = data_align; /* ... fill mem buf with CPU_ALIGN-sized data. */
\ ??Mem_Set_6:
\ 00000038 0360 STR R3,[R0, #+0]
\ 0000003A 001D ADDS R0,R0,#+4
296 size_rem -= sizeof(CPU_ALIGN);
\ 0000003C 121F SUBS R2,R2,#+4
297 }
\ ??Mem_Set_3:
\ 0000003E 042A CMP R2,#+4
\ 00000040 FAD2 BCS.N ??Mem_Set_6
298
299 pmem_08 = (CPU_INT08U *)pmem_align;
\ 00000042 002A CMP R2,#+0
\ 00000044 02E0 B.N ??Mem_Set_7
300 while (size_rem > 0) { /* Finish mem buf fill with trailing octets. */
301 *pmem_08++ = data_val;
\ ??Mem_Set_8:
\ 00000046 0170 STRB R1,[R0, #+0]
\ 00000048 401C ADDS R0,R0,#+1
302 size_rem -= sizeof(CPU_INT08U);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -