Tag: 中断

idt_table undefined! 编译内核模块时发出警告

我正在尝试在内核模块中使用gate_desc *idt_table 。 set_trap_gate()定义的set_trap_gate()函数使用此指针。 在desc.h中也有一个定义: extern gate_desc idt_table[] 。 我尝试了不同的东西: 在我的模块中使用idt_table而没有定义或做法 用我的(有效) idt_table地址影响idt_table我在编译期间得到一个id_table未定义的警告,或者为idt_table得到不完整的类型。 创建一个名为gate_desc *it = (gate_desc *)@;的新var gate_desc *it = (gate_desc *)@; 并将set_trap_gate , set_gate , write_idt_entry , pack_gate函数从sched.h复制到我的模块文件(重命名它们,并使用它而不是idt_table )。 这编译很好,但插入我的模块时,我在模块(ret -1)错误中得到一个未知符号。 (我的模块中没有对idt_table的引用,我在sched中使用的函数使用我的变量)。 我试着看看sched.h中包含的文件在哪里被定义为idt_table ,但找不到它! 有人知道我怎么用,来自sched.h的idt_table指针(用corrct地址影响它)还是创建一个新指针?

为什么明确的interrput标志导致C中的分段错误?

我正在学习关于Assembly和C.的一些基础知识用于学习目的我决定编写一个禁用Interrupts的简单程序,当用户想要在控制台中键入内容时他/她不能: #include int main(){ int a; printf(“enter your number : “); asm (“cli”); scanf(“%d”, &a); printf(“your number is %d\n” , a); return 0; } 但是当我用GCC编译它时,我得到了分段错误: Segmentation fault (core dumped) 当我用gdb调试它时,当程序到达asm(“cli”);时,我收到了这条消息asm(“cli”); 线: Program received signal SIGSEGV, Segmentation fault. main () at cli.c:6 6 asm (“cli”);

什么时候使用break,并继续用C语言?

什么时候使用break,并继续用C语言? 我可以使用循环和没有循环吗? 如果循环中的条件足以指示是否继续,那么有什么需要使用它们? 使用它们是一个好习惯吗? 提前致谢。

中断处理程序是否必须是可重入的?

我在中断处理程序中使用静态变量,使中断处理程序不可重入。 拥有一个不可重入的中断处理程序是否可以? 当引发硬件中断时,事件是否进入某种队列并等待当前中断处理程序调用完成或是否立即调用中断处理程序? 谢谢 PS。 我正在使用Linux。 我正在使用的编程语言是C,如果它有所作为。

使用Turbo C ++ 3.0处理键盘中断

我有一个项目。 这是一个简单的游戏,“Falling Blocks”。 游戏区域被视为网格,其大小为20×20。 屏幕顶部会出现下降的块,底部会有一个英雄,他们会射击这些块。 游戏的目标是在他们达到底线之前拍摄块。 他总是处于底线。 每当用户按下键盘上的空格键时,我将生成一个子弹,并且英雄用左右箭头键在底线上移动。 我不知道用Turbo C ++ 3.0处理这些键盘中断。 禁止使用“dos.h”和“int 21H”。 你能给我一些关于这些项目的提示吗? 编辑:我发现了这些信息,但我无法理解如何实现它: 当在键盘上按下键时,产生中断以及名为“生成代码”的扫描代码,并且当释放该键时,键盘控制器产生“中断代码”。 在PC上,键盘由芯片控制并分配给端口号60h和61h。 在键盘上按下键时,扫描值将在60h时进行注册。 您可以使用以下命令获取此扫描代码:在al,60h获取扫描代码后,您必须使用以下命令重置键盘编程61h芯片的命令寄存器:al,61h或al,82h out 61h ,al和al,7fh out 61h,al在每个中断服务程序结束时,清除PIC服务位,发送中断结束(EOI)命令,20h到地址20h的PIC端口。 mov al,20h out 20h,al

在保护模式下设置中断(x86)

为保护模式设置中断的过程是什么? 这个链接说应该: 为中断描述符表腾出空间 告诉CPU该空间在哪里(参见GDT教程:lidt的工作方式与lgdt完全相同) 告诉PIC您不再需要使用BIOS默认值(请参阅编程PIC芯片) 为IRQ和exception编写几个ISR处理程序(请参阅中断服务程序) 将ISR处理程序的地址放在适当的描述符中 启用IRQ掩码中所有支持的中断(PIC) 第三步对我没有任何意义(我查看了这个链接,但没有任何关于告诉PIC的事情)所以我忽略了它并完成了接下来的两个步骤,当我到达最后一步时再次无能为力。 但是,根据我对中断的理解,我不理解的两个步骤都与PIC控制器的硬件中断有关,不应该影响PIT在IRQ 0上引发的中断。因此我也忽略了这一步骤。 当我运行我的代码时,它编译得很好,甚至在虚拟机中运行,但中断似乎只发射一次。 然后我意识到我没有向EOI发送EOI,以防止它再引发任何中断。 但是,在iret指令使虚拟机崩溃之前,添加mov al, 0x20和out 0x20, al 。 这是我的IDT: ; idt idt_start : dw 0x00 ; The interrupt handler is located at absolute address 0x00 dw CODE_SEG ; CODE_SEG points to the GDT entry for code db 0x0 ; The unused byte db 0b11101001 […]

Arduino中断替代方案

从我所读到的,我的问题的解决方案是使用中断,但如果我正确理解它,我不能在中断调用的例程中使用延迟。 我有一个大按钮LED开关。 我希望它在闲置时有一个心跳,但是一旦它被按下,保持绿色并执行代码。 如果我按下按钮足够次,我可以打破heartbeat() (我假设在正确的时间完成状态更改,因为它完成了heartbeat的循环),但我仍然坚持如何让它在第一次工作单击。 有没有其他方法来做我正在尝试的事情? void loop(){ heartbeat(); //Make LED beat. buttonVal = digitalRead(buttonPin); //Check the button. if (buttonVal != buttonState) { //If the button state changed. if (buttonVal == HIGH){ //Check if the button is pressed. analogWrite(greenPin, 255); //Button stays green once pushed. functionA //Has some delays in it. functionB //Has some other […]

在MCU内部FLASH中从一个固件跳转到另一个固件

我目前正在开发针对STM32F030C8的引导加载程序固件应用程序。 我在我的分散文件中指定引导加载程序应用程序将占用主存储器位置0x08000000到0x08002FFF(扇区0到扇区2)。 我还写了一个主要的固件应用程序,存储从0x08003000到0x0800C800。 将两个固件下载到MCU内部FLASH后,我使用以下代码从引导加载程序中激活了主应用程序: /************************************************************//** * \brief Start the main application if available and correct *****************************************************************/ void INTFLASH_execute_main_app(const char mode) { MyFunc_ptr AppEntry; uint32_t temp[1]; IRQn_Type index; memcpy(temp, (void*)&NVIC->ISER, sizeof(NVIC->ISER)); //Save enabled interrupts for( index = (IRQn_Type)0; indexISER, temp, sizeof(NVIC->ISER) ); //Restore interrupts } 出于某种原因,当它执行AppEntry()时,它会跳转到下面的代码,并且不会在位置0x08003000处执行主应用程序: HardFault_Handler\ PROC EXPORT HardFault_Handler [WEAK] B . ENDP 我之前在ARM7 MCU上使用过这种逻辑,它工作正常,我无法弄清楚为什么它不适用于这种基于Cortex […]

静态全局变量和静态volatile变量之间有什么区别?

我在文件范围中使用了静态全局变量和静态volatile变量, 两者都由ISR和主循环更新,主循环检查变量的值。 在优化过程中,全局变量和volatile变量都不会被优化。 因此,全局变量不是使用volatile变量,而是解决问题。 那么使用全局变量而不是volatile是好的吗? 使用静态volatile的任何具体原因?? 任何示例程序都是可观的。 提前致谢..

Windows(或Linux)中的不间断进程?

有没有办法让程序无法中断(一个不间断的程序)? 通过这种方式,我的意思a process that can’t be terminated by any signal, kill command, or any other key combinations任何系统中a process that can’t be terminated by any signal, kill command, or any other key combinations :Linux,Windows等。 首先,我有兴趣知道它是否可能。 如果是,那么可能的范围是什么? 我主要用C,C ++和python编写代码; 但我不知道这些编程语言中有任何这样的命令。 是否可以使用汇编语言,以及如何使用? 或者使用嵌入式汇编代码(内联汇编)的高级语言c? 我知道有些信号可以捕获,有些信号不像SIGKILL和SIGSTOP。 我记得,当我习惯使用Windows-XP时, some viruses couldn’t be terminated even from Task Manager. 所以我想在低级语言中可能有一些解决方案。 也许通过重写中断向量表。 我们可以使用TSR(挂钩)编写一个不间断的程序吗? 因为TSR只能在重新启动计算机时或者从内存中明确删除TSR时删除。 […]