0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术ESM335x外部中断输入应用介绍

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-02-04 10:37 次阅读

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外部中断功能需要先打开相应的设备文件:

intirq_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函数,主程序继续执行其他的操作。线程函数如下:

intIRQSelectThreadFunc(void* lparam)

{

intfd = * (int*)lparam;

fd_set fdRead;

structtimeval aTime;

intret,exitflag=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 );

return0;

}

创建线程:

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外部中断输入。

如有疑问请随时与我们联系。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11007

    浏览量

    206897
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6066

    浏览量

    34663
收藏 人收藏

    评论

    相关推荐

    外部中断的工作原理 外部中断方式有哪些 为什么要使用外部中断

    外部中断的工作原理是单片机响应外部事件的一种机制** **。
    的头像 发表于 01-28 17:37 1761次阅读

    STM32外部中断大问题

    问题:一直进入中断,没有触发信号,也一直进入。描述:开PA0为外部中断,刚刚很好,一个触发信号一个中断中断函数没有丢,也没有抢跑,开PA1
    的头像 发表于 11-08 08:00 739次阅读
    STM32<b class='flag-5'>外部</b><b class='flag-5'>中断</b>大问题

    STM32基于标准外设库的外部中断配置

    本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断
    的头像 发表于 11-02 14:13 935次阅读
    STM32基于标准外设库的<b class='flag-5'>外部</b><b class='flag-5'>中断</b>配置

    单片机外部中断的好处

    外部中断是单片机实时地处理外部事件的一种内部机制。当外部事件发生时,单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行
    的头像 发表于 10-31 15:58 1281次阅读
    单片机<b class='flag-5'>外部</b><b class='flag-5'>中断</b>的好处

    STM32如何配置外部中断?STM32外部中断配置步骤

    STM32如何配置外部中断?STM32外部中断配置步骤  作为一款现代化的微控制器,STM32系列芯片在各种应用场合中广泛应用。其中最常见的应用是
    的头像 发表于 10-26 17:47 2252次阅读

    STM32学习笔记一外部中断

    STM32 的每个 IO 都可以作为外部中断中断输入口。STM32F103 的中断控制器支持 19 个
    的头像 发表于 10-24 14:12 749次阅读
    STM32学习笔记一<b class='flag-5'>外部</b><b class='flag-5'>中断</b>

    信息技术是干什么?

    广播电子技术信息技术
    橙群微电子
    发布于 :2023年09月22日 09:17:48

    外部中断的非向量处理模式介绍

    [size=14.6667px]NucleiStudio IDE 202102版 硬件需求 RV-STAR开发板 中断知识介绍 外部中断处理
    发表于 08-16 07:40

    51单片机外部中断实验

    前面,我们讲了51单片机的输入和输出功能,今天讲点不一样的,外部中断测试。
    发表于 07-11 11:41 760次阅读
    51单片机<b class='flag-5'>外部</b><b class='flag-5'>中断</b>实验

    DSP28335外部中断的使用

    处理器的外部中断主要用于捕抓外部输入的高低电平。本篇文章将介绍DSP28335的外部
    的头像 发表于 07-07 16:41 2763次阅读
    DSP28335<b class='flag-5'>外部</b><b class='flag-5'>中断</b>的使用

    CC2530 外部中断配置步骤

    介绍CC2530 外部中断配置步骤。
    的头像 发表于 07-06 14:41 1869次阅读
    CC2530 <b class='flag-5'>外部</b><b class='flag-5'>中断</b>配置步骤

    STM32F407 外部中断配置步骤

    介绍STM32F407外部中断配置步骤,以按键为例,实现外部中断配置,使用按键触发中断进行LED
    的头像 发表于 07-06 14:31 1101次阅读
    STM32F407 <b class='flag-5'>外部</b><b class='flag-5'>中断</b>配置步骤

    Linux内核外部中断解析(下)

    上篇文章我们从内核工程师的角度剖析了内核的外部中断,这节我们从BSP工程师的角度剖析一下外部中断
    发表于 06-23 15:19 287次阅读
    Linux内核<b class='flag-5'>外部</b><b class='flag-5'>中断</b>解析(下)

    STM32的IO外部中断EXTI的使用

    的方式访问输入引脚,还可以通过另外一种叫做外部中断的方式来对引脚的输入信号进行检测,本篇首先介绍下EXTI的结构,接着
    的头像 发表于 06-22 10:21 1255次阅读
    STM32的IO<b class='flag-5'>外部</b><b class='flag-5'>中断</b>EXTI的使用

    2023年中海达星推官系列直播再度启航,与您一起探讨空间信息技术

    信息技术
    中海达
    发布于 :2023年06月21日 11:45:49