📄 os_mem.txt
字号:
;;;259
;;;260 #if OS_ARG_CHK_EN > 0
;;;261 if (perr == (INT8U *)0) { /* Validate 'perr' */
;;;262 return;
;;;263 }
;;;264 if (pmem == (OS_MEM *)0) { /* Is 'pmem' a NULL pointer? */
;;;265 *perr = OS_ERR_MEM_INVALID_PMEM;
;;;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 */
00015c e59f017c LDR r0,|L1.736|
000160 e1a06001 MOV r6,r1 ;252
000164 e5d00000 LDRB r0,[r0,#0] ; OSIntNesting
000168 e1a04002 MOV r4,r2 ;252
00016c e3500000 CMP r0,#0
;;;274 *perr = OS_ERR_NAME_SET_ISR;
000170 13a00012 MOVNE r0,#0x12
;;;275 return;
000174 1a00000f BNE |L1.440|
;;;276 }
;;;277 OS_ENTER_CRITICAL();
000178 ebfffffe BL OS_CPU_SR_Save
00017c e1a07000 MOV r7,r0
;;;278 len = OS_StrLen(pname); /* Can we fit the string in the storage area? */
000180 e1a00006 MOV r0,r6
000184 ebfffffe BL OS_StrLen
;;;279 if (len > (OS_MEM_NAME_SIZE - 1)) { /* No */
000188 e350000f CMP r0,#0xf
00018c 9a000003 BLS |L1.416|
;;;280 OS_EXIT_CRITICAL();
000190 e1a00007 MOV r0,r7
000194 ebfffffe BL OS_CPU_SR_Restore
;;;281 *perr = OS_ERR_MEM_NAME_TOO_LONG;
000198 e3a00063 MOV r0,#0x63
;;;282 return;
00019c ea000005 B |L1.440|
|L1.416|
;;;283 }
;;;284 (void)OS_StrCopy(pmem->OSMemName, pname); /* Yes, copy name to the memory partition header */
0001a0 e1a01006 MOV r1,r6
0001a4 e2850014 ADD r0,r5,#0x14
0001a8 ebfffffe BL OS_StrCopy
;;;285 OS_EXIT_CRITICAL();
0001ac e1a00007 MOV r0,r7
0001b0 ebfffffe BL OS_CPU_SR_Restore
;;;286 *perr = OS_ERR_NONE;
0001b4 e3a00000 MOV r0,#0
|L1.440|
0001b8 e5c40000 STRB r0,[r4,#0]
;;;287 }
0001bc e8bd41f0 POP {r4-r8,lr}
0001c0 e12fff1e BX lr
;;;288 #endif
ENDP
OSMemPut PROC
;;;309 INT8U OSMemPut (OS_MEM *pmem, void *pblk)
;;;310 {
0001c4 e92d4070 PUSH {r4-r6,lr}
0001c8 e1a04000 MOV r4,r0
0001cc e1a05001 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 */
;;;319 return (OS_ERR_MEM_INVALID_PMEM);
;;;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();
0001d0 ebfffffe BL OS_CPU_SR_Save
;;;326 if (pmem->OSMemNFree >= pmem->OSMemNBlks) { /* Make sure all blocks not already returned */
0001d4 e5941010 LDR r1,[r4,#0x10]
0001d8 e594200c LDR r2,[r4,#0xc]
0001dc e1510002 CMP r1,r2
0001e0 3a000003 BCC |L1.500|
;;;327 OS_EXIT_CRITICAL();
0001e4 ebfffffe BL OS_CPU_SR_Restore
;;;328 return (OS_ERR_MEM_FULL);
0001e8 e3a0005e MOV r0,#0x5e
|L1.492|
0001ec e8bd4070 POP {r4-r6,lr}
;;;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 }
0001f0 e12fff1e BX lr
|L1.500|
0001f4 e5941004 LDR r1,[r4,#4] ;330
0001f8 e5851000 STR r1,[r5,#0] ;331
0001fc e5845004 STR r5,[r4,#4] ;332
000200 e5941010 LDR r1,[r4,#0x10] ;332
000204 e2811001 ADD r1,r1,#1 ;332
000208 e5841010 STR r1,[r4,#0x10] ;332
00020c ebfffffe BL OS_CPU_SR_Restore
000210 e3a00000 MOV r0,#0 ;334
000214 eafffff4 B |L1.492|
;;;336 /*$PAGE*/
ENDP
OSMemQuery PROC
;;;356 INT8U OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *p_mem_data)
;;;357 {
000218 e92d4070 PUSH {r4-r6,lr}
00021c e1a05000 MOV r5,r0
000220 e1a04001 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 */
;;;366 return (OS_ERR_MEM_INVALID_PMEM);
;;;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();
000224 ebfffffe BL OS_CPU_SR_Save
;;;373 p_mem_data->OSAddr = pmem->OSMemAddr;
000228 e5951000 LDR r1,[r5,#0]
;;;374 p_mem_data->OSFreeList = pmem->OSMemFreeList;
00022c e5841000 STR r1,[r4,#0]
000230 e5951004 LDR r1,[r5,#4]
;;;375 p_mem_data->OSBlkSize = pmem->OSMemBlkSize;
000234 e5841004 STR r1,[r4,#4]
000238 e5951008 LDR r1,[r5,#8]
;;;376 p_mem_data->OSNBlks = pmem->OSMemNBlks;
00023c e5841008 STR r1,[r4,#8]
000240 e595100c LDR r1,[r5,#0xc]
;;;377 p_mem_data->OSNFree = pmem->OSMemNFree;
000244 e584100c STR r1,[r4,#0xc]
000248 e5951010 LDR r1,[r5,#0x10]
00024c e5841010 STR r1,[r4,#0x10]
;;;378 OS_EXIT_CRITICAL();
000250 ebfffffe BL OS_CPU_SR_Restore
;;;379 p_mem_data->OSNUsed = p_mem_data->OSNBlks - p_mem_data->OSNFree;
000254 e284100c ADD r1,r4,#0xc
000258 e8910003 LDM r1,{r0,r1}
00025c e0400001 SUB r0,r0,r1
000260 e5840014 STR r0,[r4,#0x14]
;;;380 return (OS_ERR_NONE);
000264 e8bd4070 POP {r4-r6,lr}
000268 e3a00000 MOV r0,#0
;;;381 }
00026c e12fff1e BX lr
;;;382 #endif /* OS_MEM_QUERY_EN */
ENDP
OS_MemInit PROC
;;;399 void OS_MemInit (void)
;;;400 {
000270 e92d4010 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 */
000274 e59f0068 LDR r0,|L1.740|
000278 e3a010b4 MOV r1,#0xb4
00027c ebfffffe BL OS_MemClr
;;;416 pmem = &OSMemTbl[0]; /* Point to memory control block (MCB) */
000280 e59f005c LDR r0,|L1.740|
;;;417 for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) { /* Init. list of free memory partitions */
000284 e3a01000 MOV r1,#0
000288 e2803000 ADD r3,r0,#0
00028c e1a0c001 MOV r12,r1
000290 e3a0203f MOV r2,#0x3f
|L1.660|
;;;418 pmem->OSMemFreeList = (void *)&OSMemTbl[i+1]; /* Chain list of free partitions */
000294 e081e181 ADD lr,r1,r1,LSL #3
000298 e083e10e ADD lr,r3,lr,LSL #2
00029c e28ee024 ADD lr,lr,#0x24
0002a0 e580e004 STR lr,[r0,#4]
0002a4 e2811001 ADD r1,r1,#1 ;417
;;;419 #if OS_MEM_NAME_SIZE > 1
;;;420 pmem->OSMemName[0] = '?'; /* Unknown name */
0002a8 e5c02014 STRB r2,[r0,#0x14]
0002ac e3c11801 BIC r1,r1,#0x10000 ;417
;;;421 pmem->OSMemName[1] = OS_ASCII_NUL;
0002b0 e5c0c015 STRB r12,[r0,#0x15]
0002b4 e3510004 CMP r1,#4 ;417
;;;422 #endif
;;;423 pmem++;
0002b8 e2800024 ADD r0,r0,#0x24
0002bc 3afffff4 BCC |L1.660|
;;;424 }
;;;425 pmem->OSMemFreeList = (void *)0; /* Initialize last node */
0002c0 e580c004 STR r12,[r0,#4]
;;;426 #if OS_MEM_NAME_SIZE > 1
;;;427 pmem->OSMemName[0] = '?'; /* Unknown name */
0002c4 e5c02014 STRB r2,[r0,#0x14]
;;;428 pmem->OSMemName[1] = OS_ASCII_NUL;
0002c8 e5c0c015 STRB r12,[r0,#0x15]
;;;429 #endif
;;;430
;;;431 OSMemFreeList = &OSMemTbl[0]; /* Point to beginning of free list */
0002cc e59f0008 LDR r0,|L1.732|
0002d0 e5803000 STR r3,[r0,#0] ; OSMemFreeList
;;;432 #endif
;;;433 }
0002d4 e8bd4010 POP {r4,lr}
0002d8 e12fff1e BX lr
;;;434 #endif /* OS_MEM_EN */
ENDP
|L1.732|
0002dc 00000000 DCD OSMemFreeList
|L1.736|
0002e0 00000000 DCD OSIntNesting
|L1.740|
0002e4 00000000 DCD OSMemTbl
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -