You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Aarch64架构中断管控:内核模块调用及实现合理性问询

关于C代码调用内核模块的几个问题

问题1:执行如下setup.sh脚本,是否会按照IRQ编号的优先级运行?

#insert and make node for checker interrupt module
cd ~/kernel_module/check_interrupt

sudo insmod checkinterrupt.ko

sudo mknod /dev/check_interrupt c 93 0  

# insert and make node for enable interrupt module
cd ~/kernel_module/enable_interrupt

sudo insmod interrupt_en.ko

sudo mknod /dev/enable_interrupt c 94 0

# insert and make node for disale interrupt module
cd ~/kernel_module/disable_interrupt

sudo insmod interrupt_dis.ko

sudo mknod /dev/disable_interrupt c 95 0

注:相关内核模块托管在GitHub,作者为Dominic Ng。

问题2:如下C代码调用内核模块的方式是否合理?

#define DEVICE_PATH "/dev/check_interrupt"
bool INTERRUPTS_ENABLED(){
    int fd;
    unsigned long daif_value;
    char buffer[128];

    // Open the device file
    fd = open(DEVICE_PATH, O_RDONLY);
    if (fd < 0) {
        perror("Failed to open device file");
        return false;
    }
    if (read(fd, buffer, sizeof(buffer)) < 0) {
        perror("Failed to read DAIF value");
        close(fd);
        return false;
    }
    if (sscanf(buffer, "DAIF register: 0x%lx", &daif_value) != 1) {
        perror("Failed to parse DAIF value");
        close(fd);
        return false;
    }
    close(fd);
    return !((daif_value >> 7) & 1);
}


#define ENABLE_PATH "/dev/enable_interrupt"

void ENABLE_INTERRUPTS(void) {
    if (!INTERRUPTS_ENABLED()) {
        int fd;
        fd = open(ENABLE_PATH, O_WRONLY);
        if (fd < 0) {
            perror("Failed to open device file");
            return;
        }

        char buffer[1] = {0};
        if (write(fd, buffer, sizeof(buffer)) < 0) {
            perror("Failed to write to device file");
        }

    // Close the device file
        close(fd);
        printf("Interrupt should now be enabled\n");
    }
}

#define DISABLE_PATH "/dev/disable_interrupt"

void DISABLE_INTERRUPTS(void) {
    if (INTERRUPTS_ENABLED()) {
        int fd;
        fd = open(DISABLE_PATH, O_WRONLY);
        if(fd < 0){
            perror("Failed to open device file ");
            return ;
        }
        
        char buffer[1] = {0};
        if(write(fd, buffer, sizeof(buffer) < 0)){
            perror("Failed to write to device file");
        }
        close(fd);
        printf("Interrupt should now be disable\n");
    }
}

问题3:如何将这些中断处理逻辑整合到单个函数中?如下实现方式是否合理?

uint8_t buf[2];
   buf[0] = address;
   buf[1] = value;
   
    //char rx[7] = {0, 7};
    
    gpioWrite(_ss, 0);

    DISABLE_INTERRUPTS();
  
    int status = spiXfer(0 ,(char *) buf, (char *)buf , 2) ;
    
    if (status < 0)
        {
            cout << "Cant transfer data" << endl;
        }
    ENABLE_INTERRUPTS();
    gpioWrite(_ss, 1);
    return buf[1];

本人缺乏这类流程的处理经验,希望能得到经验人士的帮助。

内容的提问来源于stack exchange,提问作者Dominic Ng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 18:15:15