INT8U const OSUnMapTbl[] = { 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x00 to 0x0F */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x10 to 0x1F */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x20 to 0x2F */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x30 to 0x3F */ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x40 to 0x4F */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x50 to 0x5F */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x60 to 0x6F */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x70 to 0x7F */ 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x80 to 0x8F */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x90 to 0x9F */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xA0 to 0xAF */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xB0 to 0xBF */ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xC0 to 0xCF */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xD0 to 0xDF */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0xE0 to 0xEF */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 /* 0xF0 to 0xFF */ }; |
OS_MEM *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err) { #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr; #endif OS_MEM *pmem; INT8U *pblk; void **plink; INT32U i; #if OS_ARG_CHK_EN > 0 if (addr == (void *)0) { /* Must pass a valid address for the memory part. */ *err = OS_MEM_INVALID_ADDR; return ((OS_MEM *)0); } 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); } #endif 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 */ 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 */ *err = OS_NO_ERR; return (pmem); } /*$PAGE*/ |
原帖由 kingink1983 于 2008-9-14 18:22 發(fā)表
作為開源的實時嵌入式OS,uC/OS-II在嵌入式應(yīng)用領(lǐng)域挺多的?墒俏野l(fā)現(xiàn)嵌入式論壇里沒有人提及這個系統(tǒng),不知道有人在學(xué)習(xí)這個沒?如果有,大家可以交流一下l
另外,有個小建議:嵌入式開發(fā)這個版塊能不能根 ...
其中的pblk = (INT8U *)addr + blksize;這個轉(zhuǎn)化,不會造成地址截斷嘛,畢竟addr所占的空間不止一個字節(jié)吧
原帖由 dreamice 于 2008-9-16 14:01 發(fā)表
我簡單說一下關(guān)于這個表的作用及構(gòu)造算法(一次面試中被問到,慚愧沒答出來)。
作用:找出優(yōu)先級最低位為1的位置。大家知道,優(yōu)先級越高,其數(shù)值越小,所以,在這里也即找出優(yōu)先級最高的位置。
算法:
( ...
原帖由 dreamice 于 2008-9-16 14:30 發(fā)表
不知兄弟為何研究這個操作系統(tǒng)?純屬學(xué)習(xí)還是工作項目?如果有不錯的OS基礎(chǔ),這個操作系統(tǒng)兩個月完全可以搞定了,呵呵。我覺得任務(wù)調(diào)度,內(nèi)核一些同步與通信機制,內(nèi)存管理(這個比較弱一些),以及2.8內(nèi)核 ...
原帖由 kingink1983 于 2008-9-16 15:58 發(fā)表
學(xué)習(xí)其原理,掌握實現(xiàn)方法。以備將來用的著。慚愧的說操作系統(tǒng)原理我原來也學(xué)過,不過當(dāng)時就是聽聽一些理論,完全不知所云,學(xué)的時間長了,很多東西原來不但沒消化,現(xiàn)在還望了不少,
現(xiàn)在學(xué)習(xí)ucos主要是學(xué)習(xí) ...
歡迎光臨 Chinaunix (http://www.72891.cn/) | Powered by Discuz! X3.2 |