




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、搜索設(shè)備根據(jù)PCI設(shè)備的VendorlD和DevicelD搜索PCI設(shè)備,返回PCI配置信息和SlotNumber:intDeviceSearch(intvendorID,intdeviceID,PCI_SLOT_NUMBER*pSlotNumber,PPCI_COMMON_CONFIGpPcidata){ULONGbus;ULONGdeviceNunber;ULONGfunctionNumber;ULONGbytesREAD;BOOLbFlag=TURE;pSlotNumber->u.bits.Reserved=0;for(bus=0;bFlag;bus++){for(deviceNumber=0;deviceNumber<PCI_MAX_DEVICES&&bFlag;deviceNumber++){pSlotNumber->u.bits.DeviceNumber=deviceNumber;for(functionNumber=0;functionNumber<PCI_MAX_FUNCTION;functionNumber++){pSlotNumber->u.bits.FunctionNumber=functionNumber;bytesRead=RtGetBusDataByOffset(PCIConfiguration,bus,pSlotNumber->u.AsULONG,pPciData,0,PCI_COMMON_HDR_LENGTH);If(bytesRead==0){bFlag=FALSE;break;}\\沒有發(fā)現(xiàn)busif(bytesRead==VENDOR_ID_SIZE&&pPciData->Vendor==PCI_INVALID_VENDORID)\\\continue;\\\沒有發(fā)現(xiàn)deviceif((pPciData->VendorID==vendorID)&&(pPciData->DeviceID==deviceID))returnbus;}發(fā)現(xiàn)device}}ReturnDEVICE_NOT_FOUND;}2、初始化設(shè)備利用RtTranslateBusAddress(和RtMapMemory(),RtTranslateBusAddress()把PCI設(shè)備地址轉(zhuǎn)化為CPU可直接訪問的物理地址,RtMapMemory()把物理地址映射到虛擬地址。物理地址映射到虛擬地址映射范圍一般為4K,RtMapMemory()函數(shù)默認(rèn)最大可以映射的范圍64M字節(jié):BOOLDeviceStartup(intbusNumber,PCI_SLOT_NUMBER*pSlotNumber,PPCI_COMMON_CONFIGpPciData){LARGE_INTEGERbaseMemAddr;LARGE_INTEGERPhysMemAddr;ULONGAddressSpace=0;IntaddressRange=4*1024;IntmemoryRange=60*1024*1024;ULONGbytesWritten;Inti;If(!RTEnablePortlo((PCHAR)IOAddress,sizeof(DeviceIORegs)))ReturnFALSE;\\\I/O允許for(i=0;i<NUM_REGISTERS;i++){baseMemAddr.QuadPart=pPciData->u.type0.BaseAddresses{i};if(!RtTranslateBusAddress(PCIBus,busNumber,baseMemAddr,&AddressSpace,&PhysMemAddr)){vMemAddr[i]=NULL;continue;}if(i!=BASE_MEMORY_RSG)vMemAddr[i]=RtMapMemory(PhysMemAddr,addressRange,0);vMemAddr[i]=RtMapMemory(PhysMemAddr,memoryRange,0);}\\'基地址轉(zhuǎn)換設(shè)備-物理-IOpPciData->Command=(PCI_ENABLE_IO_SPACE|PCI_ENABLE_MEMORY_SPACE|PCI_ENABLE_BUS_MASTER|PCI_ENABLEWRITE_AND_INVALIDATE);bytesWritten=RtSetBusDataByOffset(PCIConfiguration,busNumber,pSlotNumber->u.AsULONG,pPciData,0,PCI_COMMON_HDR_LENGTH);if(bytesWritten==0)returnFALSE;RtSleep(500);returnTURE;}3、打開設(shè)備為DMA通道發(fā)送、接受網(wǎng)絡(luò)中斷等硬件功能模塊創(chuàng)建信號量。intRFM2gOpen(){intEventType;char*MsgWait[RFM2GEVENT_LAST];DMABusy=RtCreateSemaphore(NULL,1,1,"Message.DMA0busy");if(DMABusy==NULL)MsgAndExit("RtCreateSemaphoreforDMA0Busyfailed.”)\\DMA忙DMADone=RtCreateSemaphore(NULL,0,1,"Message.DMA0done");if(DMADone==NULL)MsgAndExit(“RtCreateSemaphoreforDMADonefailed.”)\\DMA完成中斷sendEvent=RtCreateSemaphore(NULL,1,1,"Message.sendevent")if(sendEvent==NULL)MasAndExit(“RtCreateSemaphoreforsendEventfailed.”)\、發(fā)送中斷MsgWait[0]="Message.eventtype0”;MsgWait[1]="Message.eventtype1”;MsgWait[2]="Message.eventtype2”;MsgWait[3]="Message.eventtype3”;MsgWait[4]="Message.eventtype4”;MsgWait[5]="Message.eventtype5”;MsgWait[6]="Message.eventtype6”;MsgWait[7]="Message.eventtype7”;for(EventType=RFM2GEVENT_RESET;EventType<RFM2GEVENT_LATS;EventType++){waitingSem[EventType]=RtCreateSemaphore(NULL,0,1,MsgWait[EventType]))If(waitingSem[EventType]==NULL)MsgAndExit(RtCreateSemaphoreforwaitingSemfailed.”);}NodeID=vMenAddr[BASE_CONFIG_REG][RFM2G_NID])returnNodeID;\\接受中斷}4、打開中斷使能DMA中斷和網(wǎng)絡(luò)中斷voidEnableInterruptsOnChip(){Unsignedintoldnumber,masknumber,confignumber)oldnumber=GetConfig(BASE_CONTRL_REG,RFM2G_DMA0MODE))masknumber=RFM2G__BIT0|RFM2G_BIT1|RFM2G_BIT7|RFM2G_BIT10|RFM2G_BIT17)confignumber=oldnember|masknumber)confignumber=confignumber&0xfffffdff)SetConfig(BASE_CONTRL_REG,RFM2G_DMA0MODE,confignumber):SetConfig(BASE_CONTRL_REG,RFM2GDMA0DAC,0x0);\\DMA通道0模式SetConfig(BASE_CONFIG_REG,RFN2G_SID1,0x0);SetConfig(BASE_CONFIG_REG,RFN2G_SID2,0x0);SetConfig(BASE_CONFIG_REG,RFN2G_SID3,0x0);SetConfig(BASE_CONFIG_REG,RFN2G_SID4,0x0);SetConfig(BASE_CONFIG_REG,RFN2G_SIDLIER,0x0);SetConfig(BASE_CONFIG_REG,RFN2G_SIDLISR,0x0);oldnumber=GetConfig(BASE_CONFIG_REG,RFM2G_LIER);masknumber=RFM2G_BIT0|RFM2G_BIT1|RFM2G_BIT2|RFM2G_BIT7;confignumber=oldnumber|masknumber;SetConfig(BASE_CONFIG_REG,RFM2G_LIER,confignumber);\\LIERoldnumber=GetConfig(BASE_CONFIG_REG,RFM2G_LISR);masknumber=RFM2G_BIT14;confignumber=oldnumber|masknumber;SetConfig(BASE_CONFIG_REG,RFM2G_LISR,confignumber);\\LISRoldnumber=GetConfig(BASE_CONTRL_REG,RFM2G_INTCSR);masknumber=RFM2G_BIT8|RFM2G_BIT11|RFM2G_BIT18;confignumber=oldnumber|masknumber;SetConfig(BASE_CONTRL_REG,RFM2G_INTCSR,confignumber);}5、發(fā)送和接受中斷intRFM2gSendEvent(HANDLErh,intToNode,RFM2GEVENTTYPeEventType,unsignedintExtendedData){Unsignedcharcmd=;If((ToNode<=RFM2G_NODE_MAX)||(ToNode==RFM2G_NODE_ALL)){if(ToNode==RFM2G_NODE_ALL)cmRFM2G_NIC_GLOBAL;sitch(EventType){caseRFM2GEVENT_RESET:cmd|=RFM2G_NIC_RESET;break;caseRFM2GEVENT_INTR1:cmd|=RFM2G_NIC_INT1;break;caseRFM2GEVENT_INTR2:cmd|=RFM2G_NIC_INT2;break;caseRFM2GEVENT_INTR3:cmd|=RFM2G_NIC_INT3;break;caseRFM2GEVENT_INTR4:cmd|=RFM2G_NIC_INT4;break;default:return(98);}}elsereturn(99);\\\網(wǎng)絡(luò)中斷命令字cmdif(RtWaitForSingleObject(sendEvent,INFINITE)==WAIT_FAILED)MsgAndExit(“RtWaitForSingleObjectsendEventfailed.”);if(EventType!=RFM2GEVENT_RESET)SetConfig(BASE_CONFIG_REG,RFM2G_NTD,ExtendedData);\\目標(biāo)數(shù)據(jù)vMemAddr[BASE_CONFIG_REG][RFM2G_NTN]=ToNode;\\i標(biāo)節(jié)點vMemAddr[BASE_CONFIG_REG][RFM2G_NIC]=cmd;\\中斷命令if(!RtReleaseSemaphore(sendEvent,1,NULL))MsgAndExit("RtReleaseSemaphoresendEventfailed.");return0;}\\'發(fā)送網(wǎng)絡(luò)中斷intRFM2gWaitForEvent(HANDLErh,RFM2GEVENTINFO*pEventInfo){unsignedintoldnumber,masknumber,confignumber;if(pEventInfo==NULL)MsgAndExit("pEventInfoNULL.");if((pEventInfo->Event<RFM2GEVENT_RESET)||(pEventInfo->Event>=RFM2GEVENT_LAST))MsgAndExit(“pEventInfoerror”);if(RtWaitForSingleObject(waitingSem[pEventInfo->Event],INFINITE)==WAIT_FAILED)MsgAndExit("RtWaitForSingleObjectwaitingSemfailed.");switch(pEventInfo->Event){caseRFM2GEVENT_INTR1:pEventInfo->ExtendedInfo=GetConfig(BASE_CONFIG_REG,RFM2G_ISD1);pEventInfo->NodeId=vMemAddr[BASE_CONFIG_REG][RFM2G_SID1];oldnumber=GetConfig(BASE_CONFIG_REG,RFM2G_LISR);masknumber=RFM2G_BIT14;confignumber=oldnumber|masknumber;confignumber=confignumber&0xfffffffe;SetConfig(BASE_CONFIG_REG,RFM2G_LISR,confignumber);break;caseRFM2GEVENT_INTR2:pEventInfo->ExtendedInfo=GetConfig(BASE_CONFIG_REG,RFM2G_ISD2);pEventInfo->NodeId=vMemAddr[BASE_CONFIG_REG][RFM2G_SID2];oldnumber=GetConfig(BASE_CONFIG_REG,RFM2G_LISR);masknumber=RFM2G_BIT14;confignumber=oldnumber|masknumber;confignumber=confignumber&0xfffffffd;SetConfig(BASE_CONFIG_REG,RFM2G_LISR,confignumber);break;caseRFM2GEVENT_INTR3:pEventInfo->ExtendedInfo=GetConfig(BASE_CONFIG_REG,RFM2G_ISD3);pEventInfo->NodeId=vMemAddr[BASE_CONFIG_REG][RFM2G_SID3];oldnumber=GetConfig(BASE_CONFIG_REG,RFM2G_LISR);masknumber=RFM2G_BIT14;confignumber=oldnumber|masknumber;confignumber=confignumber&0xfffffffb;SetConfig(BASE_CONFIG_REG,RFM2G_LISR,confignumber);break;caseRFM2GEVENT_INTR4:pEventInfo->ExtendedInfo=GetConfig(BASE_CONFIG_REG,RFM2G_ISD4);pEventInfo->NodeId=vMemAddr[BASE_CONFIG_REG][RFM2G_SID4];oldnumber=GetConfig(BASE_CONFIG_REG,RFM2G_LISR);masknumber=RFM2G_BIT14;confignumber=oldnumber|masknumber;confignumber=confignumber&0xffffff7f;SetConfig(BASE_CONFIG_REG,RFM2G_LISR,confignumber);break;caseRFM2GEVENT_RESET:break;default:break;}return0;}\\接受中斷6、讀寫操作通過DMA或者CPU讀寫節(jié)點數(shù)據(jù)或?qū)?shù)據(jù)寫入本地節(jié)點intRFM2gRead(HANDLErh,unsignedintOffset,void*Buffer,unsignedintLength){if(Length>=DEFAULT_DMA_THRESH){if(RFM2gDMA(rh,RFM2G_TO_PCI,Buffer,Offset,Length)!=0)MsgAndExit("RFM2gDMAReadfailed.");}elsememcpy((void*)Buffer,(void*)(vMemAddr[BASE_MEMORY_REG]+Offset),Length);return0;}〃讀入板卡數(shù)據(jù)intRFM2gWrite(HANDLErh,unsignedintOffset,void*Buffer,unsignedintLength){if(Length>=DEFAULT_DMA_THRESH){if(RFM2gDMA(rh,PCI_TO_RFM2G,Buffer,Offset,Length)!=0)MsgAndExit("RFM2gDMAWritefailed.");}elsememcpy((void*)(vMemAddr[BASE_MEMORY_REG]+Offset),(void*)Buffer,Length);return0;}\\寫入板卡數(shù)據(jù)staticintRFM2gDMA(HANDLErh,intdirection,void*pBuff,unsignedintrfmOffset,unsignedintlength){LARGE_INTEGERphysaddrTo;DWORDlpBuff;unsignedintlRfmOffset;intdmaComplete;unsignedintbytesLeft2DMA;〃尚未傳輸?shù)淖止?jié)數(shù)unsignedintbytes2Send;//將要傳輸?shù)淖止?jié)數(shù)unsignedintbytesSent;//完成傳輸?shù)淖止?jié)數(shù)if(RtWaitForSingleObject(DMABusy,INFINITE)==WAIT_FAILED)MsgAndExit("RtWaitForSingleObjectfailed.");if(direction==PCI_TO_RFM2G)SetConfig(BASE_CONTRL_REG,RFM2G_DMA0DESCPTR,0x0);elseSetConfig(BASE_CONTRL_REG,RFM2G_DMA0DESCPTR,0x8);//DMA傳輸方向physaddrTo=RtGetPhysicalAddress(pBuff);lpBuff=physaddrTo.LowPart;lRfmOffset=rfmOffset;dmaComplete=0;bytesLeft2DMA=length;bytes2Send=0;bytesSent=0;while(dmaComplete==0){if(bytesLeft2DMA<DMATxferSize)bytes2Send=bytesLeft2DMA;elsebytes2Send=DMATxferSize;bytesLeft2DMA-=bytes2Send;bytesSent+=bytes2Send;SetConfig(BASE_CONTRL_REG,RFM2G_DMA0PCIADDR,lpBuff);SetConfig(BASE_CONTRL_REG,RFM2G_DMA0LOCALADDR,lRfmOffset);SetConfig(BASE_CONTRL_REG,RFM2G_DMA0COUNT,(bytes2Send&RFM2G_DMA_SIZE_MAX));SetConfig(BASE_CONTRL_REG,RFM2G_DMA0CSR,0x3);RtWaitForSingleObject(DMADone,INFINITE);SetConfig(BASE_CONTRL_REG,RFM2G_DMA0CSR,0x8);〃清除DMA完成中斷if(bytesSent==length)dmaComplete=1;else{lpBuff+=bytes2Send;lRfmOffset+=bytes2Send;}}if(RtReleaseSemaphore(DMABusy,1,NULL)!=TRUE)MsgAndExit("RtReleaseSemaphorech0Busyfailed.");return0;}\\DMA數(shù)據(jù)傳輸unsignedGetConfig(unsignedBase,unsignedoffset){unsignedintget;memcpy((void*)(&get),(void*)(vMemAddr[Base]+offset),4);returnget;}\\讀32bits數(shù)voidSetConfig(unsignedBase,unsignedoffset,unsignedconfig_number){unsignedintset=config_number;memcpy((void*)(vMemAddr[Base]+offset),(void*)(&set),4);}//寫32bits數(shù)voidMsgAndExit(char*msg){RtPrintf("Error:%s(0x%X)\n”,,smg,RtGetLastError());RtExitProcess(1);}\\錯誤信息輸出7、中斷服務(wù)程序ISR、線程IST中斷服務(wù)程序ISR接收到中斷后交給中斷服務(wù)線程IST來處理,用戶一般不需要改動。INTERRUPT_DISPOSITIONRTFCNDCLDeviceISR(PVOIDpContext){BOOLEANbIstHandling=TRUE;if(bIstHandling)returnCallInterruptThread;returnDismiss;}\\中斷服務(wù)例程BOOLEANRTAPIDeviceIST(PVOIDpContext){unsignedintdmaINTCSR;dmaINTCSR=GetConfig(BASE_CONTRL_REG,RFM2G_INTCSR);〃本地配置寄存器:if(dmaINTCSR&RFM2G_BIT21){RtReleaseSemaphore(DMADone,1,NULL);RtPrintf("OKiiiiiist---DMA-DMA-INT!\n");}\\DMA中斷if(dmaINTCSR&RFM2G_BIT15){unsignedintdLISR;dLISR=GetConfig(BASE_CONFIG_REG,RFM2G_LISR);if((dLISR&RFM2G_LISR_RESET))RtReleaseSemaphore(waitingSem[RFM2GEVENT_RESET],1,NULL);if((dLISR&RFM2G_LISR_INT1))RtReleaseSemaphore(waitingSem[RFM2GEVENT_INTR1],1,NULL);if((dLISR&RFM2G_LISR_INT2))RtReleaseSemaphore(waitingSem[RFM2GEVENT_INTR2],1,NULL);if((dLISR&RFM2G_LISR_INT3))RtReleaseSemaphore(waitingSem[RFM2GEVENT_INTR3],1,NULL);if((dLISR&RFM2G_LISR_INT4))RtReleaseSemaphore(waitingSem[RFM2GEVENT_INTR4],1,NULL);RtPrintf("OKiiiiiist---NETint-NETint-INT!\n");}\\網(wǎng)絡(luò)中斷returnTRUE;}\\中斷服務(wù)線程8、掛接中斷掛接硬件中斷,保證RTX正確分配給了中斷信號反射內(nèi)存卡,采用獨占模式:HANDLEHang_Interrupt(ULONGirqLevel,ULONGirqVector,ULONGbusNumber,PCI_SLOT_NUMBERslotNumber){ATTACH_INTERRUPT_PARAMETERSAttachParams;HANDLEintHandler;if(!RtQueryPciMsiCapability(busNumber,slotNumber)){AttachParams.AttachVersion=ATTACH_LINE_BASED;AttachParams.LineBased.pThreadAttributes=NULL;AttachParams.LineBased.StackSize=0;AttachParams.LineBased.pRoutine=(PVOID)DeviceIST;AttachParams.LineBased.Context=NULL;AttachParams.LineBased.Priority=IST_PRIORITY;AttachParams.LineBased.InterfaceType=PCIBus;AttachParams.LineBased.BusNumber=busNumber;AttachParams.LineBased.SlotNumber=slotNumber;AttachParams.LineBased.BusInterruptLevel=irqLevel;AttachParams.LineBased.BusInterruptVector=irqVector;AttachParams.LineBased.Shared=FALSE;AttachParams.LineBased.InterruptMode=LevelSensitive;AttachParams.LineBased.MyInterrupt=DeviceISR;AttachParams.LineBased.ProcessorEnableMask=1<<RtGetCurrentProcessorNumber();}else{AttachParams.AttachVersion=ATTACH_MESSAGE_BASED;AttachParams.MessageBased.pThreadAttributes=NULL;AttachParams.MessageBased.StackSize=0;AttachParams.MessageBased.pRoutine=(PVOID)DeviceIST;AttachParams.MessageBased.Context=NULL;AttachParams.MessageBased.Priority=IST_PRIORITY;AttachParams.MessageBased.BusNumber=busNumber;AttachParams.MessageBased.SlotNumber=slotNumber;AttachParams.MessageBased.MyInterrupt=DeviceISR;AttachParams.MessageBased.ProcessorEnableMask=1<<RtGetCurrentProcessorNumber();}intHandler=RtAttachInterrupt(&AttachParams);returnintHandler;}9、main程序void_cdeclmain(intargc,char**argv,char**envp){UCHARbuffer[PCI_COMMON_HDR_LENGTH];PPCI_COMMON_CONFIGppciData=(PPCI_COMMON_CONFIG)buffer;//PCI配置寄存器PCI_SLOT_NUMBERslotNumber;//插槽號ULONGbusNumber;//總線號ULONGirqLevel;//中斷號ULONGirqVector;//中斷向量HANDLEintHandler;//搜索設(shè)備busNumber=DeviceSearch(VENDOR_ID,DEVICE_ID,&slotNumber,ppciData);if(busNumber==DEVICE_NOT_FOUND)MsgAndExit("TheSpecifiedDevicewasnotfoundonthismachine.");elseRtPrintf("OK---FoundDevice(busnumber:%d)(slotnumber:%d)\n",busNumber,slotNumber.u.AsULONG);if(!DeviceStartup(busNumber,&slotNumber,ppciData)){DeviceCleanup(NULL);MsgAndExit("Deviceinitializationfailed.");}elseRtPrintf("OK---StartupDeviceMap(vMemAddr0:%X)(vMemAddr2:%X)(vMemAddr3:%X)\n",vMemAddr[0],vMemAddr[2],vMemAddr[3]);RFM2gOpen();RtPrintf("OK---OpendeviceSem(NodeID:%d)\n",NodeID);DisableInterruptsOnChip();irqLevel=ppciData->u.type0.InterruptLine;irqVector=irqLevel;ntHandler=Hang_Interrupt(irqLevel,irqVector,busNumber,slotNumber);if(intHandler==NULL){DeviceCleanup(NULL);MsgAndExit("Couldnotattachtotheinterruptforthisdevice.");}else{RtPrintf("OK---Attachtotheinterruptforthisdevice(IntNo.%x)\n",irqLevel);RtEnableInterrupts();〃中斷允許}〃打開中斷EnableInterruptsOnChip();RtPrintf("OK---Openinterruptforthisdevice\n");〃打開接收信號量SemRecieve=RtOpenSemaphore(0,FALSE,"Message.WinSemRecieve");if(SemRecieve)RtPrintf("OK---OpenSemRecieve!\n");〃打開發(fā)送信號量SemSend=RtOpenSemaphore(0,FALSE,"Message.WinSemSend");if(SemSend)RtPrintf("OK---OpenSemSend!\n");〃打開共享內(nèi)存if(hSM=RtOpenSharedMemory(SHM_MAP_WRITE,FALSE,sharedmemory,&pSM)==NULL){RtPrintf("errorOpensharedmemory!\n");RtPrintf("ComRtxClose!\n");ExitProcess(1);}else{RtPrintf("OK---Opensharedmemory!\n");strcpy(pSM->recievedBuffer,"成功打開共享內(nèi)存!(RTSS)\r\n");RtReleaseSemaphore(SemRecieve,1,NULL);RtSleep(50);}〃創(chuàng)建發(fā)送線程hSendThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)onSend,NULL,0,&dwSendThreadID);RtSleep(50);〃創(chuàng)建接收線程hReceiveThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)onReceive,NULL,0,&dwReceiveTh
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年房屋建筑學(xué)教案:探索智慧城市與建筑設(shè)計
- 2025年幼兒教師師德培訓(xùn)實踐案例分享
- 體驗性社會實踐報告范文
- 保護(hù)野生動物宣傳活動總結(jié)
- 軟件產(chǎn)品OEM合作協(xié)議(10篇)
- 2025年少先隊知識課件:助力少先隊員掌握少先隊歷史
- 感冒知識培訓(xùn)課件
- 安全合理輸血及評估0306
- 影視劇融資居間合同
- 財務(wù)會計專業(yè)實務(wù)習(xí)題
- 小學(xué)勞動教育二年級下冊教學(xué)計劃
- 三年級上冊脫式計算100題及答案
- 2024春開學(xué)第一課-開學(xué)第一課 禁毒我先行 課件
- 《聽歌識曲》課件
- 金屬冶煉安全培訓(xùn)課件
- 采血護(hù)士培訓(xùn)課件
- 140m集裝箱船船體說明書
- 高等教育學(xué)課件-
- 送達(dá)地址確認(rèn)書
- 機(jī)動車檢測站管理制度
- 大班語言《你是螞蟻小可》
評論
0/150
提交評論