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

正文內(nèi)容

基于arm平臺的智能溫控系統(tǒng)設(shè)計-資料下載頁

2025-06-22 12:57本頁面
  

【正文】 一定包括所有驅(qū)動程序。所以進(jìn)行嵌入式Linux系統(tǒng)的開發(fā),很大的工作量是為各種設(shè)備編寫驅(qū)動程序。一般嵌入式Linux設(shè)備驅(qū)動的大致流程如下。(1)查看原理圖,理解設(shè)備的工作原理。一般嵌入式處理器的生產(chǎn)商提供參考電路,也可以根據(jù)需要自行設(shè)計。(2)定義設(shè)備號。設(shè)備由一個主設(shè)備號和一個次設(shè)備號來標(biāo)識。主設(shè)備號唯一標(biāo)識了設(shè)備類型,即設(shè)備驅(qū)動程序類型,它是塊設(shè)備表或字符設(shè)備表中設(shè)備表項(xiàng)的索引。次設(shè)備號僅由設(shè)備驅(qū)動程序解釋,區(qū)分被一個設(shè)備驅(qū)動控制下的某個獨(dú)立的設(shè)備。(3)實(shí)現(xiàn)初始化函數(shù)。在驅(qū)動程序中實(shí)現(xiàn)驅(qū)動的注冊和卸載。 (4)設(shè)計所要實(shí)現(xiàn)的文件操作。定義file_operations結(jié)構(gòu)。 (5)實(shí)現(xiàn)所需的文件操作調(diào)用。如read、write等。(6)實(shí)現(xiàn)中斷服務(wù),并用request_irq向內(nèi)核注冊,中斷并不是每個設(shè)備驅(qū)動所必需的。(7)編譯該驅(qū)動程序到內(nèi)核中,或者用immod命令加載模塊。(8)測試該設(shè)備,編寫應(yīng)用程序,對驅(qū)動程序進(jìn)行測試[17]。 加載和卸載驅(qū)動程序在編寫模塊程序時,必須提供兩個函數(shù),一個是init module(),在加載此模塊的時候自動調(diào)用,負(fù)責(zé)進(jìn)行設(shè)備驅(qū)動程序的初始化工作。init module()返回0,表示初始化成功,返回負(fù)數(shù)表示失敗,它在內(nèi)核中注冊一定的功能函數(shù)。在注冊后,如果有程序訪問內(nèi)核模塊的某功能,內(nèi)核將查表獲得該功能的位置,然后調(diào)用功能函數(shù)。init module()的任務(wù)就是為以后調(diào)用模塊的函數(shù)做準(zhǔn)備。另一個函數(shù)是cleanup,()備驅(qū)動程序的清除工作。這個函數(shù)的功能是取消init module()所做的事情,把initmodule()函數(shù)在內(nèi)核中注冊的功能函數(shù)完全卸載,如果沒有完全卸載,在此模塊下次調(diào)用時,將會因?yàn)橛兄孛暮瘮?shù)而導(dǎo)致調(diào)入失敗[15]。 模數(shù)轉(zhuǎn)換電路的驅(qū)動程序設(shè)計靜態(tài)存儲控制器(SMC)產(chǎn)生信號來控制外部靜態(tài)存儲器或外設(shè)的訪問。SMC可編程地址可達(dá)512M字節(jié)。它有8個片選及一個26位地址總線。16位數(shù)據(jù)總線配置與8位或16位外部器件連接。獨(dú)立的讀寫控制信號允許存儲器與外設(shè)直接連接。SMC支持不同的允許單時鐘周期存儲器訪問的訪問協(xié)議,同時也提供了外部等待請求能力。 靜態(tài)存儲器控制器提供8個片選線:NCS0~NCS7,本設(shè)計使用NCS6片選ADS7842,地址空間是0x70000000~0x7FFFFFFF,基地址為0x70000000,16路模擬通道分配的地址空間是0x70000040~0x7000005E。 靜態(tài)存儲控制器使用8個片選寄存器(SMC CSR0~SMC CSR7)對獨(dú)立的外部存儲器參數(shù)進(jìn)行編程。通過對片選寄存器的設(shè)定,完成對外設(shè)讀寫以及控制參數(shù)的設(shè)置。2. ADS7842驅(qū)動程序的編寫。程序見附錄。首先編寫Makefile文件,如下所示:CC=/asr/local/arm/linuxgccKERNELDIR=/home/CFLAGS=D_KERNEL_DMODULE I$(KERNELDIR)/include O Wallmarch=armv4 mtune=arm9tdmi:$(CC)$(CFLAGSlc$clean:Rm rf*.o對Makefile文件執(zhí)行make命令后。,執(zhí)行如下命令加載模塊:Insmod/lib/modules/AD$使用lsmod命令查看己加載的驅(qū)動。至此,ADS7842驅(qū)動程序的編寫已經(jīng)完成了。類似地,DAC模塊也采用相同的步驟編寫。[14]。5 溫度控制系統(tǒng)應(yīng)用程序的設(shè)計當(dāng)完成了Linux系統(tǒng)移植以及必要的硬件驅(qū)動的加載后,一個嵌入式平臺就搭建成功了。接下來的工作就是針對具體的設(shè)計方案編寫相應(yīng)的應(yīng)用程序,之后就可以把編譯好的應(yīng)用程序運(yùn)行于該平臺上了。本章具體介紹溫度控制系統(tǒng)各個應(yīng)用程序的具體設(shè)計,首先介紹應(yīng)用程序編寫過程中需要用到的一些概念和相關(guān)函數(shù)。 相關(guān)概念 進(jìn)程進(jìn)程是一個具有獨(dú)立功能的程序關(guān)于某個數(shù)據(jù)集合的一次可以并發(fā)執(zhí)行的程序活動,是處于活動狀態(tài)的計算機(jī)程序,進(jìn)程作為構(gòu)成系統(tǒng)的基本細(xì)胞和分配資源的最小單位,不僅是系統(tǒng)內(nèi)部獨(dú)立運(yùn)行的實(shí)體,也是獨(dú)立競爭資源的基本實(shí)體。Linux是一個多用戶多任務(wù)的操作系統(tǒng),它的一個重要特點(diǎn)就是可以同時啟動多個進(jìn)程。進(jìn)程是一個程序的一次執(zhí)行過程,它是系統(tǒng)的基本調(diào)度單位。一個進(jìn)程由以下元素組成。(1)進(jìn)程的上下文,它表示進(jìn)程執(zhí)行的狀態(tài);(2)程序當(dāng)前的執(zhí)行目錄;(3)程序服務(wù)的文件和目錄;(4)程序的訪問權(quán)限;(5)內(nèi)存和其他分配給進(jìn)程的系統(tǒng)資源。從生存周期來說,進(jìn)程主要有以下這些狀態(tài):(1)用戶狀態(tài):(2)內(nèi)核狀態(tài):(3)內(nèi)存中就緒:(4)內(nèi)存中睡眠:(5)就緒且換出:(6) 睡眠且換出:(7)被搶先:(8)創(chuàng)建狀態(tài):(9)僵死進(jìn)程:Linux系統(tǒng)中,一個進(jìn)程在內(nèi)存里有3個部分?jǐn)?shù)據(jù):數(shù)據(jù)段、堆棧段,代碼段。數(shù)據(jù)段存放程序的全局變量、常數(shù)以及動態(tài)數(shù)據(jù)分配的數(shù)據(jù)空間;堆棧段存是子程序的返回地址、子程序的參數(shù)以及程序的局部變量:代碼段存放程序的數(shù)據(jù)。系統(tǒng)中每一個進(jìn)程都包含一個task struct數(shù)據(jù)結(jié)構(gòu),所有指向這些數(shù)據(jù)結(jié)構(gòu)的指針組成一個進(jìn)程向量數(shù)組,系統(tǒng)缺省的進(jìn)程向量數(shù)據(jù)大小為512,表示系統(tǒng)可以同時容納512個進(jìn)程。進(jìn)程的task struct數(shù)據(jù)結(jié)構(gòu)包括了進(jìn)程的狀態(tài)、調(diào)度信息、進(jìn)程標(biāo)識符等信息。Linux系統(tǒng)是一個分時系統(tǒng),內(nèi)核給每個進(jìn)程分一個時間片,該進(jìn)程的時間片用完就會調(diào)度另一個進(jìn)程。Linux系統(tǒng)上的調(diào)度程序?qū)儆诙嗉壏答佈h(huán)調(diào)度。該調(diào)度方法是:給一個進(jìn)程分一個時間片,搶先一個運(yùn)行超過時間片的進(jìn)程,并把進(jìn)程反饋到若干優(yōu)先級隊(duì)列中的一個隊(duì)列。進(jìn)程執(zhí)行完之前,要經(jīng)過這樣多次反饋循環(huán)。 進(jìn)程間通信進(jìn)程間通信就是進(jìn)程之間進(jìn)行數(shù)據(jù)傳輸,Linux下的進(jìn)程通信繼承了UNIX進(jìn)程間的通信方式,完全和POSIX(Portable Operating System Interface,可移植性操作系統(tǒng)接口)兼容。Linux提供了多種IPC(Intcrprocesscs Communication)方法,主要是:管道(pipe)、命名管道(FIFO)、信號*(Signal)、內(nèi)存映射(Mapped Memory)、信息隊(duì)列(Message Queue)、信號量(Semaphore)、共享內(nèi)存(Shared Memory)、套接字(Socket)。(1) 管道:(2)命名管道:(3)信號:(4)內(nèi)存映射:(5)信息隊(duì)列:(6)信號量:(7)共享內(nèi)存:(8)套接字:本設(shè)計主要使用共享內(nèi)存和信號量以及網(wǎng)絡(luò)間進(jìn)程通信的套接字作為進(jìn)程間通信的手段,下面主要介紹這三種IPC方法。 共享內(nèi)存共享內(nèi)存(Shared Memory)為內(nèi)存塊方式的數(shù)據(jù)段,其數(shù)據(jù)長度可為系統(tǒng)參數(shù)限制內(nèi)的任意長度,對它的訪問與通常的數(shù)組類似,在取得共享內(nèi)存標(biāo)識符并將共享內(nèi)存與進(jìn)程數(shù)據(jù)段連接后即可開始對之進(jìn)行讀寫操作,在所有操作完成需要解除共享內(nèi)存和進(jìn)程數(shù)據(jù)段的關(guān)系。共享內(nèi)存中的數(shù)據(jù)不會因?yàn)閿?shù)據(jù)被進(jìn)程讀取而消失,且它的訪問不具備鎖機(jī)制處理,即多個進(jìn)程可以同時訪問同一個共享內(nèi)存中的同一個數(shù)據(jù)單元。因此,共享內(nèi)存的使用最好和信號量配合以具備鎖機(jī)制,從而保證數(shù)據(jù)的一致性。在權(quán)限允許時,共享內(nèi)存的信息傳遞是雙向的。共享內(nèi)存處理函數(shù)主要有4個,分別是shmat()、shmdt()、shmget()和shmctl(),說明如下。Shmat()的函數(shù)原型是void*shmat(int shmid,void*shmaddr,hat shmflg),該函數(shù)把由skmid標(biāo)識符標(biāo)識的共享內(nèi)存連接到調(diào)用進(jìn)程的數(shù)據(jù)段中,參數(shù)shmaddr用于指定共享內(nèi)存連接到的數(shù)據(jù)段的地址,但一般設(shè)置為0,表示該共享內(nèi)存連接到的進(jìn)程內(nèi)數(shù)據(jù)段的地址由系統(tǒng)選擇,函數(shù)的返回值為實(shí)際選擇的地址。參數(shù)shmflg控制獲得地址的方式以及讀寫權(quán)限等。若調(diào)用成功則返回共享內(nèi)存段被連接到的數(shù)據(jù)段上的實(shí)際起始地址,否則返回1。shmdt0的函數(shù)原型是void*shmdt(void‘shmaddr),該函數(shù)用于解除shmaddr地址指定的共享內(nèi)存與調(diào)用進(jìn)程數(shù)據(jù)段的聯(lián)系。若調(diào)用成功,返回0,否則返回1。shmget()的函數(shù)原型是int shmget(key t key,int size,int shmflg),該函數(shù)用于創(chuàng)建或取得與key對應(yīng)共享內(nèi)存的標(biāo)識符。共享內(nèi)存的正常創(chuàng)建需要以下條件成立:參數(shù)key等于IPC PRIVATE;參數(shù)key沒有相關(guān)的共享內(nèi)存標(biāo)識符,同時(shmflgamp。IPC_CPEAT)值為真。若調(diào)用成功,返回共享內(nèi)存標(biāo)識符,否則返回1。Shmctl()的函數(shù)原型是int shmcfl(int shmid,int cmd,stract shmid ds*buf),該函數(shù)用于對標(biāo)識符shmid指定的共享內(nèi)存進(jìn)行各種控制操作,操作行為由cmd指定。調(diào)用成功返回0,否則返回1[15]。 信號量信號量(Semaphore)相當(dāng)于一個計數(shù)器,可用于同步多進(jìn)程對共享數(shù)據(jù)對象的訪問。為了獲得共享資源,新城需要執(zhí)行以下操作。(1)測試控制該資源的信號量。(2)若此信號量的值為正,則進(jìn)程可以使用該資源,進(jìn)程將信號量值減l,表示它使用了一個資源單位。(3)若此信號量的值為0,則進(jìn)程進(jìn)入睡眠狀態(tài),直至信號量大于0。當(dāng)進(jìn)程被喚醒后,它返回至第(1)步。當(dāng)進(jìn)程不再使用由一個信號量控制的共享資源時,該信號量值增1。如果有進(jìn)程正在睡眠以等待此信號量,則喚醒它們。為了正確地實(shí)現(xiàn)信號量,信號量值的測試及減1操作應(yīng)當(dāng)是原子操作。為此,信號量通常是在內(nèi)核中實(shí)現(xiàn)的。信號量的處理函數(shù)主要有3個,分別是:semget()、semetl()、scmop()。semget()的函數(shù)原型是int semget(keytkey,intnsems,intflag),該函數(shù)用來獲‘得一個信號量ID或創(chuàng)建一個新的信號量,如果執(zhí)行成功,返回key對應(yīng)信號量的ID;若出錯則返回1。Semctl()的函數(shù)原型是int semctl(int semid,int semnum,int cmd,union$emunarg),其中:union semun{int val; /*for SETVAL*/Struct semid_ds *buf。 /*for IPC_STAT ang IPC_SET*/Ushort *array。 /*for GETVAL and SETALL8*/}。Semop()的函數(shù)原型是int semop(int semid,struct sembuf semoparrayN,size tnops),該函數(shù)自動執(zhí)行信號量集合上的數(shù)組操作,若成功,則返回0,否則返回一l。semoparray是一個指針,它指向一個信號量操作數(shù)組。結(jié)構(gòu)為:struct sembuf{ushort sem_num;short sem_op;short sem_flg;};若sem_op為正,這對應(yīng)于返回進(jìn)程占用的資源,將scm_op的值加到信號量值上。若sem_op為0,這表示希望等待到該信號量值變成0。如果信號量當(dāng)前值是0,則此函數(shù)立即返回。如果信號量值非0,若指定了IFC_NOWAIT,則出錯返回EAGAIN,若未指定IPC NOWAIT,則該信號量的semnt加l,然后調(diào)用進(jìn)程被掛起,直至信號量變成0。 套接字套接字(Socket)是一種特殊的進(jìn)程間通信方式,不同的機(jī)器上的進(jìn)程都可以使用這種方式進(jìn)行通信。socket也有描述符,它完全類似于文件描述符,文件的read、write和close操作可應(yīng)用于socket描述符。socket也有一個類似于open的函數(shù)socket0,該函數(shù)返回一個整形的socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^該socket描述符實(shí)現(xiàn)的?;咎捉幼窒到y(tǒng)調(diào)用主要有以下這些函數(shù);socket()的函數(shù)原型是int socket(int domain,int type,int protoc01),成功返回socket處理代碼,失敗返回1。bind()的函數(shù)原型是imbind(int sockfd,struct sockaddr *my_addr,intaddrlen)。addrlen常被設(shè)置為aizeof(stmct sockaddr)。connect()的函數(shù)原型是im connect(int sockfd,struct sockaddr*serv addr,intddrlen),成功則返回0,否則返回1。acceptO的函數(shù)原型是int accept(int sockfd.,void。addr,int+addrlen),addrlen為一個指向sizeof(struct sockaddr in)的整形指針變量。listen()的函數(shù)原型是imlisten(int sockfd,intbacklg)。send()的函數(shù)原型是int send(int sockfd,const void+msg,hat len,int nags),send()函數(shù)返回實(shí)際發(fā)送的字節(jié)數(shù),失敗返回1。Recv()的函數(shù)原型是int recv(int sockfd,void+bur,int len,unsigned int flags),參數(shù)len為可接收數(shù)據(jù)的最大長度,一般設(shè)為0。select()的函數(shù)原型是hat select(int numfds,fd_set+readfgs,fd_set*writefds,fd set*exceptfds,structtimeval*timeout)。調(diào)用setcct()可以解決調(diào)用非阻塞socket浪費(fèi)資源的問題,它允許把進(jìn)程掛起來,而同時使系統(tǒng)內(nèi)核監(jiān)聽所要求的一組文件描述符的任何活動,主要確認(rèn)在任何被監(jiān)控的文件描述符上出現(xiàn)活動,select()調(diào)用將返回指示該文件描述符已準(zhǔn)備好的信息,從而實(shí)現(xiàn)了為進(jìn)程選出隨機(jī)的變化,而不必由進(jìn)程本身對輸入進(jìn)行測試而浪費(fèi)CPU開銷。re
點(diǎn)擊復(fù)制文檔內(nèi)容
范文總結(jié)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1