📄 os_mem.s43
字号:
ADD #65535,12(R12)
ADDC #-1,14(R12)
; 139. OS_EXIT_CRITICAL();
EINT
; 140. *err = OS_NO_ERR; /* No error */
MOV.B #0,0(R14)
; 141. return (pblk); /* Return memory block to caller */
MOV R13,R12
; 142. }
RET
?0076:
; 143. OS_EXIT_CRITICAL();
EINT
; 144. *err = OS_MEM_NO_FREE_BLKS; /* No, Notify caller of empty memory partition */
MOV.B #113,0(R14)
; 145. return ((void *)0); /* Return NULL pointer to caller */
MOV #0,R12
; 146. }
RET
OSMemPut:
; 147. /*$PAGE*/
; 148. /*
; 149. *********************************************************************************************************
; 150. * RELEASE A MEMORY BLOCK
; 151. *
; 152. * Description : Returns a memory block to a partition
; 153. *
; 154. * Arguments : pmem is a pointer to the memory partition control block
; 155. *
; 156. * pblk is a pointer to the memory block being released.
; 157. *
; 158. * Returns : OS_NO_ERR if the memory block was inserted into the partition
; 159. * OS_MEM_FULL if you are returning a memory block to an already FULL memory
; 160. * partition (You freed more blocks than you allocated!)
; 161. * OS_MEM_INVALID_PMEM if you passed a NULL pointer for 'pmem'
; 162. * OS_MEM_INVALID_PBLK if you passed a NULL pointer for the block to release.
; 163. *********************************************************************************************************
; 164. */
; 165.
; 166. INT8U OSMemPut (OS_MEM *pmem, void *pblk)
; 167. {
PUSH R10
PUSH R11
; 168. #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; 169. OS_CPU_SR cpu_sr;
; 170. #endif
; 171.
; 172.
; 173. #if OS_ARG_CHK_EN > 0
; 174. if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
CMP #0,R12
JNE (?0079)
; 175. return (OS_MEM_INVALID_PMEM);
MOV.B #116,R12
; 176. }
JMP (?0084)
?0079:
; 177. if (pblk == (void *)0) { /* Must release a valid block */
CMP #0,R14
JNE (?0081)
; 178. return (OS_MEM_INVALID_PBLK);
MOV.B #115,R12
; 179. }
JMP (?0084)
?0081:
; 180. #endif
; 181. OS_ENTER_CRITICAL();
DINT
; 182. if (pmem->OSMemNFree >= pmem->OSMemNBlks) { /* Make sure all blocks not already returned */
MOV 12(R12),R10
MOV 14(R12),R11
SUB 8(R12),R10
SUBC 10(R12),R11
JNC (?0083)
; 183. OS_EXIT_CRITICAL();
EINT
; 184. return (OS_MEM_FULL);
MOV.B #114,R12
; 185. }
JMP (?0084)
?0083:
; 186. *(void **)pblk = pmem->OSMemFreeList; /* Insert released block into free block list */
MOV 2(R12),0(R14)
; 187. pmem->OSMemFreeList = pblk;
MOV R14,2(R12)
; 188. pmem->OSMemNFree++; /* One more memory block in this partition */
ADD #1,12(R12)
ADDC #0,14(R12)
; 189. OS_EXIT_CRITICAL();
EINT
; 190. return (OS_NO_ERR); /* Notify caller that memory block was released */
MOV.B #0,R12
; 191. }
?0084:
POP R11
POP R10
RET
OSMemQuery:
; 192. /*$PAGE*/
; 193. /*
; 194. *********************************************************************************************************
; 195. * QUERY MEMORY PARTITION
; 196. *
; 197. * Description : This function is used to determine the number of free memory blocks and the number of
; 198. * used memory blocks from a memory partition.
; 199. *
; 200. * Arguments : pmem is a pointer to the memory partition control block
; 201. *
; 202. * pdata is a pointer to a structure that will contain information about the memory
; 203. * partition.
; 204. *
; 205. * Returns : OS_NO_ERR If no errors were found.
; 206. * OS_MEM_INVALID_PMEM if you passed a NULL pointer for 'pmem'
; 207. * OS_MEM_INVALID_PDATA if you passed a NULL pointer for the block to release.
; 208. *********************************************************************************************************
; 209. */
; 210.
; 211. #if OS_MEM_QUERY_EN > 0
; 212. INT8U OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *pdata)
; 213. {
; 214. #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; 215. OS_CPU_SR cpu_sr;
; 216. #endif
; 217.
; 218.
; 219. #if OS_ARG_CHK_EN > 0
; 220. if (pmem == (OS_MEM *)0) { /* Must point to a valid memory partition */
CMP #0,R12
JNE (?0086)
; 221. return (OS_MEM_INVALID_PMEM);
MOV.B #116,R12
; 222. }
RET
?0086:
; 223. if (pdata == (OS_MEM_DATA *)0) { /* Must release a valid storage area for the data */
CMP #0,R14
JNE (?0088)
; 224. return (OS_MEM_INVALID_PDATA);
MOV.B #117,R12
; 225. }
RET
?0088:
; 226. #endif
; 227. OS_ENTER_CRITICAL();
DINT
; 228. pdata->OSAddr = pmem->OSMemAddr;
MOV @R12,0(R14)
; 229. pdata->OSFreeList = pmem->OSMemFreeList;
MOV 2(R12),2(R14)
; 230. pdata->OSBlkSize = pmem->OSMemBlkSize;
MOV 4(R12),4(R14)
MOV 6(R12),6(R14)
; 231. pdata->OSNBlks = pmem->OSMemNBlks;
MOV 8(R12),8(R14)
MOV 10(R12),10(R14)
; 232. pdata->OSNFree = pmem->OSMemNFree;
MOV 12(R12),12(R14)
MOV 14(R12),14(R14)
; 233. OS_EXIT_CRITICAL();
EINT
; 234. pdata->OSNUsed = pdata->OSNBlks - pdata->OSNFree;
MOV 8(R14),R12
MOV 10(R14),R13
SUB 12(R14),R12
SUBC 14(R14),R13
MOV R12,16(R14)
MOV R13,18(R14)
; 235. return (OS_NO_ERR);
MOV.B #0,R12
; 236. }
RET
OS_MemInit:
; 237. #endif /* OS_MEM_QUERY_EN */
; 238. /*$PAGE*/
; 239. /*
; 240. *********************************************************************************************************
; 241. * INITIALIZE MEMORY PARTITION MANAGER
; 242. *
; 243. * Description : This function is called by uC/OS-II to initialize the memory partition manager. Your
; 244. * application MUST NOT call this function.
; 245. *
; 246. * Arguments : none
; 247. *
; 248. * Returns : none
; 249. *
; 250. * Note(s) : This function is INTERNAL to uC/OS-II and your application should not call it.
; 251. *********************************************************************************************************
; 252. */
; 253.
; 254. void OS_MemInit (void)
; 255. {
; 256. #if OS_MAX_MEM_PART == 1
; 257. OSMemFreeList = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list */
; 258. OSMemFreeList->OSMemFreeList = (void *)0; /* Initialize last node */
; 259. OSMemFreeList->OSMemAddr = (void *)0; /* Store start address of memory partition */
; 260. OSMemFreeList->OSMemNFree = 0; /* No free blocks */
; 261. OSMemFreeList->OSMemNBlks = 0; /* No blocks */
; 262. OSMemFreeList->OSMemBlkSize = 0; /* Zero size */
; 263. #endif
; 264.
; 265. #if OS_MAX_MEM_PART >= 2
; 266. OS_MEM *pmem;
; 267. INT16U i;
; 268.
; 269.
; 270. pmem = (OS_MEM *)&OSMemTbl[0]; /* Point to memory control block (MCB) */
MOV #OSMemTbl,R13
; 271. for (i = 0; i < (OS_MAX_MEM_PART - 1); i++) { /* Init. list of free memory partitions */
MOV #0,R12
?0091:
CMP #4,R12
JC (?0090)
; 272. pmem->OSMemFreeList = (void *)&OSMemTbl[i+1]; /* Chain list of free partitions */
MOV R12,R14
ADD R14,R14
ADD R14,R14
ADD R14,R14
ADD R14,R14
ADD #(OSMemTbl+16),R14
MOV R14,2(R13)
; 273. pmem->OSMemAddr = (void *)0; /* Store start address of memory partition */
MOV #0,0(R13)
; 274. pmem->OSMemNFree = 0; /* No free blocks */
MOV #0,12(R13)
MOV #0,14(R13)
; 275. pmem->OSMemNBlks = 0; /* No blocks */
MOV #0,8(R13)
MOV #0,10(R13)
; 276. pmem->OSMemBlkSize = 0; /* Zero size */
MOV #0,4(R13)
MOV #0,6(R13)
; 277. pmem++;
ADD #16,R13
ADD #1,R12
JMP (?0091)
?0090:
; 278. }
; 279. pmem->OSMemFreeList = (void *)0; /* Initialize last node */
MOV #0,2(R13)
; 280. pmem->OSMemAddr = (void *)0; /* Store start address of memory partition */
MOV #0,0(R13)
; 281. pmem->OSMemNFree = 0; /* No free blocks */
MOV #0,12(R13)
MOV #0,14(R13)
; 282. pmem->OSMemNBlks = 0; /* No blocks */
MOV #0,8(R13)
MOV #0,10(R13)
; 283. pmem->OSMemBlkSize = 0; /* Zero size */
MOV #0,4(R13)
MOV #0,6(R13)
; 284.
; 285. OSMemFreeList = (OS_MEM *)&OSMemTbl[0]; /* Point to beginning of free list */
MOV #OSMemTbl,&OSMemFreeList
; 286. #endif
; 287. }
RET
; 288. #endif /* OS_MEM_EN */
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -