<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>
  • ESM335x外部中斷輸入應用

     2016-5-17              

      ESM335x嵌入式主板引出了2路外部中斷輸入,IRQ1和IRQ2。中斷上升沿有效,分別與GPIO24和GPIO25復用管腳。Linux-4.1.6之前采用了異步IO的方式通過SIGIO通知應用程序有中斷發生,我們在Linux-4.1.6 IRQ驅動中增加了對select函數的支持,select函數使用戶在應用程序中可以更方便的獲取中斷狀態。


    Linux系統IRQ外部中斷的應用


      IRQ1和IRQ2對應的設備文件分別是:/dev/em335x_irq1和/dev/em335x-irq2.應用程序使用IRQ外部中斷功能需要先打開相應的設備文件:


      int irq_no = 1;

        sprintf( device, "/dev/em335x_irq%d", irq_no );

        irq_fd = open(device, O_RDWR, S_IRUSR | S_IWUSR);

        if (irq_fd < 0)

        {

            printf("can not open /dev/em335x_irq1 device file!\n");

            return -1;

        }


      之后設置使用異步IO或者使用select函數獲取中斷狀態,異步IO方式可參考技術手冊,不再建議用戶使用。


    select函數


      由于外部中斷輸入的時間是不確定的,需要在循環中不停的調用select函數以檢查設備文件的讀狀態,所以一般會創建一個線程來調用select函數,主程序繼續執行其他的操作。線程函數如下:


      int IRQSelectThreadFunc(void* lparam)

      {

          int fd = * (int*)lparam;

          fd_set fdRead;

          struct timeval aTime;

          int retexitflag=1;    //exitflag在程序其他線程中改變

          while(1)

          {

              FD_ZERO(&fdRead);

              FD_SET(fd,&fdRead);

              aTime.tv_sec = 2; //s

              aTime.tv_usec = 0; //us

              ret = select ( fd+1, &fdRead, NULL, NULL, &aTime );

              if ( ret<0 )

                  printf( "select, something wrong!\n " );

              if ( ret>0 )

              {

                  if ( FD_ISSET(fd, &fdRead) )

                  {

                      //用戶可以在此加入中斷發生后的處理操作

                      nIrqCounter++;

                      printf( "there is a IRQ!!!\n" );

                  }

              }

              if ( exitflag==0 )

                  break;

              //判斷程序運行狀態,跳出循環

          }

          pthread_exit( NULL );

          return 0;

      }


      創建線程:


      pthread_attr_t      attr;

        pthread_t           m_thread;

        int                 res;

     

        // 創建select線程

        res = pthread_attr_init(&attr);

        if( res!=0 )

        {

            printf("Create attribute failed\n" );

        }

        // 設置線程綁定屬性

        res = pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM );

        // 設置線程分離屬性

        res += pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED );

        if( res!=0 )

        {

            printf( "Setting attribute failed\n" );

        }

     

        res = pthread_create( &m_thread, &attr, (void *(*) (void *))&IRQSelectThreadFunc, &irq_fd );

        if( res!=0 )

        {

            return -1;

        }

     

        pthread_attr_destroy( &attr );


      用戶在應用程序中創建新的線程使用select函數查詢中斷設備文件的狀態,如果有中斷發生select函數將會返回大于0的數值,用戶進一步判斷是哪一個設備文件有中斷發生,然后執行相應的中斷處理操作。


    異步IO和select函數的比較


      異步IO和select函數的功能都是相同的,即通知用戶有中斷發生,從而執行用戶在應用程序中設置的中斷處理操作;兩者由于在內核中使用的事件通知機制不同,在應用程序中的設置方法差別很大,執行的方式也不同(見程序),select函數采用阻塞的方式獲取讀狀態,不占用CPU資源,可以提高程序運行效率。兩者最大的差異在于當用戶需要在一個應用程序中檢查多個中斷輸入設備文件的狀態時(同時使用IRQ1和IRQ2),只能使用select函數才能確定具體是哪個中斷設備文件有中斷發生,使用異步IO不能確定。因此我們建議用戶在程序中使用select函數來管理IRQ外部中斷輸入。


      如有疑問請隨時與我們聯系。

    国产精品午夜高清在线观看| 国产成人精品午夜视频'| 99精品国产自在现线观看| 久久精品视频在线看99| 精品无码人妻夜人多侵犯18| 中文国产成人久久精品小说| 精品久久久无码中文字幕边打电话 | 久青草中文字幕精品视频| 精品国产v无码大片在线观看| 91精品成人免费国产| 人人妻人人澡人人爽人人精品浪潮| 久久亚洲国产午夜精品理论片| 国产剧情精品在线| 国产香蕉免费精品视频| 亚洲AV无码久久精品成人| 国产精品 综合 第五页| 久久频这里精品99香蕉久| 国产精品国色综合久久 | 亚洲国产精品成人精品小说| 精品久久综合1区2区3区激情| 国产精品高潮露脸在线观看| 久久精品人人做人人妻人人玩 | 日韩精品无码成人专区| 91精品国产91久久久久久蜜臀| 中文字幕日韩精品在线| 日本精品久久久久影院日本| 亚洲а∨精品天堂在线| 99久久99久久久99精品齐| 国产一精品一AV一免费| 国产精品免费αv视频| 国产精品电影一区二区三区| 国产va免费精品观看精品| 2022国产成人精品福利网站| 日本精品久久久中文字幕| 久久99精品久久久久久野外| 精品国产亚洲AV麻豆| 国产精品久久久久久久久久影院| 精品无人区一区二区三区| 久久久久久国产精品三级| 精品免费视在线观看| 日韩精品在线观看|