📄 os_mem.txt
字号:
000134 e8bde8bd POP {r4-r8,pc}
;;;225 #endif
ENDP
OSMemNameSet PROC
;;;251 void OSMemNameSet (OS_MEM *pmem, INT8U *pname, INT8U *perr)
;;;252 {
000138 e92de92d PUSH {r4-r8,lr}
00013c 4605 MOV r5,r0
00013e 460e MOV r6,r1
000140 4614 MOV r4,r2
;;;253 INT8U len;
;;;254 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;255 OS_CPU_SR cpu_sr = 0;
;;;256 #endif
;;;257
;;;258
;;;259
;;;260 #if OS_ARG_CHK_EN > 0
;;;261 if (perr == (INT8U *)0) { /* Validate 'perr' */
000142 2c00 CMP r4,#0
000144 d002 BEQ |L1.332|
;;;262 return;
;;;263 }
;;;264 if (pmem == (OS_MEM *)0) { /* Is 'pmem' a NULL pointer? */
000146 b91d CBNZ r5,|L1.336|
;;;265 *perr = OS_ERR_MEM_INVALID_PMEM;
000148 2060 MOVS r0,#0x60
00014a 7020 STRB r0,[r4,#0]
|L1.332|
00014c e8bde8bd POP {r4-r8,pc}
|L1.336|
;;;266 return;
;;;267 }
;;;268 if (pname == (INT8U *)0) { /* Is 'pname' a NULL pointer? */
000150 b91e CBNZ r6,|L1.346|
;;;269 *perr = OS_ERR_PNAME_NULL;
000152 200c MOVS r0,#0xc
000154 7020 STRB r0,[r4,#0]
000156 e8bde8bd POP {r4-r8,pc}
|L1.346|
;;;270 return;
;;;271 }
;;;272 #endif
;;;273 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
00015a 483f LDR r0,|L1.600|
00015c 7800 LDRB r0,[r0,#0] ; OSIntNesting
00015e b118 CBZ r0,|L1.360|
;;;274 *perr = OS_ERR_NAME_SET_ISR;
000160 2012 MOVS r0,#0x12
000162 7020 STRB r0,[r4,#0]
000164 e8bde8bd POP {r4-r8,pc}
|L1.360|
;;;275 return;
;;;276 }
;;;277 OS_ENTER_CRITICAL();
000168 f7fff7ff BL OS_CPU_SR_Save
00016c 4607 MOV r7,r0
;;;278 len = OS_StrLen(pname); /* Can we fit the string in the storage area? */
00016e 4630 MOV r0,r6
000170 f7fff7ff BL OS_StrLen
;;;279 if (len > (OS_MEM_NAME_SIZE - 1)) { /* No */
000174 280f CMP r0,#0xf
000176 d906 BLS |L1.390|
;;;280 OS_EXIT_CRITICAL();
000178 4638 MOV r0,r7
00017a f7fff7ff BL OS_CPU_SR_Restore
;;;281 *perr = OS_ERR_MEM_NAME_TOO_LONG;
00017e 2063 MOVS r0,#0x63
000180 7020 STRB r0,[r4,#0]
000182 e8bde8bd POP {r4-r8,pc}
|L1.390|
;;;282 return;
;;;283 }
;;;284 (void)OS_StrCopy(pmem->OSMemName, pname); /* Yes, copy name to the memory partition header */
000186 4631 MOV r1,r6
000188 f105f105 ADD r0,r5,#0x14
00018c f7fff7ff BL OS_StrCopy
;;;285 OS_EXIT_CRITICAL();
000190 4638 MOV r0,r7
000192 f7fff7ff BL OS_CPU_SR_Restore
;;;286 *perr = OS_ERR_NONE;
000196 2000 MOVS r0,#0
000198 7020 STRB r0,[r4,#0]
;;;287 }
00019a e8bde8bd POP {r4-r8,pc}
;;;288 #endif
ENDP
OSMemPut PROC
;;;309 INT8U OSMemPut (OS_MEM *pmem, void *pblk)
;;;310 {
00019e b570 PUSH {r4-r6,lr}
0001a0 4604 MOV r4,r0
0001a2 460d MOV r5,r1
;;;311 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;312 OS_CPU_SR cpu_sr = 0;
;;;313 #endif
;;;314
;;;315
;;;316
;;;317 #if OS_ARG_CHK_EN > 0
;;;318 if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
0001a4 b90c CBNZ r4,|L1.426|
;;;319 return (OS_ERR_MEM_INVALID_PMEM);
0001a6 2060 MOVS r0,#0x60
;;;320 }
;;;321 if (pblk == (void *)0) { /* Must release a valid block */
;;;322 return (OS_ERR_MEM_INVALID_PBLK);
;;;323 }
;;;324 #endif
;;;325 OS_ENTER_CRITICAL();
;;;326 if (pmem->OSMemNFree >= pmem->OSMemNBlks) { /* Make sure all blocks not already returned */
;;;327 OS_EXIT_CRITICAL();
;;;328 return (OS_ERR_MEM_FULL);
;;;329 }
;;;330 *(void **)pblk = pmem->OSMemFreeList; /* Insert released block into free block list */
;;;331 pmem->OSMemFreeList = pblk;
;;;332 pmem->OSMemNFree++; /* One more memory block in this partition */
;;;333 OS_EXIT_CRITICAL();
;;;334 return (OS_ERR_NONE); /* Notify caller that memory block was released */
;;;335 }
0001a8 bd70 POP {r4-r6,pc}
|L1.426|
0001aa b90d CBNZ r5,|L1.432|
0001ac 205f MOVS r0,#0x5f
0001ae bd70 POP {r4-r6,pc}
|L1.432|
0001b0 f7fff7ff BL OS_CPU_SR_Save
0001b4 68e2 LDR r2,[r4,#0xc]
0001b6 6921 LDR r1,[r4,#0x10]
0001b8 4291 CMP r1,r2
0001ba d303 BCC |L1.452|
0001bc f7fff7ff BL OS_CPU_SR_Restore
0001c0 205e MOVS r0,#0x5e
0001c2 bd70 POP {r4-r6,pc}
|L1.452|
0001c4 6861 LDR r1,[r4,#4]
0001c6 6029 STR r1,[r5,#0]
0001c8 6065 STR r5,[r4,#4]
0001ca 6921 LDR r1,[r4,#0x10]
0001cc 1c49 ADDS r1,r1,#1
0001ce 6121 STR r1,[r4,#0x10]
0001d0 f7fff7ff BL OS_CPU_SR_Restore
0001d4 2000 MOVS r0,#0
0001d6 bd70 POP {r4-r6,pc}
;;;336 /*$PAGE*/
ENDP
OSMemQuery PROC
;;;356 INT8U OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *p_mem_data)
;;;357 {
0001d8 b570 PUSH {r4-r6,lr}
0001da 4605 MOV r5,r0
0001dc 460c MOV r4,r1
;;;358 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;359 OS_CPU_SR cpu_sr = 0;
;;;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 */
0001de b90d CBNZ r5,|L1.484|
;;;366 return (OS_ERR_MEM_INVALID_PMEM);
0001e0 2060 MOVS r0,#0x60
;;;367 }
;;;368 if (p_mem_data == (OS_MEM_DATA *)0) { /* Must release a valid storage area for the data */
;;;369 return (OS_ERR_MEM_INVALID_PDATA);
;;;370 }
;;;371 #endif
;;;372 OS_ENTER_CRITICAL();
;;;373 p_mem_data->OSAddr = pmem->OSMemAddr;
;;;374 p_mem_data->OSFreeList = pmem->OSMemFreeList;
;;;375 p_mem_data->OSBlkSize = pmem->OSMemBlkSize;
;;;376 p_mem_data->OSNBlks = pmem->OSMemNBlks;
;;;377 p_mem_data->OSNFree = pmem->OSMemNFree;
;;;378 OS_EXIT_CRITICAL();
;;;379 p_mem_data->OSNUsed = p_mem_data->OSNBlks - p_mem_data->OSNFree;
;;;380 return (OS_ERR_NONE);
;;;381 }
0001e2 bd70 POP {r4-r6,pc}
|L1.484|
0001e4 b90c CBNZ r4,|L1.490|
0001e6 2061 MOVS r0,#0x61
0001e8 bd70 POP {r4-r6,pc}
|L1.490|
0001ea f7fff7ff BL OS_CPU_SR_Save
0001ee 6829 LDR r1,[r5,#0]
0001f0 6021 STR r1,[r4,#0]
0001f2 6869 LDR r1,[r5,#4]
0001f4 6061 STR r1,[r4,#4]
0001f6 68a9 LDR r1,[r5,#8]
0001f8 60a1 STR r1,[r4,#8]
0001fa 68e9 LDR r1,[r5,#0xc]
0001fc 60e1 STR r1,[r4,#0xc]
0001fe 6929 LDR r1,[r5,#0x10]
000200 6121 STR r1,[r4,#0x10]
000202 f7fff7ff BL OS_CPU_SR_Restore
000206 6921 LDR r1,[r4,#0x10]
000208 68e0 LDR r0,[r4,#0xc]
00020a 1a40 SUBS r0,r0,r1
00020c 6160 STR r0,[r4,#0x14]
00020e 2000 MOVS r0,#0
000210 bd70 POP {r4-r6,pc}
;;;382 #endif /* OS_MEM_QUERY_EN */
ENDP
OS_MemInit PROC
;;;399 void OS_MemInit (void)
;;;400 {
000212 b510 PUSH {r4,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 */
000214 21b4 MOVS r1,#0xb4
000216 4811 LDR r0,|L1.604|
000218 f7fff7ff BL OS_MemClr
;;;416 pmem = &OSMemTbl[0]; /* Point to memory control block (MCB) */
00021c 480f LDR r0,|L1.604|
;;;417 for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) { /* Init. list of free memory partitions */
00021e 2100 MOVS r1,#0
000220 4b0e LDR r3,|L1.604|
000222 f04ff04f MOV r12,#0
000226 223f MOVS r2,#0x3f
|L1.552|
;;;418 pmem->OSMemFreeList = (void *)&OSMemTbl[i+1]; /* Chain list of free partitions */
000228 1c49 ADDS r1,r1,#1
00022a eb01eb01 ADD lr,r1,r1,LSL #3
00022e eb03eb03 ADD lr,r3,lr,LSL #2
000232 f8c0f8c0 STR lr,[r0,#4]
;;;419 #if OS_MEM_NAME_SIZE > 1
;;;420 pmem->OSMemName[0] = '?'; /* Unknown name */
000236 7502 STRB r2,[r0,#0x14]
;;;421 pmem->OSMemName[1] = OS_ASCII_NUL;
000238 f880f880 STRB r12,[r0,#0x15]
;;;422 #endif
;;;423 pmem++;
00023c 3024 ADDS r0,r0,#0x24
00023e b289 UXTH r1,r1
000240 2904 CMP r1,#4
000242 d3f1 BCC |L1.552|
;;;424 }
;;;425 pmem->OSMemFreeList = (void *)0; /* Initialize last node */
000244 f8c0f8c0 STR r12,[r0,#4]
;;;426 #if OS_MEM_NAME_SIZE > 1
;;;427 pmem->OSMemName[0] = '?'; /* Unknown name */
000248 7502 STRB r2,[r0,#0x14]
;;;428 pmem->OSMemName[1] = OS_ASCII_NUL;
00024a f880f880 STRB r12,[r0,#0x15]
;;;429 #endif
;;;430
;;;431 OSMemFreeList = &OSMemTbl[0]; /* Point to beginning of free list */
00024e 4801 LDR r0,|L1.596|
000250 6003 STR r3,[r0,#0] ; OSMemFreeList
;;;432 #endif
;;;433 }
000252 bd10 POP {r4,pc}
;;;434 #endif /* OS_MEM_EN */
ENDP
|L1.596|
000254 00000000 DCD OSMemFreeList
|L1.600|
000258 00000000 DCD OSIntNesting
|L1.604|
00025c 00000000 DCD OSMemTbl
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -