<strike id="kiyse"></strike>
  • <tr id="kiyse"></tr>
  • <strike id="kiyse"></strike><samp id="kiyse"><tbody id="kiyse"></tbody></samp>
    <strike id="kiyse"><s id="kiyse"></s></strike>
    <tr id="kiyse"></tr>
    <noframes id="kiyse"><code id="kiyse"></code></noframes>
    <th id="kiyse"></th>
    <samp id="kiyse"></samp>
  • <th id="kiyse"><s id="kiyse"></s></th>
  • 精簡ISA總線Linux編程 – Part2

     2019-3-20     作者:Emtronix         

      精簡ISA總線接口是一種8-bit寬度的雙向并行擴展總線,其特點是地址數(shù)據(jù)分時復用8位總線,加上4條總線控制信號,即可實現(xiàn)對外部數(shù)據(jù)的快速讀寫。若再使能一條總線時鐘信號(共13條信號),就可實現(xiàn)高達10MB/s以上的數(shù)據(jù)傳輸。精簡ISA總線作為英創(chuàng)主板的特色功能之一,在ESM6802、ESM7000、ESM7100、ESM335x等多款型號中均有配置。


      關(guān)于對精簡ISA總線接口的應用編程的基本方法,請參考《精簡ISA總線編程 – Part 1》。本文介紹由應用程序啟動基于DMA的數(shù)據(jù)塊讀寫,即MemCpy方式的DMA。采用DMA進行ISA總線數(shù)據(jù)傳送的目的,是為了降低高速傳送大量數(shù)據(jù)時的CPU開銷。MemCpy方式的DMA是指軟件線程啟動DMA,然后該線程掛起等待DMA操作完成。在多線程環(huán)境中,其他線程即可在DMA執(zhí)行過程中得以并行運行。


      ISA總線信號定義如下:


    信號及說明PIN#信號及說明
    RESET_B,硬件復位12ISA_ADVn,地址鎖存控制信號
    ISA_AD0,地址數(shù)據(jù)總線,LSB34ISA_AD4,地址數(shù)據(jù)總線
    ISA_AD1,地址數(shù)據(jù)總線56ISA_AD5,地址數(shù)據(jù)總線
    ISA_AD2,地址數(shù)據(jù)總線78ISA_AD6,地址數(shù)據(jù)總線
    ISA_AD3,地址數(shù)據(jù)總線910ISA_AD7,地址數(shù)據(jù)總線,MSB
    MSLn,支持多模塊掛接總線1112ISA_WEn,數(shù)據(jù)寫控制信號
    GPIO9,可選作為IRQ1314ISA_RDn,數(shù)據(jù)讀控制信號
    GPIO8,可選作為IRQ1516ISA_CSn,片選控制信號
    GPIO25,可選作為IRQ1718VDD_5V0,+5V供電
    GPIO24 / ISA_BCLK,同步時鐘ISA_BCLK1920GND,電源信號地


      本文以下部分,將以ESM7000 Linux平臺為例,介紹具體的編程方法。


    DMA總線訪問API


      應用啟動DMA數(shù)據(jù)傳輸,需要使用數(shù)據(jù)結(jié)構(gòu)struct isa_transfer的傳遞參數(shù)和數(shù)據(jù),structisa_transfer的結(jié)構(gòu)定義如下:


    structisa_transfer
    {
           void              *rx_buf;                /* != NULL: buffer for bus read */
           void              *tx_buf;                /* != NULL: buffer for bus write */
           unsigned     len;                      /* buffer length in byte */
           unsigned     offset;                  /* offset,port address on isa bus */
           unsigned     inc;                      /* = 0: fixed offset, = 1: offset+1 after r/w */
    };


      每一個總線周期的操作只能是讀或?qū)懀虼嗽趇sa_transfer結(jié)構(gòu)中只能有一個buffer指針不為NULL。以下是執(zhí)行32字節(jié)數(shù)據(jù)塊寫的代碼,寫入地址為0x4040。順序的數(shù)據(jù)可方便時序的觀察。


    unsignedchargbuf[64 * 1024];
    unsignedint i, value;
    structisa_transfer      t;
    unsignedchar   *pBuf8;
     
    // write data block
    memset(&t, 0, sizeof(structisa_transfer));
    t.offset = 0x4040;
    t.len = 32;            // max len<= 16KB = 16 * 1024
    t.tx_buf = gbuf;
    // fill data
    value = 0x55;             // initialvalue
    pBuf8 = (unsignedchar*)t.tx_buf;
    for(i = 0; i<t.len; i++){
           *pBuf8 = (unsignedchar)(value + i);
           pBuf8++;
    }
    isa_write_buf(fd, &t);


      注意offset必須是0x4000 – 0x40FF,驅(qū)動程序才會啟動MemCpy方式的DMA傳輸。若從0x4040讀入32字節(jié)數(shù)據(jù),實現(xiàn)代碼則為:


    unsignedchargbuf[64 * 1024];
    structisa_transfer      t;
     
    // read data block
    memset(&t, 0, sizeof(structisa_transfer));
    t.offset = 0x4040;
    t.len = 32;                   // max len<= 16KB = 16 * 1024
    t.rx_buf = gbuf;
    isa_read_buf(fd, &t);


    DMA傳輸總線時序說明


      圖1、圖2分別為MemCpy方式DMA讀總線時序概要、寫總線時序概要。


    isa_read_buf-dma-1.png

    圖1 DMA讀總線時序


    isa_write_buf-dma-1.png

    圖2 DMA寫總線時序


      從上面的時序可見,DMA也是16字節(jié)一組,連續(xù)4個總線周期組成,每組之間有一定間隔。DMA讀操作的總線速率大約為11.8MB/s,DMA寫操作的總線速率大約為11.2MB/s。


      展開DMA寫的總線時序可看到:


    isa_write_buf-dma-2.png

    圖3 DMA寫總線時序—第1組起始部分


     isa_write_buf-dma-3.png

    圖4 DMA寫總線時序—第1組結(jié)束部分


     isa_write_buf-dma-4.png

    圖5 DMA寫總線時序—第2組起始部分


    isa_write_buf-dma-5.png

    圖6 DMA寫總線時序—第2組結(jié)束部分


      在每個總線周期中,地址遞增4。這樣當傳輸長度超過256字節(jié)時,ISA地址及會循環(huán)。這意味著當采用MemCpy方式DMA進行數(shù)據(jù)傳輸時,數(shù)據(jù)端口譯碼不能采用普通的組合電路地址譯碼方式,而必須采用BCLK+ ADV#的同步電路譯碼方式。具體方式就是每個周期的第一個BCLK下降沿鎖存到有效ADV#,標志同步周期的開始,之后經(jīng)過連續(xù)7個BCLK下降沿后同步周期結(jié)束。


    DMA傳輸時的CPU負載率


      與純軟件的同步總線周期傳輸相比,DMA傳輸最大的優(yōu)點是有效降低了總線傳輸?shù)腃PU開銷,使應用程序的其它線程能同步運行。基本的測試代碼如下:


    #define MAX_DMA_LEN         (16*1024)
    unsignedchar gbuf[64 * 1024];
     
    unsignedint i, count = 1;
    struct isa_transfer     t;
    unsignedchar   *pBuf8;
    longdouble a[4], b[4], loadavg;    //for CPU utilization calculation
    FILE *fp;
    constchar *bus_type_name[] = {"async-cpu","async-dma-mem","async-dma-ext", "sync-cpu","sync-dma-mem","sync-dma-ext"};
     
    // fill data
    pBuf8 = (unsignedchar*)gbuf;
    for(i = 0; i < MAX_DMA_LEN; i++){
           *pBuf8 = (unsignedchar)(value + i);
           pBuf8++;
    }
    memset(&t, 0, sizeof(struct isa_transfer));
     
    // get initial values for calculating CPU usage in %
    fp = fopen("/proc/stat","r");
    fscanf(fp,"%*s %Lf %Lf %Lf %Lf",&a[0],&a[1],&a[2],&a[3]);
    fclose(fp);
     
    // write data block loop
    while(count) {
           i = (count < MAX_DMA_LEN)? count : MAX_DMA_LEN;
           t.offset = offset;
           t.len = i;
           t.tx_buf = gbuf;
           isa_write_buf(fd, &t);
           count -= i;
    }
     
    // get end values for calculating CPU usage in %
    fp = fopen("/proc/stat","r");
    fscanf(fp,"%*s %Lf %Lf %Lf %Lf",&b[0],&b[1],&b[2],&b[3]);
    fclose(fp);
     
    // calculate CPU usage in %
    loadavg = ((b[0]+b[1]+b[2]) - (a[0]+a[1]+a[2])) / ((b[0]+b[1]+b[2]+b[3]) - (a[0]+a[1]+a[2]+a[3]));
    loadavg *= 100;
    i = (offset >> 12) & 0xf;
    printf("%s bus write, CPU utilization is : %Lf%%\n",bus_type_name[i], loadavg);


      使用100M數(shù)據(jù)長度來測試總的CPU負載率的情況如下:


    模式MemCpy DMA純軟件操作
    同步總線讀6.01%50.3%
    同步總線寫5.71%50.0%


      ESM7000使用的是具有雙核CPU的iMX7D,總CPU負載率50%,表示某個CPU核的負載已經(jīng)100%。DMA的使用對提高系統(tǒng)整體的性能是非常顯著的。


      進一步可測試應用層實際的傳輸速率如下:


    模式傳輸速率CPU負載
    MemCpy DMA同步總線讀8.67MB/s6.01%
    MemCpy DMA同步總線寫7.93MB/s5.71%


      若把每個周期傳輸?shù)淖止?jié)數(shù)從4個提升到8個,傳輸率則可有50%的提升。


      以上是對精簡ISA總線基本讀寫的介紹,有興趣的客戶可與英創(chuàng)公司技術(shù)聯(lián)系,索取完整的測試代碼源碼。技術(shù)支持郵箱:support@www.jsjflaw.com。

    国产精品日本一区二区不卡视频 | 99热成人精品国产免国语的 | 国产成人精品自线拍| 久久99精品视免费看| 日韩精品一二三区| 无码精品A∨在线观看免费| 一本色道久久88精品综合| 国产精品模特hd在线| 日产精品一二三四区国产| 亚洲精品国产精品乱码不卡√| 日韩精品免费电影| 91精品国产色综久久| 国产午夜精品久久久久免费视| 四虎成人精品在永久在线观看 | 国产精品理论电影| 亚洲国产精品成人综合久久久| 国产一区二区三精品久久久无广告 | 热久久美女精品天天吊色| 99re6这里只有精品视频| 99久久成人国产精品免费| 四虎成人精品无码永久在线| 无码国产精品久久一区免费| 日韩精品人妻系列无码专区| 国产成人精品一区二区三区无码| 国产亚洲精品美女2020久久| 久久人午夜亚洲精品无码区| 5555国产在线观看精品| 久久精品国产这里是免费| 国内精品免费久久影院| 国产成人亚洲精品电影| 无码人妻精品一区二区三区9厂| 亚洲欧洲精品视频在线观看| 久久精品99香蕉国产| 99热婷婷国产精品综合| 精品久久久久久久中文字幕 | 精品400部自拍视频在线播放| 亚洲精品动漫免费二区| 久热中文字幕在线精品免费| 九九精品99久久久香蕉| 久久精品国产成人AV| 久久免费精品视频|