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
相关产品推荐
相关产品推荐

