激情综合丁香-激情综合六月-激情综合婷婷亚洲图片-激情综合图区-激情综合网五月

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外部中斷輸入。


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

主站蜘蛛池模板: 国产日韩精品一区二区在线观看播放| 高清在线观看自拍视频| 精品福利一区二区免费视频| 黄色片中文| 国产一区二区三区在线| 成人看片毛片免费播放器| 日韩丝袜在线观看| 91黄色片| 久久青青视频| 夜色爽| 久久久精品一区| 亚洲国产精品视频| 国产成人亚洲精品久久| 性欧美视频在线观看| 欧美一区二区三区视频在线观看| 在线观看免费视频国产| 一级黑人| 乱色美www女麻豆| 好爽快一点视频在线观看| 韩毛片| 色视频在线观看在线播放| 久操青青| 麻豆免费视频网站| 国产精品v一区二区三区| 成人免费一级片| 99久久免费国产特黄| 国产午夜在线观看视频播放| 特级黄毛片| 在线观看日本污污ww网站| 亚洲午夜精品国产电影在线观看 | 欧美笫一页| 久久九九精品一区二区| 美女动作一级毛片| 成人欧美1314www色视频| 99黄色| 国产精品国产精品国产三级普| 国产日韩中文字幕| 小明看看在线视频| 国产永久免费高清动作片www| 国产目拍亚洲精品区一区| 日本人与黑人xxxx|