精华内容
下载资源
问答
  • 中断程序的执行顺序
    千次阅读
    2021-01-05 19:54:45

    单级中断系统中,中断服务程序执行顺序:
    ①保护现场
    ②中断事件处理
    ③恢复现场
    ④开中断
    ⑤中断返回

    更多相关内容
  • GDB实现程序中断

    千次阅读 2021-05-19 17:41:08
    中断调试是为了让程序运行时停在某一个或多个点上,然后...为了帮助我们找出代码中存在的问题,例如程序中使用了空指针,编译的阶段不会出现错误,程序执行的时候会报段错误的提示信息,而且还不会告诉我们错误出...

    中断调试是为了让程序运行时停在某一个或多个点上,然后进行调试操作,也就是分步调试程序。

    为什么要分步调试程序呢?具体可以归结为两个原因:

    为了方便我们获取程序运行时的各个阶段的信息。通过这些信息,可以分析出程序中表达式的变化,程序的运行方式以及各部分的执行顺序。

    为了帮助我们找出代码中存在的问题,例如程序中使用了空指针,编译的阶段不会出现错误,程序执行的时候会报段错误的提示信息,而且还不会告诉我们错误出现的具体位置。

    中断程序

    在 GDB 中有很多的方法可以让程序产生中断,例如信号,断点或者是一个 GDB 的命令,然而最常见的方式就是设置断点。当程序执行到某个断点时,我们可以在该处执行一些调试的相关操作来获取信息,例如可以打印或者改变某个具体参数的值,设置一个新的断点或是删除一个断点,操作结束后程序继续执行。

    设置断点

    设置断点是让程序产生中断的最常用的方法,对于每个断点来说,还可以通过加上相应的控制条件来决定程序是否会继续处于中断的状态。GDB 中设置断点使用的是 break 命令。下面是 break 命令常用的一些格式。

    1.在给定的位置设置断点,使用方式:

    break

    location 可以是函数名,行号或者是一个指令的地址,实例:

    (gdb) break func()

    (gdb) break 16

    (gdb) break 0x12345

    2.在不带参数的情况下,break 命令在下一条指令里设置断点,使用方式:

    break

    3.设置条件断点,使用方式:

    break <...> if

    每次断点到达时计算 condition,当且仅当表达式为真的时候会产生中断。<...>表示的是指定产生中断的位置(断点的位置),condition为条件表达式。实例:

    (gdb) break 16 if i == 3

    当程序中变量 i 的值等于 3 的时候,在第 16 行会中断程序。

    break命令的变形格式

    break 存在几种特殊的变形格式,都可以实现设置断点的作用,相关的使用如下。

    1.设置一个只中断一次的断点,使用方式:

    tbreak

    tbreak 和 break 里面的参数是一样的,断点的设置也是一样的。但是断点会在第一次执行后自动删除。

    2.设置硬件辅助断点,使用方式:

    hbreak

    hbreak 和 break 里面的参数是一样的,断点的设置也是一样的。但是断点需要硬件支持,某些硬件可能不支持此功能。其主要用途是 EPROM / ROM 代码调试,因此我们可以在不更改指令的情况下在指令处设置断点。

    3.设置仅在一次停止时启用的硬件辅助断点,使用方式:

    thbreak

    thbreak 和 break 里面的参数是一样的,断点的设置也是一样的。但是 thbreak 与 tbreak 命令一样,断点会在程序第一次停止后自动删除。此外,thbreak 与 hbreak 命令一样,断点需要硬件支持,而某些目标硬件可能不支持。

    4.在与正则表达式匹配的所有函数上设置断点 ,使用方式:

    rbreak

    regex 表示一个正则表达式,这条命令表示在所有符合 regex 匹配的项上设置无条件断点,并且打印设置的所有断点的列表。设置断点后,它们将被视为与使用 break 命令设置的断点一样,可以删除它们,禁用它们或者以与任何其他断点相同的方式使它们成为条件。

    设置捕捉点

    捕捉点是一种特殊类型的断点,用来在设置在某些事件发生时中断程序,使用方式:

    catch

    event 表示程序中发生的事件,当 catch 捕捉到被设置的事件发生,就会中断程序。可以包含以下几种表示形式:

    throw:C++抛出的异常。

    catch:C++捕捉到的异常。

    exec:exec 函数被调用时。

    fork:fork 函数被调用。

    vfork:vfork 函数被调用。

    load:加载动态库。

    unload:卸载动态库。

    设置监视点

    监视点也是一种特殊的断点,我们可以对一些表达式实行监视,当表达式的值发生改变就会中断程序。使用方式:

    (r/a)watch

    condition表示为表达式,表达式可以是一个变量的值或者是由操作符绑定的一个或多个变量。当 被访问、改变时中断程序运行,其中 r 表示访问的时候中断程序,a 表示的是访问或者改变的时候中断程序。

    中断调试程序

    为了方便对程序的综合调试(包含设置断点,设置监视点,设置捕捉点),这次调试的对象为 C++ 的程序,参数通过命令行传递。

    #include

    #include

    using namespace std;

    double dev(int a,int b)

    {

    if(b == 0)

    {

    throw "this is not can";

    }

    return a / b;

    }

    int main(int argc,char *argv[])

    {

    int arr[2] = {};

    arr[0] = atoi(argv[1]);

    arr[1] = atoi(argv[2]);

    double z = 0;

    try

    {

    z = dev(arr[0],arr[1]);

    }catch(const char *msg)

    {

    cerr<

    }

    return 0;

    }

    编译文件:

    g++ -g test.cpp -o test

    进入gdb命令行调试文件:

    gdb test

    相关的调试操作如下:

    (gdb) break dev(int, int)            //设置函数名断点

    Breakpoint 1 at 0xc08: file test.cpp, line 7.

    (gdb) break 18                   //设置行号断点

    Breakpoint 2 at 0xc80: file test.cpp, line 18.

    (gdb) catch throw                 //设置捕获点断点

    Catchpoint 3 (throw)

    (gdb) info breakpoints             //显示断点信息

    Num     Type           Disp Enb Address            What

    1       breakpoint     keep y   0x0000000000000c08 in dev(int, int)

    at test.cpp:7

    2       breakpoint     keep y   0x0000000000000c80 in main at test.cpp:18

    3       breakpoint     keep y   0x0000000000000ac0 exception throw

    (gdb) run 10 0                   //通过命令行参数传递

    Starting program: /home/wjc/hsxy/lianxi/10/test/a.out 10 0

    Breakpoint 2, main (argc=0, argv=0x7ffff7de59a0 <_dl_fini>) at test.cpp:18

    18            arr[1] = atoi(argv[2]);                //第一个断点程序中断

    (gdb) p a

    $1 = {i = {0, 1045149306}, d = 1.2904777690891933e-08}

    (gdb) p b

    $2 = {i = {0, 1068498944}, d = 0.0625}

    (gdb) continue

    Continuing.

    Breakpoint 1, dev (a=10, b=0) at test.cpp:7

    7               if(b == 0)                       //第二个断点程序中断

    (gdb) p a                               //打印变量的值

    $3 = 10

    (gdb) p b

    $4 = 0

    (gdb) continue

    Continuing.

    Catchpoint 3 (exception thrown), 0x00007ffff7adeced in __cxa_throw ()

    from /usr/lib/x86_64-linux-gnu/libstdc++.so.6       //捕获抛出异常

    (gdb) continue

    Continuing.

    this is not can                                //运行结果显示

    [Inferior 1 (process 5014) exited normally]

    注意:通常 GDB 提供的消息可以显示程序大量的状态,我们也可以使用命令打印显示请求的信息,命令为“ info program”。显示的信息主要包括:程序是否在执行的状态,是什么进程,以及为什么会产生中断。

    展开全文
  • STM32并不是如手册所言,绝大部都是耐5V电压的,具体的要参考数据手册——我就是轻信了网络上话,犯错误了。STM32(Cortex-M3)中有两个优先级的概念——抢占式...关于如何在Keil 中观察程序执行时间,方法有二种。
  • CPU正在处理某个事件,突然另外一个事件需要处理,于是进入中断后,而你不想将现在执行的程序的各寄存器状态入栈,那么可以把这个中断程序放入另一个寄存器组,如切换到1组,然后退出中断时,再切回到0组(原来的...
  • 单片机的中断就是类似的一个过程,发生中断时,就会打断正在执行的主程序,先处理完中断任务,返回主程序继续运行,当然在执行中断函数之前,单片机需要把关键的数据保存下来,中断函数执行完成后才可以正确的恢...

    描述

    中断用于执行优先级更高的任务

    中断顾名思义是“中途打断”的意思。举一个简单的例子:您正在和部门的同事在开会,突然老板进来找你,你就得暂停会议,离开会议室,跟老板谈完重要的事情,再重新回来会议室继续会议。单片机的中断就是类似的一个过程,发生中断时,就会打断正在执行的主程序,先处理完中断任务,返回主程序继续运行,当然在执行中断函数之前,单片机需要把关键的数据保存下来,中断函数执行完成后才可以正确的恢复主函数运行。

    b52f4f5236a9999e63ff06c1075c51ae.png

    单片机的主程序是怎么运行的?

    其实单片机的主程序其实是一个主函数,我们一般命名为Main,主函数会从上住下运行的,执行到最后又返回上面继续运行。我们用C语言编写Main主函数时,会用到while(1)让主程序不断的循环。

    0dc96238a96c55d7c9bcc94053daf399.png

    由此可见,主程序里的各种功能是按着顺序来执行的,谁也不能插队。那怎么样来实现中途打断插队呢?这就需要用到中断了。

    单片机的中断程序是怎么执行的?

    单片机有着各种和样的中断功能,比如定时器中断、外部中断、串口中断等等。比如我们要实时检测一个按键的按下事件,如果在主程序中进行扫描,就会有一定的延时,需要等主程序运行到按键扫描的程序时才可以检测到按键的状态。

    中断是单片机一个重要的功能,单片机会给所有中断功能分配一个中断向量(有些中断功能会共用一个中断向量)。当开启了相应的中断功能并且发生中断时,就会自动跳转到对应的中断向量运行。在中断向量处,我们就可以调用我们编写好的中断函数,处理相关的事件就可以了。如果开启了中断嵌套,在中断函数执行过程发生优先级更高的中断,还可以暂停正在运行的中断函数,去执行更高级别的中断程序。

    40418ac61aee1d24221cb82c977444af.png

    中断函数为什么不在主函数中运行?

    主函数是一个函数,中断函数也是一个函数,它们是独立的函数,所以是分开的。上面已经说得很清楚了,中断是打断正在运行的函数去执行优先级更高的函数,所以中断就是打断主函数去执行更高优先级别的中断函数的一个过程。

    在发生中断时,单片机会自动跳转到对应的中断向量,在中断向量处,我们需要调用中断函数来处理中断事件,如果中断事件的处理程序放在主函数中,那么这些处理中断事件的程序就不是一个独立的函数了,就没法调用了。

    de476d7cd1be2d2f13d4ee16a754f544.png

    打开APP阅读更多精彩内容

    点击阅读全文

    展开全文
  • Arduino 中断程序运行及注意事项

    千次阅读 2021-05-27 16:56:23
    使用attachInterrupt()函数,利用Arduino的引脚触发中断程序。arduino不是所有引脚都能实现中断,具体要求见下表: Arduino控制板 支持中断的引脚 Uno, Nano, Mini 2, 3 Mega, Mega2560, MegaADK 2, 3, 18...

    使用attachInterrupt()函数,利用Arduino的引脚触发中断程序。arduino不是所有引脚都能实现中断,具体要求见下表:

    Arduino控制板支持中断的引脚
    Uno, Nano, Mini2, 3
    Mega, Mega2560, MegaADK2, 3, 18, 19, 20, 21
    Micro, Leonardo0, 1, 2, 3, 7
    Zero除4号引脚以外的所有数字引脚
    MKR1000 Rev.10, 1, 4, 5, 6, 7, 8, 9, A1, A2
    Due所有数字引脚

    语法

    attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);
    

    参数

    pin: 中断引脚号
    ISR: 中断服务程序名
    mode:中断模式

    中断模式(mode):

    LOW: 当引脚为低电平时触发中断服务程序
    CHANGE: 当引脚电平发生变化时触发中断服务程序
    RISING: 当引脚电平由低电平变为高电平时触发中断服务程序
    FALLING: 当引脚电平由高电平变为低电平时触发中断服务程序

    注意事项:

    • 中断函数不能有任何参数,也没有任何返回值。
    • 通常ISR需要越短小精悍越好!每次Arduino只能运行一个ISR函数,其它ISR函数只有在当前的ISR函数执行结束以后,才能按照其优先级别顺序执行。
    • millis()函数的运行依赖Arduino开发板的中断功能,因此ISR函数中的millis()函数是无法正常运行的。micros() 也是类似的情况,不能使用delay()函数和millis()函数。 delayMicroseconds() 不需要任何计数器就可以运行,所以delayMicroseconds() 运行是不会受到影响的。
    • 一般情况下,ISR函数与主程序之间传递数据是依靠全局变量来实现的。为了确保全局变量在ISR函数中可以正常的工作,应该将可能被ISR函数中使用的全局变量声明为volatile类型。
    展开全文
  • 在PLC执行当前程序时,由于系统出现了某种需要处理的紧急情况,(比如定时中断10ms进行脉冲计数,只要中断时间一到,我们就去查看10ms里累积的脉冲量,我们对这个时间片的间隔是有严格要求的,不能等主程序执行完,...
  • 嵌入式开发之中断服务程序

    千次阅读 2021-07-10 11:33:05
    使用中断时,哪些处理在中断服务程序执行,哪些处理在应用程序执行中断服务程序怎样与应用程序通信? 软件与外设的交互,基本有两种模式:轮询和中断。轮询是由软件定时地查询外设的各种寄存器,检查该外设...
  • 回顾 《程序如何在cpu中运行的》 举例了几个例子 我们回顾一下 1 顺序执行时 pc指针存放在函数里 PC指针存放的是下一个地址的指令,pc指针寄存器这样的功能 会让程序有序执行. 2 条件分支:当前的 和存放的下一个...
  • c语言中的中断函数注意事项单片机_C语言函数_中断函数(中断服务程序)在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统。中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该知道),我们在...
  • 51单片机中断系统程序实例 (STC89C52RC)51单片机有了中断,在程序设计中就可以做到,在做某件事的过程中,停下来先去响应中断,做别的事情,做好别的事情再继续原来的事情。中断优先级是可以给要做的事情排序。...
  • 关于程序中断函数的理解
  • 展开全部中断程序是在中断事件发生时调用,程序也不知道什62616964757a686964616fe59b9ee7ad9431333365643536么时候有中断事件发生。子程序是在需要的时候调用,在程序里可以预见它的使用。因为中断是由系统调用的,...
  • 对python捕获ctrl+c手工中断程序的两种方法详解日常编写调试运行程序过程中,难免需要手动停止,以下两种方法可以捕获ctrl+c立即停止程序1、使用python的异常KeyboardInterrupttry:while 1:passexcept ...
  • 中断是一个过程,当中央处理器CPU在处理某件事情时,外部又发生了另一紧急事件,请求CPU...最后通过仿真器输入程序,手动中断中断结束后,程序从断点处继续执行中断的应用具有重要的意义,它大大提高了计算机效率。
  • 输入输出系统实现主机与I/O设备之间的数据传送,可以采取程序查询方式、程序终端方式、DMA方式,在程序中断方式中,中断处理优先级与中断响应次序这两个概念容易混淆。 1、 中断响应次序是指当多个中断源同时向CPU...
  • DSP/BIOS程序启动顺序

    2020-08-02 21:34:37
    下面给大家介绍一下DSP/BIOS程序的启动顺序
  • 顺序与分支汇编语言程序设计实验
  • 第八章子程序中断调用.ppt

    千次阅读 2021-05-26 00:33:44
    第八章子程序与中断调用8.3 子程序与主程序间...主程序用CALL指令调用子程序,子程序执行完后用RET指令返回到主程序的CALL指令的下一条指令; 2.主程序有段内调用(NEAR)和段间调用(FAR),子程序返回对应有段内返回和段...
  • 中断优先级

    千次阅读 2021-07-25 04:32:43
    为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程度,硬件将中断源分为若干个级别,称作中断优先级。在实际系统中,常常遇到多个中断源同时请求中断的情况,这时CPU必须确定首先为哪...
  • 过程中如果符合某条规则将会进行处理,处理动作除了ACCEPT、REJECT、DROP、REDIRECT和MASQUERADE以外,还多出 LOG、ULOG等,其中某些处理动作不会中断过滤程序,某些处理动作则会中断同一规则炼的过滤,并依照前述...
  • 场景:某前端界面在加入alert之后,程序能正常运行,而注释掉后竟然程序无法正常运行了。 原因:第一,注意JS前端的加载顺序。为何alert能让程序正常?是因为没注意加载顺序,而alert有终止程序的作用,从而给了...
  • 实际上这句话还可以这么理解:无论是用户程序还是内核程序,其运行的目的都是为了帮助一个实际的用户去完成某些具体的任务,在这个过程中,用户程序他的指令集可以说是不完整的,因为他不可以直接使用某
  • 上期我们已经学习了将程序放在地址空间中,并在向量表中显示保存位置的内容。本期将介绍在执行程序及产生中断时CPU内会...引导程序运行程序计数器一般来说,程序就是计算机将所要进行的处理按顺序排列的指令集。
  • 如要使中断优先级依次循环到IR6为最低 优先级即优先级优先级顺序为IR7 IR0 IR1 IR2 IR3 IR4 IR5 IR6,则需送命 令码11100110到端口20H 中断嵌套是指正在运行中断处理程序又被其它 中断中断 中断嵌套 从中断的响应...
  • 单片机里面有很多中断资源,例如外部中断、定时器中断、串口中断等,这些中断资源应当用于处理相应的紧急事件,而不是顺序执行的常规事件,所以在编写中断程序的时候应当十分注意。 具体的事务处理语句不应放在...
  • 我理解为:ab都属于保护现场,只是a是在中断周期执行的,对吗? (类似于“MAR,MDR功能属于主存,却制作在CPU里。” 这种理解对吗?) 2、向量地址-&amp;gt;PC与关中断 顺序? 在图里,向量地址-&amp;g...
  • 中断在操作系统中有着重要地位,它是多道程序得以实现的基础,没有中断就没有多道程序,因此进程之间的切换是通过中断来完成的。此外,为了提高处理机的利用率和实现CPU与I/O设备的并行执行,也必须要有中断的支持。...
  • zynq添加GPIO中断程序

    千次阅读 2018-08-10 15:53:12
    二、修改驱动,添加中断程序: 1.打开内核目录下./drivers/gpio/gpio-zynq.c GPIO驱动文件。 2.找到驱动探测函数static int zynq_gpio_probe(struct platform_device *pdev)添加代码。 在zynq_gpio_probe函数内添加...
  • 内核的执行体 -- 中断

    2020-07-29 14:38:52
    中断是Linux内核里面区别于进程的另一类执行体,他们比进程具有更高的优先级,能在进程的执行期间中断他并进入自己的中断处理函数,进行中断服务。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 212,010
精华内容 84,804
关键字:

中断程序的执行顺序

友情链接: ofdm_4.zip