123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456 |
- #ifndef OS_MASTER_FILE
- #include <ucos_ii.h>
- #endif
- #if (OS_MEM_EN > 0u) && (OS_MAX_MEM_PART > 0u)
- OS_MEM *OSMemCreate (void *addr,
- INT32U nblks,
- INT32U blksize,
- INT8U *perr)
- {
- OS_MEM *pmem;
- INT8U *pblk;
- void **plink;
- INT32U loops;
- INT32U i;
- #if OS_CRITICAL_METHOD == 3u
- OS_CPU_SR cpu_sr = 0u;
- #endif
- #ifdef OS_SAFETY_CRITICAL
- if (perr == (INT8U *)0) {
- OS_SAFETY_CRITICAL_EXCEPTION();
- }
- #endif
- #ifdef OS_SAFETY_CRITICAL_IEC61508
- if (OSSafetyCriticalStartFlag == OS_TRUE) {
- OS_SAFETY_CRITICAL_EXCEPTION();
- }
- #endif
- #if OS_ARG_CHK_EN > 0u
- if (addr == (void *)0) {
- *perr = OS_ERR_MEM_INVALID_ADDR;
- return ((OS_MEM *)0);
- }
- if (((INT32U)addr & (sizeof(void *) - 1u)) != 0u){
- *perr = OS_ERR_MEM_INVALID_ADDR;
- return ((OS_MEM *)0);
- }
- if (nblks < 2u) {
- *perr = OS_ERR_MEM_INVALID_BLKS;
- return ((OS_MEM *)0);
- }
- if (blksize < sizeof(void *)) {
- *perr = OS_ERR_MEM_INVALID_SIZE;
- return ((OS_MEM *)0);
- }
- #endif
- OS_ENTER_CRITICAL();
- pmem = OSMemFreeList;
- if (OSMemFreeList != (OS_MEM *)0) {
- OSMemFreeList = (OS_MEM *)OSMemFreeList->OSMemFreeList;
- }
- OS_EXIT_CRITICAL();
- if (pmem == (OS_MEM *)0) {
- *perr = OS_ERR_MEM_INVALID_PART;
- return ((OS_MEM *)0);
- }
- plink = (void **)addr;
- pblk = (INT8U *)addr;
- loops = nblks - 1u;
- for (i = 0u; i < loops; i++) {
- pblk += blksize;
- *plink = (void *)pblk;
- plink = (void **)pblk;
- }
- *plink = (void *)0;
- pmem->OSMemAddr = addr;
- pmem->OSMemFreeList = addr;
- pmem->OSMemNFree = nblks;
- pmem->OSMemNBlks = nblks;
- pmem->OSMemBlkSize = blksize;
- *perr = OS_ERR_NONE;
- return (pmem);
- }
- void *OSMemGet (OS_MEM *pmem,
- INT8U *perr)
- {
- void *pblk;
- #if OS_CRITICAL_METHOD == 3u
- OS_CPU_SR cpu_sr = 0u;
- #endif
- #ifdef OS_SAFETY_CRITICAL
- if (perr == (INT8U *)0) {
- OS_SAFETY_CRITICAL_EXCEPTION();
- }
- #endif
- #if OS_ARG_CHK_EN > 0u
- if (pmem == (OS_MEM *)0) {
- *perr = OS_ERR_MEM_INVALID_PMEM;
- return ((void *)0);
- }
- #endif
- OS_ENTER_CRITICAL();
- if (pmem->OSMemNFree > 0u) {
- pblk = pmem->OSMemFreeList;
- pmem->OSMemFreeList = *(void **)pblk;
- pmem->OSMemNFree--;
- OS_EXIT_CRITICAL();
- *perr = OS_ERR_NONE;
- return (pblk);
- }
- OS_EXIT_CRITICAL();
- *perr = OS_ERR_MEM_NO_FREE_BLKS;
- return ((void *)0);
- }
- #if OS_MEM_NAME_EN > 0u
- INT8U OSMemNameGet (OS_MEM *pmem,
- INT8U **pname,
- INT8U *perr)
- {
- INT8U len;
- #if OS_CRITICAL_METHOD == 3u
- OS_CPU_SR cpu_sr = 0u;
- #endif
- #ifdef OS_SAFETY_CRITICAL
- if (perr == (INT8U *)0) {
- OS_SAFETY_CRITICAL_EXCEPTION();
- }
- #endif
- #if OS_ARG_CHK_EN > 0u
- if (pmem == (OS_MEM *)0) {
- *perr = OS_ERR_MEM_INVALID_PMEM;
- return (0u);
- }
- if (pname == (INT8U **)0) {
- *perr = OS_ERR_PNAME_NULL;
- return (0u);
- }
- #endif
- if (OSIntNesting > 0u) {
- *perr = OS_ERR_NAME_GET_ISR;
- return (0u);
- }
- OS_ENTER_CRITICAL();
- *pname = pmem->OSMemName;
- len = OS_StrLen(*pname);
- OS_EXIT_CRITICAL();
- *perr = OS_ERR_NONE;
- return (len);
- }
- #endif
- #if OS_MEM_NAME_EN > 0u
- void OSMemNameSet (OS_MEM *pmem,
- INT8U *pname,
- INT8U *perr)
- {
- #if OS_CRITICAL_METHOD == 3u
- OS_CPU_SR cpu_sr = 0u;
- #endif
- #ifdef OS_SAFETY_CRITICAL
- if (perr == (INT8U *)0) {
- OS_SAFETY_CRITICAL_EXCEPTION();
- }
- #endif
- #if OS_ARG_CHK_EN > 0u
- if (pmem == (OS_MEM *)0) {
- *perr = OS_ERR_MEM_INVALID_PMEM;
- return;
- }
- if (pname == (INT8U *)0) {
- *perr = OS_ERR_PNAME_NULL;
- return;
- }
- #endif
- if (OSIntNesting > 0u) {
- *perr = OS_ERR_NAME_SET_ISR;
- return;
- }
- OS_ENTER_CRITICAL();
- pmem->OSMemName = pname;
- OS_EXIT_CRITICAL();
- *perr = OS_ERR_NONE;
- }
- #endif
- INT8U OSMemPut (OS_MEM *pmem,
- void *pblk)
- {
- #if OS_CRITICAL_METHOD == 3u
- OS_CPU_SR cpu_sr = 0u;
- #endif
- #if OS_ARG_CHK_EN > 0u
- if (pmem == (OS_MEM *)0) {
- return (OS_ERR_MEM_INVALID_PMEM);
- }
- if (pblk == (void *)0) {
- return (OS_ERR_MEM_INVALID_PBLK);
- }
- #endif
- OS_ENTER_CRITICAL();
- if (pmem->OSMemNFree >= pmem->OSMemNBlks) {
- OS_EXIT_CRITICAL();
- return (OS_ERR_MEM_FULL);
- }
- *(void **)pblk = pmem->OSMemFreeList;
- pmem->OSMemFreeList = pblk;
- pmem->OSMemNFree++;
- OS_EXIT_CRITICAL();
- return (OS_ERR_NONE);
- }
- #if OS_MEM_QUERY_EN > 0u
- INT8U OSMemQuery (OS_MEM *pmem,
- OS_MEM_DATA *p_mem_data)
- {
- #if OS_CRITICAL_METHOD == 3u
- OS_CPU_SR cpu_sr = 0u;
- #endif
- #if OS_ARG_CHK_EN > 0u
- if (pmem == (OS_MEM *)0) {
- return (OS_ERR_MEM_INVALID_PMEM);
- }
- if (p_mem_data == (OS_MEM_DATA *)0) {
- return (OS_ERR_MEM_INVALID_PDATA);
- }
- #endif
- OS_ENTER_CRITICAL();
- p_mem_data->OSAddr = pmem->OSMemAddr;
- p_mem_data->OSFreeList = pmem->OSMemFreeList;
- p_mem_data->OSBlkSize = pmem->OSMemBlkSize;
- p_mem_data->OSNBlks = pmem->OSMemNBlks;
- p_mem_data->OSNFree = pmem->OSMemNFree;
- OS_EXIT_CRITICAL();
- p_mem_data->OSNUsed = p_mem_data->OSNBlks - p_mem_data->OSNFree;
- return (OS_ERR_NONE);
- }
- #endif
- void OS_MemInit (void)
- {
- #if OS_MAX_MEM_PART == 1u
- OS_MemClr((INT8U *)&OSMemTbl[0], sizeof(OSMemTbl));
- OSMemFreeList = (OS_MEM *)&OSMemTbl[0];
- #if OS_MEM_NAME_EN > 0u
- OSMemFreeList->OSMemName = (INT8U *)"?";
- #endif
- #endif
- #if OS_MAX_MEM_PART >= 2u
- OS_MEM *pmem;
- INT16U i;
- OS_MemClr((INT8U *)&OSMemTbl[0], sizeof(OSMemTbl));
- for (i = 0u; i < (OS_MAX_MEM_PART - 1u); i++) {
- pmem = &OSMemTbl[i];
- pmem->OSMemFreeList = (void *)&OSMemTbl[i + 1u];
- #if OS_MEM_NAME_EN > 0u
- pmem->OSMemName = (INT8U *)(void *)"?";
- #endif
- }
- pmem = &OSMemTbl[i];
- pmem->OSMemFreeList = (void *)0;
- #if OS_MEM_NAME_EN > 0u
- pmem->OSMemName = (INT8U *)(void *)"?";
- #endif
- OSMemFreeList = &OSMemTbl[0];
- #endif
- }
- #endif
-
|