📄 os_mem.s43
字号:
NAME os_mem(16)
RSEG CODE(1)
PUBLIC OSMemCreate
EXTERN OSMemFreeList
PUBLIC OSMemGet
PUBLIC OSMemPut
PUBLIC OSMemQuery
EXTERN OSMemTbl
PUBLIC OS_MemInit
EXTERN ?CL430_1_26_L08
RSEG CODE
OSMemCreate:
; 1. /*
; 2. *********************************************************************************************************
; 3. * uC/OS-II
; 4. * The Real-Time Kernel
; 5. * MEMORY MANAGEMENT
; 6. *
; 7. * (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
; 8. * All Rights Reserved
; 9. *
; 10. * File : OS_MEM.C
; 11. * By : Jean J. Labrosse
; 12. *********************************************************************************************************
; 13. */
; 14.
; 15. #ifndef OS_MASTER_FILE
; 16. #include "includes.h"
; 17. #endif
; 18.
; 19. #if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
; 20. /*
; 21. *********************************************************************************************************
; 22. * CREATE A MEMORY PARTITION
; 23. *
; 24. * Description : Create a fixed-sized memory partition that will be managed by uC/OS-II.
; 25. *
; 26. * Arguments : addr is the starting address of the memory partition
; 27. *
; 28. * nblks is the number of memory blocks to create from the partition.
; 29. *
; 30. * blksize is the size (in bytes) of each block in the memory partition.
; 31. *
; 32. * err is a pointer to a variable containing an error message which will be set by
; 33. * this function to either:
; 34. *
; 35. * OS_NO_ERR if the memory partition has been created correctly.
; 36. * OS_MEM_INVALID_ADDR you are specifying an invalid address for the memory
; 37. * storage of the partition.
; 38. * OS_MEM_INVALID_PART no free partitions available
; 39. * OS_MEM_INVALID_BLKS user specified an invalid number of blocks (must be >= 2)
; 40. * OS_MEM_INVALID_SIZE user specified an invalid block size
; 41. * (must be greater than the size of a pointer)
; 42. * Returns : != (OS_MEM *)0 is the partition was created
; 43. * == (OS_MEM *)0 if the partition was not created because of invalid arguments or, no
; 44. * free partition is available.
; 45. *********************************************************************************************************
; 46. */
; 47.
; 48. OS_MEM *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err)
; 49. {
PUSH R10
PUSH R11
PUSH R8
PUSH R9
PUSH R6
PUSH R7
PUSH R4
PUSH R5
SUB #6,SP
MOV R12,R10
MOV 24(SP),R8
MOV 26(SP),R9
MOV 28(SP),R11
; 50. #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; 51. OS_CPU_SR cpu_sr;
; 52. #endif
; 53. OS_MEM *pmem;
; 54. INT8U *pblk;
; 55. void **plink;
; 56. INT32U i;
; 57.
; 58.
; 59. #if OS_ARG_CHK_EN > 0
; 60. if (addr == (void *)0) { /* Must pass a valid address for the memory part. */
CMP #0,R10
JNE (?0059)
; 61. *err = OS_MEM_INVALID_ADDR;
MOV.B #118,0(R11)
; 62. return ((OS_MEM *)0);
MOV #0,R12
; 63. }
JMP (?0072)
?0059:
; 64. if (nblks < 2) { /* Must have at least 2 blocks per partition */
MOV R14,R12
MOV R15,R13
SUB #2,R12
SUBC #0,R13
JC (?0061)
; 65. *err = OS_MEM_INVALID_BLKS;
MOV.B #111,0(R11)
; 66. return ((OS_MEM *)0);
MOV #0,R12
; 67. }
JMP (?0072)
?0061:
; 68. if (blksize < sizeof(void *)) { /* Must contain space for at least a pointer */
MOV R8,R12
MOV R9,R13
SUB #2,R12
SUBC #0,R13
JC (?0063)
; 69. *err = OS_MEM_INVALID_SIZE;
MOV.B #112,0(R11)
; 70. return ((OS_MEM *)0);
MOV #0,R12
; 71. }
JMP (?0072)
?0063:
; 72. #endif
; 73. OS_ENTER_CRITICAL();
DINT
; 74. pmem = OSMemFreeList; /* Get next free memory partition */
MOV &OSMemFreeList,R4
; 75. if (OSMemFreeList != (OS_MEM *)0) { /* See if pool of free partitions was empty */
CMP #0,&OSMemFreeList
JEQ (?0065)
; 76. OSMemFreeList = (OS_MEM *)OSMemFreeList->OSMemFreeList;
MOV &OSMemFreeList,R12
MOV 2(R12),&OSMemFreeList
?0065:
; 77. }
; 78. OS_EXIT_CRITICAL();
EINT
; 79. if (pmem == (OS_MEM *)0) { /* See if we have a memory partition */
CMP #0,R4
JNE (?0067)
; 80. *err = OS_MEM_INVALID_PART;
MOV.B #110,0(R11)
; 81. return ((OS_MEM *)0);
MOV #0,R12
; 82. }
JMP (?0072)
?0067:
; 83. plink = (void **)addr; /* Create linked list of free memory blocks */
MOV R10,0(SP)
; 84. pblk = (INT8U *)addr + blksize;
MOV R10,R5
ADD R8,R5
; 85. for (i = 0; i < (nblks - 1); i++) {
MOV #0,2(SP)
MOV #0,4(SP)
?0069:
MOV R14,R6
MOV R15,R7
ADD #65535,R6
ADDC #-1,R7
MOV 2(SP),R12
MOV 4(SP),R13
SUB R6,R12
SUBC R7,R13
MOV @SP,R12
JC (?0068)
; 86. *plink = (void *)pblk;
MOV R5,0(R12)
; 87. plink = (void **)pblk;
MOV R5,0(SP)
; 88. pblk = pblk + blksize;
ADD R8,R5
ADD #1,2(SP)
ADDC #0,4(SP)
JMP (?0069)
?0068:
; 89. }
; 90. *plink = (void *)0; /* Last memory block points to NULL */
MOV #0,0(R12)
; 91. pmem->OSMemAddr = addr; /* Store start address of memory partition */
MOV R10,0(R4)
; 92. pmem->OSMemFreeList = addr; /* Initialize pointer to pool of free blocks */
MOV R10,2(R4)
; 93. pmem->OSMemNFree = nblks; /* Store number of free blocks in MCB */
MOV R14,12(R4)
MOV R15,14(R4)
; 94. pmem->OSMemNBlks = nblks;
MOV R14,8(R4)
MOV R15,10(R4)
; 95. pmem->OSMemBlkSize = blksize; /* Store block size of each memory blocks */
MOV R8,4(R4)
MOV R9,6(R4)
; 96. *err = OS_NO_ERR;
MOV.B #0,0(R11)
; 97. return (pmem);
MOV R4,R12
; 98. }
?0072:
ADD #6,SP
POP R5
POP R4
POP R7
POP R6
POP R9
POP R8
POP R11
POP R10
RET
OSMemGet:
; 99. /*$PAGE*/
; 100. /*
; 101. *********************************************************************************************************
; 102. * GET A MEMORY BLOCK
; 103. *
; 104. * Description : Get a memory block from a partition
; 105. *
; 106. * Arguments : pmem is a pointer to the memory partition control block
; 107. *
; 108. * err is a pointer to a variable containing an error message which will be set by this
; 109. * function to either:
; 110. *
; 111. * OS_NO_ERR if the memory partition has been created correctly.
; 112. * OS_MEM_NO_FREE_BLKS if there are no more free memory blocks to allocate to caller
; 113. * OS_MEM_INVALID_PMEM if you passed a NULL pointer for 'pmem'
; 114. *
; 115. * Returns : A pointer to a memory block if no error is detected
; 116. * A pointer to NULL if an error is detected
; 117. *********************************************************************************************************
; 118. */
; 119.
; 120. void *OSMemGet (OS_MEM *pmem, INT8U *err)
; 121. {
; 122. #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; 123. OS_CPU_SR cpu_sr;
; 124. #endif
; 125. void *pblk;
; 126.
; 127.
; 128. #if OS_ARG_CHK_EN > 0
; 129. if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
CMP #0,R12
JNE (?0074)
; 130. *err = OS_MEM_INVALID_PMEM;
MOV.B #116,0(R14)
; 131. return ((OS_MEM *)0);
; 132. }
RET
?0074:
; 133. #endif
; 134. OS_ENTER_CRITICAL();
DINT
; 135. if (pmem->OSMemNFree > 0) { /* See if there are any free memory blocks */
MOV 12(R12),R13
BIS 14(R12),R13
CMP #0,R13
JEQ (?0076)
; 136. pblk = pmem->OSMemFreeList; /* Yes, point to next free memory block */
MOV 2(R12),R13
; 137. pmem->OSMemFreeList = *(void **)pblk; /* Adjust pointer to new free list */
MOV @R13,2(R12)
; 138. pmem->OSMemNFree--; /* One less memory block in this partition */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -