• 5238阅读
  • 5回复

[提问]Qt下编写硬件中断服务函数 [复制链接]

上一主题 下一主题
离线zjun726
 
只看楼主 倒序阅读 楼主  发表于: 2013-05-22
现在要在Qt的main函数中对PWM的中断进行处理,源码如下:

#include "smartdelaywidget.h"
#include <QApplication>
#include <QWSServer>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <asm/irq.h>
#include <fcntl.h>
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <stdlib.h>
#include "sys/ioctl.h"


// PWM
#define PWM_IOCTL_SET_FREQ              1
#define PWM_IOCTL_STOP                  0


static int pwm_fd = -1;
static int pwm_int_count = 0;


static irqreturn_t PWM_Interrupt(int irq, void *dev_id)      
{  
    pwm_int_count++;
    if (pwm_int_count % 5000 == 0)                                                          
        printk("500ms delay\n");
    
    if (pwm_int_count % 10000 == 0)
        printk("1s delay\n");                                
                                                              
    return IRQ_RETVAL(IRQ_HANDLED);                          
}


static int open_pwm(void)
{
    pwm_fd = open("/dev/pwm", 0);
    if (pwm_fd < 0) {
        perror("open pwm device");
        exit(1);
    }
    
    int err;


    err = request_irq(IRQ_TIMER0, PWM_Interrupt, IRQ_TYPE_NONE, "pwm", NULL);


    if (err)
    {
        disable_irq(IRQ_TIMER0);
        free_irq(IRQ_TIMER0, NULL);


        return -EBUSY;
    }
}


static void close_pwm(void)
{
    if (pwm_fd >= 0) {
        ioctl(pwm_fd, PWM_IOCTL_STOP);
        close(pwm_fd);
        pwm_fd = -1;
    }
}


static void set_pwm_freq(int freq)
{
    // this IOCTL command is the key to set frequency
    int ret = ioctl(pwm_fd, PWM_IOCTL_SET_FREQ, freq);
    if(ret < 0) {
        perror("set the frequency of the buzzer");
        exit(1);
    }
}


static void stop_pwm(void)
{
    int ret = ioctl(pwm_fd, PWM_IOCTL_STOP);
    if(ret < 0) {
        perror("stop the buzzer");
        exit(1);
    }
}


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    SmartDelayWidget w;
    QWSServer::setCursorVisible(false); //hide the cursor
    w.setWindowFlags(Qt::FramelessWindowHint);  //hide the Window title
    w.show();


    open_pwm();
    set_pwm_freq(100);
  
    return a.exec();
}


编译时,提示<linux/interrupt.h><linux/irq.h><asm/irq.h> no such file or directory,这些头文件都是linux系统自带的啊,怎么会提示找不到呢?
离线ywmlovecss

只看该作者 1楼 发表于: 2013-05-22
在嵌入式下需要连接到相关源代码模块里面的的。估计你都没有!!还有你的开发环境也是影响的,有些东西的需要自己配置。系统有时也不是那么智能的!!
离线zjun726
只看该作者 2楼 发表于: 2013-05-22
回 1楼(ywmlovecss) 的帖子
这个我想到了,就是不知道在哪里配置啊,我把Qt option选项里面的东西都看了一遍,没发现哪可以配置这个啊
离线ppdayz

只看该作者 3楼 发表于: 2013-05-22
这个不是Qt option的问题。。
这个是你的交叉编译器的问题,一般来说,你安装了交叉编译,就会有一套对应的库,一般来说,安装交叉编译器的时候会把环境变量也一起搞定的,如果环境变量有问题,就去看你的编译器的安装教程。
或者说如果是用的第三方库,就要在pro文件中加入lib += 。。。。 includepath+= 。。。,
离线zjun726
只看该作者 4楼 发表于: 2013-05-22
回 3楼(ppdayz) 的帖子
我安装的是arm-linux-gcc4.4.3,在环境变量中设置为
在/root/.bashrc中加入了 export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin

还需要配置什么啊,如果不用中断服务,编译时没有问题的啊。
离线ywmlovecss

只看该作者 5楼 发表于: 2013-05-22
三楼正解
快速回复
限100 字节
 
上一个 下一个