📄 os_mem.s79
字号:
// 264 * OS_MEM_FULL if you are returning a memory block to an already FULL memory
// 265 * partition (You freed more blocks than you allocated!)
// 266 * OS_MEM_INVALID_PMEM if you passed a NULL pointer for 'pmem'
// 267 * OS_MEM_INVALID_PBLK if you passed a NULL pointer for the block to release.
// 268 *********************************************************************************************************
// 269 */
// 270
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock9 Using cfiCommon1
CFI Function OSMemPut
THUMB
// 271 INT8U OSMemPut (OS_MEM *pmem, void *pblk)
// 272 {
OSMemPut:
PUSH {R4,R5,LR}
CFI ?RET Frame(CFA, -4)
CFI R5 Frame(CFA, -8)
CFI R4 Frame(CFA, -12)
CFI CFA R13+12
MOVS R4,R0
MOVS R5,R1
// 273 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
// 274 OS_CPU_SR cpu_sr;
// 275 #endif
// 276
// 277
// 278 #if OS_ARG_CHK_EN > 0
// 279 if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
CMP R4,#+0
BNE ??OSMemPut_0
// 280 return (OS_MEM_INVALID_PMEM);
MOVS R0,#+116
B ??OSMemPut_1
// 281 }
// 282 if (pblk == (void *)0) { /* Must release a valid block */
??OSMemPut_0:
CMP R5,#+0
BNE ??OSMemPut_2
// 283 return (OS_MEM_INVALID_PBLK);
MOVS R0,#+115
B ??OSMemPut_1
// 284 }
// 285 #endif
// 286 OS_ENTER_CRITICAL();
??OSMemPut_2:
_BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
// 287 if (pmem->OSMemNFree >= pmem->OSMemNBlks) { /* Make sure all blocks not already returned */
LDR R1,[R4, #+16]
LDR R2,[R4, #+12]
CMP R1,R2
BCC ??OSMemPut_3
// 288 OS_EXIT_CRITICAL();
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 289 return (OS_MEM_FULL);
MOVS R0,#+114
B ??OSMemPut_1
// 290 }
// 291 *(void **)pblk = pmem->OSMemFreeList; /* Insert released block into free block list */
??OSMemPut_3:
LDR R1,[R4, #+4]
STR R1,[R5, #+0]
// 292 pmem->OSMemFreeList = pblk;
STR R5,[R4, #+4]
// 293 pmem->OSMemNFree++; /* One more memory block in this partition */
LDR R1,[R4, #+16]
ADDS R1,R1,#+1
STR R1,[R4, #+16]
// 294 OS_EXIT_CRITICAL();
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 295 return (OS_NO_ERR); /* Notify caller that memory block was released */
MOVS R0,#+0
??OSMemPut_1:
POP {R4,R5}
POP {R1}
BX R1 ;; return
CFI EndBlock cfiBlock9
// 296 }
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock10 Using cfiCommon0
CFI NoFunction
ARM
??OSMemQuery??rA:
ADD R12,PC,#+1
BX R12
CFI EndBlock cfiBlock10
REQUIRE OSMemQuery
// 297
// 298 /*
// 299 *********************************************************************************************************
// 300 * QUERY MEMORY PARTITION
// 301 *
// 302 * Description : This function is used to determine the number of free memory blocks and the number of
// 303 * used memory blocks from a memory partition.
// 304 *
// 305 * Arguments : pmem is a pointer to the memory partition control block
// 306 *
// 307 * p_mem_data is a pointer to a structure that will contain information about the memory
// 308 * partition.
// 309 *
// 310 * Returns : OS_NO_ERR If no errors were found.
// 311 * OS_MEM_INVALID_PMEM if you passed a NULL pointer for 'pmem'
// 312 * OS_MEM_INVALID_PDATA if you passed a NULL pointer to the data recipient.
// 313 *********************************************************************************************************
// 314 */
// 315
// 316 #if OS_MEM_QUERY_EN > 0
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock11 Using cfiCommon1
CFI Function OSMemQuery
THUMB
// 317 INT8U OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *p_mem_data)
// 318 {
OSMemQuery:
PUSH {R4,R5,LR}
CFI ?RET Frame(CFA, -4)
CFI R5 Frame(CFA, -8)
CFI R4 Frame(CFA, -12)
CFI CFA R13+12
MOVS R4,R0
MOVS R5,R1
// 319 #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
// 320 OS_CPU_SR cpu_sr;
// 321 #endif
// 322
// 323
// 324 #if OS_ARG_CHK_EN > 0
// 325 if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
CMP R4,#+0
BNE ??OSMemQuery_0
// 326 return (OS_MEM_INVALID_PMEM);
MOVS R0,#+116
B ??OSMemQuery_1
// 327 }
// 328 if (p_mem_data == (OS_MEM_DATA *)0) { /* Must release a valid storage area for the data */
??OSMemQuery_0:
CMP R5,#+0
BNE ??OSMemQuery_2
// 329 return (OS_MEM_INVALID_PDATA);
MOVS R0,#+117
B ??OSMemQuery_1
// 330 }
// 331 #endif
// 332 OS_ENTER_CRITICAL();
??OSMemQuery_2:
_BLF OS_CPU_SR_Save,??OS_CPU_SR_Save??rT
// 333 p_mem_data->OSAddr = pmem->OSMemAddr;
LDR R1,[R4, #+0]
STR R1,[R5, #+0]
// 334 p_mem_data->OSFreeList = pmem->OSMemFreeList;
LDR R1,[R4, #+4]
STR R1,[R5, #+4]
// 335 p_mem_data->OSBlkSize = pmem->OSMemBlkSize;
LDR R1,[R4, #+8]
STR R1,[R5, #+8]
// 336 p_mem_data->OSNBlks = pmem->OSMemNBlks;
LDR R1,[R4, #+12]
STR R1,[R5, #+12]
// 337 p_mem_data->OSNFree = pmem->OSMemNFree;
LDR R1,[R4, #+16]
STR R1,[R5, #+16]
// 338 OS_EXIT_CRITICAL();
_BLF OS_CPU_SR_Restore,??OS_CPU_SR_Restore??rT
// 339 p_mem_data->OSNUsed = p_mem_data->OSNBlks - p_mem_data->OSNFree;
LDR R0,[R5, #+12]
LDR R1,[R5, #+16]
SUBS R0,R0,R1
STR R0,[R5, #+20]
// 340 return (OS_NO_ERR);
MOVS R0,#+0
??OSMemQuery_1:
POP {R4,R5}
POP {R1}
BX R1 ;; return
CFI EndBlock cfiBlock11
// 341 }
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock12 Using cfiCommon0
CFI NoFunction
ARM
??OS_MemInit??rA:
ADD R12,PC,#+1
BX R12
CFI EndBlock cfiBlock12
REQUIRE OS_MemInit
// 342 #endif /* OS_MEM_QUERY_EN */
// 343
// 344 /*
// 345 *********************************************************************************************************
// 346 * INITIALIZE MEMORY PARTITION MANAGER
// 347 *
// 348 * Description : This function is called by uC/OS-II to initialize the memory partition manager. Your
// 349 * application MUST NOT call this function.
// 350 *
// 351 * Arguments : none
// 352 *
// 353 * Returns : none
// 354 *
// 355 * Note(s) : This function is INTERNAL to uC/OS-II and your application should not call it.
// 356 *********************************************************************************************************
// 357 */
// 358
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock13 Using cfiCommon1
CFI Function OS_MemInit
THUMB
// 359 void OS_MemInit (void)
// 360 {
OS_MemInit:
PUSH {R4,LR}
CFI ?RET Frame(CFA, -4)
CFI R4 Frame(CFA, -8)
CFI CFA R13+8
// 361 #if OS_MAX_MEM_PART == 1
// 362 OSMemFreeList = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list */
// 363 OS_MemClr((INT8U *)&OSMemTbl[0], sizeof(OSMemTbl)); /* Clear the memory partition table */
// 364 #endif
// 365
// 366 #if OS_MAX_MEM_PART >= 2
// 367 OS_MEM *pmem;
// 368 INT16U i;
// 369
// 370
// 371 OS_MemClr((INT8U *)&OSMemTbl[0], sizeof(OSMemTbl)); /* Clear the memory partition table */
MOVS R1,#+130
LSLS R1,R1,#+1 ;; #+260
LDR R0,??OS_MemInit_0 ;; OSMemTbl
_BLF OS_MemClr,??OS_MemClr??rT
// 372 pmem = (OS_MEM *)&OSMemTbl[0]; /* Point to memory control block (MCB) */
LDR R0,??OS_MemInit_0 ;; OSMemTbl
// 373 for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) { /* Init. list of free memory partitions */
ADDS R1,R0,#+4
LDR R2,??OS_MemInit_0+0x4 ;; OSMemTbl + 52
MOVS R3,#+4
// 374 pmem->OSMemFreeList = (void *)&OSMemTbl[i+1]; /* Chain list of free partitions */
??OS_MemInit_1:
STR R2,[R1, #+0]
// 375 #if OS_MEM_NAME_SIZE > 1
// 376 pmem->OSMemName[0] = '?'; /* Unknown name */
MOVS R4,#+63
STRB R4,[R0, #+20]
// 377 pmem->OSMemName[1] = OS_ASCII_NUL;
MOVS R4,#+0
STRB R4,[R0, #+21]
// 378 #endif
// 379 pmem++;
ADDS R0,R0,#+52
// 380 }
ADDS R2,R2,#+52
ADDS R1,R1,#+52
SUBS R3,R3,#+1
BNE ??OS_MemInit_1
// 381 pmem->OSMemFreeList = (void *)0; /* Initialize last node */
STR R4,[R0, #+4]
// 382 #if OS_MEM_NAME_SIZE > 1
// 383 pmem->OSMemName[0] = '?'; /* Unknown name */
MOVS R1,#+63
STRB R1,[R0, #+20]
// 384 pmem->OSMemName[1] = OS_ASCII_NUL;
STRB R4,[R0, #+21]
// 385 #endif
// 386
// 387 OSMemFreeList = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list */
LDR R0,??DataTable1 ;; OSMemFreeList
LDR R1,??OS_MemInit_0 ;; OSMemTbl
STR R1,[R0, #+0]
// 388 #endif
// 389 }
POP {R4}
POP {R0}
BX R0 ;; return
DATA
??OS_MemInit_0:
DC32 OSMemTbl
DC32 OSMemTbl + 52
CFI EndBlock cfiBlock13
RSEG CODE:CODE:NOROOT(2)
DATA
??DataTable1:
DC32 OSMemFreeList
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock14 Using cfiCommon1
CFI NoFunction
THUMB
??OS_CPU_SR_Save??rT:
LDR R3,??Subroutine7_0 ;; OS_CPU_SR_Save
BX R3
DATA
??Subroutine7_0:
DC32 OS_CPU_SR_Save
CFI EndBlock cfiBlock14
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock15 Using cfiCommon1
CFI NoFunction
THUMB
??OS_CPU_SR_Restore??rT:
LDR R3,??Subroutine8_0 ;; OS_CPU_SR_Restore
BX R3
DATA
??Subroutine8_0:
DC32 OS_CPU_SR_Restore
CFI EndBlock cfiBlock15
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock16 Using cfiCommon1
CFI NoFunction
THUMB
??OS_StrCopy??rT:
LDR R3,??Subroutine9_0 ;; OS_StrCopy
BX R3
DATA
??Subroutine9_0:
DC32 OS_StrCopy
CFI EndBlock cfiBlock16
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock17 Using cfiCommon1
CFI NoFunction
THUMB
??OS_StrLen??rT:
LDR R3,??Subroutine10_0 ;; OS_StrLen
BX R3
DATA
??Subroutine10_0:
DC32 OS_StrLen
CFI EndBlock cfiBlock17
RSEG CODE:CODE:NOROOT(2)
CFI Block cfiBlock18 Using cfiCommon1
CFI NoFunction
THUMB
??OS_MemClr??rT:
LDR R3,??Subroutine11_0 ;; OS_MemClr
BX R3
DATA
??Subroutine11_0:
DC32 OS_MemClr
CFI EndBlock cfiBlock18
END
// 390 #endif /* OS_MEM_EN */
//
// 638 bytes in segment CODE
//
// 542 bytes of CODE memory (+ 96 bytes shared)
//
//Errors: none
//Warnings: none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -