Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ nirq:标志不匹配irq 80。00002083(ledtrig gpio)与00000083(用户)_C++_Arm_Embedded Linux_Gpio_Sysfs - Fatal编程技术网

C++ nirq:标志不匹配irq 80。00002083(ledtrig gpio)与00000083(用户)

C++ nirq:标志不匹配irq 80。00002083(ledtrig gpio)与00000083(用户),c++,arm,embedded-linux,gpio,sysfs,C++,Arm,Embedded Linux,Gpio,Sysfs,我正在SAMA5D27-SOM1-EK1板上做一些实验。我正在使用Linux操作系统。我正在利用我董事会的GPIO。在GPIO 10上定义了红色LED,在GPIO 29上定义了用户按钮。我写了C++程序来控制板的LED,这里是代码: #include<iostream> #include<fstream> #include<string> using namespace std; #define LED0_PATH "/sys/class/leds/red"

我正在SAMA5D27-SOM1-EK1板上做一些实验。我正在使用Linux操作系统。我正在利用我董事会的GPIO。在GPIO 10上定义了红色LED,在GPIO 29上定义了用户按钮。我写了C++程序来控制板的LED,这里是代码:

#include<iostream>
#include<fstream>
#include<string>
using namespace std;

#define LED0_PATH "/sys/class/leds/red"

void removeTrigger(){
   // remove the trigger from the LED
   std::fstream fs;
   fs.open( LED0_PATH "/trigger", std::fstream::out);
   fs << "none";
   fs.close();
}

int main(int argc, char* argv[]){
   if(argc!=2){
 cout << "Usage is makeLED and one of: on, off, flash or status"
<< endl;
 cout << "e.g. makeLED flash" << endl;
   }

   string cmd(argv[1]);
   std::fstream fs;
   cout << "Starting the LED flash program" << endl;
   cout << "The LED Path is: " << LED0_PATH << endl;


 // select whether it is on, off or flash
   if(cmd=="on"){
 removeTrigger();
 fs.open (LED0_PATH "/brightness", std::fstream::out);
 fs << "1";
 fs.close();
   }

   else if (cmd=="off"){
 removeTrigger();
 fs.open (LED0_PATH "/brightness", std::fstream::out);
 fs << "0";
 fs.close();
   }

   else if (cmd=="flash"){
 fs.open (LED0_PATH "/trigger", std::fstream::out);
 fs << "timer";
 fs.close();
 fs.open (LED0_PATH "/delay_on", std::fstream::out);
 fs << "50";
 fs.close();
 fs.open (LED0_PATH "/delay_off", std::fstream::out);
 fs << "50";
 fs.close();
   }

   else if (cmd=="status"){
 // display the current trigger details
 fs.open( LED0_PATH "/trigger", std::fstream::in);
 string line;
 while(getline(fs,line)) cout << line;
 fs.close();
 }

   else{
 cout << "Invalid command" << endl;
 }

cout << "Finished the LED flash program" << endl;
       return 0;
现在,当我录制
/target\u bin按钮时,它会显示一个错误:

nirq:标志不匹配irq 80。00002083(ledtrig gpio)与00000083 (用户)指示灯红色:请求\u irq失败,错误为-16

有人能帮我吗

现在,当我录制[sic]./target_bin按钮时,它会显示一个错误:

nirq:标志不匹配irq 80。00002083(ledtrig gpio)与00000083(用户)LED红色:请求\u irq失败,错误为-16

错误16为“设备或资源忙”。
所涉及的设备或资源是按钮的gpio_键。
请注意,错误消息中提到了“用户”,这恰好是分配给设备树文件中按钮的gpio_键的
标签

此(新)中断模式(即0x00002083)与gpio_密钥驱动程序建立的现有模式/标志(即0x00000083)冲突。
此冲突意味着此GPIO不能同时用于GPIO_键(输入事件)和LED触发器。
因此,您必须选择此GPIO将在哪种模式下运行

。。。而不是LED

您的意思是希望错误出现在LED上?
在执行特定操作时,您无法选择导致错误的设备

在为GPIO_键分配(新的)中断处理程序期间,您请求的操作(即分配一个特定GPIO(已作为GPIO_键安装)作为LED触发器失败。
因此,gpio_键报告错误,而不是LED


如需进一步确认以消除您的疑虑:
由于错误消息中提到“irq 80”,您应该在主板上的/proc/interrupts文件中查找此“irq 80”。
该文件应表明“irq 80”与“GPIO 29”(根据DT是GPIO_键)相关联

还有一个程序可以消除你的疑虑:
找到一个可访问且未使用的未使用的PIO引脚(作为gpio由任何外围设备或任何驱动程序/进程使用)。
将该引脚指定为LED触发器。
不应发生错误(假设您选择了未使用的pin)。
将引脚短接至接地或VDD_3V3以更改LED的(默认)状态



如何重新配置按钮用户,使其不是gpio_键并可用作LED触发器

正如我已经写过的,设备树文件at91-sama5d27_som1_ek.dts是带有按钮的GPIO被声明为GPIO_键的地方,我还发布了该节点的一段突出行。

如果不希望将该GPIO配置为GPIO_密钥,则需要通过删除该节点来修改设备树文件(当然还需要重新编译为dtb)。

您仍然需要LED触发器请求IRQ。阅读如何释放LED GPIO触发器的GPIO线的绑定文档。更好的方法是在DTS中禁用此GPIO线上的LED。我不希望修改DTS。但当我使用
gpioinfo | grep“\[USED\]”
命令搜索主板上“使用”的设备时,我发现在运行程序之前使用了红色LED:
第10行:“PA10”“RED”输出高电平[已使用]
但我的代码没有显示错误。为什么它会显示按钮错误而不是LED错误?我如何重新配置按钮用户,使其不是gpio_键并可用作LED触发器?
else if (cmd=="button"){
        removeTrigger();
        fs.open (LED0_PATH "/trigger", std::fstream::out);
        fs << "gpio";
        fs.close();
        fs.open (LED0_PATH "/gpio", std::fstream::out);
        fs << "29";
        fs.close();
   }
gpio_keys {
    ...
    pb4 {
        label = "USER";
        gpios = <&pioA PIN_PA29 GPIO_ACTIVE_LOW>;
        ...
    };
};
 * IRQF_ONESHOT - Interrupt is not reenabled after the hardirq handler finished.
 *                Used by threaded interrupts which need to keep the
 *                irq line disabled until the threaded handler has been run.
 ...
#define IRQF_ONESHOT        0x00002000