📄 os_mem.lst
字号:
340 *
341 * Description : This function is used to determine the number of free memory blocks and the number of
342 * used memory blocks from a memory partition.
343 *
344 * Arguments : pmem is a pointer to the memory partition control block
345 *
346 * p_mem_data is a pointer to a structure that will contain information about the memory
347 * partition.
348 *
349 * Returns : OS_ERR_NONE if no errors were found.
350 * OS_ERR_MEM_INVALID_PMEM if you passed a NULL pointer for 'pmem'
351 * OS_ERR_MEM_INVALID_PDATA if you passed a NULL pointer to the data recipient.
352 *********************************************************************************************************
353 */
354
355 #if OS_MEM_QUERY_EN > 0
\ In segment CODE, align 4, keep-with-next
356 INT8U OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *p_mem_data)
357 {
\ OSMemQuery:
\ 00000000 70402DE9 PUSH {R4-R6,LR}
\ 00000004 0040B0E1 MOVS R4,R0
\ 00000008 0150B0E1 MOVS R5,R1
358 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
359 OS_CPU_SR cpu_sr = 0;
\ 0000000C 0000A0E3 MOV R0,#+0
\ 00000010 0060B0E1 MOVS R6,R0
360 #endif
361
362
363
364 #if OS_ARG_CHK_EN > 0
365 if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
\ 00000014 000054E3 CMP R4,#+0
\ 00000018 0100001A BNE ??OSMemQuery_0
366 return (OS_ERR_MEM_INVALID_PMEM);
\ 0000001C 6000A0E3 MOV R0,#+96
\ 00000020 160000EA B ??OSMemQuery_1
367 }
368 if (p_mem_data == (OS_MEM_DATA *)0) { /* Must release a valid storage area for the data */
\ ??OSMemQuery_0:
\ 00000024 000055E3 CMP R5,#+0
\ 00000028 0100001A BNE ??OSMemQuery_2
369 return (OS_ERR_MEM_INVALID_PDATA);
\ 0000002C 6100A0E3 MOV R0,#+97
\ 00000030 120000EA B ??OSMemQuery_1
370 }
371 #endif
372 OS_ENTER_CRITICAL();
\ ??OSMemQuery_2:
\ 00000034 ........ _BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rA
\ 00000038 0060B0E1 MOVS R6,R0
373 p_mem_data->OSAddr = pmem->OSMemAddr;
\ 0000003C 000094E5 LDR R0,[R4, #+0]
\ 00000040 000085E5 STR R0,[R5, #+0]
374 p_mem_data->OSFreeList = pmem->OSMemFreeList;
\ 00000044 040094E5 LDR R0,[R4, #+4]
\ 00000048 040085E5 STR R0,[R5, #+4]
375 p_mem_data->OSBlkSize = pmem->OSMemBlkSize;
\ 0000004C 080094E5 LDR R0,[R4, #+8]
\ 00000050 080085E5 STR R0,[R5, #+8]
376 p_mem_data->OSNBlks = pmem->OSMemNBlks;
\ 00000054 0C0094E5 LDR R0,[R4, #+12]
\ 00000058 0C0085E5 STR R0,[R5, #+12]
377 p_mem_data->OSNFree = pmem->OSMemNFree;
\ 0000005C 100094E5 LDR R0,[R4, #+16]
\ 00000060 100085E5 STR R0,[R5, #+16]
378 OS_EXIT_CRITICAL();
\ 00000064 0600B0E1 MOVS R0,R6
\ 00000068 ........ _BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rA
379 p_mem_data->OSNUsed = p_mem_data->OSNBlks - p_mem_data->OSNFree;
\ 0000006C 0C0095E5 LDR R0,[R5, #+12]
\ 00000070 101095E5 LDR R1,[R5, #+16]
\ 00000074 010050E0 SUBS R0,R0,R1
\ 00000078 140085E5 STR R0,[R5, #+20]
380 return (OS_ERR_NONE);
\ 0000007C 0000A0E3 MOV R0,#+0
\ ??OSMemQuery_1:
\ 00000080 7080BDE8 POP {R4-R6,PC} ;; return
381 }
382 #endif /* OS_MEM_QUERY_EN */
383 /*$PAGE*/
384 /*
385 *********************************************************************************************************
386 * INITIALIZE MEMORY PARTITION MANAGER
387 *
388 * Description : This function is called by uC/OS-II to initialize the memory partition manager. Your
389 * application MUST NOT call this function.
390 *
391 * Arguments : none
392 *
393 * Returns : none
394 *
395 * Note(s) : This function is INTERNAL to uC/OS-II and your application should not call it.
396 *********************************************************************************************************
397 */
398
\ In segment CODE, align 4, keep-with-next
399 void OS_MemInit (void)
400 {
\ OS_MemInit:
\ 00000000 30402DE9 PUSH {R4,R5,LR}
401 #if OS_MAX_MEM_PART == 1
402 OS_MemClr((INT8U *)&OSMemTbl[0], sizeof(OSMemTbl)); /* Clear the memory partition table */
403 OSMemFreeList = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list */
404 #if OS_MEM_NAME_SIZE > 1
405 OSMemFreeList->OSMemName[0] = '?'; /* Unknown name */
406 OSMemFreeList->OSMemName[1] = OS_ASCII_NUL;
407 #endif
408 #endif
409
410 #if OS_MAX_MEM_PART >= 2
411 OS_MEM *pmem;
412 INT16U i;
413
414
415 OS_MemClr((INT8U *)&OSMemTbl[0], sizeof(OSMemTbl)); /* Clear the memory partition table */
\ 00000004 B410A0E3 MOV R1,#+180
\ 00000008 84009FE5 LDR R0,??OS_MemInit_0 ;; OSMemTbl
\ 0000000C ........ _BLF OS_MemClr,??OS_MemClr??rA
416 pmem = &OSMemTbl[0]; /* Point to memory control block (MCB) */
\ 00000010 7C009FE5 LDR R0,??OS_MemInit_0 ;; OSMemTbl
\ 00000014 0040B0E1 MOVS R4,R0
417 for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) { /* Init. list of free memory partitions */
\ 00000018 0000A0E3 MOV R0,#+0
\ 0000001C 0050B0E1 MOVS R5,R0
\ ??OS_MemInit_1:
\ 00000020 0558A0E1 MOV R5,R5, LSL #+16
\ 00000024 2558B0E1 MOVS R5,R5, LSR #+16
\ 00000028 040055E3 CMP R5,#+4
\ 0000002C 0E00002A BCS ??OS_MemInit_2
418 pmem->OSMemFreeList = (void *)&OSMemTbl[i+1]; /* Chain list of free partitions */
\ 00000030 0500B0E1 MOVS R0,R5
\ 00000034 0008A0E1 MOV R0,R0, LSL #+16
\ 00000038 2008B0E1 MOVS R0,R0, LSR #+16
\ 0000003C 2410A0E3 MOV R1,#+36
\ 00000040 4C209FE5 LDR R2,??OS_MemInit_0 ;; OSMemTbl
\ 00000044 912020E0 MLA R0,R1,R0,R2
\ 00000048 240090E2 ADDS R0,R0,#+36
\ 0000004C 040084E5 STR R0,[R4, #+4]
419 #if OS_MEM_NAME_SIZE > 1
420 pmem->OSMemName[0] = '?'; /* Unknown name */
\ 00000050 3F00A0E3 MOV R0,#+63
\ 00000054 1400C4E5 STRB R0,[R4, #+20]
421 pmem->OSMemName[1] = OS_ASCII_NUL;
\ 00000058 0000A0E3 MOV R0,#+0
\ 0000005C 1500C4E5 STRB R0,[R4, #+21]
422 #endif
423 pmem++;
\ 00000060 244094E2 ADDS R4,R4,#+36
424 }
\ 00000064 015095E2 ADDS R5,R5,#+1
\ 00000068 ECFFFFEA B ??OS_MemInit_1
425 pmem->OSMemFreeList = (void *)0; /* Initialize last node */
\ ??OS_MemInit_2:
\ 0000006C 0000A0E3 MOV R0,#+0
\ 00000070 040084E5 STR R0,[R4, #+4]
426 #if OS_MEM_NAME_SIZE > 1
427 pmem->OSMemName[0] = '?'; /* Unknown name */
\ 00000074 3F00A0E3 MOV R0,#+63
\ 00000078 1400C4E5 STRB R0,[R4, #+20]
428 pmem->OSMemName[1] = OS_ASCII_NUL;
\ 0000007C 0000A0E3 MOV R0,#+0
\ 00000080 1500C4E5 STRB R0,[R4, #+21]
429 #endif
430
431 OSMemFreeList = &OSMemTbl[0]; /* Point to beginning of free list */
\ 00000084 ........ LDR R0,??DataTable4 ;; OSMemFreeList
\ 00000088 04109FE5 LDR R1,??OS_MemInit_0 ;; OSMemTbl
\ 0000008C 001080E5 STR R1,[R0, #+0]
432 #endif
433 }
\ 00000090 3080BDE8 POP {R4,R5,PC} ;; return
\ ??OS_MemInit_0:
\ 00000094 ........ DC32 OSMemTbl
\ In segment CODE, align 4, keep-with-next
\ ??DataTable4:
\ 00000000 ........ DC32 OSMemFreeList
434 #endif /* OS_MEM_EN */
Maximum stack usage in bytes:
Function CSTACK
-------- ------
OSMemCreate 40
OSMemGet 20
OSMemNameGet 24
OSMemNameSet 24
OSMemPut 16
OSMemQuery 16
OS_MemInit 12
Segment part sizes:
Function/Label Bytes
-------------- -----
OSMemCreate 360
OSMemGet 156
OSMemNameGet 160
OSMemNameSet 180
OSMemPut 132
OSMemQuery 132
OS_MemInit 152
??DataTable4 4
Others 60
1 336 bytes in segment CODE
1 276 bytes of CODE memory (+ 60 bytes shared)
Errors: none
Warnings: none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -