您的位置:首页 > 其它

uc/OS-II source code remark

2005-11-19 11:09 232 查看
New Page 7

1:

#if OS_Time_DlyHMSM_EN

INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)reentrant

{

INT32U ticks;

INT16U loops;

if (hours > 0 || minutes > 0 || seconds > 0 || milli > 0) {

if (minutes > 59) {

return (OS_TIME_INVALID_MINUTES); /* Validate arguments to be within range */

}

if (seconds > 59) {

return (OS_TIME_INVALID_SECONDS);

}

if (milli > 999) {

return (OS_TIME_INVALID_MILLI);

}

/* Compute the total number of clock ticks required.. */

/* .. (rounded to the nearest tick) */

ticks = ((INT32U)hours * 3600L + (INT32U)minutes * 60L + (INT32U)seconds) * OS_TICKS_PER_SEC

+ OS_TICKS_PER_SEC * ((INT32U)milli + 500L / OS_TICKS_PER_SEC) / 1000L;

loops = ticks / 65536L; /* Compute the integral number of 65536 tick delays */

ticks = ticks % 65536L; /* Obtain the fractional number of ticks */

OSTimeDly(ticks);

while (loops > 0) {

OSTimeDly(32768);

OSTimeDly(32768);

loops--;

}

return (OS_NO_ERR);

} else {

return (OS_TIME_ZERO_DLY);

}

}

#endif

 

2:

OS_MEM *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err)reentrant

{

OS_MEM *pmem;

INT8U *pblk;

void **plink;

INT32U i;

if (nblks < 2) { /* Must have at least 2 blocks per partition */

*err = OS_MEM_INVALID_BLKS;

return ((OS_MEM *)0);

}

if (blksize < sizeof(void *)) { /* Must contain space for at least a pointer */

*err = OS_MEM_INVALID_SIZE;

return ((OS_MEM *)0);

}

OS_ENTER_CRITICAL();

pmem = OSMemFreeList; /* Get next free memory partition */

if (OSMemFreeList != (OS_MEM *)0) { /* See if pool of free partitions was empty */

OSMemFreeList = (OS_MEM *)OSMemFreeList->OSMemFreeList;

}

OS_EXIT_CRITICAL();

if (pmem == (OS_MEM *)0) { /* See if we have a memory partition */

*err = OS_MEM_INVALID_PART;

return ((OS_MEM *)0);

}

plink = (void **)addr; /* Create linked list of free memory blocks */

pblk = (INT8U *)addr + blksize;

for (i = 0; i < (nblks - 1); i++) {

*plink = (void *)pblk;

plink = (void **)pblk;

pblk = pblk + blksize;

}

*plink = (void *)0; /* Last memory block points to NULL */

OS_ENTER_CRITICAL();

pmem->OSMemAddr = addr; /* Store start address of memory partition */

pmem->OSMemFreeList = addr; /* Initialize pointer to pool of free blocks */

pmem->OSMemNFree = nblks; /* Store number of free blocks in MCB */

pmem->OSMemNBlks = nblks;

pmem->OSMemBlkSize = blksize; /* Store block size of each memory blocks */

OS_EXIT_CRITICAL();

*err = OS_NO_ERR;

return (pmem);

}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: