📄 os_mem.lst
字号:
\ 0000000A 7420 MOVS R0,#+116
\ 0000000C 16E0 B ??OSMemPut_1
281 }
282 if (pblk == (void *)0) { /* Must release a valid block */
\ ??OSMemPut_0:
\ 0000000E 002D CMP R5,#+0
\ 00000010 01D1 BNE ??OSMemPut_2
283 return (OS_MEM_INVALID_PBLK);
\ 00000012 7320 MOVS R0,#+115
\ 00000014 12E0 B ??OSMemPut_1
284 }
285 #endif
286 OS_ENTER_CRITICAL();
\ ??OSMemPut_2:
\ 00000016 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
287 if (pmem->OSMemNFree >= pmem->OSMemNBlks) { /* Make sure all blocks not already returned */
\ 0000001A 2169 LDR R1,[R4, #+16]
\ 0000001C E268 LDR R2,[R4, #+12]
\ 0000001E 9142 CMP R1,R2
\ 00000020 03D3 BCC ??OSMemPut_3
288 OS_EXIT_CRITICAL();
\ 00000022 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
289 return (OS_MEM_FULL);
\ 00000026 7220 MOVS R0,#+114
\ 00000028 08E0 B ??OSMemPut_1
290 }
291 *(void **)pblk = pmem->OSMemFreeList; /* Insert released block into free block list */
\ ??OSMemPut_3:
\ 0000002A 6168 LDR R1,[R4, #+4]
\ 0000002C 2960 STR R1,[R5, #+0]
292 pmem->OSMemFreeList = pblk;
\ 0000002E 6560 STR R5,[R4, #+4]
293 pmem->OSMemNFree++; /* One more memory block in this partition */
\ 00000030 2169 LDR R1,[R4, #+16]
\ 00000032 491C ADDS R1,R1,#+1
\ 00000034 2161 STR R1,[R4, #+16]
294 OS_EXIT_CRITICAL();
\ 00000036 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
295 return (OS_NO_ERR); /* Notify caller that memory block was released */
\ 0000003A 0020 MOVS R0,#+0
\ ??OSMemPut_1:
\ 0000003C 30BC POP {R4,R5}
\ 0000003E 02BC POP {R1}
\ 00000040 0847 BX R1 ;; return
296 }
297
298 /*
299 *********************************************************************************************************
300 * QUERY MEMORY PARTITION
301 *
302 * Description : This function is used to determine the number of free memory blocks and the number of
303 * used memory blocks from a memory partition.
304 *
305 * Arguments : pmem is a pointer to the memory partition control block
306 *
307 * p_mem_data is a pointer to a structure that will contain information about the memory
308 * partition.
309 *
310 * Returns : OS_NO_ERR If no errors were found.
311 * OS_MEM_INVALID_PMEM if you passed a NULL pointer for 'pmem'
312 * OS_MEM_INVALID_PDATA if you passed a NULL pointer to the data recipient.
313 *********************************************************************************************************
314 */
315
316 #if OS_MEM_QUERY_EN > 0
\ In segment CODE, align 4, keep-with-next
317 INT8U OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *p_mem_data)
318 {
\ OSMemQuery:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 0400 MOVS R4,R0
\ 00000004 0D00 MOVS R5,R1
319 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
320 OS_CPU_SR cpu_sr;
321 #endif
322
323
324 #if OS_ARG_CHK_EN > 0
325 if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
\ 00000006 002C CMP R4,#+0
\ 00000008 01D1 BNE ??OSMemQuery_0
326 return (OS_MEM_INVALID_PMEM);
\ 0000000A 7420 MOVS R0,#+116
\ 0000000C 16E0 B ??OSMemQuery_1
327 }
328 if (p_mem_data == (OS_MEM_DATA *)0) { /* Must release a valid storage area for the data */
\ ??OSMemQuery_0:
\ 0000000E 002D CMP R5,#+0
\ 00000010 01D1 BNE ??OSMemQuery_2
329 return (OS_MEM_INVALID_PDATA);
\ 00000012 7520 MOVS R0,#+117
\ 00000014 12E0 B ??OSMemQuery_1
330 }
331 #endif
332 OS_ENTER_CRITICAL();
\ ??OSMemQuery_2:
\ 00000016 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
333 p_mem_data->OSAddr = pmem->OSMemAddr;
\ 0000001A 2168 LDR R1,[R4, #+0]
\ 0000001C 2960 STR R1,[R5, #+0]
334 p_mem_data->OSFreeList = pmem->OSMemFreeList;
\ 0000001E 6168 LDR R1,[R4, #+4]
\ 00000020 6960 STR R1,[R5, #+4]
335 p_mem_data->OSBlkSize = pmem->OSMemBlkSize;
\ 00000022 A168 LDR R1,[R4, #+8]
\ 00000024 A960 STR R1,[R5, #+8]
336 p_mem_data->OSNBlks = pmem->OSMemNBlks;
\ 00000026 E168 LDR R1,[R4, #+12]
\ 00000028 E960 STR R1,[R5, #+12]
337 p_mem_data->OSNFree = pmem->OSMemNFree;
\ 0000002A 2169 LDR R1,[R4, #+16]
\ 0000002C 2961 STR R1,[R5, #+16]
338 OS_EXIT_CRITICAL();
\ 0000002E ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
339 p_mem_data->OSNUsed = p_mem_data->OSNBlks - p_mem_data->OSNFree;
\ 00000032 E868 LDR R0,[R5, #+12]
\ 00000034 2969 LDR R1,[R5, #+16]
\ 00000036 401A SUBS R0,R0,R1
\ 00000038 6861 STR R0,[R5, #+20]
340 return (OS_NO_ERR);
\ 0000003A 0020 MOVS R0,#+0
\ ??OSMemQuery_1:
\ 0000003C 30BC POP {R4,R5}
\ 0000003E 02BC POP {R1}
\ 00000040 0847 BX R1 ;; return
341 }
342 #endif /* OS_MEM_QUERY_EN */
343
344 /*
345 *********************************************************************************************************
346 * INITIALIZE MEMORY PARTITION MANAGER
347 *
348 * Description : This function is called by uC/OS-II to initialize the memory partition manager. Your
349 * application MUST NOT call this function.
350 *
351 * Arguments : none
352 *
353 * Returns : none
354 *
355 * Note(s) : This function is INTERNAL to uC/OS-II and your application should not call it.
356 *********************************************************************************************************
357 */
358
\ In segment CODE, align 4, keep-with-next
359 void OS_MemInit (void)
360 {
\ OS_MemInit:
\ 00000000 10B5 PUSH {R4,LR}
361 #if OS_MAX_MEM_PART == 1
362 OSMemFreeList = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list */
363 OS_MemClr((INT8U *)&OSMemTbl[0], sizeof(OSMemTbl)); /* Clear the memory partition table */
364 #endif
365
366 #if OS_MAX_MEM_PART >= 2
367 OS_MEM *pmem;
368 INT16U i;
369
370
371 OS_MemClr((INT8U *)&OSMemTbl[0], sizeof(OSMemTbl)); /* Clear the memory partition table */
\ 00000002 8221 MOVS R1,#+130
\ 00000004 4900 LSLS R1,R1,#+1 ;; #+260
\ 00000006 0D48 LDR R0,??OS_MemInit_0 ;; OSMemTbl
\ 00000008 ........ _BLF OS_MemClr,??OS_MemClr??rT
372 pmem = (OS_MEM *)&OSMemTbl[0]; /* Point to memory control block (MCB) */
\ 0000000C 0B48 LDR R0,??OS_MemInit_0 ;; OSMemTbl
373 for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) { /* Init. list of free memory partitions */
\ 0000000E 011D ADDS R1,R0,#+4
\ 00000010 0B4A LDR R2,??OS_MemInit_0+0x4 ;; OSMemTbl + 52
\ 00000012 0423 MOVS R3,#+4
374 pmem->OSMemFreeList = (void *)&OSMemTbl[i+1]; /* Chain list of free partitions */
\ ??OS_MemInit_1:
\ 00000014 0A60 STR R2,[R1, #+0]
375 #if OS_MEM_NAME_SIZE > 1
376 pmem->OSMemName[0] = '?'; /* Unknown name */
\ 00000016 3F24 MOVS R4,#+63
\ 00000018 0475 STRB R4,[R0, #+20]
377 pmem->OSMemName[1] = OS_ASCII_NUL;
\ 0000001A 0024 MOVS R4,#+0
\ 0000001C 4475 STRB R4,[R0, #+21]
378 #endif
379 pmem++;
\ 0000001E 3430 ADDS R0,R0,#+52
380 }
\ 00000020 3432 ADDS R2,R2,#+52
\ 00000022 3431 ADDS R1,R1,#+52
\ 00000024 5B1E SUBS R3,R3,#+1
\ 00000026 F5D1 BNE ??OS_MemInit_1
381 pmem->OSMemFreeList = (void *)0; /* Initialize last node */
\ 00000028 4460 STR R4,[R0, #+4]
382 #if OS_MEM_NAME_SIZE > 1
383 pmem->OSMemName[0] = '?'; /* Unknown name */
\ 0000002A 3F21 MOVS R1,#+63
\ 0000002C 0175 STRB R1,[R0, #+20]
384 pmem->OSMemName[1] = OS_ASCII_NUL;
\ 0000002E 4475 STRB R4,[R0, #+21]
385 #endif
386
387 OSMemFreeList = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list */
\ 00000030 .... LDR R0,??DataTable1 ;; OSMemFreeList
\ 00000032 0249 LDR R1,??OS_MemInit_0 ;; OSMemTbl
\ 00000034 0160 STR R1,[R0, #+0]
388 #endif
389 }
\ 00000036 10BC POP {R4}
\ 00000038 01BC POP {R0}
\ 0000003A 0047 BX R0 ;; return
\ ??OS_MemInit_0:
\ 0000003C ........ DC32 OSMemTbl
\ 00000040 ........ DC32 OSMemTbl + 52
\ In segment CODE, align 4, keep-with-next
\ ??DataTable1:
\ 00000000 ........ DC32 OSMemFreeList
390 #endif /* OS_MEM_EN */
Maximum stack usage in bytes:
Function CSTACK
-------- ------
OSMemCreate 24
OSMemGet 16
OSMemNameGet 20
OSMemNameSet 20
OSMemPut 12
OSMemQuery 12
OS_MemInit 8
Segment part sizes:
Function/Label Bytes
-------------- -----
OSMemCreate 116
OSMemGet 64
OSMemNameGet 72
OSMemNameSet 86
OSMemPut 66
OSMemQuery 66
OS_MemInit 68
??DataTable1 4
Others 96
638 bytes in segment CODE
542 bytes of CODE memory (+ 96 bytes shared)
Errors: none
Warnings: none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -