📄 os_mem.txt
字号:
000260 e1a00005 MOV r0,r5
000264 ebfffffe BL OS_StrCopy
000268 e1a08000 MOV r8,r0
00026c e1a00007 MOV r0,r7
000270 ebfffffe BL OS_CPU_SR_Restore
000274 e3a00000 MOV r0,#0
000278 e5c60000 STRB r0,[r6,#0]
00027c e1a00008 MOV r0,r8
000280 eaffffe3 B |L1.532|
ENDP
OSMemNameSet PROC
;;;252 void OSMemNameSet (OS_MEM *pmem, INT8U *pname, INT8U *err)
;;;253 {
000284 e92d41f0 PUSH {r4-r8,lr}
000288 e1a04000 MOV r4,r0
00028c e1a05001 MOV r5,r1
000290 e1a06002 MOV r6,r2
;;;254 INT8U len;
;;;255 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;256 OS_CPU_SR cpu_sr = 0;
000294 e3a08000 MOV r8,#0
;;;257 #endif
;;;258
;;;259
;;;260
;;;261 OS_ENTER_CRITICAL();
000298 ebfffffe BL OS_CPU_SR_Save
00029c e1a08000 MOV r8,r0
;;;262 #if OS_ARG_CHK_EN > 0
;;;263 if (err == (INT8U *)0) { /* Validate 'err' */
0002a0 e3560000 CMP r6,#0
0002a4 1a000003 BNE |L1.696|
;;;264 OS_EXIT_CRITICAL();
0002a8 e1a00008 MOV r0,r8
0002ac ebfffffe BL OS_CPU_SR_Restore
|L1.688|
;;;265 return;
;;;266 }
;;;267 if (pmem == (OS_MEM *)0) { /* Is 'pmem' a NULL pointer? */
;;;268 OS_EXIT_CRITICAL(); /* Yes */
;;;269 *err = OS_ERR_MEM_INVALID_PMEM;
;;;270 return;
;;;271 }
;;;272 if (pname == (INT8U *)0) { /* Is 'pname' a NULL pointer? */
;;;273 OS_EXIT_CRITICAL(); /* Yes */
;;;274 *err = OS_ERR_PNAME_NULL;
;;;275 return;
;;;276 }
;;;277 #endif
;;;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 *err = 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 *err = OS_ERR_NONE;
;;;287 }
0002b0 e8bd41f0 POP {r4-r8,lr}
0002b4 e12fff1e BX lr
|L1.696|
0002b8 e3540000 CMP r4,#0
0002bc 1a000004 BNE |L1.724|
0002c0 e1a00008 MOV r0,r8
0002c4 ebfffffe BL OS_CPU_SR_Restore
0002c8 e3a00060 MOV r0,#0x60
0002cc e5c60000 STRB r0,[r6,#0]
0002d0 eafffff6 B |L1.688|
|L1.724|
0002d4 e3550000 CMP r5,#0
0002d8 1a000004 BNE |L1.752|
0002dc e1a00008 MOV r0,r8
0002e0 ebfffffe BL OS_CPU_SR_Restore
0002e4 e3a0000c MOV r0,#0xc
0002e8 e5c60000 STRB r0,[r6,#0]
0002ec eaffffef B |L1.688|
|L1.752|
0002f0 e1a00005 MOV r0,r5
0002f4 ebfffffe BL OS_StrLen
0002f8 e1a07000 MOV r7,r0
0002fc e357000f CMP r7,#0xf
000300 da000004 BLE |L1.792|
000304 e1a00008 MOV r0,r8
000308 ebfffffe BL OS_CPU_SR_Restore
00030c e3a00063 MOV r0,#0x63
000310 e5c60000 STRB r0,[r6,#0]
000314 eaffffe5 B |L1.688|
|L1.792|
000318 e1a01005 MOV r1,r5
00031c e2840014 ADD r0,r4,#0x14
000320 ebfffffe BL OS_StrCopy
000324 e1a00008 MOV r0,r8
000328 ebfffffe BL OS_CPU_SR_Restore
00032c e3a00000 MOV r0,#0
000330 e5c60000 STRB r0,[r6,#0]
000334 eaffffdd B |L1.688|
ENDP
OSMemPut PROC
;;;309 INT8U OSMemPut (OS_MEM *pmem, void *pblk)
;;;310 {
000338 e92d4070 PUSH {r4-r6,lr}
00033c e1a04000 MOV r4,r0
000340 e1a05001 MOV r5,r1
;;;311 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;312 OS_CPU_SR cpu_sr = 0;
000344 e3a06000 MOV r6,#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 */
000348 e3540000 CMP r4,#0
00034c 1a000002 BNE |L1.860|
;;;319 return (OS_ERR_MEM_INVALID_PMEM);
000350 e3a00060 MOV r0,#0x60
|L1.852|
000354 e8bd4070 POP {r4-r6,lr}
;;;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 }
000358 e12fff1e BX lr
|L1.860|
00035c e3550000 CMP r5,#0
000360 1a000001 BNE |L1.876|
000364 e3a0005f MOV r0,#0x5f
000368 eafffff9 B |L1.852|
|L1.876|
00036c ebfffffe BL OS_CPU_SR_Save
000370 e1a06000 MOV r6,r0
000374 e5940010 LDR r0,[r4,#0x10]
000378 e594100c LDR r1,[r4,#0xc]
00037c e1500001 CMP r0,r1
000380 3a000003 BCC |L1.916|
000384 e1a00006 MOV r0,r6
000388 ebfffffe BL OS_CPU_SR_Restore
00038c e3a0005e MOV r0,#0x5e
000390 eaffffef B |L1.852|
|L1.916|
000394 e5940004 LDR r0,[r4,#4]
000398 e5850000 STR r0,[r5,#0]
00039c e5845004 STR r5,[r4,#4]
0003a0 e5940010 LDR r0,[r4,#0x10]
0003a4 e2800001 ADD r0,r0,#1
0003a8 e5840010 STR r0,[r4,#0x10]
0003ac e1a00006 MOV r0,r6
0003b0 ebfffffe BL OS_CPU_SR_Restore
0003b4 e3a00000 MOV r0,#0
0003b8 eaffffe5 B |L1.852|
ENDP
OSMemQuery PROC
;;;356 INT8U OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *p_mem_data)
;;;357 {
0003bc e92d4070 PUSH {r4-r6,lr}
0003c0 e1a04000 MOV r4,r0
0003c4 e1a05001 MOV r5,r1
;;;358 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
;;;359 OS_CPU_SR cpu_sr = 0;
0003c8 e3a06000 MOV r6,#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 */
0003cc e3540000 CMP r4,#0
0003d0 1a000002 BNE |L1.992|
;;;366 return (OS_ERR_MEM_INVALID_PMEM);
0003d4 e3a00060 MOV r0,#0x60
|L1.984|
0003d8 e8bd4070 POP {r4-r6,lr}
;;;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 }
0003dc e12fff1e BX lr
|L1.992|
0003e0 e3550000 CMP r5,#0
0003e4 1a000001 BNE |L1.1008|
0003e8 e3a00061 MOV r0,#0x61
0003ec eafffff9 B |L1.984|
|L1.1008|
0003f0 ebfffffe BL OS_CPU_SR_Save
0003f4 e1a06000 MOV r6,r0
0003f8 e5940000 LDR r0,[r4,#0]
0003fc e5850000 STR r0,[r5,#0]
000400 e5940004 LDR r0,[r4,#4]
000404 e5850004 STR r0,[r5,#4]
000408 e5940008 LDR r0,[r4,#8]
00040c e5850008 STR r0,[r5,#8]
000410 e594000c LDR r0,[r4,#0xc]
000414 e585000c STR r0,[r5,#0xc]
000418 e5940010 LDR r0,[r4,#0x10]
00041c e5850010 STR r0,[r5,#0x10]
000420 e1a00006 MOV r0,r6
000424 ebfffffe BL OS_CPU_SR_Restore
000428 e285100c ADD r1,r5,#0xc
00042c e8910003 LDM r1,{r0,r1}
000430 e0400001 SUB r0,r0,r1
000434 e5850014 STR r0,[r5,#0x14]
000438 e3a00000 MOV r0,#0
00043c eaffffe5 B |L1.984|
ENDP
OS_MemInit PROC
;;;399 void OS_MemInit (void)
;;;400 {
000440 e92d4070 PUSH {r4-r6,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 */
000444 e3a010b4 MOV r1,#0xb4
000448 e59f0074 LDR r0,|L1.1220|
00044c ebfffffe BL OS_MemClr
;;;416 pmem = &OSMemTbl[0]; /* Point to memory control block (MCB) */
000450 e59f506c LDR r5,|L1.1220|
;;;417 for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) { /* Init. list of free memory partitions */
000454 e3a04000 MOV r4,#0
000458 ea00000b B |L1.1164|
|L1.1116|
;;;418 pmem->OSMemFreeList = (void *)&OSMemTbl[i+1]; /* Chain list of free partitions */
00045c e2840001 ADD r0,r4,#1
000460 e0800180 ADD r0,r0,r0,LSL #3
000464 e59f1058 LDR r1,|L1.1220|
000468 e0810100 ADD r0,r1,r0,LSL #2
00046c e5850004 STR r0,[r5,#4]
;;;419 #if OS_MEM_NAME_SIZE > 1
;;;420 pmem->OSMemName[0] = '?'; /* Unknown name */
000470 e3a0003f MOV r0,#0x3f
000474 e5c50014 STRB r0,[r5,#0x14]
;;;421 pmem->OSMemName[1] = OS_ASCII_NUL;
000478 e3a00000 MOV r0,#0
00047c e5c50015 STRB r0,[r5,#0x15]
;;;422 #endif
;;;423 pmem++;
000480 e2855024 ADD r5,r5,#0x24
000484 e2840001 ADD r0,r4,#1
000488 e3c04801 BIC r4,r0,#0x10000
|L1.1164|
00048c e3540004 CMP r4,#4
000490 bafffff1 BLT |L1.1116|
;;;424 }
;;;425 pmem->OSMemFreeList = (void *)0; /* Initialize last node */
000494 e3a00000 MOV r0,#0
000498 e5850004 STR r0,[r5,#4]
;;;426 #if OS_MEM_NAME_SIZE > 1
;;;427 pmem->OSMemName[0] = '?'; /* Unknown name */
00049c e3a0003f MOV r0,#0x3f
0004a0 e5c50014 STRB r0,[r5,#0x14]
;;;428 pmem->OSMemName[1] = OS_ASCII_NUL;
0004a4 e3a00000 MOV r0,#0
0004a8 e5c50015 STRB r0,[r5,#0x15]
;;;429 #endif
;;;430
;;;431 OSMemFreeList = &OSMemTbl[0]; /* Point to beginning of free list */
0004ac e59f0010 LDR r0,|L1.1220|
0004b0 e59f1008 LDR r1,|L1.1216|
0004b4 e5810000 STR r0,[r1,#0] ; OSMemFreeList
;;;432 #endif
;;;433 }
0004b8 e8bd4070 POP {r4-r6,lr}
0004bc e12fff1e BX lr
ENDP
|L1.1216|
0004c0 00000000 DCD OSMemFreeList
|L1.1220|
0004c4 00000000 DCD OSMemTbl
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -