版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第7章7.6 內(nèi)存管理.1 內(nèi)存控制塊.2 建立一個(gè)內(nèi)存分區(qū),OSMEMCREATE().3 分配一個(gè)內(nèi)存塊,OSMEMGET().5 釋放一個(gè)內(nèi)存塊,OSMEMPUT().6 查詢一個(gè)內(nèi)存分區(qū)的狀態(tài),OSMEMQUERY().7 USING MEMORY PARTITIONS.8 等待一個(gè)內(nèi)存塊.10I內(nèi)存管理我們知道,在ANSI C中可以用malloc()和free()兩個(gè)函數(shù)動(dòng)態(tài)地分配內(nèi)存和釋放內(nèi)存。但是,在嵌入式實(shí)時(shí)操作系統(tǒng)中,多次這樣做會(huì)把原來很大的一塊連續(xù)內(nèi)存區(qū)域,逐漸地分割成許多非常小而且彼此又不相鄰的內(nèi)存區(qū)域,也就是內(nèi)存碎片。由于這些碎片的大量存在,使得程序到后來連非常小的內(nèi)存
2、也分配不到。在4.02節(jié)的任務(wù)堆棧中,我們講到過用malloc()函數(shù)來分配堆棧時(shí),曾經(jīng)討論過內(nèi)存碎片的問題。另外,由于內(nèi)存管理算法的原因,malloc()和free()函數(shù)執(zhí)行時(shí)間是不確定的。在µC/OS-II中,操作系統(tǒng)把連續(xù)的大塊內(nèi)存按分區(qū)來管理。每個(gè)分區(qū)中包含有整數(shù)個(gè)大小相同的內(nèi)存塊,如同圖F7.1。利用這種機(jī)制,µC/OS-II 對malloc()和free()函數(shù)進(jìn)行了改進(jìn),使得它們可以分配和釋放固定大小的內(nèi)存塊。這樣一來,malloc()和free()函數(shù)的執(zhí)行時(shí)間也是固定的了。如圖 F7.2,在一個(gè)系統(tǒng)中可以有多個(gè)內(nèi)存分區(qū)。這樣,用戶的應(yīng)用程序就可以從不同的
3、內(nèi)存分區(qū)中得到不同大小的內(nèi)存塊。但是,特定的內(nèi)存塊在釋放時(shí)必須重新放回它以前所屬于的內(nèi)存分區(qū)。顯然,采用這樣的內(nèi)存管理算法,上面的內(nèi)存碎片問題就得到了解決。7-1內(nèi)存控制塊為了便于內(nèi)存的管理,在µC/OS-II中使用內(nèi)存控制塊(memory control blocks)的數(shù)據(jù)結(jié)構(gòu)來跟蹤每一個(gè)內(nèi)存分區(qū),系統(tǒng)中的每個(gè)內(nèi)存分區(qū)都有它自己的內(nèi)存控制塊。程序清單L7.1是內(nèi)存控制塊的定義。程序清單 L7.1 內(nèi)存控制塊的數(shù)據(jù)結(jié)構(gòu)typedef struct void *OSMemAddr;void *OSMemFreeList;INT32U OSMemBlkSize;INT32U OSMem
4、NBlks;INT32U OSMemNFree; OS_MEM;.OSMemAddr是指向內(nèi)存分區(qū)起始地址的指針。它在建立內(nèi)存分區(qū)見7.1節(jié),建立一個(gè)內(nèi)存分區(qū),OSMemCreate()時(shí)被初始化,在此之后就不能更改了。.OSMemFreeList是指向下一個(gè)空閑內(nèi)存控制塊或者下一個(gè)空閑的內(nèi)存塊的指針,具體含義要根據(jù)該內(nèi)存分區(qū)是否已經(jīng)建立來決定見7.1節(jié)。.OSMemBlkSize是內(nèi)存分區(qū)中內(nèi)存塊的大小,是用戶建立該內(nèi)存分區(qū)時(shí)指定的見7.1節(jié)。 .OSMemNBlks是內(nèi)存分區(qū)中總的內(nèi)存塊數(shù)量,也是用戶建立該內(nèi)存分區(qū)時(shí)指定的見7.1節(jié)。 .OSMemNFree是內(nèi)存分區(qū)中當(dāng)前可以得空閑內(nèi)存塊
5、數(shù)量。如果要在µC/OS-II中使用內(nèi)存管理,需要在OS_CFG.H文件中將開關(guān)量OS_MEM_EN設(shè)置為1。這樣µC/OS-II 在啟動(dòng)時(shí)就會(huì)對內(nèi)存管理器進(jìn)行初始化由OSInit()調(diào)用OSMemInit()實(shí)現(xiàn)。該初始化主要建立一個(gè)圖 F7.3所示的內(nèi)存控制塊鏈表,其中的常數(shù)OS_MAX_MEM_PART(見文件OS_CFG.H)定義了最大的內(nèi)存分區(qū)數(shù),該常數(shù)值至少應(yīng)為2。7-2建立一個(gè)內(nèi)存分區(qū),OSMemCreate()在使用一個(gè)內(nèi)存分區(qū)之前,必須先建立該內(nèi)存分區(qū)。這個(gè)操作可以通過調(diào)用OSMemCreate()函數(shù)來完成。程序清單 L7.2說明了如何建立一個(gè)含有100
6、個(gè)內(nèi)存塊、每個(gè)內(nèi)存塊32字節(jié)的內(nèi)存分區(qū)。程序清單 L7.2 建立一個(gè)內(nèi)存分區(qū)OS_MEM *CommTxBuf;INT8U CommTxPart10032;void main (void)INT8U err;OSInit();.CommTxBuf = OSMemCreate(CommTxPart, 100, 32, &err);.OSStart();程序清單 L7.3是OSMemCreate()函數(shù)的源代碼。該函數(shù)共有4個(gè)參數(shù):內(nèi)存分區(qū)的起始地址、分區(qū)內(nèi)的內(nèi)存塊總塊數(shù)、每個(gè)內(nèi)存塊的字節(jié)數(shù)和一個(gè)指向錯(cuò)誤信息代碼的指針。如果OSMemCreate()操作失敗,它將返回一個(gè)NULL指針。否則
7、,它將返回一個(gè)指向內(nèi)存控制塊的指針。對內(nèi)存管理的其它操作,象OSMemGet(),OSMemPut(),OSMemQuery()函數(shù)等,都要通過該指針進(jìn)行。7-3每個(gè)內(nèi)存分區(qū)必須含有至少兩個(gè)內(nèi)存塊L7.3(1),每個(gè)內(nèi)存塊至少為一個(gè)指針的大小,因?yàn)橥环謪^(qū)中的所有空閑內(nèi)存塊是由指針串聯(lián)起來的L7.3(2)。接著,OSMemCreate()從系統(tǒng)中的空閑內(nèi)存控制塊中取得一個(gè)內(nèi)存控制塊L7.3(3),該內(nèi)存控制塊包含相應(yīng)內(nèi)存分區(qū)的運(yùn)行信息。OSMemCreate()必須在有空閑內(nèi)存控制塊可用的情況下才能建立一個(gè)內(nèi)存分區(qū)L7.3(4)。在上述條件均得到滿足時(shí),所要建立的內(nèi)存分區(qū)內(nèi)的所有內(nèi)存塊被鏈接成
8、一個(gè)單向的鏈表L7.3(5)。然后,在對應(yīng)的內(nèi)存控制塊中填寫相應(yīng)的信息L7.3(6)。完成上述各動(dòng)作后,OSMemCreate()返回指向該內(nèi)存塊的指針。該指針在以后對內(nèi)存塊的操作中使用L7.3(6)。程序清單 L7.3 OSMemCreate()OS_MEM *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err) OS_MEM *pmem;INT8U *pblk;void *plink;INT32U i;if (nblks < 2) (1) *err = OS_MEM_INVALID_BLKS;return
9、 (OS_MEM *)0);if (blksize < sizeof(void *) *err = OS_MEM_INVALID_SIZE;return (OS_MEM *)0);OS_ENTER_CRITICAL();pmem = OSMemFreeList; (3) if (OSMemFreeList != (OS_MEM *)0) OSMemFreeList = (OS_MEM *)OSMemFreeList->OSMemFreeList;OS_EXIT_CRITICAL();if (pmem = (OS_MEM *)0) return (OS_MEM *)0);plink
10、= (void *)addr; (5) pblk = (INT8U *)addr + blksize;for (i = 0; i < (nblks - 1); i+) *plink = (void *)pblk;plink = (void *)pblk; (4) *err = OS_MEM_INVALID_PART; (2)7-4pblk = pblk + blksize;*plink = (void *)0;OS_ENTER_CRITICAL();pmem->OSMemAddr = addr;pmem->OSMemFreeList = addr;pmem->OSMem
11、NFree = nblks;pmem->OSMemNBlks = nblks;pmem->OSMemBlkSize = blksize;OS_EXIT_CRITICAL();*err = OS_NO_ERR;return (pmem);圖 F7.4是OSMemCreate()函數(shù)完成后,內(nèi)存控制塊及對應(yīng)的內(nèi)存分區(qū)和分區(qū)內(nèi)的內(nèi)存塊之間的關(guān)系。在程序運(yùn)行期間,經(jīng)過多次的內(nèi)存分配和釋放后,同一分區(qū)內(nèi)的各內(nèi)存塊之間的鏈接順序會(huì)發(fā)生很大的變化。 (7) (6)分配一個(gè)內(nèi)存塊,OSMemGet()應(yīng)用程序可以調(diào)用OSMemGet()函數(shù)從已經(jīng)建立的內(nèi)存分區(qū)中申請一個(gè)內(nèi)存塊。該函數(shù)的唯一參數(shù)是指
12、向特定內(nèi)存分區(qū)的指針,該指針在建立內(nèi)存分區(qū)時(shí),由OSMemCreate()函數(shù)返回。顯然,應(yīng)用程序必須知道內(nèi)存塊的大小,并且在使用時(shí)不能超過該容量。例如,如果一個(gè)內(nèi)存分區(qū)內(nèi)的內(nèi)存塊為32字節(jié),那么,應(yīng)用程序最多只能使用該內(nèi)存塊中的32字節(jié)。當(dāng)應(yīng)用程序不再使用這個(gè)內(nèi)存塊后,必須及時(shí)把它釋放,重新放入相應(yīng)的內(nèi)存分區(qū)中見7.03節(jié),釋放一個(gè)內(nèi)存塊,OSMemPut()。7-5程序清單 L7.4是OSMemGet()函數(shù)的源代碼。參數(shù)中的指針pmem指向用戶希望從其中分配內(nèi)存塊的內(nèi)存分區(qū)L7.4(1)。OSMemGet()首先檢查內(nèi)存分區(qū)中是否有空閑的內(nèi)存塊L7.4(2)。如果有,從空閑內(nèi)存塊鏈表中刪
13、除第一個(gè)內(nèi)存塊L7.4(3),并對空閑內(nèi)存塊鏈表作相應(yīng)的修改 L7.4(4)。這包括將鏈表頭指針后移一個(gè)元素和空閑內(nèi)存塊數(shù)減1L7.4(5)。最后,返回指向被分配內(nèi)存塊的指針L7.4(6)。程序清單 L7.4 OSMemGet()void *OSMemGet (OS_MEM *pmem, INT8U *err)void *pblk;OS_ENTER_CRITICAL();if (pmem->OSMemNFree > 0) (2)(3)(4) pblk = pmem->OSMemFreeList; pmem->OSMemFreeList = *(void *)pblk;p
14、mem->OSMemNFree-;OS_EXIT_CRITICAL();*err = OS_NO_ERR;return (pblk); else OS_EXIT_CRITICAL();*err = OS_MEM_NO_FREE_BLKS;return (void *)0);值得注意的是,用戶可以在中斷服務(wù)子程序中調(diào)用OSMemGet(),因?yàn)樵跁簳r(shí)沒有內(nèi)存塊可用的情況下,OSMemGet()不會(huì)等待,而是馬上返回NULL指針。(6) (1) (5)釋放一個(gè)內(nèi)存塊,OSMemPut()當(dāng)用戶應(yīng)用程序不再使用一個(gè)內(nèi)存塊時(shí),必須及時(shí)地把它釋放并放回到相應(yīng)的內(nèi)存分區(qū)中。這個(gè)操作由OSMemPut
15、()函數(shù)完成。必須注意的是,OSMemPut()并不知道一個(gè)內(nèi)存塊是屬于哪個(gè)內(nèi)存分區(qū)的。例如,用戶任務(wù)從一個(gè)包含32字節(jié)內(nèi)存塊的分區(qū)中分配了一個(gè)內(nèi)存塊,用完后,把它返還給了一個(gè)包含120字節(jié)內(nèi)存塊的內(nèi)存分區(qū)。當(dāng)用戶應(yīng)用程序下一次申請120字節(jié)分區(qū)中的一個(gè)內(nèi)存塊時(shí),它會(huì)只得到32字節(jié)的可用空間,其它88字節(jié)屬于其它的任務(wù),這就有可能使系統(tǒng)崩潰。程序清單 L7.5是OSMemPut()函數(shù)的源代碼。它的第一個(gè)參數(shù)pmem是指向內(nèi)存控制塊的指針,也即內(nèi)存塊屬于的內(nèi)存分區(qū)L7.5(1)。OSMemPut()首先檢查內(nèi)存分區(qū)是否已滿L7.5(2)。如果已滿,說明系統(tǒng)在分配和釋放內(nèi)存時(shí)出現(xiàn)了錯(cuò)誤。如果未滿
16、,要釋放的內(nèi)存7-6塊被插入到該分區(qū)的空閑內(nèi)存塊鏈表中L7.5(3)。最后,將分區(qū)中空閑內(nèi)存塊總數(shù)加1L7.5(4)。程序清單 L7.5 OSMemPut()INT8U OSMemPut (OS_MEM *pmem, void *pblk)OS_ENTER_CRITICAL();if (pmem->OSMemNFree >= pmem->OSMemNBlks) OS_EXIT_CRITICAL();return (OS_MEM_FULL);*(void *)pblk = pmem->OSMemFreeList;pmem->OSMemFreeList = pblk;
17、pmem->OSMemNFree+;OS_EXIT_CRITICAL();return (OS_NO_ERR);查詢一個(gè)內(nèi)存分區(qū)的狀態(tài),OSMemQuery() (4) (3) (2) (1)在µC/OS-II 中,可以使用OSMemQuery()函數(shù)來查詢一個(gè)特定內(nèi)存分區(qū)的有關(guān)消息。通過該函數(shù)可以知道特定內(nèi)存分區(qū)中內(nèi)存塊的大小、可用內(nèi)存塊數(shù)和正在使用的內(nèi)存塊數(shù)等信息。所有這些信息都放在一個(gè)叫OS_MEM_DATA的數(shù)據(jù)結(jié)構(gòu)中,如程序清單 L7.6。程序清單 L7.6 OS_MEM_DATA數(shù)據(jù)結(jié)構(gòu)typedef struct void *OSAddr; /* 指向內(nèi)存分區(qū)首地
18、址的指針 */void *OSFreeList; /* 指向空閑內(nèi)存塊鏈表首地址的指針 */INT32U OSBlkSize; /* 每個(gè)內(nèi)存塊所含的字節(jié)數(shù) */INT32U OSNBlks; /* 內(nèi)存分區(qū)總的內(nèi)存塊數(shù) */INT32U OSNFree; /* 空閑內(nèi)存塊總數(shù) */INT32U OSNUsed; /* 正在使用的內(nèi)存塊總數(shù) */ OS_MEM_DATA;程序清單 L7.7是OSMemQuery()函數(shù)的源代碼,它將指定內(nèi)存分區(qū)的信息復(fù)制到OS_MEM_DATA定義的變量的對應(yīng)域中。在此之前,代碼首先禁止了外部中斷,防止復(fù)制過程中某些變量值被修改L7.7(1)。由于正在使用的內(nèi)
19、存塊數(shù)是由OS_MEM_DATA中的局部變量計(jì)算得到的,所以,可以放在(critical section中斷屏蔽)的外面。程序清單 L7.7 OSMemQuery()INT8U OSMemQuery (OS_MEM *pmem, OS_MEM_DATA *pdata)7-7OS_ENTER_CRITICAL();pdata->OSAddr = pmem->OSMemAddr;pdata->OSFreeList = pmem->OSMemFreeList;pdata->OSBlkSize = pmem->OSMemBlkSize;pdata->OSNBl
20、ks = pmem->OSMemNBlks;pdata->OSNFree = pmem->OSMemNFree;OS_EXIT_CRITICAL();pdata->OSNUsed = pdata->OSNBlks - pdata->OSNFree;return (OS_NO_ERR);(2) (1)Using Memory Partitions圖 F7.5是一個(gè)演示如何使用µC/OS-II中的動(dòng)態(tài)分配內(nèi)存功能,以及利用它進(jìn)行消息傳遞見第6章的例子。程序清單 L7.8是這個(gè)例子中兩個(gè)任務(wù)的示意代碼,其中一些重要代碼的標(biāo)號(hào)和圖 F7.5中括號(hào)內(nèi)用數(shù)字標(biāo)
21、識(shí)的動(dòng)作是相對應(yīng)的。第一個(gè)任務(wù)讀取并檢查模擬輸入量的值(如氣壓、溫度、電壓等),如果其超過了一定的閾值,就向第二個(gè)任務(wù)發(fā)送一個(gè)消息。該消息中含有時(shí)間信息、出錯(cuò)的通道號(hào)和錯(cuò)誤代碼等可以想象的任何可能的信息。錯(cuò)誤處理程序是該例子的中心。任何任務(wù)、中斷服務(wù)子程序都可以向該任務(wù)發(fā)送出錯(cuò)消息。錯(cuò)誤處理程序則負(fù)責(zé)在顯示設(shè)備上顯示出錯(cuò)信息,在磁盤上登記出錯(cuò)記錄,或者啟動(dòng)另一個(gè)任務(wù)對錯(cuò)誤進(jìn)行糾正等。7-8程序清單 L7.8 內(nèi)存分配的例子掃描模擬量的輸入和報(bào)告出錯(cuò)AnalogInputTask()for (;) for (所有的模擬量都有輸入) 讀入模擬量輸入值; (1) if (模擬量超過閾值) 得到一個(gè)內(nèi)
22、存塊; (2) 得到當(dāng)前系統(tǒng)時(shí)間 (以時(shí)鐘節(jié)拍為單位);將下列各項(xiàng)存入內(nèi)存塊:系統(tǒng)時(shí)間 (時(shí)間戳);超過閾值的通道號(hào);錯(cuò)誤代碼;錯(cuò)誤等級(jí);等.向錯(cuò)誤隊(duì)列發(fā)送錯(cuò)誤消息; (5) (3) (4)7-9(一個(gè)指向包含上述各項(xiàng)的內(nèi)存塊的指針)延時(shí)任務(wù),直到要再次對模擬量進(jìn)行采樣時(shí)為止;ErrorHandlerTask()for (;) 等待錯(cuò)誤隊(duì)列的消息; (6)(7)(8) (得到指向包含有關(guān)錯(cuò)誤數(shù)據(jù)的內(nèi)存塊的指針) 讀入消息,并根據(jù)消息的內(nèi)容執(zhí)行相應(yīng)的操作; 將內(nèi)存塊放回到相應(yīng)的內(nèi)存分區(qū)中;等待一個(gè)內(nèi)存塊有時(shí)候,在內(nèi)存分區(qū)暫時(shí)沒有可用的空閑內(nèi)存塊的情況下,讓一個(gè)申請內(nèi)存塊的任務(wù)等待也是有用的。但是
23、,µC/OS-II本身在內(nèi)存管理上并不支持這項(xiàng)功能。如果確實(shí)需要,則可以通過為特定內(nèi)存分區(qū)增加信號(hào)量的方法,實(shí)現(xiàn)這種功能(見6.05節(jié),信號(hào)量)。應(yīng)用程序?yàn)榱松暾埛峙鋬?nèi)存塊,首先要得到一個(gè)相應(yīng)的信號(hào)量,然后才能調(diào)用OSMemGet()函數(shù)。整個(gè)過程見程序清單 L7.9。程序代碼首先定義了程序中使用到的各個(gè)變量L7.9(1)。該例中,直接使用數(shù)字定義了各個(gè)變量的大小,實(shí)際應(yīng)用中,建議將這些數(shù)字定義成常數(shù)。在系統(tǒng)復(fù)位時(shí),µC/OS-II調(diào)用OSInit()進(jìn)行系統(tǒng)初始化L7.9(2),然后用內(nèi)存分區(qū)中總的內(nèi)存塊數(shù)來初始化一個(gè)信號(hào)量L7.9(3),緊接著建立內(nèi)存分區(qū)L7.9(4)和相應(yīng)的要訪問該分區(qū)的任務(wù)L7.9(5)。當(dāng)然,到此為止,我們對如何增加其它的任務(wù)也已經(jīng)很清楚了。顯然,如果系統(tǒng)中只有一個(gè)任務(wù)使用動(dòng)態(tài)內(nèi)存塊,就沒有必要使用信號(hào)量了。這種情況不需要保證內(nèi)存資源的互斥。事實(shí)上,除非我們要實(shí)現(xiàn)多任務(wù)共享內(nèi)存,否則連內(nèi)存分區(qū)都不需要。多任務(wù)執(zhí)行從OSStart()開始L7.9(6)。當(dāng)一個(gè)任務(wù)運(yùn)行時(shí),只有在信號(hào)量有效時(shí)L7.9(7),才有可能得到內(nèi)存塊L7.9
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 蘇科版八年級(jí)物理上冊《第三章光的折射、透鏡》章末測試卷帶答案
- 多功能會(huì)議室系統(tǒng)建議方案
- 主要領(lǐng)導(dǎo)在2025新年工作部署大會(huì)上的講話
- 第十四章光的干涉作業(yè)
- 高一化學(xué)第二單元化學(xué)物質(zhì)及其變化第二講離子反應(yīng)練習(xí)題
- 2024屆河南省非凡吉?jiǎng)?chuàng)聯(lián)盟高考化學(xué)押題試卷含解析
- 2024高中地理第一章宇宙的地球中4地球的結(jié)構(gòu)課時(shí)作業(yè)含解析湘教版必修1
- 2024高中語文第一單元以意逆志知人論世自主賞析書憤學(xué)案新人教版選修中國古代詩歌散文欣賞
- 2024高中語文第四單元新聞和報(bào)告文學(xué)第12課飛向太空的航程學(xué)案新人教版必修1
- 2024高考地理一輪復(fù)習(xí)專練36人口遷移含解析新人教版
- 人教版2024-2025學(xué)年七年級(jí)數(shù)學(xué)上冊計(jì)算題專項(xiàng)訓(xùn)專題09運(yùn)用運(yùn)算律簡便運(yùn)算(計(jì)算題專項(xiàng)訓(xùn)練)(學(xué)生版+解析)
- 2023年二輪復(fù)習(xí)解答題專題十七:二次函數(shù)的應(yīng)用(銷售利潤問題)(原卷版+解析)
- 《ISO56001-2024創(chuàng)新管理體系 - 要求》之26:“9績效評(píng)價(jià)-9.3管理評(píng)審”解讀和應(yīng)用指導(dǎo)材料(雷澤佳編制-2024)
- GB 26134-2024乘用車頂部抗壓強(qiáng)度
- 2024年高中生物新教材同步必修第二冊學(xué)習(xí)筆記第3章 本章知識(shí)網(wǎng)絡(luò)
- 三年級(jí)上冊乘法豎式計(jì)算練習(xí)200道及答案
- 組建學(xué)?;@球隊(duì)方案
- 重大事故隱患判定標(biāo)準(zhǔn)培訓(xùn)記錄、培訓(xùn)效果評(píng)估
- 2024版軟包合同模板
- GB/T 36548-2024電化學(xué)儲(chǔ)能電站接入電網(wǎng)測試規(guī)程
- NB-T+31010-2019陸上風(fēng)電場工程概算定額
評(píng)論
0/150
提交評(píng)論