linux中断响应gpio中断太慢是什么原因
要么是由于(被修改了寄存器而)发生了中断,然后可以接着处理其所要做的事情;要么是一直轮训,检测对应的某种资源释放变化,比如上面被改的寄存器的对应的位,发现变化了,再去调用你的函数,做对应的处理。
延迟中断处理:对于一些不需要立即响应的中断事件,可以延迟中断处理。通过设置合适的中断优先级和延迟时间,可以减少短时间内的中断处理次数,提高系统的效率。
gpio中断一开启就持续被触发中断的原因如下:引脚未正确设置为输入模式:gpio引脚需要正确配置为输入模式才能接收外部信号。若引脚被错误地配置为输出模式或其他模式,会导致持续触发中断。
保护断点,即保存下一将要执行的指令的地址,就是把这个地址送入堆栈。寻找中断入口,根据5个不同的中断源所产生的中断,查找5个不同的入口地址。以上工作是由计算机自动完成的,与编程者无关。
Linux内核gpio
一共有5组 GPIO(GPIO0~4) ,每组 GPIO 为一个 Bank ,共32个引脚。每个 Bank 包括4个 Group (GPIOA(0~7) ~ D(0~7) 。不是所有 Bank 都有 GPIOA~D 的编号, RK3399 共122个 GPIO 引脚。
gpio_set_value(unsigned gpio, int value)用来设置gpio寄存器的值 gpio_direction_output(unsigned gpio, int value)用来设置gpio为输出功能,同时设置gpio输出的值。
根据查询相关信息得知linux设备树不能直接控制gpio,linux设备树有两个模式的用户态和内核态,gpio操作只能在内核态进行,而应用程序运行在用户态。在内核空间控制gpio有两种方法。通过调用gpiolib的接口来控制gpio。
linux内核里的GPIO操作函数
echo 1 /sys/class/gpio/gpio28/value 以上代码作用是:将RK30_PIN0_PD4设置为输出,将输出电平设置为高电平。
一共有5组 GPIO(GPIO0~4) ,每组 GPIO 为一个 Bank ,共32个引脚。每个 Bank 包括4个 Group (GPIOA(0~7) ~ D(0~7) 。不是所有 Bank 都有 GPIOA~D 的编号, RK3399 共122个 GPIO 引脚。
gpio定义好了后,直接调用系统提供的 gio_read 和 gio_write 函数。TI解决方案中都带有这两个接口。
安装SD Linux系统 如图所示,先后将Arduino Software 3 (Arduino IDE)和SD-Card Linux Image下载到本机,Arduino IDE在后面查找GPIO与Arduino IO 之间的映射关系时需要用到。
有两种方案:第一种就是准备好GPIO驱动程序,然后应用程序通过read函数和write函数或者ioctl函数来操作GPIO驱动程序,也就是让应用程序模拟PWM波形。