📄 os_mem.txt
字号:
000134 e8bd81f0 POP {r4-r8,pc}
;;;225 #endif
ENDP
OSMemNameSet PROC
;;;251 void OSMemNameSet (OS_MEM *pmem, INT8U *pname, INT8U *perr)
;;;252 {
000138 e92d41f0 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|
;;;266 return;
;;;267 }
;;;268 if (pname == (INT8U *)0) { /* Is 'pname' a NULL pointer? */
;;;269 *perr = OS_ERR_PNAME_NULL;
;;;270 return;
;;;271 }
;;;272 #endif
;;;273 if (OSIntNesting > 0) { /* See if trying to call from an ISR */
;;;274 *perr = OS_ERR_NAME_SET_ISR;
;;;275 return;
;;;276 }
;;;277 OS_ENTER_CRITICAL();
;;;278 len = OS_StrLen(pname); /* Can we fit the string in the storage area? */
;;;279 if (len > (OS_MEM_NAME_SIZE - 1)) { /* No */
;;;280 OS_EXIT_CRITICAL();
;;;281 *perr = OS_ERR_MEM_NAME_TOO_LONG;
;;;282 return;
;;;283 }
;;;284 (void)OS_StrCopy(pmem->OSMemName, pname); /* Yes, copy name to the memory partition header */
;;;285 OS_EXIT_CRITICAL();
;;;286 *perr = OS_ERR_NONE;
;;;287 }
00014c e8bd81f0 POP {r4-r8,pc}
|L1.336|
000150 b91e CBNZ r6,|L1.346|
000152 200c MOVS r0,#0xc ;269
000154 7020 STRB r0,[r4,#0] ;269
000156 e8bd81f0 POP {r4-r8,pc}
|L1.346|
00015a 483f LDR r0,|L1.600|
00015c 7800 LDRB r0,[r0,#0] ;273 ; OSIntNesting
00015e b118 CBZ r0,|L1.360|
000160 2012 MOVS r0,#0x12 ;274
000162 7020 STRB r0,[r4,#0] ;274
000164 e8bd81f0 POP {r4-r8,pc}
|L1.360|
000168 f7fffffe BL OS_CPU_SR_Save
00016c 4607 MOV r7,r0 ;277
00016e 4630 MOV r0,r6 ;278
000170 f7fffffe BL OS_StrLen
000174 280f CMP r0,#0xf ;279
000176 d906 BLS |L1.390|
000178 4638 MOV r0,r7 ;280
00017a f7fffffe BL OS_CPU_SR_Restore
00017e 2063 MOVS r0,#0x63 ;281
000180 7020 STRB r0,[r4,#0] ;281
000182 e8bd81f0 POP {r4-r8,pc}
|L1.390|
000186 4631 MOV r1,r6 ;284
000188 f1050014 ADD r0,r5,#0x14 ;284
00018c f7fffffe BL OS_StrCopy
000190 4638 MOV r0,r7 ;285
000192 f7fffffe BL OS_CPU_SR_Restore
000196 2000 MOVS r0,#0 ;286
000198 7020 STRB r0,[r4,#0] ;286
00019a e8bd81f0 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 ;322
0001ae bd70 POP {r4-r6,pc}
|L1.432|
0001b0 f7fffffe BL OS_CPU_SR_Save
0001b4 68e2 LDR r2,[r4,#0xc] ;326
0001b6 6921 LDR r1,[r4,#0x10] ;326
0001b8 4291 CMP r1,r2 ;326
0001ba d303 BCC |L1.452|
0001bc f7fffffe BL OS_CPU_SR_Restore
0001c0 205e MOVS r0,#0x5e ;328
0001c2 bd70 POP {r4-r6,pc}
|L1.452|
0001c4 6861 LDR r1,[r4,#4] ;330
0001c6 6029 STR r1,[r5,#0] ;330
0001c8 6065 STR r5,[r4,#4] ;331
0001ca 6921 LDR r1,[r4,#0x10] ;332
0001cc 1c49 ADDS r1,r1,#1 ;332
0001ce 6121 STR r1,[r4,#0x10] ;332
0001d0 f7fffffe BL OS_CPU_SR_Restore
0001d4 2000 MOVS r0,#0 ;334
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 ;369
0001e8 bd70 POP {r4-r6,pc}
|L1.490|
0001ea f7fffffe BL OS_CPU_SR_Save
0001ee 6829 LDR r1,[r5,#0] ;373
0001f0 6021 STR r1,[r4,#0] ;373
0001f2 6869 LDR r1,[r5,#4] ;374
0001f4 6061 STR r1,[r4,#4] ;374
0001f6 68a9 LDR r1,[r5,#8] ;375
0001f8 60a1 STR r1,[r4,#8] ;375
0001fa 68e9 LDR r1,[r5,#0xc] ;376
0001fc 60e1 STR r1,[r4,#0xc] ;376
0001fe 6929 LDR r1,[r5,#0x10] ;377
000200 6121 STR r1,[r4,#0x10] ;377
000202 f7fffffe BL OS_CPU_SR_Restore
000206 6921 LDR r1,[r4,#0x10] ;379
000208 68e0 LDR r0,[r4,#0xc] ;379
00020a 1a40 SUBS r0,r0,r1 ;379
00020c 6160 STR r0,[r4,#0x14] ;379
00020e 2000 MOVS r0,#0 ;380
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 f7fffffe 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 f04f0c00 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 eb010ec1 ADD lr,r1,r1,LSL #3
00022e eb030e8e ADD lr,r3,lr,LSL #2
000232 f8c0e004 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 f880c015 STRB r12,[r0,#0x15]
;;;422 #endif
;;;423 pmem++;
00023c 3024 ADDS r0,r0,#0x24
00023e b289 UXTH r1,r1 ;417
000240 2904 CMP r1,#4 ;417
000242 d3f1 BCC |L1.552|
;;;424 }
;;;425 pmem->OSMemFreeList = (void *)0; /* Initialize last node */
000244 f8c0c004 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 f880c015 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 + -