freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

鄺堅(jiān)_北郵嵌入式實(shí)驗(yàn)報(bào)告-wenkub

2024-10-31 23 本頁(yè)面
 

【正文】 .......................................................9 CPU GPIO驅(qū)動(dòng)程序設(shè)計(jì)...................................................9 ...........................................................................10 ................................................................12 LED點(diǎn)陣驅(qū)動(dòng)程序設(shè)計(jì)...................................................19 AD驅(qū)動(dòng)實(shí)驗(yàn)....................................................................23 DA驅(qū)動(dòng)實(shí)驗(yàn)....................................................................26六、實(shí)驗(yàn)中遇到的問(wèn)題及解決方法........................................................30七、實(shí)驗(yàn)總結(jié)及心得................................................................................31一、實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)實(shí)驗(yàn)熟悉Linux環(huán)境,并掌握一些基本接口驅(qū)動(dòng)的寫(xiě)法和用C語(yǔ)言編寫(xiě)簡(jiǎn)單的實(shí)驗(yàn)程序。rxMsg,MAX_MSG_LEN,WAIT_FOREVER);msgQSend(msgQIdClient[mSendId],(char*)amp。Timer0Timer1Timer9ClientMsgQ0ClientMsgQ1…… copy 消息隊(duì)列存儲(chǔ)的是指向消息的指針,從而實(shí)現(xiàn)了零拷貝。blockHead* blockHeadPtr。return(void*)((char*)blockHeadPtr + sizeof(blockHead))。/*分配內(nèi)存時(shí)加入塊頭開(kāi)銷*/ } else if((Size next)available!= 0)){} else{ printf(“n[Warning] : Too large for blocks or the blocks are /*其他情況用系統(tǒng)的內(nèi)存分配函數(shù)malloc分配*/ blockHeadPtr =(poolHeadPtrnext)firstavailable。/*首個(gè)可用塊地址賦給poolHeadPtrfirstavailable = blockHeadPtrfrontBlock。blockHead* blockHeadPtr。/* 當(dāng)前首poolHeadPtrfirstavailable = blockHeadPtr。poolHeadPtrfirstavailable = blockHeadPtr。for(i=1。poolHeadPtrfirstavailable = blockHeadPtr。i址*/ } /*初始化pool 2 該內(nèi)存池分配大小為256B的內(nèi)存*/ poolHeadPtr = poolHeadPtrnext。/*初始化第一塊可用塊的地址*/ poolHeadPtrnext=(poolHead*)((char*)poolHeadPtr + sizeof(poolHeadPtr)/*+ 32*(sizeof(blockHead)+16))。/*初始化內(nèi)存池的首地址*/ poolHeadPtravailable = 32。/*分配6000B內(nèi)存作為內(nèi)存池*//*初始化pool*/ poolPtr =(pool*)mem。pool* poolPtr。靜態(tài)內(nèi)存的數(shù)據(jù)結(jié)構(gòu)為單鏈表,采用頭插法,申請(qǐng)內(nèi)存時(shí),修改firstavailable另其指向第二塊,將firstavailable指向的頭塊取出,回收內(nèi)存時(shí),將回收的塊的frontBlock指向第一塊,修改firstavailable另其指向回收的塊,將回收的塊作為第一塊,數(shù)據(jù)結(jié)構(gòu)如下所示: …… ……} return(OK)。} /* timer(id)向客戶端定時(shí)發(fā)送的定時(shí)器*/ STATUS timer(int id){ ……semTake(semSynStart,WAIT_FOREVER)。sprintf(tempName, “tTimer%d”, id)。taskDelay(10)。id NUM_TIMER。return(OK)。} for(id = 0。} MSG_Q_FIFO|MSG_Q_EVENTSEND_ERR_NOTIFY)。id NUM_CLIENT。semMalloc = semBCreate(SEM_Q_PRIORITY,SEM_FULL)。id++){} /* 創(chuàng)建消息隊(duì)列 */ msgQIdServer = msgQCreate(MAX_MSGS, MAX_MSG_LEN, MSG_Q_FIFO|MSG_Q_EVENTSEND_ERR_NOTIFY)。id NUM_CLIENT。return(OK)。/* progStart()啟動(dòng)實(shí)例程序*/ STATUS progStart(void){int id。printf(“tTimer%d send message to tClient%d!n”,id,id)。txMsgmType = 0。/*創(chuàng)建一個(gè)定時(shí),用于提醒發(fā)送者任務(wù)定時(shí)發(fā)送消息*/ tick=sysClkRateGet()。/* 接收任務(wù)的MESSAGE ID */ int mData。環(huán)境:VxWorks 的VxSim 仿真環(huán)境或2440(ARM920T)內(nèi)容: 必選功能: 統(tǒng)一框架,包含統(tǒng)一消息格式定義及使用規(guī)范; ; 啟動(dòng)同步功能;,最大限度降低外部碎片對(duì)系統(tǒng)可靠性的威脅??蛇x功能(加分):其它有利于實(shí)時(shí)處理的有效機(jī)制,如:無(wú)信號(hào)量(互斥)支持的臨界資源訪問(wèn)方式,zero copy 等;二、實(shí)現(xiàn)的功能 統(tǒng)一框架,包含統(tǒng)一消息格式定義及使用規(guī)范; STATUS Task(){ Initialization(MBox, Data Structure, Timer, etc.)Forever{ MsgReceive If(…){ …… }else if(…){ …… } ……} } typedef struct _MESSAGE { int mType。/* 消息中傳遞的數(shù)據(jù) */ }MESSAGE。semTake(semSynStart,WAIT_FOREVER)。txMsgmSendId = MID_TIMER(id)。if(msgQSend(msgQIdClient[id],(char*)amp。/* 用來(lái)區(qū)分不同的定時(shí)器或者客戶任務(wù) */ mallocPtr=amp。initialPtr = initial()。id++){ tidClient[id] = 0。if(msgQIdServer == NULL){} for(id = 0。semFree = semBCreate(SEM_Q_PRIORITY,SEM_FULL)。id++){char tempName[20]。return(ERROR)。id NUM_TIMER。} /* manager()管理進(jìn)程,實(shí)現(xiàn)task同步*/ STATUS manager(){ int id。id++){} semFlush(semSynStart)。for(id = 0。tidTimer[id] = taskSpawn(tempName, 230, 0, STACK_SIZE,(FUNCPTR)timer,id,0,0,0,0,0,0,0,0,0)。FOREVER { } /*client(id)向服務(wù)器任務(wù)發(fā)請(qǐng)求消息*/ STATUS client(int id){ ……semTake(semSynStart,WAIT_FOREVER)。…… poolpoolHeadnextfirstavailable blockHeadfrontBlockblockHeadfrontBlockblockHeadfrontBlockblockHeadpoolHeadfirstavailableblockHeadfrontBlockblockHeadfrontBlockblockHeadfrontBlockblockHead 靜態(tài)分配了含有32個(gè)16B塊的內(nèi)存池和含有16個(gè)256B塊的內(nèi)存池,如果申請(qǐng)的內(nèi)存大于256B,調(diào)用系統(tǒng)malloc。poolHead* poolHeadPtr。poolPtrpoolNum = 2。/*初始化可用塊數(shù)32*/ poolHeadPtrblockSize = 16。/*next指向第二個(gè)內(nèi)存池 */blockHeadPtrpoolId =1。poolHeadPtravailable = 16。poolHeadPtrnext = 0。i} return(pool*)mem。(sizeof(blockHead)+256))。/* 求下一首個(gè)可用塊地(sizeof(blockHead)+16))。semTake(semMalloc,WAIT_FOREVER)。/*改變下poolHeadPtravailable。(poolHeadPtrnext)firstavailable = blockHeadPtrfrontBlock。/*長(zhǎng)度大于16小于256時(shí),分配長(zhǎng)度為256的內(nèi)存空間*/ exhausted n”)。semTake(semFree,WAIT_FOREVER)。define MAX_MSG_LEN sizeof(MESSAGE*)MESSAGE* rxMsg。txMsg,MAX_MSG_LEN,WAIT_FOREVER,MSG_PRI_NORMAL);三、運(yùn)行結(jié)果在shell中輸入progStart,觀察VxSim,輸入progStop結(jié)束。學(xué)習(xí)LINUX開(kāi)發(fā)環(huán)境的搭建,通訊配置等。由于后面的實(shí)驗(yàn)都要依靠前面實(shí)驗(yàn)的配置,故本段只著重?cái)⑹鰧?shí)驗(yàn)七的具體實(shí)現(xiàn)。實(shí)驗(yàn)六為宿主PC機(jī)配置了NFS服務(wù)。實(shí)驗(yàn)七通過(guò)用c語(yǔ)言編寫(xiě)的簡(jiǎn)單程序HelloWorld,測(cè)試前面幾個(gè)實(shí)驗(yàn)是否成功配置好環(huán)境,從超級(jí)終端可以看到HelloWorld程序的運(yùn)行結(jié)果。進(jìn)入RedHat 圖形界面后,打開(kāi)一個(gè)終端窗(Terminal)。就像在 Windows系統(tǒng)下面使用寫(xiě)字板等一樣道理。8)在上面同一個(gè)終端窗口中,輸入下列 2 , 目標(biāo)文件,如圖 710,圖711: ①armlinuxgcc– ②ls 等到再次出現(xiàn)提示符,代表程序已經(jīng)正確編譯。驅(qū)動(dòng)程序是內(nèi)核的一部分,是操作系統(tǒng)內(nèi)核與硬件設(shè)備的直接接口,驅(qū)動(dòng)程序屏蔽了硬件的細(xì)節(jié),完成以下功能:?對(duì)設(shè)備初始化和釋放;?對(duì)設(shè)備進(jìn)行管理,包括實(shí)時(shí)參數(shù)設(shè)置,以及提供對(duì)設(shè)備的操作接口; ?讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)或者回送應(yīng)用程序請(qǐng)求的數(shù)據(jù); ?檢測(cè)和處理設(shè)備出現(xiàn)的錯(cuò)誤。?應(yīng)用程序通常可以通過(guò)系統(tǒng)調(diào)用open()打開(kāi)設(shè)備文件,建立起與目標(biāo)設(shè)備的連接。由于Linux 中將設(shè)備當(dāng)做文件處理,所以對(duì)設(shè)備進(jìn)行操作的調(diào)用格式與對(duì)文件的操作類似,主要包括open()、read()、write()、ioctl()、close()等。打開(kāi)設(shè)備準(zhǔn)備I/O操作。?close入口點(diǎn)。?read入口點(diǎn)。?write入口點(diǎn)。?ioctl入口點(diǎn)。select系統(tǒng)調(diào)用在檢查與設(shè)備文件相關(guān)的文件描述符時(shí)使用select入口點(diǎn)。name是設(shè)備名,fops是對(duì)各個(gè)調(diào)用的入口點(diǎn)說(shuō)明。Linux在/dev目錄中為每個(gè)設(shè)備建立一個(gè)文件,用ls–l命令列出函數(shù)返回值,若小于0,則表示注冊(cè)失?。环祷?或者大于0的值表示注冊(cè)成功。字符設(shè)備在cleanup_ module()函數(shù)中調(diào)用unregister_chrdev()來(lái)完成設(shè)備的注銷。對(duì)硬件寄存器進(jìn)行設(shè)置。在這一步驟里對(duì)設(shè)備變量中的項(xiàng)進(jìn)行初始化。如果設(shè)備需要IRQ支持,則要使用request_irq()函數(shù)注冊(cè)中斷。若驅(qū)動(dòng)程序是內(nèi)核的一部分,初始化函數(shù)則要按如下方式聲明: int __initchr_driver_init(void)。所以進(jìn)行嵌入式Linux系統(tǒng)的開(kāi)發(fā),很大的工作量是為各種設(shè)備編寫(xiě)驅(qū)動(dòng)程序。實(shí)現(xiàn)一個(gè)嵌入式Linux設(shè)備驅(qū)動(dòng)的大致流程如下。設(shè)備由一個(gè)主設(shè)備號(hào)和一個(gè)次設(shè)備號(hào)來(lái)標(biāo)識(shí)。在驅(qū)動(dòng)程序中實(shí)現(xiàn)驅(qū)動(dòng)的注冊(cè)和卸載。(7)編譯該驅(qū)動(dòng)程序到內(nèi)核中,或者用insmod命令加載模塊。 簡(jiǎn)單設(shè)備驅(qū)動(dòng)程序本次實(shí)驗(yàn)的任務(wù)是編寫(xiě)一個(gè)字符型設(shè)備驅(qū)動(dòng)程序,并學(xué)習(xí)在應(yīng)用程序中調(diào)用驅(qū)動(dòng)。 CPU GPIO驅(qū)動(dòng)程序設(shè)計(jì)在本實(shí)驗(yàn)中,我們要編寫(xiě)第一個(gè)針對(duì)實(shí)際硬件的驅(qū)動(dòng)程序。補(bǔ)充代碼(1)//WRITEssize_tSIMPLE_GPIO_LED_write(struct file * file ,const char * buf, size_t count, loff_t * f_ops){ ifdef OURS_GPIO_LED_DEBUG printk(“SIMPLE_GPIO_LED_write [kernel]n”)。return 0。sleep(1)。} 中斷實(shí)驗(yàn)// 滅2秒 // 亮7秒 ioctl(fd,LED_ON)。補(bǔ)充代碼1 voidshowversion(void){ printk(“*********************************************n”)。補(bǔ)充代碼2 //READssize_tSIMPLE_INT_read(struct file * file
點(diǎn)擊復(fù)制文檔內(nèi)容
研究報(bào)告相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1