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

正文內(nèi)容

數(shù)碼相框設(shè)計(jì)與使用畢業(yè)論文(編輯修改稿)

2025-07-25 14:37 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 循環(huán)播放。在實(shí)現(xiàn)暫停功能時(shí),使用到了Linux系統(tǒng)的sem__post()和sem_waitOi函數(shù),設(shè)置一個(gè)全局信號(hào)量sem__pause,暫停時(shí)使用sem_wait(amp。sem_pause)即可將當(dāng)前線(xiàn)程掛起,要恢復(fù)暫停時(shí)則使用set_post(amp。sem_pause),線(xiàn)程會(huì)從剛才的狀態(tài)繼續(xù)往下運(yùn)行。進(jìn)程就是運(yùn)行的程序,就是說(shuō)一個(gè)程序加載到內(nèi)存后就變?yōu)檫M(jìn)程。進(jìn)程在Multics操作系統(tǒng)出現(xiàn)前叫工作(job).工作是IBM用于多道批處理程序中用到的概念。歷史原因最后改為進(jìn)程(process)。在之前的操作系統(tǒng)中CPU的利用率很低,為了提高CPU的利用率人們將多個(gè)程序同時(shí)加載到計(jì)算機(jī)里,并發(fā)執(zhí)行,這些加載到內(nèi)存中的程序就成了進(jìn)程。所以進(jìn)程的引入實(shí)現(xiàn)了多道編程。進(jìn)程的產(chǎn)生主要有以下幾種情況:系統(tǒng)初始化 執(zhí)行進(jìn)程創(chuàng)立程序 用戶(hù)請(qǐng)求創(chuàng)建新進(jìn)程。造成進(jìn)程消亡的事件主要分為4中。壽終:進(jìn)程運(yùn)行完成而退出。自殺:進(jìn)程因錯(cuò)誤而自行退出。他殺:進(jìn)程被其他進(jìn)程強(qiáng)行“殺死”。 處決:進(jìn)程因異常而強(qiáng)行終結(jié)。前兩種情況都是自愿退出,后兩種情況被動(dòng)退出。首先進(jìn)程至少有執(zhí)行和掛起兩種狀態(tài)。一般情況下進(jìn)程分為執(zhí)行、阻塞、就緒3終狀態(tài)。他們之間的關(guān)系為:執(zhí)行就緒、執(zhí)行阻塞、阻塞就緒和就緒執(zhí)行。進(jìn)程的特征:動(dòng)態(tài)性:進(jìn)程的基本特征;并發(fā)性:多個(gè)進(jìn)程實(shí)體,同存于內(nèi)存中,在同一時(shí)間內(nèi)同時(shí)運(yùn)行,并發(fā)性是進(jìn)程的重要特征。獨(dú)立性:進(jìn)程實(shí)體是一個(gè)能獨(dú)立運(yùn)行的基本單位,同時(shí)也是系統(tǒng)中獨(dú)立獲得資源和獨(dú)立調(diào)度的基本單位。異步性:進(jìn)程按各自獨(dú)立的、不可預(yù)知的速度向前推進(jìn)。結(jié)構(gòu)特性:從結(jié)構(gòu)上看,進(jìn)程是有程序段、數(shù)據(jù)段及進(jìn)程控制塊三部分組成。進(jìn)程的控制函數(shù)有以下幾個(gè):()函數(shù)——?jiǎng)?chuàng)建進(jìn)程。()函數(shù)——可以使子進(jìn)程執(zhí)行另一個(gè)程序;()和waitpid()函數(shù)——父進(jìn)程用來(lái)給子進(jìn)程收尸;()——終止進(jìn)程;進(jìn)程間通信通常有三種方式:(pipe):管道是一種單工通信的方式,要想實(shí)現(xiàn)兩個(gè)進(jìn)程間的相互通信就需要兩個(gè)管道一才能實(shí)現(xiàn)。:fifo通信的前提是兩個(gè)進(jìn)程能夠訪(fǎng)問(wèn)到相同的地址空間的內(nèi)容,linux內(nèi)核為fifo提供的有這樣一個(gè)空間,在內(nèi)核里里有1G的空間,是內(nèi)核共享的,當(dāng)進(jìn)程創(chuàng)造時(shí),進(jìn)程擁有自己獨(dú)立的堆棧即數(shù)據(jù)段等,彼此之間的數(shù)據(jù)訪(fǎng)問(wèn)是獨(dú)立的,而操作系統(tǒng)在內(nèi)核里提供了1G的空間是可以共同訪(fǎng)問(wèn)的。:mmap函數(shù)的作用是將一段空間映射到內(nèi)存上,可選有兩種方式,一種是只讀映射(即修改內(nèi)存的數(shù)值時(shí)不影響原地址里數(shù)值),另一種就是共享映射(即改變內(nèi)存的值的同時(shí)也改變?cè)吹刂返闹?。通過(guò)這樣一種方式,可以讓兩個(gè)進(jìn)程需要通信的地址映射到相同的內(nèi)存空間通過(guò)共享映射的方式,也可以實(shí)現(xiàn)進(jìn)程間的通信。而對(duì)于通信來(lái)書(shū),信號(hào)是不具有通信功能的,但在進(jìn)程的操作中也占有一定的比重。 信號(hào)操作的特點(diǎn)是簡(jiǎn)單、及時(shí)。只有在產(chǎn)生相應(yīng)的信號(hào)是才會(huì)有用,同時(shí),信號(hào)可以通過(guò)自己編寫(xiě)代碼實(shí)現(xiàn)自己所需要的功能。關(guān)鍵代碼實(shí)現(xiàn):void play(int id, char *filename){ int fd_mp3。 while(1) { if((fd_mp3 = open(filename, O_RDONLY)) 0){ fprintf(stderr, Open mp3 %s\n, strerror(errno))。 return。 } struct stat stat。 void *fdm。 if((fstat(fd_mp3, amp。stat) == 1) || ( == 0)) { fprintf(stderr, Error stat file)。 return。 } fdm = mmap(0, , PROT_READ, MAP_SHARED, fd_mp3, 0)。 if (fdm == NULL) { fprintf(stderr, mmap file %s\n, strerror(errno))。 exit(1)。 } decode(fdm, , id)。 munmap(fdm, )。 }根據(jù)進(jìn)程相互間獨(dú)立的特征,音樂(lè)功能需要用到兩個(gè)進(jìn)程來(lái)實(shí)現(xiàn)。當(dāng)進(jìn)入到mouse主函數(shù)中是,在該函數(shù)中會(huì)進(jìn)行一個(gè)死循環(huán),要不斷的進(jìn)行判斷在某個(gè)功能函數(shù)并且有事件要處理。當(dāng)剛啟動(dòng)電子相冊(cè)時(shí),程序處在主菜單界面等待操作,一旦判斷到鼠標(biāo)點(diǎn)擊了音樂(lè)按鈕時(shí),程序就會(huì)進(jìn)入到music的功能函數(shù)中執(zhí)行,首先做的就是重刷屏幕,換成音樂(lè)界面的圖片。還要設(shè)置相應(yīng)的標(biāo)志位用以說(shuō)明已經(jīng)在音樂(lè)界面了。fork()產(chǎn)生的子進(jìn)程則主要用來(lái)播放音樂(lè)。主進(jìn)程做的事情就是在mouse函數(shù)和music功能函數(shù)之間不斷的轉(zhuǎn)換,保證鼠標(biāo)位置的更新,同時(shí)要保證有操作時(shí)能夠及時(shí)的進(jìn)行響應(yīng)。這樣,音樂(lè)的播放和鼠標(biāo)的操作可以同時(shí)的進(jìn)行,相互直接沒(méi)有直接的關(guān)聯(lián)。但是主進(jìn)程要控制鼠標(biāo)的播放和暫停還有歌曲的切換,這樣就需要兩個(gè)進(jìn)程之間能夠相互通信,本設(shè)計(jì)關(guān)于通信的問(wèn)題采用較簡(jiǎn)單方便的信號(hào)來(lái)進(jìn)行。首先在子進(jìn)程編寫(xiě)好相應(yīng)的信號(hào)撲捉函數(shù)和處理函數(shù),在主進(jìn)程里,當(dāng)有操作時(shí),、發(fā)送相應(yīng)的信號(hào)就可以實(shí)現(xiàn)。比如SIGKILL信號(hào),當(dāng)主進(jìn)程檢測(cè)到點(diǎn)擊了退出music功能時(shí),就給子進(jìn)程發(fā)送一個(gè)SIGKILL信號(hào),自己播放音樂(lè)時(shí)檢測(cè)到有SIGKILL信號(hào)到來(lái)了,就調(diào)用kill()函數(shù)將自己殺死,結(jié)束音樂(lè)的播放。Music模塊的程序流程圖如圖31所示: 進(jìn)入Music模塊首次進(jìn)入?繪制背景YN切換歌曲?返回鼠標(biāo)主函數(shù)繪制背景N切換歌表頁(yè)?YN隱藏/顯示切換Y隱藏/顯示歌表?N播放/暫停切換Y播放/暫停歌曲?N音樂(lè)切換Y Preview功能實(shí)現(xiàn)的設(shè)計(jì) Preview功能描述preview功能作為電子相冊(cè)的一個(gè)不可少的部分,它的功能主要是提供照片的預(yù)覽。當(dāng)進(jìn)入preview共能中后,會(huì)在屏幕上展現(xiàn)出多張圖片,可以通過(guò)上/下頁(yè)按鈕切換頁(yè)面,通過(guò)這種方式進(jìn)行一個(gè)快速的預(yù)覽查看。除簡(jiǎn)單的預(yù)覽功能外,還提供了照片放大的功能,可以通過(guò)此方式來(lái)更清楚的觀(guān)賞圖片。本模塊中,在圖片加載之前,程序會(huì)自動(dòng)搜索根目錄下所有的jpg格式的圖片,以圖片墻的方式顯示在屏幕上,鼠標(biāo)單擊,被選中的圖片會(huì)在屏幕中央放大顯示,再次點(diǎn)擊圖片又會(huì)恢復(fù)原裝。,在屏幕右下角有上一頁(yè)和下一頁(yè)的功能,方便翻閱。 關(guān)鍵代碼實(shí)現(xiàn):void read_dir_jpg(char *path){ struct dirent *dir_st。 DIR *dir。 char path_r[1024], *name, ch[1024]。 if((dir= opendir(path)) != NULL) { while((dir_st = readdir(dir)) != NULL) { if(dir_std_type == DT_DIR) { if((strcmp(dir_std_name, .) != 0) amp。amp。 (strcmp(dir_std_name, /) != 0)amp。amp。(strcmp(dir_std_name, ..) != 0) amp。amp。strstr(dir_std_name,.) == NULL) { if(strcmp(path, /) == 0) { sprintf(path_r, %s%s,path, dir_std_name)。 read_dir_jpg(path_r)。 } else { sprintf(path_r, %s/%s,path, dir_std_name)。 read_dir_jpg(path_r)。 } } } else { int fd。 if((name = strstr(dir_std_name, .jpg)) != NULL) { sprintf(ch, %s/%s\n,path, dir_std_name)。 if((fd = open(, O_APPEND|O_CREAT|O_WRONLY, 0755))) { write(fd, ch, strlen(ch))。 n++。 close(fd)。 } } } } } closedir(dir)。 Framebuffer的簡(jiǎn)單介紹FrameBuffer 是出現(xiàn)在 內(nèi)核當(dāng)中的一種驅(qū)動(dòng)程序接口。Linux 是工作在保護(hù)模式下,所以用戶(hù)態(tài)進(jìn)程是無(wú)法象 DOS 那樣使用顯卡BIOS里提供的中斷調(diào)用來(lái)實(shí)現(xiàn)直接寫(xiě)屏,Linux抽象出 FrameBuffer 這個(gè)設(shè)備來(lái)供用戶(hù)態(tài)進(jìn)程實(shí)現(xiàn)直接寫(xiě)屏。Framebuffer 機(jī)制模仿顯卡的功能,將顯卡硬件結(jié)構(gòu)抽象掉,可以通過(guò) Framebuffer 的讀寫(xiě)直接對(duì)顯存進(jìn)行操作。用戶(hù)可以將Framebuffer 看成是顯示內(nèi)存的一個(gè)映像,將其映射到進(jìn)程地址空間之后,就可以直接進(jìn)行讀寫(xiě)操作,而寫(xiě)操作可以立即反應(yīng)在屏幕上。但 Framebuffer 本身不具備任何運(yùn)算數(shù)據(jù)的能力,就只好比是一個(gè)暫時(shí)存放水的水池。CPU 將運(yùn)算后的結(jié)果放到這個(gè)水池,水池再將結(jié)果流到顯示器。中間不會(huì)對(duì)數(shù)據(jù)做處理。應(yīng)用程序也可以直接讀寫(xiě)這個(gè)水池的內(nèi)容。在這種機(jī)制下,盡管 Framebuffer需要真正的顯卡驅(qū)動(dòng)的支持,但所有顯示任務(wù)都有CPU完成,因此CPU負(fù)擔(dān)很重。framebuffer 的設(shè)備文件一般是 /dev/fb0、/dev/fb1 等等??梢杂妹?dd if=/dev/zero of=/dev/fb 清空屏幕。如果顯示模式是1024x7688位色,用命令:$ dd if=/dev/zero of=/dev/fb0,bs=1024 count=768 清空屏幕;用命令: dd if=/dev/fb of=fbfile 可以將 fb 中的內(nèi)容保存下來(lái);可以重新寫(xiě)回屏幕: dd if=fbfile of=/dev/fb;在使用 Framebuffer 時(shí),Linux 是將顯卡置于圖形模式下的。在應(yīng)用程序中,一般通過(guò)將 FrameBuffer 設(shè)備映射到進(jìn)程地址空間的方式使用,比如下面的程序就打開(kāi) /dev/fb0 設(shè)備,并通過(guò) mmap 系統(tǒng)調(diào)用進(jìn)行地址映射,隨后用 memset 將屏幕清空(這里假設(shè)顯示模式是 1024x7688 位色模式,線(xiàn)性?xún)?nèi)存模式):int fb。
unsigned char* fb_mem。
fb=open(/dev/fb0, O_RDWR)。
fb_mem=mmap (NULL, 1024*768,PROT_READ|PROT_WRITE,MAP_SHARED,fb,0)。
memset (fb_mem, 0, 1024*768)。 //這個(gè)命令應(yīng)該只有在 root 可 以執(zhí)行FrameBuffer 設(shè)備還提供了若干 ioctl 命令,通過(guò)這些命令,可以獲得顯示設(shè)備的一些固定信息(比如顯示內(nèi)存大小)、與顯示模式相關(guān)的可變信息(比如分辨率、象素結(jié)構(gòu)、每掃描線(xiàn)的字節(jié)寬度),以及偽彩色模式下的調(diào)色板信息等等。通過(guò) FrameBuffer 設(shè)備,還可以獲得當(dāng)前內(nèi)核所支持的加速顯示卡的類(lèi)型(通過(guò)固定信息得到),這種類(lèi)型通常是和特定顯示芯片相關(guān)的。比如目前最新的內(nèi)核()中,就包含有對(duì)SMatrox、nVidia、3Dfx等等流行顯示芯片的加速支持。在獲得了加速芯片類(lèi)型之后,應(yīng)用程序就可以將PCI設(shè)備的內(nèi)存I/O(memio)映射到進(jìn)程的地址空間。這些memio一般是用來(lái)控制顯示卡的寄存器,通過(guò)對(duì)這些寄存器的操作,應(yīng)用程序就可以控制特定顯卡的加速功能。PCI 設(shè)備可以將自己的控制寄存器映射到物理內(nèi)存空間,而后,對(duì)這些控制寄存器的訪(fǎng)問(wèn),給變成了對(duì)物理內(nèi)存的訪(fǎng)問(wèn)。因此,這些寄存器又被稱(chēng)為memio。一旦被映射到物理內(nèi)存,Linux的普通進(jìn)程就可以通過(guò)mmap將這些內(nèi)存I/O映射到進(jìn)程地址空間,這樣就可以直接訪(fǎng)問(wèn)這些寄存器了。當(dāng)然,因?yàn)椴煌娘@示芯片具有不同的加速能力,對(duì)memio的使用和定義也各自不同,這時(shí),就需要針對(duì)加速芯片的不同類(lèi)型來(lái)編寫(xiě)實(shí)現(xiàn)不同的加速功能。比如大多數(shù)芯片都提供了對(duì)矩形填充的硬件加速支持但不同的芯片實(shí)現(xiàn)方式不同,這時(shí),就需要針對(duì)不同的芯片類(lèi)型編寫(xiě)不同的用來(lái)完成填充矩形的函數(shù)。
FrameBuffer只是一個(gè)提供顯示內(nèi)存和顯示芯片寄存器從物理內(nèi)存映射到進(jìn)程地址空間中的設(shè)備。FrameBuffer 設(shè)備驅(qū)動(dòng)基于如下兩個(gè)文件:
1) linux/include/linux/
2) linux/drivers/video/
下面就 中的主要結(jié)構(gòu)進(jìn)行分析
fb_var_screeninfo這個(gè)結(jié)構(gòu)描述了顯卡的特性
說(shuō)明:__u32 代表 unsigned 無(wú)符號(hào)32 bits數(shù)據(jù)類(lèi)型,其余類(lèi)推。
這是Linux內(nèi)核中所用到的數(shù)據(jù)類(lèi)型,如果是開(kāi)發(fā)用戶(hù)空間(userspace)的程序,可以根據(jù)具體計(jì)算機(jī)平臺(tái)的情況,用unsigned long等來(lái)代替Struct fb_var_screeninfo
{
__u32 xres。
__u32 yres。
__u32 xres_virtual。
__u32 yres_virtual。
__u32 xoffset。
/* visible resolution */
/* virtual resolution */
/* offset from virtual to visible resolution */__u32 yoffset。
__u32 bits_p
點(diǎn)擊復(fù)制文檔內(nèi)容
試題試卷相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1