Linux嵌入式开发关于中断按键实验碰到的一些问题

        在继续学习linux嵌入式开发的过程中,进行到中断按键实验的时候碰到了一些问题。写下这篇博客,希望能够记录下来,同时希望能够帮助到正在学习的你。

        首先,我学习Linux嵌入式开发使用的是imx6ull开发板,也是正点原子的,教程也是看的正点原子的视频,在学习到GPIO中断实验的时候发现了自己的问题所在。刚开始程序一直报错,我看了一下问题描述,是结构体相关的错误,我c语言学习的不是特别扎实,于是我就花了一些时间补学了关于c语言结构体和数组指针的内容,在我们写关于gpio结构体的内容其实就相当于STM32中的库函数的意思,写了之后我们就能够直接对GPIO进行配置,例如结构体gpio_pin_config_t,代码如下:

可以看到在这个结构体中,嵌入了gpio_pin_direction_t和gpio_interrupt_mode_t两个结构体,分别代表了gpio引脚的输入输出模式与中断触发方式,然后在初始化中断的程序中,用到了这个结构体,例如:

在这段代码中,首先结构体命名为key_config,然后用GPIO初始化函数将GPIO1_18与key_config对应起来,然后设置 GPIO1_18为输入方式和上升沿触发的方式,诸如此类的结构体的应用还有许多,其实linux中c语言使用最多的就是函数、结构体、指针等。

        在调试好程序之后,按照例程编写了中断服务函数和主函数,代码如下:

 

按理说这个程序现象应该是下到板子中去之后,led灯会一直闪烁,然后按下按键触发中断,蜂鸣器会响,结果发现led灯能闪烁,但是按下按键之后蜂鸣器不会响而且主程序中的led闪烁也会卡死。原子哥也说了 是因为复位之后,程序最开始执行的是清除bss段的代码,程序最开始就不是执行的中断向量表,然后我们的中断向量偏移是设定的起始地址0x87800000,我们能够在反汇编dis文件中清楚的看到,起始地址之并没有初始化中断服务函数,

        于是左盟主将bss初始化的代码与清除bss段放在一起,在中断向量表之后,此时进行编译,看反汇编文件dis可以看到此时,从0x87800000开始之后进入了中断向量表。

然后我下进板子之后,发现现象还是和之前一样,然后我排查了很久的错误,一直也觉得是中断程序的错误,最后发现是因为,在.s文件中我的两个中服务函数IRQ和FIQ写反了,

就是这两个函数,可以看到注释还没有更改过来,然后改好之后,下在板子之后,发现有现象了,但是按键控制蜂鸣器还是不太灵敏,不能做到一按一开一按一关。我猜测可能是因为中断函数中写进了延时函数delay,后面会学习用定时器来写延时函数函数不知道会不会有所改观。

        我注意到了,既然是中断向量地址偏移的问题,那能不能不改bss段的代码,从而把中断向量地址偏移的值改了呢,带着疑问,我进行了尝试,首先将bss段代码还原,放在开头,然后编译查看中断过向量表的地址,在中断初始化函数中设置中断向量偏移设置,然后发现还是不行。

 

        后面我查阅了手册和出的pdf中提到了一句,

        我就清楚了,中断向量表必须放在程序的最前面,也就是代码链接的起始地址,我看了STM32中的中断向量表也是如此。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值