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

正文內(nèi)容

北郵計算機網(wǎng)絡實踐第三次實驗報告(編輯修改稿)

2024-10-30 23:03 本頁面
 

【文章內(nèi)容簡介】 tunregister_chrdev(unsigned int major, const char *name)。包括設備注冊在內(nèi),設備驅動的初始化函數(shù)主要完成的功能是有以下5項。(1)對驅動程序管理的硬件進行必要的初始化。對硬件寄存器進行設置。比如,設置中斷掩碼,設置串口的工作方式、并口的數(shù)據(jù)方向等。(2)初始化設備驅動相關的參數(shù)。一般說來,每個設備都要定義一個設備變量,用以保存設備相關的參數(shù)。在這一步驟里對設備變量中的項進行初始化。(3)在內(nèi)核注冊設備。調用register_chrdev()函數(shù)來注冊設備。(4)注冊中斷。如果設備需要IRQ支持,則要使用request_irq()函數(shù)注冊中斷。(5)其他初始化工作。初始化部分一般還負責給設備驅動程序申請包括內(nèi)存、時鐘、I/O端口等在內(nèi)的系統(tǒng)資源,這些資源也可以在open子程序或者其他地方申請。這些資源不用時,應該釋放,以利于資源的共享。若驅動程序是內(nèi)核的一部分,初始化函數(shù)則要按如下方式聲明: int __initchr_driver_init(void)。其中__init是必不可少的,在系統(tǒng)啟動時會由內(nèi)核調用chr_driver_init,完成驅動程序的初始化。當驅動程序是以模塊的形式編寫時,則要按照如下方式聲明: intinit_module(void)當運行后面介紹的insmod命令插入模塊時,會調用init_module函數(shù)完成初始化工作。由于嵌入式設備由于硬件種類非常豐富,在默認的內(nèi)核發(fā)布版中不一定包括所有驅動程序。所以進行嵌入式Linux系統(tǒng)的開發(fā),很大的工作量是為各種設備編寫驅動程序。除非系統(tǒng)不使用操作系統(tǒng),程序直接操縱硬件。嵌入式Linux系統(tǒng)驅動程序開發(fā)與普通Linux開發(fā)沒有區(qū)別??梢栽谟布a(chǎn)廠家或者Internet上尋找驅動程序,也可以根據(jù)相近的硬件驅動程序來改寫,這樣可以加快開發(fā)速度。實現(xiàn)一個嵌入式Linux設備驅動的大致流程如下。(1)查看原理圖,理解設備的工作原理。一般嵌入式處理器的生產(chǎn)商提供參考電路,也可以根據(jù)需要自行設計。(2)定義設備號。設備由一個主設備號和一個次設備號來標識。主設備號惟一標識了設備類型,即設備驅動程序類型,它是塊設備表或字符設備表中設備表項的索引。次設備號僅由設備驅動程序解釋,區(qū)分被一個設備驅動控制下的某個獨立的設備。(3)實現(xiàn)初始化函數(shù)。在驅動程序中實現(xiàn)驅動的注冊和卸載。(4)設計所要實現(xiàn)的文件操作,定義file_operations結構。(5)實現(xiàn)所需的文件操作調用,如read、write等。(6)實現(xiàn)中斷服務,并用request_irq向內(nèi)核注冊,中斷并不是每個設備驅動所必需的。(7)編譯該驅動程序到內(nèi)核中,或者用insmod命令加載模塊。(8)測試該設備,編寫應用程序,對驅動程序進行測試。五、基本接口實驗在完成了基本實驗后,我們開始著手基本接口實驗。在這些實驗中,我們學習如何編寫設備驅動程序,及如何用測試程序檢驗驅動程序是否正確,并通過改寫測試程序正常地對驅動程序進行相關操作。 簡單設備驅動程序本次實驗的任務是編寫一個字符型設備驅動程序,并學習在應用程序中調用驅動??紤]到我們初次接觸驅動程序的編寫,對此還十分陌生,因此指導書中提供了本次實驗所要用到的程序源代碼。雖然這樣一個字符型設備驅動程序并沒有任何實際作用,但是它讓我們輕松掌握了嵌入式驅動的編寫過程,因為復雜繁瑣的驅動,其骨架都是相同的。因此,看懂本實驗的源代碼,學習并模仿其編寫方法,對于后續(xù)實驗有著非常重要的意義。 CPU GPIO驅動程序設計在本實驗中,我們要編寫第一個針對實際硬件的驅動程序。我們知道,凡是操作系統(tǒng)控制外部設備,即使是最簡單的硬件電路,也是需要驅動的。本實驗涉及的外部硬件只有電阻和發(fā)光二極管。我們使用自己編寫的驅動程序與應用程序控制 GPIO96的電平,通過 LED 的亮滅來判斷,是否 CPU 做出了正確的響應。補充代碼(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”)。endifreturn count。}補充代碼(2)//OPENssize_tSIMPLE_GPIO_LED_open(structinode * inode ,struct file * file){ ifdef OURS_GPIO_LED_DEBUG printk(“SIMPLE_GPIO_LED_open [kernel]n”)。endifMOD_INC_USE_COUNT。return 0。}補充代碼(3)//structfile_operationsGPIO_LED_ctl_ops ={ open:SIMPLE_GPIO_LED_open, read:SIMPLE_GPIO_LED_read, write:SIMPLE_GPIO_LED_write, ioctl:SIMPLE_GPIO_LED_ioctl, release:SIMPLE_GPIO_LED_release, }。實驗作業(yè)要求在目標板上LED閃爍產(chǎn)生亮7秒,滅2秒的效果 在測試程序中有這樣一段代碼: while(1){ ioctl(fd,LED_OFF)。sleep(1)。sleep(1)。while(1){ ioctl(fd,LED_OFF)。sleep(2)。sleep(7)。} 中斷實驗// 滅2秒 // 亮7秒 ioctl(fd,LED_ON)。}// 休眠1秒ioctl(fd,LED_ON)。只需將上面的代碼改為如下代碼即可:在理論課中,我們學習了許多中斷方面的知識,包括中斷向量、中斷優(yōu)先級、中斷過程等。在PXA270系統(tǒng)里,中斷控制器分外部設備和 PXA270X 處理器設備產(chǎn)生的兩個層次的中斷,前者是初級的中斷源,后者是次級中斷源,大量的次級中斷源通常被映射為一個初級中斷源。補充代碼1 voidshowversion(void){ printk(“*********************************************n”)。printk(“t %s tn”, VERSION)。printk(“*********************************************nn”)。} static intSimpleINT_temp_count = 0。補充代碼2 //READssize_tSIMPLE_INT_read(struct file * file ,char * buf, size_t count, loff_t * f_ops){ifdef OURS_INT_DEBUGendif return count。printk(“SIMPLE_INT_read [kernel]n”)。} 補充代碼3 //WRITEssize_tSIMPLE_INT_write(struct file * file ,const char * buf, size_t count, loff_t * f_ops){ifdef OURS_INT_DEBUG} 補充代碼4 //structfile_operationsINT_ctl_ops ={ open: SIMPLE_INT_open, read: SIMPLE_INT_read, endif return count。printk(“SIMPL_INT_write [kernel]n”)。write:SIMPLE_INT_write, ioctl:SIMPLE_INT_ioctl, release:SIMPLE_INT_release, }。通過此實驗,我了解了硬件中斷管腳與中斷號的對應關系,以及中斷號與中斷處理程序的對應關系,對于今后編寫更為復雜的中斷程序打下基礎。數(shù)碼管顯示實驗在此實驗中,我們要編寫針對 74LV164 的驅動程序,并用其串并轉換功能來控制八段LED數(shù)碼管的顯示。補充代碼1 voidshowversion(void){ printk(“*********************************************n”)。printk(“t %s tn”, VERSION)。printk(“*********************************************nn”)。} 補充代碼2 //READssize_tSERIAL_LED_read(struct file * file ,char * buf, size_t count, loff_t * f_ops){ ifdef OURS_HELLO_DEBUG} 補充代碼3 //WRITEssize_tSERIAL_LED_write(struct file * file ,const char * buf, size_t count, loff_t * f_ops)return count。printk(“SERIAL_LED_read [kernel]n”)。endif { ifdef OURS_HELLO_DEBUG} 補充代碼4 //IOCTLssize_tSERIAL_LED_ioctl(structinode * inode ,struct file * file, unsigned intcmd, long data){ ifdef OURS_HELLO_DEBUGendif} 補充代碼5 //OPENssize_tSERIAL_LED_open(structinode * inode ,struct file * file){ ifdef OURS_HELLO_DEBUGendifreturn 0。} MOD_INC_USE_COUNT。printk(“SERIAL_LED_open [kernel]n”)。return 0。printk(“SERIAL_LED_ioctl [kernel]n”)。return count。endif write_byte(* buf)。printk(“SERIAL_LED_write [kernel]n”)。補充代碼6 //RELEASE/CLOSEssize_tSERIAL_LED_release(structinode *inode ,struct file * file){ ifdef OURS_HELLO_DEBUGprintk(“SERIAL_LED_release [kernel]n”)。endif MOD_DEC_USE_COUNT。return 0。} 補充代碼7 //structfile_operationsSERIAL_LED_ops ={ open: SERIAL_LED_open,read: SERIAL_LED_read,write:SERIAL_LED_write,ioctl:SERIAL_LED_ioctl,release:SERIAL_LED_release, }。補充代碼8 staticint __initHW_SERIAL_LED_init(void){ int ret =ENODEV。ret =devfs_register_chrdev(SERIAL_LED_MAJOR, amp。SERIAL_LED_ops)。showversion()。if(ret 0)“serial_led_ctl”,} {} else { } return ret。printk(“ pxa270 serial_led_driver register success!![kernel]n”)。printk(“ pxa270 init_module failed with %dn [kernel]”, ret)。return ret。補充代碼9 staticint __init pxa270_SERIAL_LED_init(void){ int ret =ENODEV。printk(“pxa270_SERIAL_LED_init [kernel]n”)。endifret = HW_SERIAL_LED_init()。if(ret)return ret。return 0。} 補充代碼10 static void __exit cleanup_SERIAL_LED(void){ ifdef OURS_HELLO_DEBUG ifdef OURS_HELLO_DEBUGendif }補充代碼11 MODULE_DESCRIPTION(“serial_led driver module”)。MODULE_AUTHOR(“l(fā)iduo”)。MODULE_LICENSE(“GPL”)。module_init(pxa270
點擊復制文檔內(nèi)容
黨政相關相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1