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

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

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

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

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

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

      時(shí)間:2019-05-15 10:17:28下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫(xiě)寫(xiě)幫文庫(kù)小編為你整理了多篇相關(guān)的《北郵電子院專(zhuān)業(yè)實(shí)驗(yàn)報(bào)告》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫(xiě)寫(xiě)幫文庫(kù)還可以找到更多《北郵電子院專(zhuān)業(yè)實(shí)驗(yàn)報(bào)告》。

      第一篇:北郵電子院專(zhuān)業(yè)實(shí)驗(yàn)報(bào)告

      電子工程學(xué)院

      ASIC專(zhuān)業(yè)實(shí)驗(yàn)報(bào)告

      班級(jí): 姓名:

      學(xué)號(hào): 班內(nèi)序號(hào):

      第一部分 語(yǔ)言級(jí)仿真

      LAB 1:簡(jiǎn)單的組合邏輯設(shè)計(jì)一、二、實(shí)驗(yàn)?zāi)康?實(shí)驗(yàn)原理 掌握基本組合邏輯電路的實(shí)現(xiàn)方法。

      本實(shí)驗(yàn)中描述的是一個(gè)可綜合的二選一開(kāi)關(guān),它的功能是當(dāng)sel = 0時(shí),給出out = a,否則給出結(jié)果out = b。在Verilog HDL中,描述組合邏輯時(shí)常使用assign結(jié)構(gòu)。equal=(a==b)?1:0是一種在組合邏輯實(shí)現(xiàn)分支判斷時(shí)常用的格式。parameter定義的size參數(shù)決定位寬。測(cè)試模塊用于檢測(cè)模塊設(shè)計(jì)的是否正確,它給出模塊的輸入信號(hào),觀察模塊的內(nèi)部信號(hào)和輸出信號(hào)。

      三、源代碼

      mux.v module scale_mux(out,sel,b,a);parameter size=1;output[size-1:0] out;input[size-1:0]b,a;input sel;assign out =(!sel)?a:

      (sel)?b:

      {size{1'bx}};endmodule

      mux_test.v `define width 8 `timescale 1 ns/1 ns module mux_test;

      reg[`width:1]a,b;

      wire[`width:1]out;

      reg sel;

      scale_mux#(`width)m1(.out(out),.sel(sel),.b(b),.a(a));

      initial

      begin

      $monitor($stime,“sel=%b a=%b b=%b out=%b”,sel,a,b,out);

      $dumpvars(2,mux_test);

      sel=0;b={`width{1'b0}};a={`width{1'b1}};

      #5sel=0;b={`width{1'b1}};a={`width{1'b0}};

      #5sel=1;b={`width{1'b0}};a={`width{1'b1}};

      #5sel=1;b={`width{1'b1}};a={`width{1'b0}};

      #5 $finish;

      end endmodule

      四、仿真結(jié)果與波形

      LAB 2:簡(jiǎn)單時(shí)序邏輯電路的設(shè)計(jì)一、二、實(shí)驗(yàn)?zāi)康?實(shí)驗(yàn)原理 掌握基本時(shí)序邏輯電路的實(shí)現(xiàn)。

      在Verilog HDL中,相對(duì)于組合邏輯電路,時(shí)序邏輯電路也有規(guī)定的表述方式。在可綜合的Verilog HDL模型中,我們常使用always塊和@(posedge clk)或@(negedge clk)的結(jié)構(gòu)來(lái)表述時(shí)序邏輯。

      在always塊中,被賦值的信號(hào)都必須定義為reg型,這是由時(shí)序邏輯電路的特點(diǎn)所決定的對(duì)于reg型數(shù)據(jù),如果未對(duì)它進(jìn)行賦值,仿真工具會(huì)認(rèn)為它是不定態(tài)。為了正確地觀察到仿真結(jié)果,在可綜合的模塊中我們通常定義一個(gè)復(fù)位信號(hào)rst-,當(dāng)它為低電平時(shí)對(duì)電路中的寄存器進(jìn)行復(fù)位。

      三、源代碼

      counter.v `timescale 1 ns/100 ps module counter(cnt,clk,data,rst_,load);output[4:0]cnt;input [4:0]data;input

      clk;input

      rst_;input

      load;reg

      [4:0]cnt;

      always@(posedge clk or negedge rst_)

      if(!rst_)

      #1.2 cnt<=0;

      else

      if(load)

      cnt<=#3 data;

      else

      cnt<=#4 cnt + 1;

      endmodule

      counter_test.v `timescale 1 ns/1 ns module counter_test;

      wire[4:0]cnt;

      reg [4:0]data;

      reg

      rst_;

      reg

      load;

      reg

      clk;

      counter c1

      (.cnt(cnt),.clk(clk),.data(data),.rst_(rst_),.load(load));

      initial begin

      clk=0;

      forever begin

      #10 clk=1'b1;

      #10 clk=1'b0;

      end

      end

      initial begin

      $timeformat(-9,1,“ns”,9);

      $monitor(“time=%t,data=%h,clk=%b,rst_=%b,load=%b,cnt=%b”,$stime,data,clk,rst_,load,cnt);

      $dumpvars(2,counter_test);

      end task expect;input [4:0]expects;

      if(cnt!==expects)begin

      $display(“At time %t cnt is %b and should be %b”,$time,cnt,expects);

      $display(“TEST FAILED”);

      $finish;

      end endtask initial begin

      @(negedge clk)

      {rst_,load,data}=7'b0_X_XXXXX;@(negedge clk)expect(5'h00);

      {rst_,load,data}=7'b1_1_11101;@(negedge clk)expect(5'h1D);

      {rst_,load,data}=7'b1_0_11101;

      repeat(5)@(negedge clk);

      expect(5'h02);

      {rst_,load,data}=7'b1_1_11111;@(negedge clk)expect(5'h1F);

      {rst_,load,data}=7'b0_X_XXXXX;@(negedge clk)expect(5'h00);

      $display(“TEST PASSED”);

      $finish;

      end endmodule

      四、仿真結(jié)果與波形

      五、思考題

      該電路中,rst-是同步還是異步清零端?

      在counter.v的always塊中reset沒(méi)有等時(shí)鐘,而是直接清零。所以是異步清零端。

      LAB 3:簡(jiǎn)單時(shí)序邏輯電路的設(shè)計(jì)一、二、實(shí)驗(yàn)?zāi)康?實(shí)驗(yàn)原理 使用預(yù)定義的庫(kù)元件來(lái)設(shè)計(jì)八位寄存器。

      八位寄存器中,每一位寄存器由一個(gè)二選一MUX和一個(gè)觸發(fā)器dffr組成,當(dāng)load=1,裝載數(shù)據(jù);當(dāng)load=0,寄存器保持。對(duì)于處理重復(fù)的電路,可用數(shù)組條用的方式,使電路描述清晰、簡(jiǎn)潔。

      三、源代碼

      clock.v `timescale 1 ns /1 ns module clock(clk);reg clk;output clk;initial begin clk=0;forever begin #10 clk=1'b1;#10 clk=1'b0;end end endmodule

      mux及dffr模塊調(diào)用代碼

      mux mux7(.out(n1[7]),.sel(load),.b(data[7]),.a(out[7]));dffr dffr7(.q(out[7]),.d(n1[7]),.clk(clk),.rst_(rst_));mux mux6(.out(n1[6]),.sel(load),.b(data[6]),.a(out[6]));dffr dffr6(.q(out[6]),.d(n1[6]),.clk(clk),.rst_(rst_));mux mux5(.out(n1[5]),.sel(load),.b(data[5]),.a(out[5]));dffr dffr5(.q(out[5]),.d(n1[5]),.clk(clk),.rst_(rst_));mux mux4(.out(n1[4]),.sel(load),.b(data[4]),.a(out[4]));dffr dffr4(.q(out[4]),.d(n1[4]),.clk(clk),.rst_(rst_));

      mux mux3(.out(n1[3]),.sel(load),.b(data[3]),.a(out[3]));dffr dffr3(.q(out[3]),.d(n1[3]),.clk(clk),.rst_(rst_));mux mux2(.out(n1[2]),.sel(load),.b(data[2]),.a(out[2]));dffr dffr2(.q(out[2]),.d(n1[2]),.clk(clk),.rst_(rst_));mux mux1(.out(n1[1]),.sel(load),.b(data[1]),.a(out[1]));dffr dffr1(.q(out[1]),.d(n1[1]),.clk(clk),.rst_(rst_));mux mux0(.out(n1[0]),.sel(load),.b(data[0]),.a(out[0]));dffr dffr0(.q(out[0]),.d(n1[0]),.clk(clk),.rst_(rst_));

      例化寄存器

      register r1(.data(data),.out(out),.load(load),.clk(clk),.rst_(rst_));例化時(shí)鐘

      clock c1(.clk(clk));

      添加檢測(cè)信號(hào) initial begin $timeformat(-9,1,“ns”,9);$monitor(“time=%t,clk=%b,data=%h,load=%b,out=%h”, $stime,clk,data,load,out);$dumpvars(2,register_test);end

      四、仿真結(jié)果與波形

      LAB 4:用always塊實(shí)現(xiàn)較復(fù)雜的組合邏輯電路

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

      掌握用always實(shí)現(xiàn)組合邏輯電路的方法;

      了解assign與always兩種組合邏輯電路實(shí)現(xiàn)方法之間的區(qū)別。

      二、實(shí)驗(yàn)原理

      僅使用assign結(jié)構(gòu)來(lái)實(shí)現(xiàn)組合邏輯電路,在設(shè)計(jì)中會(huì)發(fā)現(xiàn)很多地方顯得冗長(zhǎng)且效率低下。適當(dāng)?shù)厥褂胊lways來(lái)設(shè)計(jì)組合邏輯,會(huì)更具實(shí)效。

      本實(shí)驗(yàn)描述的是一個(gè)簡(jiǎn)單的ALU指令譯碼電路的設(shè)計(jì)示例。它通過(guò)對(duì)指令的判斷,對(duì)輸入數(shù)據(jù)執(zhí)行相應(yīng)的操作,包括加、減、或和傳數(shù)據(jù),并且無(wú)論是指令作用的數(shù)據(jù)還是指令本身發(fā)生變化,結(jié)果都要做出及時(shí)的反應(yīng)。

      示例中使用了電平敏感的always塊,電平敏感的觸發(fā)條件是指在@后括號(hào)內(nèi)電平列表的任何一個(gè)電平發(fā)生變化就能觸發(fā)always塊的動(dòng)作,并且運(yùn)用了case結(jié)構(gòu)來(lái)進(jìn)行分支判斷。

      在always中適當(dāng)運(yùn)用default(在case結(jié)構(gòu)中)和else(子if…else結(jié)構(gòu)中),通常可以綜合為純組合邏輯,盡管被賦值的變量一定要定義為reg型。如果不使用default或else對(duì)缺省項(xiàng)進(jìn)行說(shuō)明,易產(chǎn)生意想不到的鎖存器。

      三、源代碼

      電路描述

      always@(opcode or data or accum)begin if(accum==8'b00000000)#1.2 zero=1;else #1.2 zero=0;

      case(opcode)PASS0: #3.5 out =accum;PASS1: #3.5 out =accum;ADD: #3.5 out = data + accum;AND: #3.5 out =data&accum;XOR: #3.5 out =data^accum;PASSD: #3.5 out=data;PASS6:#3.5 out=accum;PASS7:#3.5 out=accum;default:#3.5 out=8'bx;endcase end

      四、仿真結(jié)果與波形

      LAB 5:存儲(chǔ)器電路的設(shè)計(jì)一、二、實(shí)驗(yàn)?zāi)康?實(shí)驗(yàn)原理 設(shè)計(jì)和測(cè)試存儲(chǔ)器電路。

      本實(shí)驗(yàn)中,設(shè)計(jì)一個(gè)模塊名為mem的存儲(chǔ)器仿真模型,該存儲(chǔ)器具有雙線數(shù)據(jù)總線及異步處理功能。由于數(shù)據(jù)是雙向的,所以要注意,對(duì)memory的讀寫(xiě)在時(shí)序上要錯(cuò)開(kāi)。

      三、源代碼

      自行添加的代碼

      assign data=(read)?memory[addr]:8'hZ;

      always @(posedge write)begin memory[addr]<=data[7:0];end

      四、仿真結(jié)果與波形

      LAB 6:設(shè)計(jì)時(shí)序邏輯時(shí)采用阻塞賦值與非阻塞賦值的區(qū)別

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

      明確掌握阻塞賦值與非阻塞賦值的概念和區(qū)別; 了解阻塞賦值的使用情況。

      二、實(shí)驗(yàn)原理

      在always塊中,阻塞賦值可以理解為賦值語(yǔ)句是順序執(zhí)行的,而非阻塞賦值可以理解為并發(fā)執(zhí)行的。實(shí)際時(shí)序邏輯設(shè)計(jì)中,一般情況下非阻塞賦值語(yǔ)句被更多的使用,有時(shí)為了在同一周期實(shí)現(xiàn)相互關(guān)聯(lián)的操作,也使用阻塞賦值語(yǔ)句。

      三、源代碼

      blocking.v `timescale 1 ns/ 100 ps

      module blocking(clk,a,b,c);

      output[3:0]b,c;

      input [3:0]a;

      input

      clk;

      reg

      [3:0]b,c;

      always@(posedge clk)

      begin

      b =a;

      c =b;

      $display(“Blocking: a=%d,b=%d,c=%d.”,a,b,c);

      end endmodule

      non_blocking.v `timescale 1 ns/ 100 ps module non_blocking(clk,a,b,c);

      output[3:0] b,c;input[3:0] a;input clk;reg [3:0]b,c;always @(posedge clk)begin b<=a;c<=b;$display(“Non_blocking:a=%d,b=%d,c=%d”,a,b,c);end endmodule compareTop.v `timescale 1 ns/ 100 ps module compareTop;wire [3:0] b1,c1,b2,c2;reg[3:0]a;reg clk;initial begin clk=0;forever #50 clk=~clk;end initial $dumpvars(2,compareTop);initial begin a=4'h3;$display(“_______________________________”);# 100 a =4'h7;$display(“_______________________________”);# 100 a =4'hf;$display(“_______________________________”);# 100 a =4'ha;$display(“_______________________________”);# 100 a =4'h2;$display(“_______________________________”);# 100 $display(“_______________________________”);$finish;end non_blocking nonblocking(clk,a,b2,c2);blocking blocking(clk,a,b1,c1);endmodule

      四、仿真結(jié)果與波形

      LAB 7:利用有限狀態(tài)機(jī)進(jìn)行復(fù)雜時(shí)序邏輯的設(shè)計(jì)一、二、實(shí)驗(yàn)?zāi)康?實(shí)驗(yàn)原理 掌握利用有限狀態(tài)機(jī)(FSM)實(shí)現(xiàn)復(fù)雜時(shí)序邏輯的方法。

      控制器是CPU的控制核心,用于產(chǎn)生一系列的控制信號(hào),啟動(dòng)或停止某些部件。CPU何時(shí)進(jìn)行讀指令,何時(shí)進(jìn)行RAM和I/O端口的讀寫(xiě)操作等,都由控制器來(lái)控制。

      三、源代碼

      補(bǔ)充代碼

      nexstate<=state+1'h01;case(state)1:begin sel=1;rd=0;ld_ir=0;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end 2:begin sel=1;rd=1;ld_ir=0;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end 3:begin sel=1;rd=1;ld_ir=1;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end 4:begin sel=1;rd=1;ld_ir=1;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end 5:begin sel=0;rd=0;ld_ir=0;inc_pc=1;ld_pc=0;data_e=0;ld_ac=0;wr=0;if(opcode==`HLT)halt=1;end 6:begin sel=0;rd=alu_op;ld_ir=0;inc_pc=0;halt=0;ld_pc=0;data_e=0;ld_ac=0;wr=0;end 7:begin sel=0;rd=alu_op;ld_ir=0;halt=0;data_e=!alu_op;ld_ac=0;wr=0;if(opcode==`SKZ)inc_pc<=zero;if(opcode==`JMP)ld_pc=1;end 0:begin sel=0;rd=alu_op;ld_ir=0;halt=0;data_e=!alu_op;ld_ac=alu_op;inc_pc=(opcode==`SKZ)&zero||(opcode==`JMP);if(opcode==`JMP)ld_pc=1;if(opcode==`STO)wr=1;end //default:begin sel=1'bZ;rd=1'bZ;ld_ir=1'bZ;inc_pc=1'bZ;halt=1'bZ;ld_pc=1'bZ;data_e=1'bZ;ld_ac=1'bZ;wr=1'bZ;end endcase end

      control_test.v /***************************** * TEST BENCH FOR CONTROLLER * *****************************/

      `timescale 1 ns / 1 ns

      module control_test;

      reg [8:0] response [0:127];

      reg [3:0] stimulus [0:15];

      reg [2:0] opcode;

      reg

      clk;

      reg

      rst_;

      reg

      zero;

      integer

      i,j;

      reg[(3*8):1] mnemonic;

      // Instantiate controller

      control c1(rd , wr , ld_ir , ld_ac , ld_pc , inc_pc , halt , data_e , sel , opcode , zero , clk , rst_);

      // Define clock

      initial begin

      clk = 1;

      forever begin

      #10 clk = 0;

      #10 clk = 1;

      end

      end

      // Generate mnemonic for debugging purposes

      always @(opcode)

      begin

      case(opcode)

      3'h0

      : mnemonic = “HLT”;

      3'h1

      : mnemonic = “SKZ”;

      3'h2

      : mnemonic = “ADD”;

      3'h3

      : mnemonic = “AND”;

      3'h4

      : mnemonic = “XOR”;

      3'h5

      : mnemonic = “LDA”;

      3'h6

      : mnemonic = “STO”;

      3'h7

      : mnemonic = “JMP”;

      default : mnemonic = “???”;

      endcase

      end

      // Monitor signals

      initial

      begin

      $timeformat(-9, 1, “ ns”, 9);

      $display(“ time

      rd wr ld_ir ld_ac ld_pc inc_pc halt data_e sel opcode zero state”);

      $display(“--------------------------------------------------------------”);//

      $shm_open(“waves.shm”);//

      $shm_probe(“A”);//

      $shm_probe(c1.state);

      end

      // Apply stimulus

      initial

      begin

      $readmemb(“stimulus.pat”, stimulus);

      rst_=1;

      @(negedge clk)rst_ = 0;

      @(negedge clk)rst_ = 1;

      for(i=0;i<=15;i=i+1)

      @(posedge ld_ir)

      @(negedge clk)

      { opcode, zero } = stimulus[i];

      end

      // Check response

      initial

      begin

      $readmemb(“response.pat”, response);

      @(posedge rst_)

      for(j=0;j<=127;j=j+1)

      @(negedge clk)

      begin

      $display(“%t %b %b %b

      %b

      %b

      %b

      %b

      %b %b

      %b

      %b”,$time,rd,wr,ld_ir,ld_ac,ld_pc,inc_pc,halt,data_e,sel,opcode,zero,c1.state);

      if({rd,wr,ld_ir,ld_ac,ld_pc,inc_pc,halt,data_e,sel}!==

      response[j])

      begin : blk

      reg [8:0] r;

      r = response[j];

      $display("ERRORTEST1 PASSED!

      111_00000

      // 18

      JMP BEGIN //run test again

      @1A 00000000

      // 1A

      DATA_1:

      //constant 00(hex)

      11111111

      // 1B

      DATA_2:

      //constant FF(hex)

      10101010

      // 1C

      TEMP:

      //variableTEST2 PASSED!

      111_00000

      // 11

      JMP BEGIN

      //run test again

      @1A 00000001

      // 1A

      DATA_1:

      //constant 1(hex)

      10101010

      // 1B

      DATA_2:

      //constant AA(hex)

      11111111

      // 1C

      DATA_3:

      //constant FF(hex)

      00000000

      // 1D

      TEMP:

      CPUtest3.dat //opcode_operand // addr

      assembly code //--------------//-------------------------

      111_00011

      // 00

      JMP LOOP

      //jump to the address of LOOP @03 101_11011

      // 03

      LOOP:

      LDA FN2

      //load value in FN2 into accum

      110_11100

      // 04

      STO TEMP

      //store accumulator in TEMP

      010_11010

      // 05

      ADD FN1

      //add value in FN1 to accumulator

      110_11011

      // 06

      STO FN2

      //store result in FN2

      101_11100

      // 07

      LDA TEMP

      //load TEMP into the accumulator

      110_11010

      // 08

      STO FN1

      //store accumulator in FN1

      100_11101

      // 09

      XOR LIMIT //compare accumulator to LIMIT

      001_00000

      // 0A

      SKZ

      //if accum = 0, skip to DONE

      111_00011

      // 0B

      JMP LOOP

      //jump to address of LOOP

      000_00000

      // 0C

      DONE:

      HLT

      //end of program

      101_11111

      // 0D

      AGAIN: LDA ONE

      110_11010

      // 0E

      STO FN1

      101_11110

      // 0F

      LDA ZERO

      110_11011

      // 10

      STO FN2

      111_00011

      // 11

      JMP LOOP

      //jump to address of LOOP

      @1A 00000001

      // 1A

      FN1:

      //variablestores 2nd Fib.No.00000000

      // 1C

      TEMP:

      //temporary variable

      10010000

      // 1D

      LIMIT:

      //constant 144stores 1st Fib.No.00000101

      // 1B

      data2:

      //5

      variablemax value

      00000110

      // 1E

      LIMIT:

      // 6

      constant 1

      11111111

      // 1F

      AND1:

      //FF and

      四、仿真結(jié)果與波形

      第二部分 電路綜合一、二、三、四、實(shí)驗(yàn)?zāi)康?實(shí)驗(yàn)內(nèi)容 源代碼

      門(mén)級(jí)電路仿真結(jié)果與波形 掌握邏輯綜合的概念和流程,熟悉采用Design Compiler進(jìn)行邏輯綜合的基本方法。采用SYNOPSYS公司的綜合工具Design Compiler對(duì)實(shí)驗(yàn)7的control.v做綜合。與實(shí)驗(yàn)指導(dǎo)書(shū)中相同。

      五、思考題

      1.control_pad.v文件是verilog語(yǔ)言及的描述還是結(jié)構(gòu)化的描述?

      是結(jié)構(gòu)化的描述。

      2.control_pad.sdf文件中,對(duì)觸發(fā)器的延遲包括哪些信息?

      包括對(duì)邏輯單元和管腳的上升/下降時(shí)延的最大值、最小值和典型值。

      第三部分 版圖設(shè)計(jì)一、二、三、四、實(shí)驗(yàn)?zāi)康?實(shí)驗(yàn)內(nèi)容 源代碼

      仿真結(jié)果與波形 掌握版圖設(shè)計(jì)的基本概念和流程,熟悉采用Sysnopsys ICC工具進(jìn)行版圖設(shè)計(jì)的方法。對(duì)電路綜合輸出的門(mén)級(jí)網(wǎng)表control_pad.v進(jìn)行布局布線。與實(shí)驗(yàn)指導(dǎo)書(shū)中相同。布局規(guī)劃后結(jié)果

      未產(chǎn)生core ring和mesh前

      產(chǎn)生core ring和mesh后

      電源線和電影PAD連接后

      filler PAD填充后

      布局后結(jié)果

      時(shí)鐘樹(shù)綜合后結(jié)果

      布線后結(jié)果

      寄生參數(shù)的導(dǎo)出和后仿

      五、思考題

      1.簡(jiǎn)述ICC在design setup階段的主要工作。

      創(chuàng)建設(shè)計(jì)庫(kù),讀取網(wǎng)表文件并創(chuàng)建設(shè)計(jì)單元,提供并檢查時(shí)間約束,檢查時(shí)鐘。在對(duì)之前的數(shù)據(jù)與信息進(jìn)行讀取與檢查后保存設(shè)計(jì)單元。2.為什么要填充filler pad?

      filler pad把分散的pad單元連接起來(lái),把pad I/O區(qū)域供電連成一個(gè)整體。使它們得到持續(xù)供電并提高ESD保護(hù)能力。3.derive_pg_connection的作用是什么?

      描述有關(guān)電源連接的信息。4.簡(jiǎn)述floorplan的主要任務(wù)。

      對(duì)芯片大小、輸入輸出單元、宏模塊進(jìn)行規(guī)劃,對(duì)電源網(wǎng)絡(luò)進(jìn)行設(shè)計(jì)。5.簡(jiǎn)述place階段的主要任務(wù)。

      對(duì)電路中的延時(shí)進(jìn)行估計(jì)與分析,模擬時(shí)鐘樹(shù)的影響,按照時(shí)序要求,對(duì)標(biāo)準(zhǔn)化單元進(jìn)行布局。

      6.簡(jiǎn)述CTS的主要步驟。

      設(shè)置時(shí)鐘樹(shù)公共選項(xiàng);綜合時(shí)鐘樹(shù);重新連接掃描鏈;使能傳播時(shí)鐘;Post-CTS布局優(yōu)化;優(yōu)化時(shí)鐘偏移;優(yōu)化時(shí)序。

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

      經(jīng)過(guò)數(shù)周的ASIC專(zhuān)業(yè)實(shí)驗(yàn),我對(duì)芯片設(shè)計(jì)流程、Verilog HDL語(yǔ)言、Linux基本指令和Vi文本編輯器有了基本的了解。雖然之前對(duì)芯片設(shè)計(jì)、VHDL一無(wú)所知,但通過(guò)實(shí)驗(yàn)初步熟悉了ASIC的體系結(jié)構(gòu)和VHDL的基本語(yǔ)法,對(duì)電路中時(shí)鐘、寄生參數(shù)、元件布局帶來(lái)的影響也有了了解。我在實(shí)驗(yàn)中也遇到了許多問(wèn)題,但我在老師、助教、同學(xué)的幫助下解決了這些問(wèn)題,也有了更多收獲。通過(guò)這次ASIC專(zhuān)業(yè)實(shí)驗(yàn),我加深了對(duì)本專(zhuān)業(yè)的認(rèn)識(shí)。我會(huì)繼續(xù)努力成為合格的電子人。

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

      嵌入式實(shí)驗(yàn)報(bào)告

      學(xué)院: 電子工程學(xué)院

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

      1、了解嵌入式系統(tǒng)及其相關(guān)基礎(chǔ)知識(shí)。

      2、了解宿主PC機(jī)與PXA270目標(biāo)版,能正確連接宿主PC機(jī)與PXA270目標(biāo)版。

      3、學(xué)會(huì)在宿主機(jī)上安裝Linux操作系統(tǒng)——RedHat9.0。、4、學(xué)會(huì)建立宿主PC機(jī)端的開(kāi)發(fā)環(huán)境。

      5、學(xué)會(huì)配置宿主PC機(jī)端的超級(jí)終端。

      6、配置宿主PC機(jī)端的TFTP服務(wù),并開(kāi)通此服務(wù)。

      7、配置宿主PC機(jī)端的NFS服務(wù),并開(kāi)通此服務(wù)。

      8、學(xué)會(huì)簡(jiǎn)單Linux驅(qū)動(dòng)程序的設(shè)計(jì)。

      二、實(shí)驗(yàn)內(nèi)容

      (一)基本實(shí)驗(yàn)

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

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

      實(shí)驗(yàn)四是配置宿主PC機(jī)端的超級(jí)終端,使PC機(jī)與PXA270目標(biāo)板之間可以通過(guò)串口通訊。在每次重啟宿主PC機(jī)時(shí),都需要重新將超級(jí)終端掛載到虛擬機(jī)上,掛載之前須通過(guò)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是簡(jiǎn)單文件傳輸協(xié)議。每次重啟宿主PC機(jī)時(shí),都要重啟該服務(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)端檔案時(shí),只需調(diào)用“mount”就可以遠(yuǎn)端系統(tǒng)掛接在自己的檔案系統(tǒng)之下。每次重啟宿主PC機(jī)時(shí),也都要重啟該服務(wù),重啟命令為: service nfs restart service nfs restart

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

      實(shí)驗(yàn)

      十二、簡(jiǎn)單設(shè)備驅(qū)動(dòng)程序

      本次實(shí)驗(yàn)的目的是讓我們動(dòng)手實(shí)踐一個(gè)簡(jiǎn)單的字符型設(shè)備驅(qū)動(dòng)程序,學(xué)習(xí)Linux驅(qū)動(dòng)程序構(gòu)架,學(xué)習(xí)在應(yīng)用程序中調(diào)用驅(qū)動(dòng)。驅(qū)動(dòng)程序代碼及注釋為: // 頭文件

      #include #include #include #include #include #include #include #define SIMPLE_HELLO_MAJOR 96 // 定義主設(shè)備號(hào)HELLO DEVICE MAJOR #define OURS_HELLO_DEBUG // 定義標(biāo)識(shí)符

      #define VERSION “PXA2700EP-SIMPLE_HELLO-V1.00-060530” // 定義版本號(hào) void showversion(void)//顯示版本的函數(shù) { printk(“***************************************”);printk(“t %s tn”,VERSION);printk(“***************************************”);}

      /*-------read:用于在指定文件描述符中讀取數(shù)據(jù) file:是文件指針 buf:讀取數(shù)據(jù)緩存區(qū) count:請(qǐng)求傳輸?shù)淖止?jié)數(shù) f_ops:文件當(dāng)前偏移量

      當(dāng)讀取標(biāo)識(shí)符OURS_HELLO_DEBUG時(shí),打印信息,然后返回count----------*/ ssize_t SIMPLE_HELLO_read(struct file * file ,char * buf, size_t count, loff_t * f_ops){ #ifdef OURS_HELLO_DEBUG

      printk(“SIMPLE_HELLO_read[--kernel--]n”);#endif return count;}

      /*-----write:用于向打開(kāi)的文件寫(xiě)數(shù)據(jù) file:是文件指針 buf:寫(xiě)入數(shù)據(jù)緩存區(qū) count:求傳輸?shù)淖止?jié)數(shù) f_ops:文件當(dāng)前偏移量

      當(dāng)讀取標(biāo)識(shí)符OURS_HELLO_DEBUG時(shí),打印信息,然后返回count----------*/ ssize_t SIMPLE_HELLO_write(struct file * file ,const char * buf, size_t count, loff_t * f_ops){ #ifdef OURS_HELLO_DEBUG

      printk(“SIMPLE_HELLO_write[--kernel--]n”);#endif

      return count;}

      /*-----ioctl:對(duì)設(shè)備的I/O通道進(jìn)行管理的函數(shù) inode:設(shè)備節(jié)點(diǎn)

      flip:打開(kāi)的一個(gè)文件

      cmd:驅(qū)動(dòng)程序的特殊命令編號(hào) data:接收剩余參數(shù)

      ----------*/ ssize_t SIMPLE_HELLO_ioctl(struct inode * inode ,struct file * file, unsigned int cmd, long data){ #ifdef OURS_HELLO_DEBUG

      printk(“SIMPLE_HELLO_ioctl[--kernel--]n”);#endif return 0;}

      /*----------open:打開(kāi)函數(shù)

      inode:打開(kāi)文件所對(duì)應(yīng)的i節(jié)點(diǎn),獲取從設(shè)備號(hào) flip:打開(kāi)的一個(gè)文件

      open()方法最重要的是調(diào)用了宏MOD_INC_USE_COUNT,這個(gè)宏主要用來(lái)使驅(qū)動(dòng)程序使用計(jì)數(shù)器,避免不正確卸載程序

      ----------*/ ssize_t SIMPLE_HELLO_open(struct inode * inode ,struct file * file){ #ifdef OURS_HELLO_DEBUG

      printk(“SIMPLE_HELLO_open[--kernel--]n”);#endif MOD_INC_USE_COUNT;return 0;}

      /*----------released:關(guān)閉函數(shù)

      Inode:打開(kāi)文件所對(duì)應(yīng)的i節(jié)點(diǎn),主要獲取從設(shè)備號(hào) flip:打開(kāi)的一個(gè)文件

      release()方法最重要的是調(diào)用了宏MOD_DEC_INC_USE_COUNT,這個(gè)宏主要用來(lái)減少驅(qū)動(dòng)程序使用計(jì)數(shù)器

      ----------*/ ssize_t SIMPLE_HELLO_release(struct inode * inode ,struct file * file){ #ifdef OURS_HELLO_DEBUG

      printk(“SIMPLE_HELLO_release[--kernel--]n”);#endif MOD_DEC_INC_USE_COUNT;return 0;}

      struct file_operations HELLO_ops ={ // SIMPLE_HELLO設(shè)備向系統(tǒng)注冊(cè)

      open: SIMPLE_HELLO_open, read: SIMPLE_HELLO_read, write: SIMPLE_HELLO_write, ioctl: SIMPLE_HELLO_ioctl, release: SIMPLE_HELLO_release, };

      /*----------INIT:驅(qū)動(dòng)程序初始化

      devfs_register_chrdev(SIMPLE_HELLO_MAJOR,“hello_serial_ctl”,& HELLO_ops)最為主要

      devfs_register_chrdev注冊(cè)設(shè)備驅(qū)動(dòng)程序,包括主設(shè)備號(hào)、驅(qū)動(dòng)程序名、結(jié)構(gòu)體指針----------*/ static int __init HW_ HELLO_init(void){ int ret =-ENODEV;

      ret = devfs_register_chrdev(SIMPLE_HELLO_MAJOR, “hello_serial_ctl”,& HELLO_ops);

      showversion();

      if(ret<0)

      {

      printk(“pxa270 init_module failed with %d n[--kernel--]”,ret);

      }

      else

      {

      printk(“pxa270 hello_driver register success!![--kernel--]n”);

      } return ret;}

      static int __init pxa270_ HELLO_init(void)//模塊初始化函數(shù),調(diào)用HW_ HELLO_init 函數(shù)

      { int ret =-ENODEV;

      #ifdef OURS_HELLO_DEBUG

      printk(“pxa270_ HELLO_init[--kernel--]n”);

      #endif ret = HW_ HELLO_init();if(ret)return ret;return 0;}

      /*----------模塊卸載函數(shù)

      devfs_unregister_chrdev(SIMPLE_HELLO_MAJOR,“hello _ctl”)最為主要 devfs_unregister_chrdev卸載設(shè)備驅(qū)動(dòng)程序,包括主設(shè)備號(hào)、驅(qū)動(dòng)程序名

      ----------*/ static void __exit cleanup_ HELLO_ctl(void){ #ifdef OURS_HELLO_DEBUG

      printk(“cleanup_HELLO_ctl[--kernel--]n”);#endif devfs_unregister_chrdev(SIMPLE_HELLO_MAJOR, “hello_ctl”);}

      MODULE_DESCRIPTION(“simple hello driver module”);//描述信息 MODULE_AUTHOR(“l(fā)iduo”);

      //驅(qū)動(dòng)程序作者姓名 MODULE_LICENSE(“GPL”);module_init(pxa270_HELLO_init);

      //指定驅(qū)動(dòng)程序初始化函數(shù) module_exit(cleanup _HELLO_ctl);

      //指定驅(qū)動(dòng)程序卸載函數(shù)

      Makefile文件代碼:

      #TOPDIR:=$(shell cd..;pwd)TOPDIR:=.KERNELDIR=/pxa270_linux/linux INCLUDEDIR=$(KERNELDIR)/include CROSS_COMPILE=arm-linux-

      AS =$(CROSS_COMPILE)as LD =$(CROSS_COMPILE)ld CC =$(CROSS_COMPILE)gcc CPP =$(CC)-E AR =$(CROSS_COMPILE)ar NM =$(CROSS_COMPILE)nm STRIP =$(CROSS_COMPILE)strip OBJCOPY=$(CROSS_COMPILE)objcopy OBJDUMP=$(CROSS_COMPILE)objdump

      CFLAGS+=-I..CFLAGS+=-Wall –O –D_KERNEL_-DMODULE –I$(INCLUDEDIR)

      TARGET = pxa270_hello_drv.o modules: $(TARGET)

      all: $(TARGET)

      pxa270_hello_drv.o:pxa270_hello_drv.c $(CC)-c $(CFLAGS)$^-o $@

      clean: rm-f *.o *~ core.depend Makefile文件的內(nèi)容用于執(zhí)行編譯工作,一個(gè)Makefile文件包括:① 由make工具創(chuàng)建的目標(biāo)體(target),通常是目標(biāo)文件或可執(zhí)行文件;② 要?jiǎng)?chuàng)建目標(biāo)體所依賴的文件(dependency_file);③ 創(chuàng)建每個(gè)目標(biāo)需要運(yùn)行的命令(command)。

      以上兩個(gè)文件編輯完成后后,用make modules編譯驅(qū)動(dòng)程序,編寫(xiě)測(cè)試文件simple_test_driver.c,然后GCC編輯器編譯測(cè)試程序生成測(cè)試文件。成功生成測(cè)試文件后用超級(jí)終端開(kāi)始掛載,加載驅(qū)動(dòng)程序,使用命令./test測(cè)試,觀察測(cè)試結(jié)果,實(shí)驗(yàn)完成。

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

      本實(shí)驗(yàn)是讓我們?cè)趌inux系統(tǒng)中插入自己的驅(qū)動(dòng)程序,調(diào)用它。實(shí)現(xiàn)用CPU GPIO控制外部LED,利用PXA270核心板上的LED驗(yàn)證我們的工作。驅(qū)動(dòng)程序代碼:

      驅(qū)動(dòng)程序代碼與實(shí)驗(yàn)十二無(wú)大區(qū)別,下面列出需要補(bǔ)充的代碼。

      一、補(bǔ)充代碼

      補(bǔ)充代碼1:

      #ifdef OURS_GPIO_LED_DEBUG printk(“SIMPLE_GPIO_LED_write [--kernel--]n”);#endif return count;

      補(bǔ)充代碼2:

      #ifdef OURS_GPIO_LED_DEBUG printk(“SIMPLE_GPIO_LED_open [--kernel--]n”);#endif

      補(bǔ)充代碼3:

      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, 不同之處:GPIO_LED,主文件名、二、Makefile文件:

      將實(shí)驗(yàn)十二相關(guān)代碼作如下修改即可: TARGET = pxa270_gpio_led_drv.o modules: $(TARGET)

      all: $(TARGET)

      pxa270_gpio_led_drv.o:pxa270_gpio_led_drv.c $(CC)-c $(CFLAGS)$^-o $@

      三、作業(yè)代碼

      要求:使得目標(biāo)板的核心板上的LED閃爍產(chǎn)生亮7秒,滅5秒的效果。作業(yè)主要代碼:

      while(1)

      { ioctl(fd,LED_OFF);

      sleep(5);//原來(lái)為sleep(1);

      ioctl(fd,LED_ON);sleep(7);//原來(lái)為sleep(1); }

      不同之處:改變代碼中加粗位置括號(hào)數(shù)字,可以改變燈亮和熄滅的時(shí)間比

      四、測(cè)試顯示

      測(cè)試時(shí),超級(jí)終端上的顯示如下:

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

      本實(shí)驗(yàn)是讓我們學(xué)習(xí)中斷的相關(guān)概念,以及Linux系統(tǒng)是如何處理中斷的,并且學(xué)會(huì)編寫(xiě)獲取和處理外中斷的驅(qū)動(dòng)程序。

      一、補(bǔ)充代碼

      補(bǔ)充代碼1:

      printk(“*****************************************n”);printk(“t %s tn”,VERSION);printk(“************************************************nn”);補(bǔ)充代碼2:

      #ifdef OURS_GPIO_LED_DEBUG printk(“SIMPLE_GPIO_LED_read [--kernel--]n”);#endif return count;

      補(bǔ)充代碼3:

      #ifdef OURS_GPIO_LED_DEBUG printk(“SIMPLE_GPIO_LED_write [--kernel--]n”);#endif return count;

      補(bǔ)充代碼4:

      open: SIMPLE_INT_open, read: SIMPLE_INT_read, write: SIMPLE_INT_write, ioctl: SIMPLE_INT_ioctl, release: SIMPLE_INT_release, 二、Makefile文件如實(shí)驗(yàn)十三做相應(yīng)修改。

      三、測(cè)試時(shí),超級(jí)終端上顯示如下:

      實(shí)驗(yàn)十五 數(shù)碼管顯示驅(qū)動(dòng)實(shí)驗(yàn)

      本實(shí)驗(yàn)中,我們要編驅(qū)動(dòng)程序以實(shí)現(xiàn)在Linux系統(tǒng)下控制LED數(shù)碼管的顯示。

      一、補(bǔ)充代碼

      補(bǔ)充代碼1:

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

      補(bǔ)充代碼2: #ifdef OURS_HELLO_DEBUG printk(“SERIAL_LED_read [--kernel--]n”);#endif return count;

      補(bǔ)充代碼3: #ifdef OURS_HELLO_DEBUG printk(“SERIAL_LED_write [--kernel--]n”);#endif return count;

      補(bǔ)充代碼4: #ifdef OURS_HELLO_DEBUG printk(“SERIAL_LED_ioctl [--kernel--]n”);#endif return 0;

      補(bǔ)充代碼5: #ifdef OURS_HELLO_DEBUG printk(“SERIAL_LED_open [--kernel--]n”);#endif MOD_INC_USE_COUNT;return 0;

      補(bǔ)充代碼6: #ifdef OURS_HELLO_DEBUG printk(“SERIAL_LED_release [--kernel--]n”);#endif MOD_DEC_USE_COUNT;return 0;

      補(bǔ)充代碼7: open: SERIAL_LED_open, read: SERIAL_LED_read, write: SERIAL_LED_write, ioctl: SERIAL_LED_ioctl, release: SERIAL_LED_release

      補(bǔ)充代碼8: int ret =-ENODEV;ret = devfs_register_chrdev(SERIAL_LED_MAJOR, “serial_led_ctl”, &SERIAL_LED_ops);Showversion();If(ret<0){ printk(“pxa270 init_module failed with %dn [--kernel--]”,ret);return ret;} else { printk(“pxa270 serial_led_driver register success!![--kernel--]n”);} return ret;

      補(bǔ)充代碼9: int ret =-ENODEV;#ifdef OURS_HELLO_DEBUG printk(“pxa270_SERIAL_LED_init [--kernel--]n”);#endif ret = HW_SERIAL_LED_init();if(ret)return ret;return 0;

      補(bǔ)充代碼10: #ifdef OURS_HELLO_DEBUG printk(“cleanup_SERIAL_LED [--kernel--]n”);#endif devfs_unregister_chrdev(SERIAL_LED_MAJOR, “serial_led”);

      補(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);

      二、Makefile文件與實(shí)驗(yàn)十四相同,只需作相應(yīng)修改即可

      三、作業(yè)代碼

      1、實(shí)現(xiàn)目標(biāo)板上的LED數(shù)碼管循環(huán)顯示數(shù)字9-0。

      for(count=0;count<10;count++)

      { data[0] = buf[9-count];//原來(lái)為data[0] = buf[count] ret=write(fd,data,1);sleep(1);} 修改之處:將顯示的數(shù)有buf[count]改為buf[9-count],實(shí)現(xiàn)反向循環(huán)顯示。

      2、實(shí)現(xiàn)目標(biāo)板上的LED數(shù)碼管循環(huán)顯示數(shù)字2、4、6、8、0或者8、6、4、2、0。代碼: for(count=0;count<10;count+=2)//原來(lái)為count++

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

      修改之處:修改count的變化方式,讓其每次增加2,而不是1,使0、2、4、6、8循環(huán)顯示,如要循環(huán)顯示8、6、4、2、0的話,只要在上述代碼中將buf[count]改為buf[8-count]即可。

      四、測(cè)試顯示:

      測(cè)試時(shí),顯示如下:

      作業(yè)1: 作業(yè)2:

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

      本實(shí)驗(yàn)要求我們學(xué)會(huì)編寫(xiě)驅(qū)動(dòng)程序,實(shí)現(xiàn)在Linux系統(tǒng)下控制LED點(diǎn)陣顯示,并在此基礎(chǔ)上稍加改進(jìn),實(shí)現(xiàn)對(duì)LED的控制。驅(qū)動(dòng)程序代碼:

      一、補(bǔ)充代碼

      補(bǔ)充代碼1:

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

      補(bǔ)充代碼2:

      #ifdef OURS_LED_DEBUG printk(“SIMPLW_LED_read [--kernel--]n”);#endif return count;

      補(bǔ)充代碼3:

      #ifdef OURS_LED_DEBUG printk(“SIMPLE_LED_ioctl [--kernel--]n”);#endif return 0;

      補(bǔ)充代碼4:

      open: SIMPLE_LED_open, read: SIMPLE_LED_read, write: SIMPLE_LED_write, ioctl: SIMPLE_LED_ioctl, release: SIMPLE_LED_release

      補(bǔ)充代碼5:

      int ret =-ENODEV;#ifdef OURS_LED_DEBUG printk(“pxa270_LED_CTL_init [--kernel--]n”);#endif ret = HW_LED_CTL_init();if(ret)return ret;return 0;

      補(bǔ)充代碼6:

      #ifdef OURS_LED_DEBUG printk(“cleanup_LED_ctl [--kernel--]n”);#endif devfs_unregister_chrdev(SIMPLE_LED_MAJOR, “l(fā)ed_ctl”);

      二、Makefile程序仍然可以用前一個(gè)實(shí)驗(yàn)的,只要把相關(guān)函數(shù)名改了就可以,此處不再贅述。

      三、作業(yè)代碼

      1、按橫方向隔行掃描led點(diǎn)陣數(shù)碼管。代碼:

      for(i=1;i<=4;i++){ //原來(lái)為i<8

      buf[0]=c;

      buf[1]=~r;// row

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

      write(fd,buf,2);

      printf(“buf[0],buf[1]: [%x,%x]n”,buf[0],buf[1]);

      usleep(200000);// sleep 0.2 second

      c = c<<1;

      buf[0]=c;// column

      }

      c = 1;

      r = r<<2;

      } //原來(lái)為r=r<<1

      修改之處:外層for循環(huán)中間i<8改為i<4,同時(shí),將else中的r=r<<1改為r<<2。這樣就可以讓點(diǎn)陣在顯示時(shí)跳躍一行進(jìn)行顯示。

      2、按豎方向順序掃描led點(diǎn)陣數(shù)碼管。代碼:

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

      buf[0]=c;

      buf[1]=~r;// row

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

      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;//原來(lái)此處為c=c<<1 buf[1]=~r;//原來(lái)此處為buf[1]=~c } r = 1;//原來(lái)此處為c=1 c = c<<1;//原來(lái)此處為r=r<<1 修改之處(現(xiàn)對(duì)于最初的測(cè)試程序,而不是作業(yè)1的測(cè)試程序):將r和c 進(jìn)行對(duì)調(diào)。實(shí)現(xiàn)將橫和豎的對(duì)調(diào),已達(dá)到豎方向掃描的目的。四、測(cè)試顯示

      測(cè)試時(shí),超級(jí)終端顯示如下:

      作業(yè)1: 作業(yè)2:

      實(shí)驗(yàn)十七 AD驅(qū)動(dòng)程序

      本實(shí)驗(yàn)要求我們學(xué)會(huì)編寫(xiě)驅(qū)動(dòng)程序?qū)δM量輸入進(jìn)行采集,并轉(zhuǎn)換為數(shù)字量顯示在超級(jí)終端上,從而實(shí)現(xiàn)AD轉(zhuǎn)換。

      驅(qū)動(dòng)程序代碼

      一、補(bǔ)充代碼

      補(bǔ)充代碼1:

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

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

      補(bǔ)充代碼2:

      #ifdef OURS_HELLO_DEBUG printk(“SIMPLE_HELLO_read [--kernel--]n”);#endif return count;

      補(bǔ)充代碼3:

      #ifdef OURS_HELLO_DEBUG printk(“SIMPLE_HELLO_write [--kernel--]n”);#endif return count;

      補(bǔ)充代碼4:

      #ifdef OURS_HELLO_DEBUG printk(“SIMPLE_HELLO_open [--kernel--]n”);#endif MOD_INC_USE_COUNT;return 0;

      補(bǔ)充代碼5:

      #ifdef OURS_HELLO_DEBUG printk(“SIMPLE_HELLO_release [--kernel--]n”);#endif MOD_DEC_USE_COUNT;return 0;

      補(bǔ)充代碼6:

      open: SIMPLE_HELLO_open, read: SIMPLE_HELLO_read, write: SIMPLE_HELLO_write, ioctl: SIMPLE_HELLO_ioctl, release: SIMPLE_HELLO_release

      補(bǔ)充代碼7:

      ad_ucb = ucb1x00_get();

      int ret =-ENODEV;ret = devfs_register_chrdev(ADCTL_MAJOR, “ad_ctl”, &adctl_ops);Showversion();If(ret<0){ printk(“pxa270 init_module failed with %dn [--kernel--]”,ret);return ret;} else { printk(“pxa270 serial_led_driver register success!![--kernel--]n”);} return ret;

      補(bǔ)充代碼8:

      int ret =-ENODEV;#ifdef OURS_HELLO_DEBUG printk(“pxa270_AD_CTL_init [--kernel--]n”);#endif ret = HW_AD_CTL_init();if(ret)return ret;return 0;

      補(bǔ)充代碼9:

      #ifdef OURS_HELLO_DEBUG printk(“cleanup_AD_ctl [--kernel--]n”);#endif devfs_unregister_chrdev(ADCTL_MAJOR, “ad_ctl”);

      二、Makefile文件可以用前一個(gè)程序的文件,只要將相應(yīng)部分的代碼修改即可

      三、作業(yè)代碼

      要求:將UCB_ADC_INP_AD0換為其他通道并觀察。代碼:

      for(i=0;i<50;i++)

      { Val0 = ioctl(fd,UCB_ADC_INP_AD1,0);usleep(100);val1 = ioctl(fd,UCB_ADC_INP_AD0,0);printf(“val0 = %dtval1 = %dn”,val0,val1;usleep(500000);

      }

      修改之處:只需交換AD1和AD0即可實(shí)現(xiàn)輸出通道的改變。四、測(cè)試時(shí)顯示

      測(cè)試時(shí)、超級(jí)終端顯示如下:

      實(shí)驗(yàn)十八 DA驅(qū)動(dòng)程序

      本實(shí)驗(yàn)要求我們編寫(xiě)驅(qū)動(dòng)程序,實(shí)現(xiàn)將數(shù)字信號(hào)轉(zhuǎn)換成模擬信號(hào)并在示波器上顯示出模擬信號(hào)波形,即實(shí)現(xiàn)DA轉(zhuǎn)換。驅(qū)動(dòng)程序代碼:

      一、補(bǔ)充代碼

      補(bǔ)充代碼1:

      #include“../AD/pxa_ad_drv.h” /引用AD驅(qū)動(dòng)程序的頭文件/

      補(bǔ)充代碼2:

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

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

      補(bǔ)充代碼3:

      #ifdef OURS_DA_DEBUG printk(“SIMPLE_DA_read [--kernel--]n”);#endif return count;

      補(bǔ)充代碼4:

      #ifdef OURS_DA_DEBUG printk(“SIMPLE_DA_write [--kernel--]n”);#endif return count;

      補(bǔ)充代碼5:

      #ifdef OURS_DA_DEBUG printk(“SIMPLE_DA_ioctl [--kernel--]n”);#endif return 0;

      補(bǔ)充代碼6:

      #ifdef OURS_DA_DEBUG printk(“SIMPLE_DA_open [--kernel--]n”);#endif MOD_INC_USE_COUNT;return 0;

      補(bǔ)充代碼7:

      open: SIMPLE_DA_open, read: SIMPLE_DA_read, write: SIMPLE_DA_write, ioctl: SIMPLE_DA_ioctl, release: SIMPLE_DA_release

      補(bǔ)充代碼8:

      int ret =-ENODEV;ret = devfs_register_chrdev(SIMPLE_DA_MAJOR, “DA_ctl”, &DA_ctl_ops);Showversion();If(ret<0){ printk(“pxa270 init_module failed with %dn [--kernel--]”,ret);return ret;} else { printk(“pxa270 serial_led_driver register success!![--kernel--]n”);} return ret;

      補(bǔ)充代碼9:

      int ret =-ENODEV;#ifdef OURS_DA_DEBUG printk(“pxa270_DA_CTL_init [--kernel--]n”);#endif ret = HW_DA_CTL_init();if(ret)return ret;return 0;

      補(bǔ)充代碼10:

      #ifdef OURS_DA_DEBUG printk(“cleanup_DA_ctl [--kernel--]n”);#endif devfs_unregister_chrdev(SIMPLE_DA_MAJOR, “DA_ctl”);補(bǔ)充代碼11:

      MODULE_DESCRIPTION(“serial_led driver module”);MODULE_AUTHOR(“l(fā)iduo”);MODULE_LICENSE(“GPL”);module_init(pxa270_DA_CTL_init);module_exit(cleanup_DA_ctl);

      二、Makefile文件可以繼續(xù)用前面程序Mekefile的代碼,只需要將相應(yīng)部分的代碼修改即可。

      三、作業(yè)代碼

      要求:輸出三角波。代碼:(需要修改部分)

      //---------------------print--------------------void da_create_sin(int fd){ unsigned char buf[(int)POINT];unsigned char*c;unsigned long I;int j;double x;for(j=0;j

      x=(j/POINT)*(5*M_PI);//此處原來(lái)為x=sin((j/POINT

      //*(2*M_PI))#ifdef OURS_DEBUG printf(“%ft”,x);#endif buf[j] =(unsigned char)255*(x/2+1)/2;#ifdef OURS_DEBUG printf(“%xn”, buf[j]);#endif } printf(“create sin waven”);printf(“Use”Ctrl + c“quit the functionn”);while(1){ c = buf;for(j=0;j

      四、測(cè)試顯示:(以下為三角波)

      (以下為sin)

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

      在本次嵌入式實(shí)驗(yàn)中,我們首先在老師的指導(dǎo)下了解了嵌入式系統(tǒng),初步接觸了Linux環(huán)境。我們的實(shí)驗(yàn)板是OURS-PXA270-EP,它是一款基于INTEL XSCALE PXA270處理器,針對(duì)高校嵌入式系統(tǒng)教學(xué)和實(shí)驗(yàn)科研的平臺(tái)。這款設(shè)備主要包括核心板與底板兩個(gè)部分,核心板主要集成了高速的PXA270 CPU,配套的存儲(chǔ)器,網(wǎng)卡等設(shè)備;底板主要是各種類(lèi)型的接口與擴(kuò)展口。

      了解了實(shí)驗(yàn)的平臺(tái)后,在接下來(lái)的基本實(shí)驗(yàn)中我們學(xué)會(huì)了嵌入式開(kāi)發(fā)系統(tǒng)硬件環(huán)境的搭建、Linux操作系統(tǒng)RedHat9的安裝、軟件環(huán)境的搭建,以及配置超級(jí)終端,配置通訊服務(wù)。這些實(shí)驗(yàn)內(nèi)容只要按照實(shí)驗(yàn)指導(dǎo)書(shū)上的步驟一步一步做即可,不會(huì)出現(xiàn)難以解決的問(wèn)題,一般都會(huì)做的很順利。有三個(gè)需要注意的地方時(shí),在配置端口時(shí),一定要確定實(shí)驗(yàn)箱接的是端口一,還是端口二。否則會(huì)出現(xiàn)無(wú)法建立呼叫的問(wèn)題(其表現(xiàn)為超級(jí)終端接口內(nèi)沒(méi)有輸出內(nèi)容)。其次要確定虛擬機(jī)上網(wǎng)橋的設(shè)定是否正確。不然也會(huì)出現(xiàn)無(wú)法呼叫現(xiàn)象。最后,要確定網(wǎng)線是否連接上。在實(shí)驗(yàn)時(shí),由于有些電腦的網(wǎng)線接口有斷裂的現(xiàn)象,如果插口沒(méi)接好的話,將會(huì)出現(xiàn)nfs連接錯(cuò)誤。

      在基本實(shí)驗(yàn)之后,進(jìn)行的就是接口實(shí)驗(yàn)。總的來(lái)說(shuō),實(shí)驗(yàn)的難度不大。當(dāng)然這是建立在對(duì)實(shí)驗(yàn)代碼有一定理解的基礎(chǔ)之上的。在實(shí)驗(yàn)十二中,我們對(duì)實(shí)驗(yàn)的接口代碼規(guī)則已經(jīng)有了一定的了解。而之后的幾個(gè)實(shí)驗(yàn)都是基于實(shí)驗(yàn)十二進(jìn)行相應(yīng)的改動(dòng)即可。所以完成下來(lái)難度不是很大。而對(duì)應(yīng)的作業(yè)中,我們僅需要對(duì)測(cè)試代碼進(jìn)行相應(yīng)的改寫(xiě)。在對(duì)c語(yǔ)言有一定的了解的前提下,可以很容易相應(yīng)代碼所實(shí)現(xiàn)的功能,僅需要對(duì)相應(yīng)代碼做些修改即可。

      不過(guò),值得注意的還有兩點(diǎn),第一:代碼的編寫(xiě)一定要符合規(guī)則,同時(shí),代碼的輸入要避免輸入錯(cuò)誤。否則,在需要一次一次編譯一次次查看錯(cuò)誤一次次改正錯(cuò)誤,這會(huì)是個(gè)費(fèi)時(shí)費(fèi)力的工作。第二:每次實(shí)驗(yàn)時(shí),需要從新設(shè)定虛擬機(jī)的ip,即每次實(shí)驗(yàn)開(kāi)始時(shí)都需要重復(fù)做實(shí)驗(yàn)五實(shí)驗(yàn)六。不然在掛載時(shí)會(huì)出現(xiàn)無(wú)法掛載的現(xiàn)象。

      通過(guò)這次實(shí)驗(yàn),我對(duì)嵌入式編程有了更深層次的理解,加深了我對(duì)理論知識(shí)的認(rèn)識(shí),有助于今后的學(xué)習(xí)和工作。感謝黃惠英老師的細(xì)心指導(dǎo)。

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

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

      (三)姓名:學(xué)號(hào):班級(jí):

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

      ? Transact-SQL語(yǔ)句: 導(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ù)庫(kù)database2.xls',department$);

      insertinto student select*from openrowset

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

      insertinto student_course select*from openrowset

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

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

      操作:選中數(shù)據(jù)庫(kù)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語(yǔ)句:

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

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

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

      SQL語(yǔ)句:

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

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

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

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

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

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

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

      SQL語(yǔ)句:

      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語(yǔ)句:

      deletefrom student_course where course_id in(select course_id from course

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

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

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

      AccessDatabaseEngine的安裝

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

      備份完之后,選中要?jiǎng)h除的文件(00006開(kāi)頭的四個(gè)),右鍵-刪除即可?;氐紸ccess database engine 32位的程序安裝包,安裝。我無(wú)法安裝64位,可能是因?yàn)閛ffice是32位。安裝成功之后就可以在sqlserver中導(dǎo)入excel文件了。

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

      北京郵電大學(xué)

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

      學(xué)院:

      班級(jí): 姓名: 學(xué)號(hào):

      序號(hào):

      目錄

      一、實(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ū)動(dòng)程序..............................................................................................5

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

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

      1.實(shí)驗(yàn)十二簡(jiǎn)單設(shè)備驅(qū)動(dòng)程序..............................................................9 2.實(shí)驗(yàn)十三 CPU GPIO驅(qū)動(dòng)程序設(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ū)動(dòng)程序設(shè)計(jì)...................................................19 6.實(shí)驗(yàn)十七 AD驅(qū)動(dòng)實(shí)驗(yàn)....................................................................23 7.實(shí)驗(yàn)十八 DA驅(qū)動(dòng)實(shí)驗(yàn)....................................................................26

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

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

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

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

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

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

      2.安裝Redhat9的宿主PC機(jī),并且配置好ARM Linux的開(kāi)發(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ù),并通過(guò)編寫(xiě)最簡(jiǎn)單的HelloWorld程序進(jìn)行測(cè)試。由于后面的實(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)是簡(jiǎn)單文件傳輸協(xié)議,由于特定開(kāi)發(fā)環(huán)境的制約,這一服務(wù)是必須的。在配置完成后,每次重啟宿主PC機(jī)時(shí),都須先輸入命令:service xinetd restart,以啟動(dòng)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)端檔案時(shí),只需調(diào)用“mount”就可以遠(yuǎn)端系統(tǒng)掛接在自己的檔案系統(tǒng)之下。每次重啟宿主PC機(jī)時(shí),都須先輸入命令:service nfs restart,以啟動(dòng)nfs服務(wù)。

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

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

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

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

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

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

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

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

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

      ②mkdir HW

      ③ cd HW

      ④ vi

      HelloWorld.c

      /*請(qǐng)您輸入程序 7.1 程序清單*/

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

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

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

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

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

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

      ① cd home/HW

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

      /*此時(shí)會(huì)看到如下圖*/

      四、驅(qū)動(dòng)程序

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

      設(shè)備驅(qū)動(dòng)程序?qū)嶋H是處理和操作硬件控制器的軟件,從本質(zhì)上講,是內(nèi)核中具有最高特權(quán)級(jí)的、駐留內(nèi)存的、可共享的底層硬件處理例程。驅(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ò)誤。

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

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

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

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

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

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

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

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

      ?

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

      ?

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

      ?

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

      ?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      4.設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)過(guò)程

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

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

      (2)定義設(shè)備號(hào)。設(shè)備由一個(gè)主設(shè)備號(hào)和一個(gè)次設(shè)備號(hào)來(lái)標(biāo)識(shí)。主設(shè)備號(hào)惟一標(biāo)識(shí)了設(shè)備類(lèi)型,即設(shè)備驅(qū)動(dòng)程序類(lèi)型,它是塊設(shè)備表或字符設(shè)備表中設(shè)備表項(xiàng)的索引。次設(shè)備號(hào)僅由設(shè)備驅(qū)動(dòng)程序解釋?zhuān)瑓^(qū)分被一個(gè)設(shè)備驅(qū)動(dòng)控制下的某個(gè)獨(dú)立的設(shè)備。

      (3)實(shí)現(xiàn)初始化函數(shù)。在驅(qū)動(dòng)程序中實(shí)現(xiàn)驅(qū)動(dòng)的注冊(cè)和卸載。(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)核注冊(cè),中斷并不是每個(gè)設(shè)備驅(qū)動(dòng)所必需的。

      (7)編譯該驅(qū)動(dòng)程序到內(nèi)核中,或者用insmod命令加載模塊。(8)測(cè)試該設(shè)備,編寫(xiě)應(yīng)用程序,對(duì)驅(qū)動(dòng)程序進(jìn)行測(cè)試。

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

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

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

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

      在本實(shí)驗(yàn)中,我們要編寫(xiě)第一個(gè)針對(duì)實(shí)際硬件的驅(qū)動(dòng)程序。我們知道,凡是操作系統(tǒng)控制外部設(shè)備,即使是最簡(jiǎn)單的硬件電路,也是需要驅(qū)動(dòng)的。本實(shí)驗(yàn)涉及的外部硬件只有電阻和發(fā)光二極管。我們使用自己編寫(xiě)的驅(qū)動(dòng)程序與應(yīng)用程序控制 GPIO96的電平,通過(guò) LED 的亮滅來(lái)判斷,是否 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秒的效果 在測(cè)試程序中有這樣一段代碼: 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í)了許多中斷方面的知識(shí),包括中斷向量、中斷優(yōu)先級(jí)、中斷過(guò)程等。在PXA270系統(tǒng)里,中斷控制器分外部設(shè)備和 PXA270X 處理器設(shè)備產(chǎn)生的兩個(gè)層次的中斷,前者是初級(jí)的中斷源,后者是次級(jí)中斷源,大量的次級(jí)中斷源通常被映射為一個(gè)初級(jí)中斷源。

      補(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, };

      通過(guò)此實(shí)驗(yàn),我了解了硬件中斷管腳與中斷號(hào)的對(duì)應(yīng)關(guān)系,以及中斷號(hào)與中斷處理程序的對(duì)應(yīng)關(guān)系,對(duì)于今后編寫(xiě)更為復(fù)雜的中斷程序打下基礎(chǔ)。

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

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

      在此實(shí)驗(yàn)中,我們要編寫(xiě)針對(duì) 74LV164 的驅(qū)動(dòng)程序,并用其串并轉(zhuǎn)換功能來(lái)控制八段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);使用測(cè)試程序看到的測(cè)試結(jié)果是數(shù)碼管按0-9顯示輸出。實(shí)驗(yàn)作業(yè)要求在上述基礎(chǔ)上,分別實(shí)現(xiàn)一下兩個(gè)功能:

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

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

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

      原測(cè)試程序: 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);

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

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

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

      補(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

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

      ②要求您再編寫(xiě)一個(gè)測(cè)試程序,實(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ū)動(dòng)實(shí)驗(yàn)

      通過(guò)本實(shí)驗(yàn)的操作,我們將 AD 轉(zhuǎn)換器驅(qū)動(dòng)起來(lái)并通過(guò)編寫(xiě)測(cè)試程序,使其能夠?qū)⒛M信號(hào)量按照我們的要求轉(zhuǎn)換成數(shù)字信號(hào)量。為了更加清楚地理解 AD 轉(zhuǎn)換器的工作過(guò)程,請(qǐng)您再編寫(xiě)一個(gè)測(cè)試程序,將 UCB_ADC_INP_AD0 換成其他通道,來(lái)觀察其他 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ū)動(dòng)實(shí)驗(yàn)

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

      補(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)中遇到的問(wèn)題及解決方法

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

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

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

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

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

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

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

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

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

      第五篇:北郵信通院移動(dòng)通信實(shí)驗(yàn)報(bào)告

      北京郵電大學(xué) 移動(dòng)通信實(shí)驗(yàn)報(bào)告

      班級(jí):

      2010211126

      專(zhuān)業(yè):

      信息工程

      姓名:

      學(xué)號(hào):

      班內(nèi)序號(hào):

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

      1、移動(dòng)通信設(shè)備的認(rèn)知 a)了解機(jī)柜結(jié)構(gòu)

      b)了解移動(dòng)通信設(shè)備組成和機(jī)框結(jié)構(gòu) c)了解移動(dòng)通信設(shè)備各單元的功能及連接方式

      2、網(wǎng)管操作和 OMT 創(chuàng)建小區(qū) a)了解OMC系統(tǒng)的基本功能和操作 b)掌握OMT如何創(chuàng)建小區(qū)

      3、移動(dòng)通信業(yè)務(wù)的建立與信令流程 a)了解TD-SCDMA系統(tǒng)的網(wǎng)絡(luò)結(jié)構(gòu) b)掌握基本業(yè)務(wù)測(cè)試環(huán)境的搭建

      c)掌握CS業(yè)務(wù)與普通PS業(yè)務(wù)信令流程,體驗(yàn)視頻通話

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

      TD‐SCDMA 移動(dòng)通信設(shè)備一套

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

      1、TD_SCDMA系統(tǒng)認(rèn)識(shí)

      聽(tīng)了老師的講授后,我了解到了TD_SCDMA系統(tǒng)是時(shí)分雙工的同步CDMA系統(tǒng),知道了TD_SCDMA系統(tǒng)網(wǎng)絡(luò)結(jié)構(gòu)中的三個(gè)重要接口(Iu接口、Iub接口、Uu接口),認(rèn)識(shí)了TD_SCDMA系統(tǒng)的物理層結(jié)構(gòu),熟悉了TD_SCDMA系統(tǒng)的六大關(guān)鍵技術(shù)以及其后續(xù)演進(jìn)LTE。

      2、CN開(kāi)卡

      開(kāi)卡過(guò)程如下圖所示:

      3、硬件認(rèn)知

      1)整套移動(dòng)通信設(shè)備如下:

      2)RNC設(shè)備認(rèn)知

      TDR3000設(shè)備機(jī)框外形結(jié)構(gòu)如圖1和圖2所示

      機(jī)框主要功能如下:

      支持 14 個(gè)板位,作為19〞機(jī)框通用背板使用。

      滿足 PICMG3.0、PICMG3.1 規(guī)范。

      實(shí)現(xiàn)機(jī)框內(nèi)以太交換雙星型物理連接拓?fù)洹?/p>

      對(duì)各前插板提供板位編號(hào)(HA0~7)。

      對(duì)各前插板提供 Fabric、Base、CLK、Update 數(shù)據(jù)通路。

      提供對(duì)所有 FRU 單元的IPMB 總線通路。

      提供‐48V 冗余供電通路。

      ATCA 機(jī)框的UPDATE CHANNEL 設(shè)計(jì)規(guī)則為物理板位1 與13、2 與14、3 與11、4 與12、5 與 9、6 與10、7 與8 兩兩之間設(shè)計(jì)UPDATE CHANNEL。

      圖 1:機(jī)框背板功能分布示意圖

      由上圖可知,ATCA 機(jī)框的UPDATE CHANNEL 設(shè)計(jì)規(guī)則為物理板位1 與13、2 與14、3 與11、4 與12、5 與9、6 與10、7 與8 兩兩之間設(shè)計(jì)UPDATE CHANNEL。其中藍(lán)色連線表示具有Update Channel 連線的板位分配,物理板位7,8 固定為兩塊交換板,其余板位固定為功能板。

      圖 2:機(jī)框背板接口后視圖

      機(jī)框物理上是一種13U 標(biāo)準(zhǔn)的ATCA 插箱,機(jī)框背板主體尺寸為ATCA 標(biāo)準(zhǔn)定義部分: 354.8mmX426.72mm。主體之下為背板的風(fēng)扇、電源接口引入部分,風(fēng)扇接口包括風(fēng)扇電源和IPMI 接口,背板與電源模塊之間的電源接口包括兩路-48V 供電和四路風(fēng)扇電源輸入。背板與各前插

      板之間的電源接口采用分散供電方式,每個(gè)前插板有兩路‐48V 供電。背板下部左右兩部分中間位

      置各預(yù)留1 英寸安裝輸入電源插座(‐48V/風(fēng)扇電源)。

      單板結(jié)構(gòu)

      單板相關(guān)描述中,采用“邏輯板(物理板)”的描述方式,其中邏輯板為從軟件功能及操作維護(hù)臺(tái)顯示的單板;物理板為硬件單板,其單板名稱(chēng)印刷在在物理單板面板下方。采用該表達(dá)方式的目的,是便于使用者能隨時(shí)直觀地了解邏輯板與物理板的映射關(guān)系,避免不熟悉兩種單板類(lèi)型映射關(guān)系的用戶頻繁地查找單板對(duì)應(yīng)關(guān)系表。TDR3000 各種單板的類(lèi)型及功能如下

      機(jī)框槽位布局如下:

      可以使用LDT軟件查看硬件是否正常,由下圖可以看出,硬件連接均正常。

      其中使用的各單板功能如下:

      ? GCPA(GMPA+SPMC+HDD)全局控制處理板完成以下功能:

      ? 全局處理板完成 RNC 全局資源的控制與處理、以及與OMC‐R 的連接。全局控制板 支持板載2.5〞 IDE 80GB 硬盤(pán)數(shù)據(jù)存儲(chǔ)功能;

      ? 處理以下協(xié)議:RANAP 協(xié)議中的復(fù)位,資源復(fù)位,過(guò)載控制消息;SCCP 管理、MTP3B 管理、ALCAP 管理、M3UA 管理協(xié)議等; ? 兩塊 GCPA 以主備用方式工作; ? RSPA(GMPA+SPMC)無(wú)線網(wǎng)絡(luò)信令處理板完成以下功能:

      ? 處理 Iu,Iub 接口的控制面協(xié)議以及傳輸網(wǎng)絡(luò)高層協(xié)議,完成無(wú)線網(wǎng)絡(luò)協(xié)議的處理,以及呼叫處理功能;

      ? 處理的協(xié)議有:RRC 協(xié)議,RANAP 部分協(xié)議,NBAP 協(xié)議,無(wú)線資源管理;SCCP 部 分協(xié)議,ALCAP 部分協(xié)議,MTP3B 部分協(xié)議,M3UA 部分協(xié)議,SCTP 協(xié)議等; ? 兩塊 RSPA 以主備用方式工作;

      ? ONCA/IPUA(MNPA+GEIC)板的主要功能如下:

      ? ONCA/IPUA(MNPA+GEIC)配合GEIB 后插板完成4xFE/GE 接口功能。? 網(wǎng)絡(luò)處理器完成外部 IP 到內(nèi)部IP 的轉(zhuǎn)換、處理功能; ? TCSA(MASA)板的主要功能如下:

      ? 支持控制面 Base 交換和業(yè)務(wù)面Fabric 交換兩級(jí)交換,完成業(yè)務(wù)和控制面的L2、L3 以太交換功能;

      ? 固定使用 2 個(gè)交換板槽位,即框中的第7、8 槽位;

      ? 同時(shí)完成整個(gè)機(jī)框的 ShMC(機(jī)框管理器)功能,同時(shí)兼容IPMC 功能,可根據(jù)不同 ATCA 機(jī)框進(jìn)行靈活配置;

      ? 提供架框號(hào)的編碼配置功能;

      ? 支持對(duì)網(wǎng)同步時(shí)鐘的接入、分配功能; ? 以主備用方式工作; ? RTPA(MDPA)板由單板控制模塊、單板以太交換模塊、DSP 處理模塊、電源模塊、IPMC 模塊組成,主要功能如下:

      ? 單板控制模塊完成板內(nèi)的各種控制管理功能;

      ? 單板以太交換模塊實(shí)現(xiàn)完成 RTPA(MDPA)板內(nèi)的以太數(shù)據(jù)交換;

      ? DSP 處理模塊主要由DSP 和其外圍來(lái)實(shí)現(xiàn),完成業(yè)務(wù)數(shù)據(jù)和協(xié)議的處理;

      ? 電源轉(zhuǎn)換模塊從背板接入雙路‐48V 電源,經(jīng)過(guò)電源轉(zhuǎn)換芯片轉(zhuǎn)換后,給單板提供各 種芯片正常工作的各種電壓;

      ? IPMC 模塊主要完成單板上電的控制,以及溫度、電壓監(jiān)控等功能。? PTPA(MNPA)板的主要功能如下: ? 完成 Iu‐PS 用戶面協(xié)議處理功能;

      ? GTPU 處理板,完成IP(OA)、UDP、TCP、GTP‐U 協(xié)議模塊處理; ? Host 部分完成網(wǎng)絡(luò)處理器運(yùn)行狀態(tài)監(jiān)視、性能統(tǒng)計(jì)等功能。

      3)Node B設(shè)備

      EMB5116 基站主要分為如下幾個(gè)主要組成部分:主機(jī)箱、電源單元、EMx 板卡、風(fēng)機(jī)及濾網(wǎng)單元、功能板卡

      硬件單元排布如圖3所示。

      圖 3:1EMB5116 槽位框圖

      4、LMT-B 使用LMT-B軟件進(jìn)行網(wǎng)絡(luò)布配,完成光纖與RRU的配置 1)單天線模式配置 配置參數(shù)見(jiàn)下圖:

      圖表 4: 單天線模式配置詳細(xì)參數(shù)

      圖表 5:?jiǎn)翁炀€模式配置結(jié)果

      2)分布式單天線模式配置: 配置參數(shù)見(jiàn)下圖:

      圖表 6:分布式天線模式配置詳細(xì)參數(shù)

      圖表 7:分布式天線配置結(jié)果

      3)智能天線模式配置參數(shù)如下:將天線模式改為智能天線,并需要在連接天線處添加天線,其它參數(shù)與單天線相同。添加的天線信息如下:

      圖表 8:所添加天線信息

      圖表 9:智能天線模式配置詳細(xì)參數(shù)

      圖表 10:智能天線配置結(jié)果

      5、LDT信令跟蹤

      圖 11:設(shè)備監(jiān)視圖

      圖表 12:信令跟蹤結(jié)果

      6、網(wǎng)管操作和OMT創(chuàng)建小區(qū)

      實(shí)驗(yàn)步驟: 增加一個(gè) R4 小區(qū)

      選擇邏輯基站—小區(qū)集—右鍵選擇快速創(chuàng)建小區(qū)

      第一步:

      小區(qū)基本信息: 小區(qū)標(biāo)識(shí)(CellId):

      同一個(gè)RNC 中的CellId 配置值要求不能重復(fù); 小區(qū)參數(shù)標(biāo)識(shí)(CellParameterId):

      小區(qū)參數(shù)標(biāo)識(shí)ID 唯一標(biāo)識(shí)了小區(qū)中的一組參數(shù):下行同步序列SYNC‐DL、上行同步

      序列SYNC‐UL sequences、擾碼、midamble 碼;

      小區(qū)特性:

      主頻段時(shí)隙轉(zhuǎn)換點(diǎn):3(說(shuō)明小區(qū)時(shí)隙為2 上4 下,一般為2 上4 下); 其他頻段時(shí)隙轉(zhuǎn)換點(diǎn):可以與主頻段不一致;

      HSDPA 特性:

      非HSDPA 小區(qū)(可根據(jù)需要選擇:HSDPA 小區(qū)或混合DPA 小區(qū),這里我們選擇非HSDPA 小

      區(qū)是因?yàn)槲覀円獎(jiǎng)?chuàng)建一個(gè)R4 小區(qū)); HSUPA 特性:

      不支持HSUPA 小區(qū)(可根據(jù)需要選擇支持HSUPA 小區(qū),這里我們選擇不支持HSUPA 小區(qū)

      是因?yàn)槲覀円獎(jiǎng)?chuàng)建一個(gè)R4 小區(qū));

      位置區(qū)信息:

      位置區(qū)代碼:由RNC 全局參數(shù)決定(實(shí)驗(yàn)室環(huán)境與RNC 一致:比如RNC2,那么就是2);

      路由區(qū)代碼:由RNC 全局參數(shù)決定(實(shí)驗(yàn)室環(huán)境與RNC 一致:比如RNC2,那么就是2);

      服務(wù)區(qū)代碼:實(shí)驗(yàn)室環(huán)境為107; UPA 有效數(shù):1(固定);

      其他信息默認(rèn),然后選擇下一步

      第二步:

      根據(jù)需要選擇輔載波的數(shù)量;

      主載波上行時(shí)隙至少要選擇一個(gè)PRACH; 然后選擇下一步;

      第三步:

      信道功率信息和UpPCH 信道功率信息選擇默認(rèn)即可,這些數(shù)值在創(chuàng)建完小區(qū)之后,根據(jù)需要 是可以修改的;

      選擇完成,一個(gè)R4 小區(qū)創(chuàng)建完畢。

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

      此次實(shí)驗(yàn)不僅讓我更加深入的了解了TD_SCDMA系統(tǒng),還認(rèn)識(shí)了許多和移動(dòng)通信有關(guān)的設(shè)備,體驗(yàn)了視頻通話和手機(jī)電視等先進(jìn)的移動(dòng)通信技術(shù),極大的增強(qiáng)了我對(duì)移動(dòng)通信的興趣。

      下載北郵電子院專(zhuān)業(yè)實(shí)驗(yàn)報(bào)告word格式文檔
      下載北郵電子院專(zhuān)業(yè)實(shí)驗(yàn)報(bào)告.doc
      將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
      點(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ù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

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

        數(shù)據(jù)庫(kù)實(shí)驗(yàn)報(bào)告(四) 姓名:學(xué)號(hào):班級(jí): 1. 簡(jiǎn)單查詢:SQL語(yǔ)句: select credit from course where course_name='SQL Server數(shù)據(jù)庫(kù)開(kāi)發(fā)技術(shù)'; 查詢“數(shù)據(jù)庫(kù)開(kāi)發(fā)技術(shù)”課程的學(xué)分;......

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

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

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

        《數(shù)據(jù)庫(kù)原理》實(shí)驗(yàn)報(bào)告 實(shí)驗(yàn)名稱(chēng)班級(jí)組號(hào)組員姓名 數(shù)據(jù)庫(kù)實(shí)驗(yàn)平臺(tái)的安裝、數(shù)據(jù)庫(kù)創(chuàng)建與維護(hù)實(shí)驗(yàn) 計(jì)算機(jī)科學(xué)與技術(shù)8班2011211308 梁展偉、李安一、實(shí)驗(yàn)?zāi)康?1.通過(guò)對(duì)Micr......

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

        嵌入式系統(tǒng)開(kāi)發(fā)實(shí)驗(yàn)報(bào)告 班級(jí): 姓名: 班內(nèi)序號(hào): 學(xué)號(hào): 日期: 目錄 一、 實(shí)驗(yàn)?zāi)康?.........................................................................................

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

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

        北郵java智能卡實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)三電子錢(qián)包(一)

        智能卡技術(shù)實(shí)驗(yàn)報(bào)告 學(xué)院: 電子工程學(xué)院 班級(jí): 2011211204 學(xué)號(hào): 2011210986 姓名: 實(shí)驗(yàn)三 Java卡電子錢(qián)包程序 一、實(shí)驗(yàn)?zāi)康?建立Java卡電子錢(qián)包程序,并進(jìn)行java卡程序的編譯......

        北郵計(jì)算機(jī)網(wǎng)絡(luò)實(shí)踐第三次實(shí)驗(yàn)報(bào)告

        計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)實(shí)踐 實(shí)驗(yàn)報(bào)告 實(shí)驗(yàn)名稱(chēng) RIP和OSPF路由協(xié)議的配置及協(xié)議流程 姓 名___(-…-)_____________實(shí) 驗(yàn) 日 期:2014年4月11日 學(xué) 號(hào)_ 242_______實(shí)驗(yàn)報(bào)告日期:2014年4......

        北郵數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告 單鏈表

        北京郵電大學(xué) 數(shù)據(jù)結(jié)構(gòu)試驗(yàn)報(bào)告 實(shí)驗(yàn)名稱(chēng): 實(shí)驗(yàn)一線性表 學(xué)生姓名:班級(jí):班內(nèi)序號(hào):學(xué)號(hào): 日期: 2014年1月3日 1 實(shí)驗(yàn)?zāi)康?? 熟悉C++語(yǔ)言的基本編程方法,掌握集成編譯環(huán)境的調(diào)試方法......