欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      北郵數(shù)據(jù)庫實(shí)驗(yàn)報(bào)告

      時間:2019-05-14 21:02:26下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《北郵數(shù)據(jù)庫實(shí)驗(yàn)報(bào)告》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《北郵數(shù)據(jù)庫實(shí)驗(yàn)報(bào)告》。

      第一篇:北郵數(shù)據(jù)庫實(shí)驗(yàn)報(bào)告

      數(shù)據(jù)庫實(shí)驗(yàn)報(bào)告

      (三)姓名:學(xué)號:班級:

      1.用Transact-SQL語句、數(shù)據(jù)導(dǎo)入、SQL Server Management Studio(企業(yè)管理器)輸入的方法對所給定的8張表的數(shù)據(jù)輸入到數(shù)據(jù)庫中。自行決定每張表的數(shù)據(jù)導(dǎo)入辦法,但每種方法各針對二或三張表。

      ? Transact-SQL語句: 導(dǎo)入department,student, student_course表。

      insertinto department select*from openrowset

      ('microsoft.jep.oledb.4.0','excel 5.0;hdr=yes;database=D:課件數(shù)據(jù)庫database2.xls',department$);

      insertinto student select*from openrowset

      ('microsoft.jep.oledb.4.0','excel 5.0;hdr=yes;database=D:課件數(shù)據(jù)庫database2.xls',student$);

      insertinto student_course select*from openrowset

      ('microsoft.jep.oledb.4.0','excel 5.0;hdr=yes;database=D:課件數(shù)據(jù)庫database2.xls',student_course$);

      ? 數(shù)據(jù)導(dǎo)入:

      操作:選中數(shù)據(jù)庫studentsdb,右鍵-任務(wù)-導(dǎo)入數(shù)據(jù)。導(dǎo)入book, class, course表。

      SQL Server Management Studio: 操作:右鍵需要編輯的表,選擇編輯前200行。

      Teacher:

      Teacher_course_class:

      導(dǎo)入結(jié)果: Book:

      Class:

      Course:

      Department:

      Student:

      Student_course:

      Teacher:

      Teacher_course_class:

      2.用Transact-SQL向Course表中插入一條記錄,course_name為空,看運(yùn)行的結(jié)果。

      SQL語句:

      INSERTINTO course VALUES('dep02_s002', null,'dep02_s002', '72', '5', '4');運(yùn)行結(jié)果:

      分析:course_name有not null的約束,因此這條語句不能執(zhí)行。

      3.用Transact-SQL修改Course表中credit為5的記錄,將其credit改為7, credit小于4的改為2,看運(yùn)行的結(jié)果。

      SQL語句:

      update course set credit=7 where credit=5;執(zhí)行結(jié)果:

      分析:約束C1指定了credit的范圍為1至6.SQL語句:

      update course set credit=2 where credit<4;執(zhí)行結(jié)果:

      4.刪除一條學(xué)生記錄,看運(yùn)行結(jié)果,對運(yùn)行結(jié)果進(jìn)行分析。SQL語句:

      deletefrom student where student_id='g9940201';執(zhí)行結(jié)果:

      分析:因?yàn)橛袇⒄胀暾约s束,不能刪除。

      5.用Transact-SQL完成將編號為dep04_b001的課程的選修信息插入到一個新的選課信息表中。

      SQL語句:

      Creattablestudent_course2(course_idchar(20), student_idchar(20)gradeint, creditint, semesterint,school_yearchar(20),primarykey(course_id,student_id));

      insertintostudent_course2 select*fromstudent_course wherecourse_id='dep04_b001';執(zhí)行結(jié)果:

      6.用Transact-SQL完成刪除單片機(jī)原理課程的選課信息,分析運(yùn)行結(jié)果。

      SQL語句:

      deletefrom student_course where course_id in(select course_id from course

      where course_name='單片機(jī)原理')執(zhí)行結(jié)果: 分析:所有課程號為dep04_s003的課程被刪除。

      本實(shí)驗(yàn)中遇到的問題和解決方法:

      本實(shí)驗(yàn)的順利完成需要預(yù)先作很多準(zhǔn)備工作。以下就是我在遇到缺少組件accessdatabaseengine時的解決過程的記錄。

      AccessDatabaseEngine的安裝

      accessdatabaseengine用于和office連接,導(dǎo)入導(dǎo)出數(shù)據(jù),本實(shí)驗(yàn)中需要導(dǎo)入excel文件。安裝配合office的版本,我安裝的是accessdatabaseengine2017(English)版本。安裝32位版本,因office2016是32位。之前誤操作安裝了不能使用的老舊版本accessdatabaseengine2007,通過控制面板-應(yīng)用程序卸載將其卸載了。安裝accessdatabaseengine依然報(bào)錯,是因?yàn)閙icrosoftofficeclicktorun阻礙sqlserver的一些功能,需要將其卸載。這是微軟推出的用于減少office打開速度的應(yīng)用程序,安裝office2016時會自動安裝上,原理是開機(jī)時將一部分內(nèi)容放到內(nèi)存中,因此打開文件時會更快一些。檢測自己的office是通過clickto run 還是MSI安裝的,可以在word中點(diǎn)擊文件-賬戶,查看產(chǎn)品信息,如果有下圖中“office更新”這個選項(xiàng),則說明安裝過click to run。這個程序在控制面板-應(yīng)用程序中找不到,因此用刪除注冊表的方式卸載??旖萱I“win+R”輸入“regedit”打開注冊表編輯器,左邊HKEY_CLASSES_ROOT-Installer-Product-00006開頭的選項(xiàng),有四個。單擊這幾個選項(xiàng),在右側(cè)查看詳細(xì)信息,可以看到ProductNam是Microsoft Access database engine 2007(我原來誤安裝的老版本)。刪除之前先備份注冊表。方法一:選中要刪除的文件,右鍵-導(dǎo)出,保存。只保存了要刪除的文件。方法二:注冊表編輯器,文件-導(dǎo)出,保存。保存了注冊表所有信息。這是因?yàn)槿绻`刪了重要文件會導(dǎo)致嚴(yán)重后果,可能需要重裝系統(tǒng),留此備份是為了可以恢復(fù)系統(tǒng)。

      備份完之后,選中要刪除的文件(00006開頭的四個),右鍵-刪除即可。回到Access database engine 32位的程序安裝包,安裝。我無法安裝64位,可能是因?yàn)閛ffice是32位。安裝成功之后就可以在sqlserver中導(dǎo)入excel文件了。

      第二篇:北郵數(shù)據(jù)庫第一次實(shí)驗(yàn)報(bào)告

      《數(shù)據(jù)庫原理》實(shí)驗(yàn)報(bào)告

      實(shí)驗(yàn)名稱班

      級組

      號組員姓名 數(shù)據(jù)庫實(shí)驗(yàn)平臺的安裝、數(shù)據(jù)庫創(chuàng)建與維護(hù)實(shí)驗(yàn)

      計(jì)算機(jī)科學(xué)與技術(shù)8班2011211308

      梁展偉、李安

      一、實(shí)驗(yàn)?zāi)康?/p>

      1.通過對Microsoft SQL Server數(shù)據(jù)庫的安裝和簡單使用:

      (1)了解安裝Microsoft SQL Server數(shù)據(jù)庫的軟硬件環(huán)境和安裝方法;(2)熟悉Microsoft SQL Server數(shù)據(jù)庫相關(guān)使用;(3)熟悉Microsoft SQL Server數(shù)據(jù)庫的構(gòu)成和相關(guān)工具;

      (4)通過Microsoft SQL Server數(shù)據(jù)庫的使用來理解數(shù)據(jù)庫系統(tǒng)的基本概念。

      2.通過創(chuàng)建數(shù)據(jù)庫、并進(jìn)行相應(yīng)的維護(hù),了解并掌握Microsoft SQL Server數(shù)據(jù)庫數(shù)據(jù)庫的創(chuàng)建和維護(hù)的不同方法和途徑,并通過這一具體的數(shù)據(jù)庫理解實(shí)際數(shù)據(jù)庫所包含的各要素。

      二、實(shí)驗(yàn)環(huán)境

      Windows7下的Microsoft SQL Server 2012 standard edition。

      三、實(shí)驗(yàn)內(nèi)容與步驟

      一、Microsoft SQL Server數(shù)據(jù)庫安裝

      1.下載相應(yīng)版本。選擇實(shí)驗(yàn)室Windows XP或者Win7系統(tǒng)或者虛擬機(jī)(vmware)上自行安裝的操作系統(tǒng)或者是自己的機(jī)器之一安裝該版本的Microsoft SQL Server??蛇x版本有Microsoft SQL Server 2005/2008或者2012的Express,Develop或者Enterprise等各版本。安裝時通??赏瑫r安裝SQL Server Management Studio Express,以后建立數(shù)據(jù)庫等很方便。

      2.練習(xí)啟動和停止數(shù)據(jù)庫服務(wù)。

      打開控制面板|管理工具|服務(wù),找出與所使用數(shù)據(jù)庫相關(guān)的服務(wù),嘗試停止和啟動它們。再使用SQL Server Configuration Manager下的SQL Server Services選項(xiàng)進(jìn)行相關(guān)操作。最后保持這些服務(wù)為啟動狀態(tài)。如果這些服務(wù)沒有啟動,非??赡軐?dǎo)致數(shù)據(jù)庫系統(tǒng)無法工作,從而后續(xù)實(shí)驗(yàn)無法進(jìn)行。

      二、熟悉Microsoft SQL Server數(shù)據(jù)庫基本用戶界面:

      1. 請運(yùn)行SQL Server Management Studio Express。熟悉數(shù)據(jù)庫管理系統(tǒng)的基本用戶界面。

      三、使用Microsoft SQL Server創(chuàng)建數(shù)據(jù)庫: 1.Microsfot SQL Server數(shù)據(jù)庫創(chuàng)建(1)了解數(shù)據(jù)庫系統(tǒng)的命令行操作界面:

      編寫包含CREATE DATABASE命令的腳本文件,SQL Server Management Studio Express下打開該文件并執(zhí)行之。

      如下圖,新創(chuàng)建的數(shù)據(jù)庫lian出現(xiàn)在數(shù)據(jù)庫目錄中:

      (2)SQL Server Management Studio Express下使用向?qū)?chuàng)建數(shù)據(jù)庫。并將創(chuàng)建數(shù)據(jù)庫腳本保存到文件中。打開文件查看相應(yīng)命令。理解用戶界面上相關(guān)參數(shù)。后續(xù)實(shí)驗(yàn)也同樣的學(xué)習(xí)腳本和理解參數(shù)的要求。

      連接參數(shù)的意義就是與其他的數(shù)據(jù)庫進(jìn)行連接;查詢即使用數(shù)據(jù)庫查詢語言對已選擇數(shù)據(jù)庫進(jìn)行查詢

      (3)找出系統(tǒng)數(shù)據(jù)庫,查看其下的表及其它數(shù)據(jù)庫對象。

      四、Microsoft SQL Server數(shù)據(jù)庫維護(hù)

      (1)對數(shù)據(jù)庫屬性和參數(shù)進(jìn)行查詢、相應(yīng)的修改和維護(hù),內(nèi)容包括:

      a)調(diào)整數(shù)據(jù)庫的大小,完成數(shù)據(jù)庫大小的增加、減小;

      b)增加文件組;

      c)修改日志文件的最大值;

      d)查看數(shù)據(jù)庫的屬性值。

      (2)數(shù)據(jù)庫的刪除

      a)使用腳本文件刪除數(shù)據(jù)庫。

      命令 drop database 如圖,先前的數(shù)據(jù)庫lian已被刪除:

      b)使用SQL Server Management Studio Express刪除數(shù)據(jù)庫

      直接右擊該數(shù)據(jù)庫,選擇刪除命令。

      四、實(shí)驗(yàn)要求

      1. Microsoft SQL Server數(shù)據(jù)庫的安裝實(shí)驗(yàn)要求學(xué)生在微機(jī)上安裝Microsoft SQL Server數(shù)據(jù)庫數(shù)據(jù)庫系統(tǒng),為后續(xù)各個實(shí)驗(yàn)搭建實(shí)驗(yàn)環(huán)境。

      2. 數(shù)據(jù)庫創(chuàng)建與維護(hù)實(shí)驗(yàn)以GSM網(wǎng)絡(luò)配置數(shù)據(jù)庫為背景,要求面向具體應(yīng)用領(lǐng)域,利用Microsoft SQL Server數(shù)據(jù)庫相關(guān)機(jī)制,創(chuàng)建并維護(hù)數(shù)據(jù)庫系統(tǒng),為后續(xù)各個實(shí)驗(yàn)提供前期準(zhǔn)備。

      3. 要求學(xué)生根據(jù)以上要求確定實(shí)驗(yàn)步驟,獨(dú)立完成以上實(shí)驗(yàn)內(nèi)容。并在安裝和數(shù)據(jù)庫運(yùn)行后熟悉Microsoft SQL Server數(shù)據(jù)庫的各種運(yùn)行管理。

      4.對實(shí)驗(yàn)結(jié)果進(jìn)行總結(jié)和分析;給出完成以上實(shí)驗(yàn)內(nèi)容的Transact_SQL語句,并對相應(yīng)的SQL語句進(jìn)行分析;說明建立的數(shù)據(jù)庫的相關(guān)內(nèi)容,和維護(hù)后的相關(guān)屬性的改變。

      使用了create database 和 drop database這兩個語句,前者用來建立一個新的數(shù)據(jù)庫,包括其名稱、位置、以及日志文件的相關(guān)屬性定義;后者用來刪除之前建立好的數(shù)據(jù)庫,直接在其后面加上數(shù)據(jù)庫名稱即可。

      通過修改維護(hù)相關(guān)屬性的操作之后,數(shù)據(jù)庫會做相應(yīng)的變化,例如添加屬性、修改大小等等。

      5. 實(shí)驗(yàn)完成后完成實(shí)驗(yàn)報(bào)告。

      五、實(shí)驗(yàn)總結(jié)

      在實(shí)驗(yàn)中有哪些重要問題或者事件?你如何處理的?你的收獲是什么?有何建議和意見等等。

      1、安裝時沒有出現(xiàn)任何問題,就是在一些插件的選擇以及用戶的添加上略微繁瑣,在使用SQL server配置管理器時,其中有一個服務(wù)無法直接手動打開,在網(wǎng)上查閱資料后使用高級選項(xiàng)中的操作才將其打開;

      2、在使用腳本文件創(chuàng)建數(shù)據(jù)庫時,確認(rèn)好編寫的代碼無誤后編譯還是會出錯,仔細(xì)檢查之后發(fā)現(xiàn)是冒號的打成了中文的,改正后運(yùn)行無誤;

      首先,學(xué)習(xí)數(shù)據(jù)庫還是要多查閱資料,因?yàn)橛写罅康能浖僮?,所以熟悉軟件至關(guān)重要,其次,在做一些編碼的任務(wù)時,一定要細(xì)心,切不可再因?yàn)槭韬龃笠鈱?dǎo)致時間白白浪費(fèi)。

      第三篇:北郵數(shù)據(jù)庫實(shí)驗(yàn)報(bào)告[最終版]

      數(shù)據(jù)庫實(shí)驗(yàn)報(bào)告

      (四)姓名:學(xué)號:班級:

      1.簡單查詢:

      SQL語句:

      select credit from course where course_name='SQL Server數(shù)據(jù)庫開發(fā)技術(shù)';(1)查詢“數(shù)據(jù)庫開發(fā)技術(shù)”課程的學(xué)分;

      或者模糊查詢:

      select credit from course where course_name like'%數(shù)據(jù)庫開發(fā)技術(shù)';執(zhí)行結(jié)果:

      (2)查詢選修了課程編號為“dep04_s004”的學(xué)生的學(xué)號和成績,并將成績按降序輸出;

      SQL語句:

      select student_id,grade from student_course where course_id='dep04_s003' orderby grade desc;執(zhí)行結(jié)果:

      SQL語句:

      select course_id,grade from student_course where student_id='g9940205';(3)查詢學(xué)號為“g9940205”的學(xué)生選修的課程編號和成績;

      執(zhí)行結(jié)果:

      (4)查詢選修了課程編號為“dep04_s001”且成績高于85分的學(xué)生的學(xué)號和成績。

      SQL語句:

      select student_id,grade from student_course where course_id='dep04_s001'and grade>'85';執(zhí)行結(jié)果:

      2.在多表連接的查詢實(shí)驗(yàn)中,用Transact SQL語句完成以下查詢操作:(1)查詢選修了課程編號為“dep04_s002”且成績高于85分的學(xué)生的學(xué)號、姓名和成績;

      SQL語句:

      select student.student_id,student_name,grade from student,student_course where student.student_id=student_course.student_id and student_course.course_id='dep04_s002' and student_course.grade>'85';執(zhí)行結(jié)果:

      SQL語句:

      select student.student_id,student_name,course_name,grade from student,course,student_course where student.student_id=student_course.student_id and student_course.course_id=course.course_id;(2)查詢所有學(xué)生的學(xué)號、姓名、選修的課程名稱和成績;

      執(zhí)行結(jié)果:

      (3)查詢林紅同學(xué)選修的課程名稱、學(xué)分和成績。(考試成績>=60 否則無學(xué)分。)

      SQL語句:

      select course_name,student_course.credit,grade from student,student_course,course where student_name='林紅'

      and student.student_id=student_course.student_id and student_course.course_id=course.course_id;

      有學(xué)分,3.在復(fù)雜查詢實(shí)驗(yàn)中,用Transact SQL語句完成以下查詢操作:

      SQL語句:

      select student.student_id,student_name from student,student_course where student.student_id=student_course.student_id groupby student.student_id,student_name havingcount(student_course.course_id)>=3;(1)查詢至少選修了三門課程的學(xué)生的學(xué)號和姓名;

      執(zhí)行結(jié)果:

      SQL語句:

      selectavg(grade)from student_course where course_id='dep04_b001';(2)查詢選修課程號為“dep04_b001”的學(xué)生的平均成績; 執(zhí)行結(jié)果:

      (3)查詢所有學(xué)生的學(xué)號和他選修課程的最高成績,要求他的選修課程中沒有成績?yōu)榭盏摹?/p>

      SQL語句:

      select student_id,max(grade)from student_course whereexists(select grade from student_course)groupby student_id;執(zhí)行結(jié)果:

      (4)查詢嚴(yán)為老師2001/2002學(xué)年教的軟件開發(fā)技術(shù)課程的最高成績及此學(xué)生的學(xué)號、姓名、班級。

      SQL語句:

      select student.student_id,student_name,student.class_id,grade from teacher_course_class,teacher,course,student,student_course where teacher_course_class.teacher_id = teacher.teacher_id and teacher.teacher_name ='嚴(yán)為'and teacher_course_class.course_id = course.course_id and course.course_name ='軟件開發(fā)技術(shù)'and

      teacher_course_class.course_id = student_course.course_id and student_course.student_id = student.student_id and teacher_course_class.school_year ='2001/2002'and student_course.grade>=all(select grade from student_course,course where student_course.course_id = course.course_id and

      course.course_name ='軟件開發(fā)技術(shù)');執(zhí)行結(jié)果:

      (5)查詢數(shù)據(jù)庫開發(fā)技術(shù)課程用過的教材名稱,作者和出版社。

      SQL語句:

      select book_name,author,publish_company from book,course where course.book_id=book.book_id and course_name='SQL SERVER數(shù)據(jù)庫開發(fā)技術(shù)';執(zhí)行結(jié)果:

      (6)查詢計(jì)算機(jī)科學(xué)系講授過數(shù)據(jù)庫開發(fā)技術(shù)的老師姓名和職稱。

      SQL語句:

      select teacher_name,profession from teacher,course,teacher_course_class,department where teacher.teacher_id = teacher_course_class.teacher_id and course.course_id = teacher_course_class.course_id and department.department_id = teacher.department_id and department.department_name ='計(jì)算機(jī)科學(xué)'and

      course.course_name ='SQL Server數(shù)據(jù)庫開發(fā)技術(shù)';執(zhí)行結(jié)果:

      4.在嵌套查詢實(shí)驗(yàn)中,用Transact SQL語句完成以下查詢操作,要求寫嵌套查詢語句:

      SQL語句:

      select student_id,student_name from student where student_id in(select student_id from student_course where course_id in(select course_id from course where course_name ='軟件開發(fā)技術(shù)'));(1)查詢選修了軟件開發(fā)技術(shù)的學(xué)生的學(xué)號和姓名;

      執(zhí)行結(jié)果:

      SQL語句:

      select student_id,student_name from student wherenotexists(select student_id from student_course(2)查詢沒有選修軟件開發(fā)技術(shù)的學(xué)生的學(xué)號和姓名; where course_id in(select course_id from course where course_name ='軟件開發(fā)技術(shù)'));執(zhí)行結(jié)果:

      (3)查詢至少選修了學(xué)號為“g9940201”的學(xué)生所選修的所有課程的學(xué)生的學(xué)號和姓名。

      SQL語句:

      select student_id,student_name from student wherenotexists(select*

      from student_course student_course1 where student_course1.student_id ='g9940201' andnotexists(select*

      from student_course student_course2 where student.student_id=student_course2.student_id and student_course2.course_id = student_course1.course_id));執(zhí)行結(jié)果:

      5.建立如下視圖:

      學(xué)生選修課程信息視圖,包括以下內(nèi)容:

      對(1)(2)內(nèi)容用企業(yè)管理器和SQL語句方式分別完成。1)學(xué)生學(xué)號、姓名、所在系、授課老師姓名、課程名稱、課程教材名稱、出版社、學(xué)分、選課成績

      SQL語句:

      Createview

      view1(student_id,student_name,department_name,teacher_name,course_name, book_name,publish_name,credit,grade)asselectdistinct

      student.student_id,student.student_name,department_name,teacher_name,course_name,book_name,publish_company,student_course.credit,student_course.grade from

      student,course,department,student_course,teacher,teacher_course_class,book,class where

      student.student_id=student_course.student_id and student.class_id=class.class_id and class.department_id=department.department_id and student_course.course_id=course.course_id and course.book_id=book.book_id and teacher.teacher_id=teacher_course_class.teacher_id and teacher_course_class.course_id=course.course_id

      企業(yè)管理器:

      Step1:右鍵視圖,選擇新建視圖。

      Step2:添加涉及到的表。

      Step3:選擇需要顯示的列。

      Step4:右鍵視圖view1,選擇查看前1000行。

      執(zhí)行結(jié)果:

      SQL語句:

      alterview

      view1(student_id,student_name,department_name,teacher_name,course_name,book_name,publish_name,credit,grade,class_id)ASSELECT DISTINCT

      student.student_id,student_name,department_name,teacher_name,course_name,book_name,publish_company,student_course.credit,student_course.grade,student.class_id FROM

      student,student_course,course,teacher,teacher_course_class,book,department,class WHERE student.student_id=student_course.student_id and student.class_id=class.class_id and class.department_id=department.department_id and student_course.course_id=course.course_id and course.book_id=book.book_id and teacher.teacher_id=teacher_course_class.teacher_id and teacher_course_class.course_id=course.course_id 2)修改以上視圖,增加學(xué)生所在班級信息。

      企業(yè)管理器:

      勾選class表中的“所有列”。

      執(zhí)行結(jié)果:

      SQL語句:

      select student_id,grade from view1 where course_name ='計(jì)算機(jī)基礎(chǔ)';3)對以上視圖進(jìn)行相關(guān)的查詢操作:(1)查詢選修了計(jì)算機(jī)基礎(chǔ)的學(xué)生的學(xué)號和成績;

      執(zhí)行結(jié)果:

      SQL語句:

      select student_id,student_name,course_name,grade from view1(2)查詢所有學(xué)生的學(xué)號、姓名、選修的課程名稱和成績;

      執(zhí)行結(jié)果:

      SQL語句:

      select student_id,student_name,course_name from view1 where teacher_name ='章紅';(3)查詢選修了章紅老師課程的學(xué)生的學(xué)號和姓名、課程名稱。

      執(zhí)行結(jié)果:

      第四篇:北郵嵌入式實(shí)驗(yàn)報(bào)告

      北京郵電大學(xué)

      嵌入式系統(tǒng)開發(fā)實(shí)驗(yàn)報(bào)告

      學(xué)院:

      班級: 姓名: 學(xué)號:

      序號:

      目錄

      一、實(shí)驗(yàn)?zāi)康?.............................................................................................1

      二、實(shí)驗(yàn)設(shè)備..............................................................................................1

      三、基礎(chǔ)實(shí)驗(yàn)(實(shí)驗(yàn)一~實(shí)驗(yàn)七)............................................................1

      1.實(shí)驗(yàn)五..................................................................................................1 2.實(shí)驗(yàn)六..................................................................................................1 3.實(shí)驗(yàn)七..................................................................................................1

      四、驅(qū)動程序..............................................................................................5

      1.設(shè)備驅(qū)動程序的概念..........................................................................5 2.驅(qū)動程序結(jié)構(gòu)......................................................................................6 3.設(shè)備注冊和初始化..............................................................................7 4.設(shè)備驅(qū)動程序的開發(fā)過程..................................................................8

      五、基本接口實(shí)驗(yàn)......................................................................................8

      1.實(shí)驗(yàn)十二簡單設(shè)備驅(qū)動程序..............................................................9 2.實(shí)驗(yàn)十三 CPU GPIO驅(qū)動程序設(shè)計(jì)...................................................9 3.實(shí)驗(yàn)十四中斷實(shí)驗(yàn)...........................................................................10 4.實(shí)驗(yàn)十五數(shù)碼管顯示實(shí)驗(yàn)................................................................12 5.實(shí)驗(yàn)十六 LED點(diǎn)陣驅(qū)動程序設(shè)計(jì)...................................................19 6.實(shí)驗(yàn)十七 AD驅(qū)動實(shí)驗(yàn)....................................................................23 7.實(shí)驗(yàn)十八 DA驅(qū)動實(shí)驗(yàn)....................................................................26

      六、實(shí)驗(yàn)中遇到的問題及解決方法........................................................30

      七、實(shí)驗(yàn)總結(jié)及心得................................................................................31

      一、實(shí)驗(yàn)?zāi)康?/p>

      通過實(shí)驗(yàn)熟悉Linux環(huán)境,并掌握一些基本接口驅(qū)動的寫法和用C語言編寫簡單的實(shí)驗(yàn)程序。學(xué)習(xí)LINUX開發(fā)環(huán)境的搭建,通訊配置等。并熟練掌握LINUX驅(qū)動程序的編寫及開發(fā)流程。對嵌入式系統(tǒng)有進(jìn)一步的了解。

      二、實(shí)驗(yàn)設(shè)備

      1.一套PXA270EP嵌入式實(shí)驗(yàn)箱

      2.安裝Redhat9的宿主PC機(jī),并且配置好ARM Linux的開發(fā)環(huán)境

      三、基礎(chǔ)實(shí)驗(yàn)(實(shí)驗(yàn)一~實(shí)驗(yàn)七)

      實(shí)驗(yàn)一~七為基礎(chǔ)實(shí)驗(yàn),目的是為后續(xù)實(shí)驗(yàn)搭建好軟、硬件環(huán)境,配置好相關(guān)的協(xié)議、服務(wù),并通過編寫最簡單的HelloWorld程序進(jìn)行測試。由于后面的實(shí)驗(yàn)都要依靠前面實(shí)驗(yàn)的配置,故本段只著重?cái)⑹鰧?shí)驗(yàn)七的具體實(shí)現(xiàn)。

      1.實(shí)驗(yàn)五

      實(shí)驗(yàn)五為宿主PC機(jī)配置了TFTP服務(wù)。TFTP(Trivial File Transfer Protocol)是簡單文件傳輸協(xié)議,由于特定開發(fā)環(huán)境的制約,這一服務(wù)是必須的。在配置完成后,每次重啟宿主PC機(jī)時,都須先輸入命令:service xinetd restart,以啟動TFTP服務(wù)。

      2.實(shí)驗(yàn)六

      實(shí)驗(yàn)六為宿主PC機(jī)配置了NFS服務(wù)。NFS(Network File System)指網(wǎng)絡(luò)文件系統(tǒng),它實(shí)現(xiàn)了文件在不同的系統(tǒng)間使用。當(dāng)我們想用遠(yuǎn)端檔案時,只需調(diào)用“mount”就可以遠(yuǎn)端系統(tǒng)掛接在自己的檔案系統(tǒng)之下。每次重啟宿主PC機(jī)時,都須先輸入命令:service nfs restart,以啟動nfs服務(wù)。

      3.實(shí)驗(yàn)七

      實(shí)驗(yàn)七通過用c語言編寫的簡單程序HelloWorld,測試前面幾個實(shí)驗(yàn)是否成功配置好環(huán)境,從超級終端可以看到HelloWorld程序的運(yùn)行結(jié)果。

      實(shí)驗(yàn)步驟如下: 1)硬件連接:

      連接宿主 PC 機(jī)和一臺 PXA270-RP目標(biāo)板。2)打開宿主PC 機(jī)電源,進(jìn)入 Linux操作系統(tǒng)。

      3)啟動RedHat 9.0 的圖形界面,如下圖,若您是以 root 身份登陸在文本模式下,則輸入命令startx啟動圖形界面。進(jìn)入RedHat 9.0 圖形界面后,打開一個終端窗(Terminal)。

      4)輸入minicom然后回車,minicim設(shè)置為115200 8NI無流控。

      5)打開PXA270_RP目標(biāo)板電源,按目標(biāo)板上的BOOT鍵,在minicom中應(yīng)該會看到如下圖:

      6)在minicom終端窗口中,如圖,輸入下列四條命令 root ifconfig eth 192.168.0.50 up mount-o nolock 192.168.0.100:/ /mnt cd /mnt 此時,先將該窗口最小化,在后面的第 10 操作步驟中還將會回到該窗口中進(jìn)行操作。

      7)宿主機(jī)上打開一個終端窗口(Terminal),點(diǎn)擊【紅帽/System Tools/Terminal】啟動終端窗口,輸入下列 4 條命令: ① cd /home

      ②mkdir HW

      ③ cd HW

      ④ vi

      HelloWorld.c

      /*請您輸入程序 7.1 程序清單*/

      此時會顯示一個空白的屏幕,這條命令的含義是,使用 Vi 編輯器,對一個名叫HelloWorld.c的文件進(jìn)行編輯,我們看到的空白窗口是對文件進(jìn)行編輯的窗口,如下圖。就像在 Windows系統(tǒng)下面使用寫字板等一樣道理。

      在 vi 里面先單擊鍵盤 A 鍵,然后左下角會變成—INSER。輸入程序的時候和其他編輯器是一樣的,如下圖。

      當(dāng)輸入程序完畢后,單擊鍵盤 Esc 鍵,然后按“:”(冒號)此時左下角會出現(xiàn)冒號然后輸入“wq”最后按“Enter”確認(rèn)存盤退出 vi 編輯器,如下圖。

      8)在上面同一個終端窗口中,輸入下列 2 條命令交叉編譯HelloWorld.c源程序,并查看生成的.o 目標(biāo)文件,如圖 7-10,圖7-11: ①

      arm-linux-gcc–oHelloWorldHelloWorld.c ②ls 等到再次出現(xiàn)提示符,代表程序已經(jīng)正確編譯。如果此步出現(xiàn)錯誤信息,請查看錯誤信息,并且重新編輯原來的 C文件,修改錯誤。直到正確編譯。

      9)重新打開第 7 步最小化的開有minicom的終端窗口,即到 PXA270-RP 目標(biāo)板的mnt目錄下,請您輸入下列 3 條命令,運(yùn)行HelloWorld編譯成功的HelloWorld目標(biāo)程序:

      ① cd home/HW

      /*回到minicom中目標(biāo)板的/mnt/home/HW目錄下*/ ②ls ③./ HelloWorld

      /*此時會看到如下圖*/

      四、驅(qū)動程序

      1.設(shè)備驅(qū)動程序的概念

      設(shè)備驅(qū)動程序?qū)嶋H是處理和操作硬件控制器的軟件,從本質(zhì)上講,是內(nèi)核中具有最高特權(quán)級的、駐留內(nèi)存的、可共享的底層硬件處理例程。驅(qū)動程序是內(nèi)核的一部分,是操作系統(tǒng)內(nèi)核與硬件設(shè)備的直接接口,驅(qū)動程序屏蔽了硬件的細(xì)節(jié),完成以下功能:

      ?對設(shè)備初始化和釋放;

      ?對設(shè)備進(jìn)行管理,包括實(shí)時參數(shù)設(shè)置,以及提供對設(shè)備的操作接口; ?讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)或者回送應(yīng)用程序請求的數(shù)據(jù); ?檢測和處理設(shè)備出現(xiàn)的錯誤。

      Linux操作系統(tǒng)將所有的設(shè)備全部看成文件,并通過文件的操作界面進(jìn)行操作。對用戶程序而言,設(shè)備驅(qū)動程序隱藏了設(shè)備的具體細(xì)節(jié),對各種不同設(shè)備提供了一致的接口,一般來說,是把設(shè)備映射為一個特殊的設(shè)備文件,用戶程序可以像對其他文件一樣對此設(shè)備文件進(jìn)行操作。這意味著:

      ?由于每一個設(shè)備至少由文件系統(tǒng)的一個文件代表,因而都有一個“文件名”。?應(yīng)用程序通??梢酝ㄟ^系統(tǒng)調(diào)用open()打開設(shè)備文件,建立起與目標(biāo)設(shè)備的連接。

      ?打開了代表著目標(biāo)設(shè)備的文件,即建立起與設(shè)備的連接后,可以通過read()、write()、ioctl()等常規(guī)的文件操作對目標(biāo)設(shè)備進(jìn)行操作。

      設(shè)備文件的屬性由三部分信息組成:第一部分是文件的類型,第二部分是一個主設(shè)備號,第三部分是一個次設(shè)備號。其中類型和主設(shè)備號結(jié)合在一起惟一地確定了設(shè)備文件驅(qū)動程序及其界面,而次設(shè)備號則說明目標(biāo)設(shè)備是同類設(shè)備中的第幾個。

      由于Linux 中將設(shè)備當(dāng)做文件處理,所以對設(shè)備進(jìn)行操作的調(diào)用格式與對文件的操作類似,主要包括open()、read()、write()、ioctl()、close()等。應(yīng)用程序發(fā)出系統(tǒng)調(diào)用命令后,會從用戶態(tài)轉(zhuǎn)到核心態(tài),通過內(nèi)核將open()這樣的系統(tǒng)調(diào)用轉(zhuǎn)換成對物理設(shè)備的操作。

      2.驅(qū)動程序結(jié)構(gòu)

      一個設(shè)備驅(qū)動程序模塊的基本框架

      在系統(tǒng)內(nèi)部,I/O設(shè)備的存取通過一組固定的入口點(diǎn)來進(jìn)行,入口點(diǎn)也可以理解為設(shè)備的句柄,就是對設(shè)備進(jìn)行操作的基本函數(shù)。字符型設(shè)備驅(qū)動程序提供如下幾個入口點(diǎn):

      ?

      open入口點(diǎn)。打開設(shè)備準(zhǔn)備I/O操作。對字符設(shè)備文件進(jìn)行打開操作,都會調(diào)用設(shè)備的open入口點(diǎn)。open子程序必須對將要進(jìn)行的I/O操作做好必要的準(zhǔn)備工作,如清除緩沖區(qū)等。如果設(shè)備是獨(dú)占的,即同一時刻只能有一個程序訪問此設(shè)備,則open子程序必須設(shè)置一些標(biāo)志以表示設(shè)備處于忙狀態(tài)。

      ?

      close入口點(diǎn)。關(guān)閉一個設(shè)備。當(dāng)最后一次使用設(shè)備完成后,調(diào)用close子程序。獨(dú)占設(shè)備必須標(biāo)記設(shè)備方可再次使用。

      ?

      read入口點(diǎn)。從設(shè)備上讀數(shù)據(jù)。對于有緩沖區(qū)的I/O操作,一般是從緩沖區(qū)里讀數(shù)據(jù)。對字符設(shè)備文件進(jìn)行讀操作將調(diào)用read子程序。

      ?

      write入口點(diǎn)。往設(shè)備上寫數(shù)據(jù)。對于有緩沖區(qū)的I/O操作,一般是把數(shù)據(jù)寫入緩沖區(qū)里。對字符設(shè)備文件進(jìn)行寫操作將調(diào)用write子程序。

      ?ioctl入口點(diǎn)。執(zhí)行讀、寫之外的操作。

      select入口點(diǎn)。檢查設(shè)備,看數(shù)據(jù)是否可讀或設(shè)備是否可用于寫數(shù)據(jù)。select系統(tǒng)調(diào)用在檢查與設(shè)備文件相關(guān)的文件描述符時使用select入口點(diǎn)。

      3.設(shè)備注冊和初始化

      設(shè)備的驅(qū)動程序在加載的時候首先需要調(diào)用入口函數(shù)init_module(),該函數(shù)最重要的一個工作就是向內(nèi)核注冊該設(shè)備,對于字符設(shè)備調(diào)用register_chrdev()完成注冊。register_chrdev的定義為:intregister_chrdev(unsigned int major, const char *name, struct file_ operations *fops);其中,major是為設(shè)備驅(qū)動程序向系統(tǒng)申請的主設(shè)備號,如果為0,則系統(tǒng)為此驅(qū)動程序動態(tài)分配一個主設(shè)備號。name是設(shè)備名,fops是對各個調(diào)用的入口點(diǎn)說明。此函數(shù)返回0時表示成功;返回-EINVAL,表示申請的主設(shè)備號非法,主要原因是主設(shè)備號大于系統(tǒng)所允許的最大設(shè)備號;返回-EBUSY,表示所申請的主設(shè)備號正在被其他設(shè)備程序使用。如果動態(tài)分配主設(shè)備號成功,此函數(shù)將返回所分配的主設(shè)備號。如果register_chrdev()操作成功,設(shè)備名就會出現(xiàn)在/proc/dvices文件中。

      Linux在/dev目錄中為每個設(shè)備建立一個文件,用ls–l命令列出函數(shù)返回值,若小于0,則表示注冊失??;返回0或者大于0的值表示注冊成功。注冊以后,Linux將設(shè)備名與主、次設(shè)備號聯(lián)系起來。當(dāng)有對此設(shè)備名的訪問時,Linux通過請求訪問的設(shè)備名得到主、次設(shè)備號,然后把此訪問分發(fā)到對應(yīng)的設(shè)備驅(qū)動,設(shè)備驅(qū)動再根據(jù)次設(shè)備號調(diào)用不同的函數(shù)。

      當(dāng)設(shè)備驅(qū)動模塊從Linux內(nèi)核中卸載,對應(yīng)的主設(shè)備號必須被釋放。字符設(shè)備在cleanup_ module()函數(shù)中調(diào)用unregister_chrdev()來完成設(shè)備的注銷。unregister_chrdev()的定義為:intunregister_chrdev(unsigned int major, const char *name);包括設(shè)備注冊在內(nèi),設(shè)備驅(qū)動的初始化函數(shù)主要完成的功能是有以下5項(xiàng)。(1)對驅(qū)動程序管理的硬件進(jìn)行必要的初始化。

      對硬件寄存器進(jìn)行設(shè)置。比如,設(shè)置中斷掩碼,設(shè)置串口的工作方式、并口的數(shù)據(jù)方向等。

      (2)初始化設(shè)備驅(qū)動相關(guān)的參數(shù)。

      一般說來,每個設(shè)備都要定義一個設(shè)備變量,用以保存設(shè)備相關(guān)的參數(shù)。在這一步驟里對設(shè)備變量中的項(xiàng)進(jìn)行初始化。

      (3)在內(nèi)核注冊設(shè)備。

      調(diào)用register_chrdev()函數(shù)來注冊設(shè)備。(4)注冊中斷。

      如果設(shè)備需要IRQ支持,則要使用request_irq()函數(shù)注冊中斷。(5)其他初始化工作。

      初始化部分一般還負(fù)責(zé)給設(shè)備驅(qū)動程序申請包括內(nèi)存、時鐘、I/O端口等在內(nèi)的系統(tǒng)資源,這些資源也可以在open子程序或者其他地方申請。這些資源不用時,應(yīng)該釋放,以利于資源的共享。

      若驅(qū)動程序是內(nèi)核的一部分,初始化函數(shù)則要按如下方式聲明: int __initchr_driver_init(void);其中__init是必不可少的,在系統(tǒng)啟動時會由內(nèi)核調(diào)用chr_driver_init,完成驅(qū)動程序的初始化。

      當(dāng)驅(qū)動程序是以模塊的形式編寫時,則要按照如下方式聲明: intinit_module(void)當(dāng)運(yùn)行后面介紹的insmod命令插入模塊時,會調(diào)用init_module函數(shù)完成初始化工作。

      4.設(shè)備驅(qū)動程序的開發(fā)過程

      由于嵌入式設(shè)備由于硬件種類非常豐富,在默認(rèn)的內(nèi)核發(fā)布版中不一定包括所有驅(qū)動程序。所以進(jìn)行嵌入式Linux系統(tǒng)的開發(fā),很大的工作量是為各種設(shè)備編寫驅(qū)動程序。除非系統(tǒng)不使用操作系統(tǒng),程序直接操縱硬件。嵌入式Linux系統(tǒng)驅(qū)動程序開發(fā)與普通Linux開發(fā)沒有區(qū)別??梢栽谟布a(chǎn)廠家或者Internet上尋找驅(qū)動程序,也可以根據(jù)相近的硬件驅(qū)動程序來改寫,這樣可以加快開發(fā)速度。實(shí)現(xiàn)一個嵌入式Linux設(shè)備驅(qū)動的大致流程如下。

      (1)查看原理圖,理解設(shè)備的工作原理。一般嵌入式處理器的生產(chǎn)商提供參考電路,也可以根據(jù)需要自行設(shè)計(jì)。

      (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è)計(jì)所要實(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)核中,或者用insmod命令加載模塊。(8)測試該設(shè)備,編寫應(yīng)用程序,對驅(qū)動程序進(jìn)行測試。

      五、基本接口實(shí)驗(yàn)

      在完成了基本實(shí)驗(yàn)后,我們開始著手基本接口實(shí)驗(yàn)。在這些實(shí)驗(yàn)中,我們學(xué)習(xí)如何編寫設(shè)備驅(qū)動程序,及如何用測試程序檢驗(yàn)驅(qū)動程序是否正確,并通過改寫測試程序正常地對驅(qū)動程序進(jìn)行相關(guān)操作。

      1.實(shí)驗(yàn)十二 簡單設(shè)備驅(qū)動程序

      本次實(shí)驗(yàn)的任務(wù)是編寫一個字符型設(shè)備驅(qū)動程序,并學(xué)習(xí)在應(yīng)用程序中調(diào)用驅(qū)動??紤]到我們初次接觸驅(qū)動程序的編寫,對此還十分陌生,因此指導(dǎo)書中提供了本次實(shí)驗(yàn)所要用到的程序源代碼。雖然這樣一個字符型設(shè)備驅(qū)動程序并沒有任何實(shí)際作用,但是它讓我們輕松掌握了嵌入式驅(qū)動的編寫過程,因?yàn)閺?fù)雜繁瑣的驅(qū)動,其骨架都是相同的。因此,看懂本實(shí)驗(yàn)的源代碼,學(xué)習(xí)并模仿其編寫方法,對于后續(xù)實(shí)驗(yàn)有著非常重要的意義。

      2.實(shí)驗(yàn)十三 CPU GPIO驅(qū)動程序設(shè)計(jì)

      在本實(shí)驗(yàn)中,我們要編寫第一個針對實(shí)際硬件的驅(qū)動程序。我們知道,凡是操作系統(tǒng)控制外部設(shè)備,即使是最簡單的硬件電路,也是需要驅(qū)動的。本實(shí)驗(yàn)涉及的外部硬件只有電阻和發(fā)光二極管。我們使用自己編寫的驅(qū)動程序與應(yīng)用程序控制 GPIO96的電平,通過 LED 的亮滅來判斷,是否 CPU 做出了正確的響應(yīng)。

      補(bǔ)充代碼(1)

      //-------------------WRITE-----------------------ssize_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”);

      #endif

      return count;}

      補(bǔ)充代碼(2)

      //-------------------OPEN------------------------ssize_tSIMPLE_GPIO_LED_open(structinode * inode ,struct file * file){ #ifdef OURS_GPIO_LED_DEBUG printk(“SIMPLE_GPIO_LED_open [--kernel--]n”);

      #endif

      MOD_INC_USE_COUNT;

      return 0;}

      補(bǔ)充代碼(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, };實(shí)驗(yàn)作業(yè)

      要求在目標(biāo)板上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);} 3.實(shí)驗(yàn)十四

      中斷實(shí)驗(yàn)

      // 滅2秒 // 亮7秒 ioctl(fd,LED_ON);}

      // 休眠1秒

      ioctl(fd,LED_ON);只需將上面的代碼改為如下代碼即可:

      在理論課中,我們學(xué)習(xí)了許多中斷方面的知識,包括中斷向量、中斷優(yōu)先級、中斷過程等。在PXA270系統(tǒng)里,中斷控制器分外部設(shè)備和 PXA270X 處理器設(shè)備產(chǎn)生的兩個層次的中斷,前者是初級的中斷源,后者是次級中斷源,大量的次級中斷源通常被映射為一個初級中斷源。

      補(bǔ)充代碼1 voidshowversion(void){ printk(“*********************************************n”);

      printk(“t %s tn”, VERSION);

      printk(“*********************************************nn”);

      } static intSimpleINT_temp_count = 0;補(bǔ)充代碼2 //-------------------READ------------------------ssize_tSIMPLE_INT_read(struct file * file ,char * buf, size_t count, loff_t * f_ops){

      #ifdef OURS_INT_DEBUG

      #endif return count;printk(“SIMPLE_INT_read [--kernel--]n”);} 補(bǔ)充代碼3 //-------------------WRITE-----------------------ssize_tSIMPLE_INT_write(struct file * file ,const char * buf, size_t count, loff_t * f_ops){

      #ifdef OURS_INT_DEBUG

      } 補(bǔ)充代碼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í)驗(yàn),我了解了硬件中斷管腳與中斷號的對應(yīng)關(guān)系,以及中斷號與中斷處理程序的對應(yīng)關(guān)系,對于今后編寫更為復(fù)雜的中斷程序打下基礎(chǔ)。

      4.實(shí)驗(yàn)十五

      數(shù)碼管顯示實(shí)驗(yàn)

      在此實(shí)驗(yàn)中,我們要編寫針對 74LV164 的驅(qū)動程序,并用其串并轉(zhuǎn)換功能來控制八段LED數(shù)碼管的顯示。

      補(bǔ)充代碼1 voidshowversion(void){ printk(“*********************************************n”);

      printk(“t %s tn”, VERSION);

      printk(“*********************************************nn”);

      } 補(bǔ)充代碼2 //-------------------READ------------------------ssize_tSERIAL_LED_read(struct file * file ,char * buf, size_t count, loff_t * f_ops){ #ifdef OURS_HELLO_DEBUG

      } 補(bǔ)充代碼3 //-------------------WRITE-----------------------ssize_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

      } 補(bǔ)充代碼4 //-------------------IOCTL-----------------------ssize_tSERIAL_LED_ioctl(structinode * inode ,struct file * file, unsigned intcmd, long data){ #ifdef OURS_HELLO_DEBUG

      #endif

      } 補(bǔ)充代碼5 //-------------------OPEN------------------------ssize_tSERIAL_LED_open(structinode * inode ,struct file * file){ #ifdef OURS_HELLO_DEBUG

      #endif

      return 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”);補(bǔ)充代碼6 //-------------------RELEASE/CLOSE---------------ssize_tSERIAL_LED_release(structinode *inode ,struct file * file){ #ifdef OURS_HELLO_DEBUG

      printk(“SERIAL_LED_release [--kernel--]n”);

      #endif MOD_DEC_USE_COUNT;return 0;} 補(bǔ)充代碼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, };補(bǔ)充代碼8 staticint __initHW_SERIAL_LED_init(void){ int ret =-ENODEV;

      ret =

      devfs_register_chrdev(SERIAL_LED_MAJOR, &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;補(bǔ)充代碼9 staticint __init pxa270_SERIAL_LED_init(void){ int ret =-ENODEV;

      printk(“pxa270_SERIAL_LED_init [--kernel--]n”);

      #endif

      ret = HW_SERIAL_LED_init();if(ret)return ret;return 0;} 補(bǔ)充代碼10 static void __exit cleanup_SERIAL_LED(void){ #ifdef OURS_HELLO_DEBUG #ifdef OURS_HELLO_DEBUG

      #endif }

      補(bǔ)充代碼11 MODULE_DESCRIPTION(“serial_led driver module”);

      MODULE_AUTHOR(“l(fā)iduo”);

      MODULE_LICENSE(“GPL”);

      module_init(pxa270_SERIAL_LED_init);module_exit(cleanup_SERIAL_LED);使用測試程序看到的測試結(jié)果是數(shù)碼管按0-9顯示輸出。實(shí)驗(yàn)作業(yè)要求在上述基礎(chǔ)上,分別實(shí)現(xiàn)一下兩個功能:

      ①要求您再編寫一個測試程序,實(shí)現(xiàn) PXA270-EP 目標(biāo)板上的 LED 數(shù)碼管循環(huán)顯示的數(shù)字9-0。

      ②要求您再編寫一個測試程序,實(shí)現(xiàn) PXA270-EP 目標(biāo)板上的 LED 數(shù)碼管循環(huán)顯示的數(shù)字02468。

      由于在測試程序中定義了數(shù)組buf[10]分別存儲了0-9是個數(shù),因此上述功能的實(shí)現(xiàn)方法是,分別對測試程序做如下修改:

      原測試程序: while(1){ for(count=0;count<10;count++){ data[0] = buf[count];ret=write(fd,data,1);sleep(1);} } 實(shí)現(xiàn)功能①: while(1){ for(count=9;count>=0;count--)} } 結(jié)果顯示

      // 倒序顯示數(shù)字

      { data[0] = buf[count];ret=write(fd,data,1);sleep(1);devfs_unregister_chrdev(SERIAL_LED_MAJOR, “serial_led”);printk(“cleanup_SERIAL_LED [--kernel--]n”);實(shí)現(xiàn)功能②: while(1){ for(count=0;count<9;count=count+2)} } 結(jié)果顯示

      // 更改顯數(shù)順序

      { data[0] = buf[count];ret=write(fd,data,1);sleep(1);

      通過更改顯數(shù)的順序,很容易實(shí)現(xiàn)實(shí)驗(yàn)作業(yè)里要求的功能。

      5.實(shí)驗(yàn)十六 LED點(diǎn)陣驅(qū)動程序設(shè)計(jì)

      通過本實(shí)驗(yàn)的操作,我們將 8X8 的點(diǎn)陣 LED 驅(qū)動起來并通過編寫測試程序,使其能夠按照您的意圖進(jìn)行顯示。要求您還編寫更多的測試程序

      補(bǔ)充代碼1 voidshowversion(void){ printk(“*********************************************n”);printk(“t %s tn”, VERSION);printk(“*********************************************nn”);

      } 補(bǔ)充代碼2 //-------------------READ------------------------ssize_tSIMPLE_LED_read(struct file * file ,char * buf, size_t count, loff_t * f_ops){ #ifdef OURS_LED_DEBUG

      #endif return count;printk(“SIMPLE_LED_read [--kernel--]n”);} 補(bǔ)充代碼3 //-------------------IOCTL-----------------------ssize_tSIMPLE_LED_ioctl(structinode * inode ,struct file * file, unsigned intcmd, long data){

      #endif

      } 補(bǔ)充代碼4 //------------------structfile_operationsLED_ctl_ops ={ open: SIMPLE_LED_open, read:

      SIMPLE_LED_read, write: SIMPLE_LED_write, ioctl: SIMPLE_LED_ioctl, release:SIMPLE_LED_release, };補(bǔ)充代碼5 staticint __init pxa270_LED_CTL_init(void){ int ret =-ENODEV;

      printk(“pxa270_LED_CTL_init [--kernel--]n”);

      #endif

      ret = HW_LED_CTL_init();if(ret)

      return ret;#ifdef OURS_LED_DEBUG return 0;printk(“SIMPLE_LED_ioctl [--kernel--]n”);#ifdef OURS_LED_DEBUG return 0;} 補(bǔ)充代碼6 static void __exit cleanup_LED_ctl(void){

      #ifdef OURS_LED_DEBUG

      #endif

      } ①要求您再編寫一個測試程序,實(shí)現(xiàn)按橫的方向隔行順序掃描 LED 點(diǎn)陣數(shù)碼管。

      ②要求您再編寫一個測試程序,實(shí)現(xiàn)按豎的方向順序掃描 LED 點(diǎn)陣數(shù)碼管。作業(yè)一,隔行掃描:

      printk(“cleanup_LED_ctl [--kernel--]n”);outw(0x0000,ioremap_addr);

      devfs_unregister_chrdev(SIMPLE_LED_MAJOR, “l(fā)ed_ary_ctl”);for(i=1;i<=8;i2++){

      buf[0]=c;buf[1]=~r;// row for(j=1;j<=8;j++){

      } r = 1;c = c<<1;

      write(fd,buf,2);

      printf(“buf[0],buf[1]: [%x,%x]n”,buf[0],buf[1]);usleep(200000);// sleep 0.2 second r=r<<1;

      buf[1]=~r;// column

      結(jié)果顯示

      作業(yè)二,豎向掃描:

      for(i=1;i<=8;i++){

      buf[0]=c;buf[1]=~r;// row for(j=1;j<=8;j++){

      } r = 1;c = c<<1;

      write(fd,buf,2);

      printf(“buf[0],buf[1]: [%x,%x]n”,buf[0],buf[1]);usleep(200000);// sleep 0.2 second r=r<<1;

      buf[1]=~r;// column

      結(jié)果顯示

      6.實(shí)驗(yàn)十七 AD驅(qū)動實(shí)驗(yàn)

      通過本實(shí)驗(yàn)的操作,我們將 AD 轉(zhuǎn)換器驅(qū)動起來并通過編寫測試程序,使其能夠?qū)⒛M信號量按照我們的要求轉(zhuǎn)換成數(shù)字信號量。為了更加清楚地理解 AD 轉(zhuǎn)換器的工作過程,請您再編寫一個測試程序,將 UCB_ADC_INP_AD0 換成其他通道,來觀察其他 AD 通道情況。

      補(bǔ)充代碼1 voidshowversion(void){ printk(“%sn”,VERSION);} struct ucb1x00 *ad_ucb;

      補(bǔ)充代碼2 //-------------------READ------------------------staticssize_tadctl_read(struct file * file ,char *buf, size_t count, loff_t *offset){

      } 補(bǔ)充代碼3 //-------------------WRITE-----------------------ssize_tadctl_write(struct file * file ,const char *buf, size_t count, loff_t *offset){

      #ifdef OURS_HELLO_DEBUG printk(“writen”);

      #endif

      } 補(bǔ)充代碼4 //-------------------OPEN------------------------ssize_tadctl_open(structinode * inode ,struct file * file){

      #ifdef OURS_HELLO_DEBUG printk(“openn”);

      #endif

      }

      補(bǔ)充代碼5 //-------------------RELEASE/CLOSE---------------ssize_tadctl_release(structinode *inode ,struct file * file){

      #ifdef OURS_HELLO_DEBUG printk(“releasen”);

      #endif return 0;return 0;return count;#ifdef OURS_HELLO_DEBUG printk(“readn”);#endif return count;} 補(bǔ)充代碼6 staticstructfile_operationsadctl_ops = {

      };補(bǔ)充代碼7 //-------------------INIT------------------------staticint __initHW_AD_CTL_init(void){

      return ret;}

      補(bǔ)充代碼8 staticint __init pxa270_AD_CTL_init(void){ int ret =-ENODEV;#ifdef OURS_HELLO_DEBUG int ret =-ENODEV;ret = devfs_register_chrdev(ADCTL_MAJOR, “adctl”, &adctl_ops);showversion();ad_ucb=ucb1x00_get();if(ret < 0){

      } else { } adctl_dev_handle = devfs_register(NULL, “ad_ctl”, DEVFS_FL_DEFAULT, printk(“adctl driver register success!n”);printk(“fail %dn”,ret);return 0;read: ioctl: adctl_read, adctl_ioctl, write: adctl_write, open: adctl_open, release:adctl_release,ADCTL_MAJOR, 0, S_IFCHR, &adctl_ops, NULL);printk(“initn”);#endif ret=HW_AD_CTL_init();if(ret)}

      補(bǔ)充代碼9 static void __exit cleanup_AD_ctl(void){

      }

      7.實(shí)驗(yàn)十八 DA驅(qū)動實(shí)驗(yàn)

      通過本實(shí)驗(yàn)的操作,我們使用示波器看到了通過DA轉(zhuǎn)換而輸出的波形。在此基礎(chǔ)上,要求試寫一個實(shí)現(xiàn)輸出三角波的測試程序。

      補(bǔ)充代碼1 #include #include #include #include #include #include #include #include 補(bǔ)充代碼2 voidshowversion(void){ printk(“*****************************n”);#ifdef OURS_HELLO_DEBUG printk(“cleanupn”);#endif devfs_unregister_chrdev(ADCTL_MAJOR,“ad_ctl”);devfs_unregister(adctl_dev_handle);return ret;return 0;

      } printk(“t %st n”,VERSION);printk(“*****************************n”);static long ioremap_addr;補(bǔ)充代碼3 //-------------------READ------------------------ssize_tSIMPLE_DA_read(struct file * file ,char * buf, size_t count, loff_t * f_ops){ #ifdef OURS_DA_DEBUG

      } 補(bǔ)充代碼4 //-------------------WRITE-----------------------ssize_tSIMPLE_DA_write(struct file * file ,const char * buf, size_t count, loff_t * f_ops){

      printk(“SIMPLE_DA_write[--kernel--]n”);

      #endif

      return count;} 補(bǔ)充代碼5 //-------------------IOCTL-----------------------ssize_tSIMPLE_DA_ioctl(structinode * inode ,struct file * file, unsigned intcmd, outb(buf[0],ioremap_addr);#ifdef OURS_DA_DEBUG return count;#endif printk(“SIMPLE_DA_read[--kernel--]n”);long data){ #ifdef OURS_DA_DEBUG

      printk(“SIMPLE_DA_ioctl[--kernel--]n”);

      #endif return 0;} 補(bǔ)充代碼6 //-------------------OPEN------------------------ssize_tSIMPLE_DA_open(structinode * inode ,struct file * file){

      #ifdef OURS_DA_DEBUG printk(“SIMPLE_DA_open [--kernel--]n”);

      MOD_INC_USE_COUNT;return 0;

      #endif } 補(bǔ)充代碼7 /------------------structfile_operationsDA_ctl_ops ={

      read: SIMPLE_DA_read,};

      補(bǔ)充代碼8 release:

      SIMPLE_DA_release, ioctl:

      SIMPLE_DA_ioctl, write:

      SIMPLE_DA_write, //-------------------INIT------------------------staticint __initHW_DA_CTL_init(void){ int ret =-ENODEV;

      }

      補(bǔ)充代碼9 staticint __init pxa270_DA_CTL_init(void){ int ret =-ENODEV;

      printk(“pxa270_DA_CTL_init [--kernel--]n”);

      #endif #ifdef OURS_DA_DEBUG } printk(“ pxa270 led_driver register success!![--kernel--]n”);{ else } return ret;printk(“ pxa270: init_module failed with %dn [--kernel--]”, ret);{ if(ret < 0)showversion();ret = devfs_register_chrdev(SIMPLE_DA_MAJOR, “da_ctl”, &DA_ctl_ops);

      ret = HW_DA_CTL_init();if(ret)

      return ret;return 0;} 補(bǔ)充代碼10 static void __exit cleanup_DA_ctl(void){

      #endif } 補(bǔ)充代碼11 MODULE_DESCRIPTION(“DA_ctl driver module”);MODULE_AUTHOR(“l(fā)iduo”);MODULE_LICENSE(“GPL”);module_init(pxa270_DA_CTL_init);module_exit(cleanup_DA_ctl);printk(“cleanup_DA_ctl [--kernel--]n”);#ifdef OURS_DA_DEBUG

      六、實(shí)驗(yàn)中遇到的問題及解決方法

      每一次上課重新啟動后,當(dāng)需要將宿主PC機(jī)的根目錄掛在到PXA270-EP目標(biāo)板的mnt目錄下(即在超級終端中輸入命令“mount –o soft,timeo=100,rsize=1024 192.168.0.100:/ /mnt”)時,常顯示無法掛載。

      解決方法:在超級終端下的掛載命令應(yīng)該用”mount –o nolock 192.168.0.100:/ /mnt”,如果依然不能掛載需要重啟NFS服務(wù),即在PC機(jī)終端中輸入命令”service nfs restart”兩遍后就可以掛載,當(dāng)然有時候也可能是因?yàn)榫W(wǎng)線沒插好。

      在每次重啟機(jī)器之后都需要將PC機(jī)終端的IP地址和開發(fā)板中的系統(tǒng)的IP地址設(shè)定正確,不然也無法掛載。

      七、實(shí)驗(yàn)總結(jié)及心得

      本學(xué)期的所有實(shí)驗(yàn)均在宿主PC機(jī)與PXA270-EP目標(biāo)板上進(jìn)行。在實(shí)驗(yàn)中,我們先建立硬件實(shí)驗(yàn)平臺,又建立主機(jī)軟件開發(fā)環(huán)境,接著為實(shí)驗(yàn)進(jìn)行各項(xiàng)配置,最后完成了各個實(shí)驗(yàn)中的多種功能。值得注意的是,前期的硬件、軟件準(zhǔn)備必須完整無誤地實(shí)現(xiàn),后續(xù)的實(shí)驗(yàn)才能順利進(jìn)行。所以,打基礎(chǔ)的工作一定要仔細(xì)謹(jǐn)慎。后續(xù)實(shí)驗(yàn)中雖然給出了驅(qū)動程序的框架,仍需要我們自己補(bǔ)充完整,并開動腦筋舉一反三,在原代碼的基礎(chǔ)上進(jìn)行一定修改以實(shí)現(xiàn)新的功能。

      通過這學(xué)期的實(shí)驗(yàn),我逐步完成了建立實(shí)驗(yàn)軟件開發(fā)平臺,搭建實(shí)驗(yàn)編譯軟件環(huán)境,在PC上編輯、編譯一個應(yīng)用程序,并且在嵌入式系統(tǒng)上運(yùn)行和調(diào)試它的過程。在實(shí)驗(yàn)中,不難發(fā)現(xiàn),編譯驅(qū)動程序大體框架都是一樣的,比如里面的讀函數(shù)、寫函數(shù)、ioctl函數(shù)、打開、關(guān)閉以及函數(shù)模塊的初始化并且在超級終端上顯示出等。但所不同的是,要根據(jù)不同的實(shí)驗(yàn)要求修改名稱,并且對其中必要的部分進(jìn)行修改。

      除此之外,我認(rèn)為很多基礎(chǔ)知識對實(shí)驗(yàn)的進(jìn)行也起著非常大的作用,例如數(shù)碼管的顯示原理。在掌握了基礎(chǔ)知識之后,上機(jī)的過程會顯得相對簡單,尤其是代碼框架已經(jīng)給出,我們所以需要做的就是根據(jù)需要稍作改動來得到我們想要的結(jié)果。

      在實(shí)驗(yàn)過程中常常會遇到各種各樣的問題,剛開始時我不知如何是好,只能求助于老師和同學(xué),后來隨著實(shí)驗(yàn)的進(jìn)行,我對實(shí)驗(yàn)的內(nèi)容和虛擬機(jī)都有了一定的了解,遇到問題時也可以靜下心來思考其原因,自己嘗試各種方法去解決問題。整個實(shí)驗(yàn)讓我了解了一套完整的嵌入式系統(tǒng)驅(qū)動程序開發(fā)的全過程,學(xué)到的內(nèi)容非常豐富,相信在學(xué)習(xí)了這些內(nèi)容后,在今后的學(xué)習(xí)工作中接觸到類似內(nèi)容,我不會感到無從下手,而是能夠有條不紊。

      感謝老師的辛勤指導(dǎo)!

      第五篇:北郵嵌入式實(shí)驗(yàn)報(bào)告

      嵌入式系統(tǒng)開發(fā)實(shí)驗(yàn)報(bào)告

      級: 姓

      名: 班內(nèi)序號: 學(xué)

      號: 日

      期:

      目錄

      一、實(shí)驗(yàn)?zāi)康?.............................................................................................1

      二、實(shí)驗(yàn)設(shè)備..............................................................................................1

      三、基礎(chǔ)實(shí)驗(yàn)(實(shí)驗(yàn)一~實(shí)驗(yàn)七)............................................................1

      1.實(shí)驗(yàn)五..................................................................................................2 2.實(shí)驗(yàn)六..................................................................................................2 3.實(shí)驗(yàn)七..................................................................................................2

      四、驅(qū)動程序..............................................................................................3

      1.設(shè)備驅(qū)動程序的概念..........................................................................3 2.驅(qū)動程序結(jié)構(gòu)......................................................................................3 3.設(shè)備注冊和初始化..............................................................................4 4.設(shè)備驅(qū)動程序的開發(fā)過程..................................................................6

      五、基本接口實(shí)驗(yàn)......................................................................................6

      1.實(shí)驗(yàn)十二 簡單設(shè)備驅(qū)動程序............................................................6 2.實(shí)驗(yàn)十三 CPU GPIO驅(qū)動程序設(shè)計(jì)...................................................7 3.實(shí)驗(yàn)十四 中斷實(shí)驗(yàn)...........................................................................8 4.實(shí)驗(yàn)十五 數(shù)碼管顯示實(shí)驗(yàn)................................................................9 5.實(shí)驗(yàn)十六 LED點(diǎn)陣驅(qū)動程序設(shè)計(jì)...................................................11 6.實(shí)驗(yàn)十七 AD驅(qū)動實(shí)驗(yàn)....................................................................12 7.實(shí)驗(yàn)十八 DA驅(qū)動實(shí)驗(yàn)....................................................................13

      六、實(shí)驗(yàn)中遇到的問題及解決方法........................................................15

      七、實(shí)驗(yàn)總結(jié)及心得................................................................................15

      一、實(shí)驗(yàn)?zāi)康?/p>

      通過實(shí)驗(yàn)熟悉Linux環(huán)境,并掌握一些基本接口驅(qū)動的寫法和用C語言編寫簡單的實(shí)驗(yàn)程序。學(xué)習(xí)LINUX開發(fā)環(huán)境的搭建,通訊配置等。并熟練掌握LINUX驅(qū)動程序的編寫及開發(fā)流程。對嵌入式系統(tǒng)有進(jìn)一步的了解。

      二、實(shí)驗(yàn)設(shè)備

      1.一套PXA270EP嵌入式實(shí)驗(yàn)箱

      2.安裝Redhat9的宿主PC機(jī),并且配置好ARM Linux的開發(fā)環(huán)境

      三、基礎(chǔ)實(shí)驗(yàn)(實(shí)驗(yàn)一~實(shí)驗(yàn)七)

      實(shí)驗(yàn)一到六為基礎(chǔ)實(shí)驗(yàn),主要是為了在熟悉實(shí)驗(yàn)操作平臺的同時為后續(xù)實(shí)驗(yàn)搭建好軟、硬件環(huán)境,配置好相關(guān)的協(xié)議、服務(wù)。

      其中實(shí)驗(yàn)一是各個硬件的互聯(lián),搭建好了實(shí)驗(yàn)的硬件環(huán)境。實(shí)驗(yàn)二是在宿主PC端安裝虛擬機(jī),提供了實(shí)驗(yàn)需要的Linux操作系統(tǒng)。實(shí)驗(yàn)三是宿主PC端開發(fā)環(huán)境的安裝與配置。

      實(shí)驗(yàn)四是配置宿主PC機(jī)端的超級終端,使PC機(jī)與PXA270目標(biāo)板之間可以通過串口通訊。在每次重啟宿主PC機(jī)時,都需要重新將超級終端掛載到虛擬機(jī)上,掛載之前須通過ifconfig命令查看該機(jī)的IP地址,若其已經(jīng)復(fù)位,須用命令:ifconfig eth0 192.168.0.100 up重置宿主PC機(jī)的IP地址。掛載虛擬機(jī)的代碼為:

      root ifconfig eth0 192.168.0.50 up mount –o nolock 192.168.0.100:/ /mnt 實(shí)驗(yàn)五是配置宿主PC機(jī)的TFTP服務(wù)。TFTP是簡單文件傳輸協(xié)議。每次重啟宿主PC機(jī)時,都要重啟該服務(wù),重啟命令為:

      service xinetd restart。

      實(shí)驗(yàn)六是配置宿主PC機(jī)端NFS服務(wù)。NFS是指網(wǎng)絡(luò)文件系統(tǒng),它實(shí)現(xiàn)了文件在不同的系統(tǒng)間使用。當(dāng)使用者想用遠(yuǎn)端檔案時,只需調(diào)用“mount”就可以遠(yuǎn)端系統(tǒng)掛接在自己的檔案系統(tǒng)之下。每次重啟宿主PC機(jī)時,也都要重啟該服務(wù),重啟命令為: service nfs restart service nfs restart

      1.實(shí)驗(yàn)五

      實(shí)驗(yàn)五為宿主PC機(jī)配置了TFTP服務(wù)。TFTP(Trivial File Transfer Protocol)是簡單文件傳輸協(xié)議,由于特定開發(fā)環(huán)境的制約,這一服務(wù)是必須的。在配置完成后,每次重啟宿主PC機(jī)時,都須先輸入命令:service xinetd restart,以啟動TFTP服務(wù)。

      2.實(shí)驗(yàn)六

      實(shí)驗(yàn)六為宿主PC機(jī)配置了NFS服務(wù)。NFS(Network File System)指網(wǎng)絡(luò)文件系統(tǒng),它實(shí)現(xiàn)了文件在不同的系統(tǒng)間使用。當(dāng)我們想用遠(yuǎn)端檔案時,只需調(diào)用“mount”就可以遠(yuǎn)端系統(tǒng)掛接在自己的檔案系統(tǒng)之下。每次重啟宿主PC機(jī)時,都須先輸入命令:service nfs restart,以啟動nfs服務(wù)。

      3.實(shí)驗(yàn)七

      實(shí)驗(yàn)七通過用c語言編寫的簡單程序HelloWorld,測試前面幾個實(shí)驗(yàn)是否成功配置好環(huán)境,從超級終端可以看到HelloWorld程序的運(yùn)行結(jié)果。

      四、驅(qū)動程序

      1.設(shè)備驅(qū)動程序的概念

      設(shè)備驅(qū)動程序?qū)嶋H是處理和操作硬件控制器的軟件,從本質(zhì)上講,是內(nèi)核中具有最高特權(quán)級的、駐留內(nèi)存的、可共享的底層硬件處理例程。驅(qū)動程序是內(nèi)核的一部分,是操作系統(tǒng)內(nèi)核與硬件設(shè)備的直接接口,驅(qū)動程序屏蔽了硬件的細(xì)節(jié),完成以下功能:

      ? 對設(shè)備初始化和釋放;

      ? 對設(shè)備進(jìn)行管理,包括實(shí)時參數(shù)設(shè)置,以及提供對設(shè)備的操作接口; ? 讀取應(yīng)用程序傳送給設(shè)備文件的數(shù)據(jù)或者回送應(yīng)用程序請求的數(shù)據(jù); ? 檢測和處理設(shè)備出現(xiàn)的錯誤。

      Linux操作系統(tǒng)將所有的設(shè)備全部看成文件,并通過文件的操作界面進(jìn)行操作。對用戶程序而言,設(shè)備驅(qū)動程序隱藏了設(shè)備的具體細(xì)節(jié),對各種不同設(shè)備提供了一致的接口,一般來說,是把設(shè)備映射為一個特殊的設(shè)備文件,用戶程序可以像對其他文件一樣對此設(shè)備文件進(jìn)行操作。這意味著:

      ? 由于每一個設(shè)備至少由文件系統(tǒng)的一個文件代表,因而都有一個“文件名”。? 應(yīng)用程序通??梢酝ㄟ^系統(tǒng)調(diào)用open()打開設(shè)備文件,建立起與目標(biāo)設(shè)備的連接。

      ? 打開了代表著目標(biāo)設(shè)備的文件,即建立起與設(shè)備的連接后,可以通過read()、write()、ioctl()等常規(guī)的文件操作對目標(biāo)設(shè)備進(jìn)行操作。

      設(shè)備文件的屬性由三部分信息組成:第一部分是文件的類型,第二部分是一個主設(shè)備號,第三部分是一個次設(shè)備號。其中類型和主設(shè)備號結(jié)合在一起惟一地確定了設(shè)備文件驅(qū)動程序及其界面,而次設(shè)備號則說明目標(biāo)設(shè)備是同類設(shè)備中的第幾個。

      由于Linux 中將設(shè)備當(dāng)做文件處理,所以對設(shè)備進(jìn)行操作的調(diào)用格式與對文件的操作類似,主要包括open()、read()、write()、ioctl()、close()等。應(yīng)用程序發(fā)出系統(tǒng)調(diào)用命令后,會從用戶態(tài)轉(zhuǎn)到核心態(tài),通過內(nèi)核將open()這樣的系統(tǒng)調(diào)用轉(zhuǎn)換成對物理設(shè)備的操作。

      2.驅(qū)動程序結(jié)構(gòu)

      一個設(shè)備驅(qū)動程序模塊的基本框架

      在系統(tǒng)內(nèi)部,I/O設(shè)備的存取通過一組固定的入口點(diǎn)來進(jìn)行,入口點(diǎn)也可以理解為設(shè)備的句柄,就是對設(shè)備進(jìn)行操作的基本函數(shù)。字符型設(shè)備驅(qū)動程序提供如下幾個入口點(diǎn):

      ?

      open入口點(diǎn)。打開設(shè)備準(zhǔn)備I/O操作。對字符設(shè)備文件進(jìn)行打開操作,都會調(diào)用設(shè)備的open入口點(diǎn)。open子程序必須對將要進(jìn)行的I/O操作做好必要的準(zhǔn)備工作,如清除緩沖區(qū)等。如果設(shè)備是獨(dú)占的,即同一時刻只能有一個程序訪問此設(shè)備,則open子程序必須設(shè)置一些標(biāo)志以表示設(shè)備處于忙狀態(tài)。

      ?

      close入口點(diǎn)。關(guān)閉一個設(shè)備。當(dāng)最后一次使用設(shè)備完成后,調(diào)用close子程序。獨(dú)占設(shè)備必須標(biāo)記設(shè)備方可再次使用。

      ?

      read入口點(diǎn)。從設(shè)備上讀數(shù)據(jù)。對于有緩沖區(qū)的I/O操作,一般是從緩沖區(qū)里讀數(shù)據(jù)。對字符設(shè)備文件進(jìn)行讀操作將調(diào)用read子程序。

      ?

      write入口點(diǎn)。往設(shè)備上寫數(shù)據(jù)。對于有緩沖區(qū)的I/O操作,一般是把數(shù)據(jù)寫入緩沖區(qū)里。對字符設(shè)備文件進(jìn)行寫操作將調(diào)用write子程序。

      ?

      ioctl入口點(diǎn)。執(zhí)行讀、寫之外的操作。

      select入口點(diǎn)。檢查設(shè)備,看數(shù)據(jù)是否可讀或設(shè)備是否可用于寫數(shù)據(jù)。select系統(tǒng)調(diào)用在檢查與設(shè)備文件相關(guān)的文件描述符時使用select入口點(diǎn)。

      3.設(shè)備注冊和初始化

      設(shè)備的驅(qū)動程序在加載的時候首先需要調(diào)用入口函數(shù)init_module(),該函數(shù)最重要的一個工作就是向內(nèi)核注冊該設(shè)備,對于字符設(shè)備調(diào)用register_chrdev()完成注冊。register_chrdev 的定義為:int register_chrdev(unsigned int major, const char *name, struct file_ operations *fops);其中,major是為設(shè)備驅(qū)動程序向系統(tǒng)申請的主設(shè)備號,如果為0,則系統(tǒng)為此驅(qū)動程序動態(tài)分配一個主設(shè)備號。name是設(shè)備名,fops是對各個調(diào)用的入口點(diǎn)說明。此函數(shù)返回0時表示成功;返回-EINVAL,表示申請的主設(shè)備號非法,主要原因是主設(shè)備號大于系統(tǒng)所允許的最大設(shè)備號;返回-EBUSY,表示所申請的主設(shè)備號正在被其他設(shè)備程序使用。如果動態(tài)分配主設(shè)備號成功,此函數(shù)將返回所分配 的主設(shè)備號。如果register_chrdev()操作成功,設(shè)備名就會出現(xiàn)在/proc/dvices文件中。

      Linux在/dev目錄中為每個設(shè)備建立一個文件,用ls –l命令列出函數(shù)返回值,若小于0,則表示注冊失?。环祷?或者大于0的值表示注冊成功。注冊以后,Linux將設(shè)備名與主、次設(shè)備號聯(lián)系起來。當(dāng)有對此設(shè)備名的訪問時,Linux通過請求訪問的設(shè)備名得到主、次設(shè)備號,然后把此訪問分發(fā)到對應(yīng)的設(shè)備驅(qū)動,設(shè)備驅(qū)動再根據(jù)次設(shè)備號調(diào)用不同的函數(shù)。

      當(dāng)設(shè)備驅(qū)動模塊從Linux內(nèi)核中卸載,對應(yīng)的主設(shè)備號必須被釋放。字符設(shè)備在cleanup_ module()函數(shù)中調(diào)用unregister_chrdev()來完成設(shè)備的注銷。unregister_chrdev()的定義為:int unregister_chrdev(unsigned int major, const char *name);包括設(shè)備注冊在內(nèi),設(shè)備驅(qū)動的初始化函數(shù)主要完成的功能是有以下5項(xiàng)。(1)對驅(qū)動程序管理的硬件進(jìn)行必要的初始化。

      對硬件寄存器進(jìn)行設(shè)置。比如,設(shè)置中斷掩碼,設(shè)置串口的工作方式、并口的數(shù)據(jù)方向等。

      (2)初始化設(shè)備驅(qū)動相關(guān)的參數(shù)。

      一般說來,每個設(shè)備都要定義一個設(shè)備變量,用以保存設(shè)備相關(guān)的參數(shù)。在這一步驟里對設(shè)備變量中的項(xiàng)進(jìn)行初始化。

      (3)在內(nèi)核注冊設(shè)備。

      調(diào)用register_chrdev()函數(shù)來注冊設(shè)備。(4)注冊中斷。

      如果設(shè)備需要IRQ支持,則要使用request_irq()函數(shù)注冊中斷。(5)其他初始化工作。

      初始化部分一般還負(fù)責(zé)給設(shè)備驅(qū)動程序申請包括內(nèi)存、時鐘、I/O端口等在內(nèi)的系統(tǒng)資源,這些資源也可以在open子程序或者其他地方申請。這些資源不用時,應(yīng)該釋放,以利于資源的共享。

      若驅(qū)動程序是內(nèi)核的一部分,初始化函數(shù)則要按如下方式聲明: int __init chr_driver_init(void);其中__init是必不可少的,在系統(tǒng)啟動時會由內(nèi)核調(diào)用chr_driver_init,完成驅(qū)動程序的初始化。

      當(dāng)驅(qū)動程序是以模塊的形式編寫時,則要按照如下方式聲明: int init_module(void)當(dāng)運(yùn)行后面介紹的insmod命令插入模塊時,會調(diào)用init_module函數(shù)完成初始化工作。

      4.設(shè)備驅(qū)動程序的開發(fā)過程

      由于嵌入式設(shè)備由于硬件種類非常豐富,在默認(rèn)的內(nèi)核發(fā)布版中不一定包括所有驅(qū)動程序。所以進(jìn)行嵌入式Linux系統(tǒng)的開發(fā),很大的工作量是為各種設(shè)備編寫驅(qū)動程序。除非系統(tǒng)不使用操作系統(tǒng),程序直接操縱硬件。嵌入式Linux系統(tǒng)驅(qū)動程序開發(fā)與普通Linux開發(fā)沒有區(qū)別。可以在硬件生產(chǎn)廠家或者Internet上尋找驅(qū)動程序,也可以根據(jù)相近的硬件驅(qū)動程序來改寫,這樣可以加快開發(fā)速度。實(shí)現(xiàn)一個嵌入式Linux設(shè)備驅(qū)動的大致流程如下。

      (1)查看原理圖,理解設(shè)備的工作原理。一般嵌入式處理器的生產(chǎn)商提供參考電路,也可以根據(jù)需要自行設(shè)計(jì)。

      (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è)計(jì)所要實(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)核中,或者用insmod命令加載模塊。(8)測試該設(shè)備,編寫應(yīng)用程序,對驅(qū)動程序進(jìn)行測試。

      五、基本接口實(shí)驗(yàn)

      在完成了基本實(shí)驗(yàn)后,我們開始著手基本接口實(shí)驗(yàn)。在這些實(shí)驗(yàn)中,我們學(xué)習(xí)如何編寫設(shè)備驅(qū)動程序,及如何用測試程序檢驗(yàn)驅(qū)動程序是否正確,并通過改寫測試程序正常地對驅(qū)動程序進(jìn)行相關(guān)操作。

      1.實(shí)驗(yàn)十二 簡單設(shè)備驅(qū)動程序

      本次實(shí)驗(yàn)的任務(wù)是編寫一個字符型設(shè)備驅(qū)動程序,并學(xué)習(xí)在應(yīng)用程序中調(diào)用驅(qū)動??紤]到我們初次接觸驅(qū)動程序的編寫,對此還十分陌生,因此指導(dǎo)書中提供了本次實(shí)驗(yàn)所要用到的程序源代碼。雖然這樣一個字符型設(shè)備驅(qū)動程序并沒有任何實(shí)際作用,但是它讓我們輕松掌握了嵌入式驅(qū)動的編寫過程,因?yàn)閺?fù)雜繁瑣的驅(qū)動,其骨架都是相同的。因此,看懂本實(shí)驗(yàn)的源代碼,學(xué)習(xí)并模仿其編寫方

      法,對于后續(xù)實(shí)驗(yàn)有著非常重要的意義。

      2.實(shí)驗(yàn)十三 CPU GPIO驅(qū)動程序設(shè)計(jì)

      在本實(shí)驗(yàn)中,我們要編寫第一個針對實(shí)際硬件的驅(qū)動程序。我們知道,凡是操作系統(tǒng)控制外部設(shè)備,即使是最簡單的硬件電路,也是需要驅(qū)動的。本實(shí)驗(yàn)涉及的外部硬件只有電阻和發(fā)光二極管。我們使用自己編寫的驅(qū)動程序與應(yīng)用程序控制 GPIO96的電平,通過 LED 的亮滅來判斷,是否 CPU 做出了正確的響應(yīng)。

      實(shí)驗(yàn)第一步是編寫 PXA270 GPIO 驅(qū)動程序。驅(qū)動的寫法參照實(shí)驗(yàn)十二,大體相同,主要區(qū)別如下:

      //-------------------控制IO設(shè)備-----------------------switch(cmd){ case LED_ON : {GPCR3 |= 0x1;break;} 為1 case LED_OFF: {GPSR3 |= 0x1;break;} 為1

      default :

      {

      //如果cmd=LED_OFF,那么GPSR3置//如果cmd=LED_ON,那么GPCR3置printk(“l(fā)cd control : no cmd run [--kernel--]n”);return(-EINVAL);} //-------------------驅(qū)動程序初始化--------------------------GPDR3 |= 0x00000001;//設(shè)置GPIO96輸出模式:開燈 GPSR3 |= 0x00000001;// 關(guān)燈

      對Makefile中的目標(biāo)體和依賴文件也要做相應(yīng)的修改,此處省略。在測試程序中有這樣一段代碼: while(1){ ioctl(fd, LED_OFF);sleep(1);

      // 休眠1秒

      ioctl(fd,LED_ON);sleep(1);}

      實(shí)驗(yàn)作業(yè)要求在目標(biāo)板上LED閃爍產(chǎn)生亮7秒,滅5秒的效果,很容易實(shí)現(xiàn),只需將上面的代碼改為如下代碼即可:

      while(1){ ioctl(fd, LED_OFF);sleep(5);

      sleep(7);}

      // 滅5秒 // 亮7秒 ioctl(fd,LED_ON);

      3.實(shí)驗(yàn)十四

      中斷實(shí)驗(yàn)

      在理論課中,我們學(xué)習(xí)了許多中斷方面的知識,包括中斷向量、中斷優(yōu)先級、中斷過程等。在PXA270系統(tǒng)里,中斷控制器分外部設(shè)備和 PXA270X 處理器設(shè)備產(chǎn)生的兩個層次的中斷,前者是初級的中斷源,后者是次級中斷源,大量的次級中斷源通常被映射為一個初級中斷源。

      在此實(shí)驗(yàn)中,我們要編寫一個中斷程序,利用目標(biāo)板上的按鍵SW2來產(chǎn)生中斷,使得當(dāng)每次按下此按鍵時,在超級終端上打印出響應(yīng)的信息。編寫中斷程序與前兩個實(shí)驗(yàn)的主要區(qū)別如下:

      /*--------------------------初始化

      request_irq申請硬件中斷,參數(shù)包括申請的硬件中斷號、設(shè)備id、中斷處理的

      一些屬性(SA_INTERRUPT是快速處理程序,調(diào)用時屏蔽所有中斷)等

      -----------------*/ ret = request_irq(SIMPLE_INT_IRQ, &SIMPLE_INT_interrupt, SA_INTERRUPT, “int_ctl”, NULL);//--------------------卸載,對應(yīng)request_irq釋放中斷---------------------free_irq(SIMPLE_INT_IRQ,NULL);通過此實(shí)驗(yàn),我了解了硬件中斷管腳與中斷號的對應(yīng)關(guān)系,以及中斷號與中斷處理程序的對應(yīng)關(guān)系,對于今后編寫更為復(fù)雜的中斷程序打下基礎(chǔ)。

      4.實(shí)驗(yàn)十五

      數(shù)碼管顯示實(shí)驗(yàn)

      在此實(shí)驗(yàn)中,我們要編寫針對 74LV164 的驅(qū)動程序,并用其串并轉(zhuǎn)換功能來控制八段LED數(shù)碼管的顯示。

      在編寫驅(qū)動程序時,主要有以下需要注意的: // 按位寫入

      void write_bit(int data){

      { } else

      {GPCR2 |=(0x1 << 26);

      GPCR2 |=(0x1 << 27);GPSR2 |=(0x1 << 26);if((data & 0x80)== 0x80)

      }

      GPSR2 |=(0x1 << 27);} // 按字節(jié)寫,一次寫8位

      void write_byte(int data){ { } } int i;

      write_bit(data << i);for(i=0;i<8;i++)

      使用測試程序看到的測試結(jié)果是數(shù)碼管按0-9顯示輸出。實(shí)驗(yàn)作業(yè)要求在上述基礎(chǔ)上,分別實(shí)現(xiàn)一下兩個功能:

      ① 要求您再編寫一個測試程序,實(shí)現(xiàn) PXA270-EP 目標(biāo)板上的 LED 數(shù)碼管循環(huán)顯示的數(shù)字9-0。

      ② 要求您再編寫一個測試程序,實(shí)現(xiàn) PXA270-EP 目標(biāo)板上的 LED 數(shù)碼管循環(huán)顯示的數(shù)字02468。

      由于在測試程序中定義了數(shù)組buf[10]分別存儲了0-9是個數(shù),因此上述功能的實(shí)現(xiàn)方法是,分別對測試程序做如下修改:

      原測試程序:

      while(1){ { } } for(count=0;count<10;count++)

      data[0] = buf[count];ret=write(fd,data,1);sleep(1);

      實(shí)現(xiàn)功能①:

      while(1){ { } } for(count=9;count>=0;count--)// 倒序顯示數(shù)字

      data[0] = buf[count];ret=write(fd,data,1);sleep(1);

      實(shí)現(xiàn)功能②:

      while(1){ { } } for(count=0;count<9;count=count+2)// 更改顯數(shù)順序

      data[0] = buf[count];ret=write(fd,data,1);sleep(1);

      通過更改顯數(shù)的順序,很容易實(shí)現(xiàn)實(shí)驗(yàn)作業(yè)里要求的功能。

      5.實(shí)驗(yàn)十六 LED點(diǎn)陣驅(qū)動程序設(shè)計(jì)

      通過本實(shí)驗(yàn)的操作,我們將 8X8 的點(diǎn)陣 LED 驅(qū)動起來并通過編寫測試程序,使其能夠按照您的意圖進(jìn)行顯示。要求您還編寫更多的測試程序

      ① 要求您再編寫一個測試程序,實(shí)現(xiàn)按橫的方向隔行順序掃描 LED 點(diǎn)陣數(shù)碼管。

      ② 要求您再編寫一個測試程序,實(shí)現(xiàn)按豎的方向順序掃描 LED 點(diǎn)陣數(shù)碼管。作業(yè)一,隔行掃描:

      for(i=1;i<=8;i2++){

      buf[0]=c;buf[1]=~r;// row for(j=1;j<=8;j++){

      } r = 1;c = c<<1;write(fd,buf,2);printf(“buf[0],buf[1]: [%x,%x]n”,buf[0],buf[1]);usleep(200000);// sleep 0.2 second r=r<<1;buf[1]=~r;// column

      作業(yè)二,豎向掃描:

      for(i=1;i<=8;i++){

      buf[0]=c;buf[1]=~r;// row for(j=1;j<=8;j++){

      } r = 1;c = c<<1;write(fd,buf,2);printf(“buf[0],buf[1]: [%x,%x]n”,buf[0],buf[1]);usleep(200000);// sleep 0.2 second r=r<<1;buf[1]=~r;// column

      6.實(shí)驗(yàn)十七 AD驅(qū)動實(shí)驗(yàn)

      通過本實(shí)驗(yàn)的操作,我們將 AD 轉(zhuǎn)換器驅(qū)動起來并通過編寫測試程序,使其能夠?qū)⒛M信 號量按照我們的要求轉(zhuǎn)換成數(shù)字信號量。為了更加清楚地理解 AD 轉(zhuǎn)換器的工作過程,請您再 編寫一個測試程序,將 UCB_ADC_INP_AD0 換成其他通道,來觀察其他 AD 通道情況。

      主要代碼:

      for(i=0;i<50;i++){ val0 = ioctl(fd,UCB_ADC_INP_AD1,0);usleep(100);val1 = ioctl(fd,UCB_ADC_INP_AD0,0);

      usleep(100);val2 = ioctl(fd,UCB_ADC_INP_AD2,0);usleep(100);

      7.實(shí)驗(yàn)十八 DA驅(qū)動實(shí)驗(yàn)

      通過本實(shí)驗(yàn)的操作,我們使用示波器看到了通過 DA 轉(zhuǎn)換而輸出的波形。在此基礎(chǔ)上,要求試寫一個實(shí)現(xiàn)輸出三角波的測試程序。

      主要代碼:

      while(flag_func_run == FUNC_RUN){ print_prompt();// print select functions scanf(“%d”,&flag_select_func);// user input select getchar();// get ENTER

      switch(flag_select_func){ case DA_SIN : {da_create_sin(fd);break;} case DA_FANG case FUNC_QUIT :

      { flag_func_run = FUNC_NOT_RUN;printf(“Quit DA function.byebyen”);break;} case DA_TRI :{da_create_tri(fd);break;} default : { printf(“input = %xn”,flag_select_func);printf(“statys = %xn”,flag_func_run);

      : {da_create_fang(fd);break;} printf(“--please input your select use 1 to 4--n”);} }

      六、實(shí)驗(yàn)中遇到的問題及解決方法

      每一次上課重新啟動后,當(dāng)需要將宿主PC機(jī)的根目錄掛在到PXA270-EP目標(biāo)板的mnt目錄下(即在超級終端中輸入命令“mount –o soft,timeo=100,rsize=1024 192.168.0.100:/ /mnt”)時,常顯示無法掛載。

      解決方法:在超級終端下的掛載命令應(yīng)該用”mount –o nolock 192.168.0.100:/ /mnt”,如果依然不能掛載需要重啟NFS服務(wù),即在PC機(jī)終端中輸入命令”service nfs restart”兩遍后就可以掛載,當(dāng)然有時候也可能是因?yàn)榫W(wǎng)線沒插好。

      在每次重啟機(jī)器之后都需要將PC機(jī)終端的IP地址和開發(fā)板中的系統(tǒng)的IP地址設(shè)定正確,不然也無法掛載。

      七、實(shí)驗(yàn)總結(jié)及心得

      本學(xué)期的所有實(shí)驗(yàn)均在宿主PC機(jī)與PXA270-EP目標(biāo)板上進(jìn)行。通過這些為數(shù)不多課時的實(shí)驗(yàn),我逐步完成了建立實(shí)驗(yàn)軟件開發(fā)平臺,搭建實(shí)驗(yàn)編譯軟件環(huán)境,在PC上編輯、編譯一個應(yīng)用程序,并且在嵌入式系統(tǒng)上運(yùn)行和調(diào)試它的過程。在實(shí)驗(yàn)中,不難發(fā)現(xiàn),編譯驅(qū)動程序大體框架都是一樣的,比如里面的讀函數(shù)、寫函數(shù)、ioctl函數(shù)、打開、關(guān)閉以及函數(shù)模塊的初始化并且在超級終端上顯示出等。但所不同的是,要根據(jù)不同的實(shí)驗(yàn)要求修改名稱,并且對其中必要的部分進(jìn)行修改。

      除此之外,我認(rèn)為很多基礎(chǔ)知識對實(shí)驗(yàn)的進(jìn)行也起著非常大的作用,例如數(shù)碼管的顯示原理。在掌握了基礎(chǔ)知識之后,上機(jī)的過程會顯得相對簡單,尤其是代碼框架已經(jīng)給出,我們所以需要做的就是根據(jù)需要稍作改動來得到我們想要的結(jié)果。

      之后,我們又進(jìn)行了更加深入的應(yīng)用試驗(yàn),如人機(jī)接口方面的鍵盤驅(qū)動實(shí)驗(yàn)、LCD控制實(shí)驗(yàn)和觸摸屏數(shù)據(jù)采集與控制實(shí)驗(yàn),應(yīng)用方面的多線程應(yīng)用實(shí)驗(yàn)等。由于涉及到嵌入式實(shí)驗(yàn)板的開發(fā),我們在之前實(shí)驗(yàn)基礎(chǔ)上自己動手編寫了程序,對算法和開發(fā)環(huán)境有了更深入的掌握,在自我與互相學(xué)習(xí)中解決了許多問題,受益匪淺。

      整個實(shí)驗(yàn)讓我了解了一套完整的嵌入式系統(tǒng)驅(qū)動程序開發(fā)的全過程,學(xué)到的內(nèi)容非常豐富,相信在學(xué)習(xí)了這些內(nèi)容后,在今后的學(xué)習(xí)工作中接觸到類似內(nèi)容,我不會感到無從下手,而是能夠有條不紊。

      感謝老師的辛勤指導(dǎo)!

      下載北郵數(shù)據(jù)庫實(shí)驗(yàn)報(bào)告word格式文檔
      下載北郵數(shù)據(jù)庫實(shí)驗(yàn)報(bào)告.doc
      將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會在5個工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        北郵數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告-排序范文大全

        北京郵電大學(xué) 數(shù)據(jù)結(jié)構(gòu)試驗(yàn)報(bào)告 實(shí)驗(yàn)名稱: 實(shí)驗(yàn)四排序 學(xué)生姓名:班級:班內(nèi)序號:學(xué)號: 日期: 2014年1月4日 1 實(shí)驗(yàn)?zāi)康?學(xué)習(xí)、實(shí)現(xiàn)、對比各種排序算法,掌握各種排序算法的優(yōu)劣,以......

        北郵日歷java實(shí)驗(yàn)報(bào)告

        Java日歷實(shí)驗(yàn)報(bào)告 信息工程27班項(xiàng)明鈞 一、實(shí)驗(yàn)要求 寫一個建議日歷圖形用戶界面二、設(shè)計(jì)思路 此次作業(yè)主要用到了窗口布局設(shè)計(jì)及各個組件的功能顯示,事件處理機(jī)制。首先需......

        北郵現(xiàn)場總線實(shí)驗(yàn)報(bào)告

        現(xiàn)場總線實(shí)驗(yàn)報(bào)告 實(shí)驗(yàn)名稱: CAN總線技術(shù)與iCAN模塊實(shí)驗(yàn)學(xué)院: 自動化學(xué)院專業(yè): 自動化專業(yè)班級: 2010211411 姓名: 韓思宇學(xué)號: 10212006 指導(dǎo)老師: 楊軍一、實(shí)驗(yàn)名稱: 實(shí)驗(yàn)一:CAN總......

        北郵電子院專業(yè)實(shí)驗(yàn)報(bào)告

        電子工程學(xué)院 ASIC專業(yè)實(shí)驗(yàn)報(bào)告 班級: 姓名:學(xué)號: 班內(nèi)序號: 第一部分 語言級仿真 LAB 1:簡單的組合邏輯設(shè)計(jì) 一、 二、 實(shí)驗(yàn)?zāi)康?實(shí)驗(yàn)原理 掌握基本組合邏輯電路的實(shí)現(xiàn)方法。 本......

        北郵數(shù)據(jù)庫期中知識點(diǎn)總結(jié)

        Chapter 1. Introduction to Database 數(shù)據(jù)庫很重要 數(shù)據(jù)庫的前身是文件系統(tǒng): 概念 自己管自己 –> 數(shù)據(jù)孤立 冗余 數(shù)據(jù)依賴性差(一個改了與它相關(guān)的全部重寫)文件格式不相......

        北郵電子院嵌入式實(shí)驗(yàn)報(bào)告大四上

        嵌入式實(shí)驗(yàn)報(bào)告 學(xué)院: 電子工程學(xué)院 一、實(shí)驗(yàn)?zāi)康?1、 了解嵌入式系統(tǒng)及其相關(guān)基礎(chǔ)知識。 2、 了解宿主PC機(jī)與PXA270目標(biāo)版,能正確連接宿主PC機(jī)與PXA270目標(biāo)版。 3、 學(xué)會在宿......

        北郵數(shù)字電路與邏輯設(shè)計(jì)實(shí)驗(yàn)報(bào)告

        北京郵電大學(xué)數(shù)字電路與邏輯 設(shè)計(jì)實(shí)驗(yàn)報(bào)告 學(xué)院: 班級: 姓名:學(xué)號: 實(shí)驗(yàn)一 Quartus II原理圖輸入法設(shè)計(jì)與實(shí)現(xiàn) 一、實(shí)驗(yàn)?zāi)康模?(1) 熟悉Quartus II原理圖輸入法進(jìn)行電路設(shè)計(jì)和仿......

        北郵小學(xué)期c++實(shí)驗(yàn)報(bào)告

        面向?qū)ο蟪绦蛟O(shè)計(jì)與實(shí)踐 c++實(shí)驗(yàn)總結(jié)報(bào)告 ——網(wǎng)絡(luò)工程14班饒思哲 ——學(xué)號:2013211574 實(shí)驗(yàn)一簡單C++程序設(shè)計(jì) 1. 猜價格游戲 編寫C++程序完成以下功能: (1) 假定有一件商品,程序......