标签: interrupt

INT 指令的具体行为是什么?

例如x86指令:push可以精确地描述为:

\n\n
push:\nsub esp, data_size\nmov [esp], data\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且call可以描述为:

\n\n
call:\npush (eip+2)\njmp addr\n
Run Code Online (Sandbox Code Playgroud)\n\n

通过了解这些,我们将完全清楚这些指令如何影响堆栈、寄存器和标志,我认为这是至关重要的。

\n\n

然而,在阅读《Intel\xc2\xae 64 和 IA-32 架构软件开发人员\xe2\x80\x99s 手册》之后。和“i386程序员手册”我没有找到有关INT指令的确切行为的信息。

\n\n

现在,我想在 INT 调用后修改堆栈,使我的程序返回到另一个地方。

\n\n

那么,INT被调用之后到底做了什么呢?

\n\n

(由程序员或硬件。我听说他们的行为不同)

\n\n

提前致谢!!

\n\n
\n

附:

\n\n

据我所知,INT 按某种顺序推送 eip、4 个通用寄存器、eflags 和一些奇怪的东西。

\n\n

我观察到当我调用它时它在堆栈上消耗了 6 个字节,

\n\n

当硬件触发时,它消耗18个字节。(如时钟)

\n\n

补充:我的代码

\n\n
    \n
  1. 将 ivt 0x1ch(系统定时器 Tick) 挂钩到我的函数 [foo]

  2. \n
  3. 科学技术

  4. \n
  5. 跳$

  6. \n
  7. foo: 打印\'A\'

  8. \n
\n\n

jmp $我在进入之前检查堆栈foo

\n …

x86 assembly operating-system interrupt

0
推荐指数
1
解决办法
1594
查看次数

ARM WFI 不会休眠

我正在尝试在 Cortex-M4 上进入待机模式。正常的行为是设备大约每 2 分钟唤醒一次,但在我最新的固件版本中,代码似乎是“随机”卡住的。

经过调查,代码似乎WFI在没有进入待机状态的情况下传递了指令(无待机 => 无重置 => 无限循环 => ... => 42)。

因此,在阅读了许多不清楚的规范之后,我的理解是,WFI如果存在待处理的中断,则可能不会进入睡眠状态。

  1. 你能确认最后一句话吗
  2. 如何确保在调用之前清除所有挂起的中断WFI

arm interrupt cortex-m

0
推荐指数
1
解决办法
2911
查看次数

int 10 在汇编中做什么?

我正在尝试为学校学习汇编,示例代码的开头有这部分:

mov al, 0
mov ah, 5
int 10
Run Code Online (Sandbox Code Playgroud)

在此之前有一个程序:

.386
instructions SEGMENT use16
        ASSUME  CS:instructions

interrupt_handler PROC
; some code
interrupt_handler ENDP
Run Code Online (Sandbox Code Playgroud)

什么是int 10线在做什么?它是调用interrupt_handler程序吗?为什么正好是10?

这一切都在 DoSBox 中运行,并使用 masm 组装。

assembly dos interrupt masm x86-16

0
推荐指数
1
解决办法
1353
查看次数

IRQ Handler 和 Callback 函数有什么区别?

我们正在使用 STM32F429I 并尝试通过不同的方式使用定时器(TIM2 和 TIM5)。在我们的代码中启用计时器并调用后;

HAL_TIM_Base_Start_IT(&htim5);
Run Code Online (Sandbox Code Playgroud)

我们可以通过调用TIM5_IRQHandler函数来更新变量。我们注意到HAL_TIM_PeriodElapsedCallback函数已完成相同的过程。

那么我们的问题是:这两个函数有什么区别吗?

embedded interrupt stm32f4

0
推荐指数
1
解决办法
8689
查看次数

c arduino 按钮中断 (isr),使多个 LED 亮起和熄灭

我一直在尝试通过按下相应的按钮来让我的 Arduino 上的 LED 亮起和熄灭。

我正在使用中断来实现它并且按钮按下确实被注册,但由于某种原因它没有改变全局变量的值(int button_pressed1,...);

应该发生的是,当我按下按钮 1 时,LED 1 应该亮起和熄灭,与按钮 2 和按钮 3 相同。

我真的很感谢你看一看,中断对我来说很新,所以这可能是一个小问题。<3

*我省略了按钮 2 和 3 的代码。如果我能让 LED 点亮按钮 1,我就能让它们点亮其他按钮。

#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include "usart.h"

#define LED_DDR DDRB
#define LED_PORT PORTB

#define BUTTON_DDR DDRC
#define BUTTON_PORT PORTC
#define BUTTON_PIN PINC

int button_pressed1 = 0; //globale variabele to turn on functions

ISR(PCINT1_vect)
{
    if (bit_is_clear(BUTTON_PIN, PC1))
    {                
        _delay_us(500); //debounce
        if (bit_is_clear(BUTTON_PIN, PC1))
        {

            button_pressed1 = 1;
            printf("button 1 pressed\n");
        }
    }
}

int …
Run Code Online (Sandbox Code Playgroud)

c atmega arduino interrupt led

0
推荐指数
1
解决办法
102
查看次数

嵌入式设备是否仍然需要硬件中断(而不是标志)?

一般来说,嵌入式设备上硬件中断的ISR应该非常短:通常只需设置一个标志,该标志将在正常执行过程中(例如在任务循环中)被读取。

这就引出了一个问题:如果是这样,成熟的硬件中断和中断控制的目的是什么?为什么MCU不简单地设置一个标志(在指定的寄存器中,内存映射中),同样可以通过任务循环检查该标志?如果我们要做的只是设置一个标志,为什么还要花费实际转移执行的费用(MCU 电路、执行中断和复杂性)?

背景:我的目标是理解。如果答案是“99% 的情况下,你是对的,但只有 1% 的情况下它会产生影响……”,这将实现我的目标。

hardware embedded cpu interrupt cpu-architecture

0
推荐指数
1
解决办法
183
查看次数

这是关闭线程的好方法吗?

我有一个简短的问题版本:

  1. 我开始这样一个线程:counter.start();,counter一个线程在哪里.
  2. 当我想要停止线程时,我这样做: counter.interrupt()
  3. 在我的帖子中,我会定期进行检查:Thread.interrupted().如果它从线程中给出了truereturn,那么它就会停止.

如果需要,这里有一些细节:

如果您需要更多细节,他们就在这里.从发明调度线程我以这种方式启动一个反线程:

public static void start() {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            showGUI();
            counter.start();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

线程的定义如下:

public static Thread counter = new Thread() {
    public void run() {
        for (int i=4; i>0; i=i-1) {
            updateGUI(i,label);
            try {Thread.sleep(1000);} catch(InterruptedException e) {};
        }
            // The time for the partner selection is over.
        SwingUtilities.invokeLater(new Runnable() {
                public void run() {    
                frame.remove(partnerSelectionPanel);
                frame.add(selectionFinishedPanel);
                frame.invalidate();
                frame.validate(); …
Run Code Online (Sandbox Code Playgroud)

java multithreading interrupt

-1
推荐指数
1
解决办法
449
查看次数

检测Go例程中断

有没有办法检测 go 例程在执行时是否被中断?我想要类似于InterruptedExceptionJava的东西: https ://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html

concurrency interrupt go interrupted-exception goroutine

-1
推荐指数
1
解决办法
757
查看次数

如何使用 Turbo C++ 并行运行两种功能,一种用于键盘,一种用于鼠标?

我正在尝试使用 Turbo-C++ 同时获得鼠标和键盘输入。

我想使用两个函数。第一个函数是main可以接受键盘输入或调用该delay函数dos.h以暂时停止main().

第二个函数处理鼠标输入:

void mouse()
 {
    union REGS in,out;
    in.x.ax=1; // Show mouse pointer
    int86(0x33,&in,&out); //interrupt call
    while(1)
     {
       //print the location whenever it changes (not required)
     }
 }
Run Code Online (Sandbox Code Playgroud)

c++ interrupt turbo-c++ low-level

-1
推荐指数
1
解决办法
155
查看次数

谁负责定义/设计计算机的中断?

我练习汇编已经有一段时间了,我在 YouTube 上看到了一个教你如何制作引导加载程序的视频。在观看视频时,我的脑海中出现了“int”是什么的问题。开始搜索,发现是interrupt的缩写。我想到了“什么是中断?”。我再次搜索并开始了解。但是,我很好奇中断是如何产生的,它们是如何产生的?...制造商会自己产生中断吗?或者是什么?

assembly interrupt bios firmware x86-16

-1
推荐指数
1
解决办法
58
查看次数

如何使用DOS中断将寄存器值传输到并行端口?

我必须了解我的工作的一个小概念.我必须使用8086使用汇编语言中的DOS中断将存储在寄存器中的值传送到并行端口.以下是需要澄清的微小代码.

[org 0x0100]
mov AL, 01001011      ;any value in AL register that is to be transmitted
(...here...how to transmit it to parallel ports using DOS Interrupt?)
Run Code Online (Sandbox Code Playgroud)

x86 assembly dos interrupt x86-16

-2
推荐指数
1
解决办法
139
查看次数