• 426查看
  • 0回复

[芯片硬件] 利用TIMER事件和栈帧体验中断响应

[复制链接]


该用户从未签到

发表于 5-5-2024 19:47:08 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


利用TIMER事件和栈帧体验中断响应w1.jpg

目前STM32芯片都是基于各种ARM Cortex-M内核的芯片,支持可编程中断优先级。支持中断抢占的同时,还中断响应的晚到和咬尾机制。中断抢占不难理解,就是某中断在运行时产生了另外的更高优先级的中断事件,低优先级的中断服务程序被暂停而去执行优先级更高的中断服务程序【后面中断服务程序用ISR表示】。所谓晚到机制,就是中断响应还在压栈阶段但没有正式进入ISR时又来了更高优先级的中断请求,等压栈操作完成后,则立刻执行高优先级的ISR,此时高优先级中断省去压栈操作,它执行完后再返回执行刚才申请压栈的低优先级ISR。而咬尾机制则是指某ISR正在执行过程中产生了新的不高于当前中断优先级的中断事件,一直等到当前中断ISR执行完毕,在退栈之前立即响应处于等待执行的ISR,此时该中断也无须再做压栈。不难理解,不论晚到机制还是咬尾机制都是为了提高中断响应速度,提高芯片性能。

下面是三幅分别代表中断抢占、中断晚到、中断咬尾的示意图。【注:从时间上讲,虽然发生中断晚到、中断咬尾可以显著节省时间,但也不等于从中断申请到进入ISR完全不要时间,下面图中没有体现出来。】

利用TIMER事件和栈帧体验中断响应w2.jpg

利用TIMER事件和栈帧体验中断响应w3.jpg

利用TIMER事件和栈帧体验中断响应w4.jpg

对于这几个中断响应的概念,我们是否可以比较直观地感受下呢?

或许有人想过一些诸如时间记录、波形输出等方法来感受之。这里,我想从中断响应先后顺序加上栈帧内容变化来体会中断抢占、中断晚到和中断咬尾。

对于Cortex M系列芯片【这里暂时将M33除外,我不知这个地方加上Security是否有很大差异。印象中只是有两套而已】,发生中断需要压栈的话,压栈内容根据是否启用浮点存储来进行。

利用TIMER事件和栈帧体验中断响应w5.jpg

上图表述了两种压栈格式。这里我们只关注右边的压栈格式,后面试验不使用浮点存储。

我这里借助Cortex-M4内核的STM32G4芯片的TIM1/TIM2的更新中断来完成试验。二者建立主从同步启动关系,TIM1的抢占优先级高于TIM2的,均工作在单脉冲模式,即每次启动后都能且只能产生1次更新中断。通过给二者设置相应的溢出时间参数,来模拟实现上面的三种情形。我们从中关注栈帧和个别特定寄存器的内容。【注:本试验过程中仅开启了TIM1/TIM2更新事件中断,再无其它。】

利用TIMER事件和栈帧体验中断响应w6.jpg

利用TIMER事件和栈帧体验中断响应w7.jpg

对于发生抢占情形,我们通过在代码里设置断点,一方面可以看到2个中断的响应先后,另一方面可以看到因抢占动作导致栈帧内容的变动。

对于晚到情形和晚到情形,同样也会通过在代码里设置断点查看中断执行先后顺序。

对于晚到情形,申请压栈的是低优先级中断事件,先得到执行的则是高优先级中断,同时会发现虽然响应了2次中断,却只看到1次压栈,两次ISR运行时维持同一栈内容。对于咬尾情形在栈帧内容变化上跟晚到情形类似,但实现机理不同,它申请压栈的是高优先级或同级中断事件,做咬尾操作的是低优先级或晚发生中断请求的同级中断。

先介绍两个跟中断返回有关的寄存器LR(R14)和EXC_RETURN。纠正下,EXC_RETURN不是寄存器,是微处理器动态生成的跟中断返回有关的一个值。这个值有点神秘,也很重要。神秘的就是这个值怎么产生的、放在哪里的,似乎在ARM相关手册找不到具体说明。另外,这个值本身很特别,大大区别于通用程序运行地址。如果程序里不启用浮点存储,它的值可能是下面三个。

利用TIMER事件和栈帧体验中断响应w8.jpg

这里我们重点关注图中的前2个,后面试验过程中会见到这两个值。结合图中信息,如果该值等于0xfffffff1,ISR执行完毕后要返回Handle Mode和Main Stack,极大可能地发生了中断嵌套;如果该值等于0xfffffff9,ISR执行完毕后要返回Thread Mode和Main Stack,意味着当前中断是在线程中产生的,不用OS的话,即Main程序被打断。

它很重要,中断返回得仰仗它。没有它,中断返回可能就乱套了。

每当中断压栈申请完成后,这个EXC_RETURN值就被硬件根据中断发生时CPU运行状态、运行模式、所用栈帧模式给生成好了,并在开始运行ISR之前将该值主动赋给LR寄存器。硬件在ISR执行完毕即将退栈返回时又自动将LR的内容提供给PC寄存器。当PC寄存器发现这个特殊的值后会不会一脸懵逼,啥玩意?地址不像地址。我们可以把这个值理解成中断返回告知书,并非程序地址。EXC_RETURN值通过LR寄存器做中间人传达给PC,主要传达下面几个信息:

1、恭喜我们完美地处理了刚才的突发事件,要归队返回了;

2、我们清楚刚才处理事情时的状态和待遇,但更要清楚返回后的状态、模式,不得以刚才的模式或状态来套返回后的模式或状态,不能因出了趟差就不知回家后的姿态和责任;

3、记住上面提到的,具体返回路线会专人提供【即之前压栈的PC值经出栈提供】;

戏说下,知道大意即可,更多细节可以查看相关手册。退一步讲,个中细节我们旁人也真的难以知晓。

铺垫性的话题就聊到这里。下面具体看看针对中断抢占、中断晚到、中断咬尾的试验。

先看中断抢占的情形。下面截图是有关TIM1/TIM2时基参数的配置。

利用TIMER事件和栈帧体验中断响应w9.jpg

在前面提到的固定配置前提下,我将TIM2溢出周期比TIM1少21个脉冲【这个地方不是固定的,14~24应该都可以,具体自行验证】,二者同步启动。这样配置的目的就是确保TIM2一定是先进中断但又不至于它执行完毕了TIM1中断还没来,否则就没法看到抢占情形了。下图是TIM2首先进入中断时的情形:

利用TIMER事件和栈帧体验中断响应w10.jpg

从上图可以看出,TIM2首先进入中断,栈帧有新内容放入。LR寄存器为0xfffffff9,表示当前中断ISR是从线程模式下发生的,这里就是main程序被打断了。

下图是TIM1中断抢占TIM2中断的情形。

利用TIMER事件和栈帧体验中断响应w11.jpg

从上图中,明显看到栈帧内容再次被添加了8个字的内容,内容变多。我们还可以从LR寄存器的内容看出,结尾是F1,说明当前中断是抢占了其它低优先级中断,即发生了中断嵌套,它执行完后返回的还是handle模式,这跟它抢占了TIM2 ISR相吻合。

下图是TIM1 ISR执行完毕CPU再回来执行刚才被打断的TIM2ISR情形。

利用TIMER事件和栈帧体验中断响应w12.jpg

从上图可以看出,TIM1中断抢占TIM2中断并完成ISR后,在返回TIM2 ISR之前还做了出栈操作。在当前TIM2 ISR里可以看到栈帧恢复到TIM2中断刚被响应时的情形,内容变少了。同样,我们可以发现LR寄存器内容也恢复到刚被响应时的值。

显然,发生抢占时除了看到ISR执行的顺序外,明显地看到栈帧内容的变化。

接着看看中断晚到的情形。先看TIM1/TIM2基本时基配置。

利用TIMER事件和栈帧体验中断响应w13.jpg

这样配置的目的,就是让优先级低的TIM2提前一点点发生中断,让它在申请压栈完成附近发生TIM1中断,TIM2 ISR并不能立即执行反而是TIM1抢先【不是抢占】执行ISR,之后再来运行TIM2 ISR。整个过程,只发生1次压栈、出栈操作。TIM1中断事件虽然晚发生,由于其高优先级和卡着点发生而抢先执行其ISR。

开始运行程序后,TIM1 ISR首先得到响应。【参加图中备注说明】

利用TIMER事件和栈帧体验中断响应w14.jpg

下图是TIM2 ISR得到执行的情形:

利用TIMER事件和栈帧体验中断响应w15.jpg

TIM1中断执行完毕后,回头来继续执行TIM2 ISR时,栈帧内容无变化。两次中断得到执行,只看到1次压栈操作。执行顺序靠TIMER时间参数保证TIM2的中断事件先发生并由其申请压栈, TIM1事件虽晚到却因高优先级而被优先执行其ISR。

最后来看看中断咬尾的情形。TIM1/TIM2时基参数配置如下:

利用TIMER事件和栈帧体验中断响应w16.jpg

二者设置的时基参数一样,上面TIM1的溢出周期减个1不是必须的,这里主要是为了确保TIM1中断事件不要晚于TIM2的即可,因为TIM1优先级高。二者同时申请中断,自然先响应TIM1的。

下图是TIM1 中断首先得到响应的情形:

利用TIMER事件和栈帧体验中断响应w17.jpg

下图是TIM1 ISR执行完后运行TIM2 ISR的情形:

利用TIMER事件和栈帧体验中断响应w18.jpg

TIM2 ISR基于TIM1申请压栈并完成ISR后接着执行,也省去了压栈过程,完成2次中断只见1次压栈。从栈帧内容结果上看,中断晚到和中断咬尾很类似。不过,中断晚到情形下,申请压栈的是低优先级的中断事件,而咬尾中断情形下,申请压栈的是高优先级或者是先申请压栈的同级中断事件。比方以现在讨论的中断咬尾情形为例,如果把TIM1/TIM2的抢占优先级设置一样,TIM2溢出时间参数稍微调短点,这时玩咬尾动作的就是TIM1中断了,因为二者优先级一样,TIM2先产生溢出中断自然先响应它的,TIM1的中断则等它执行完ISR基于咬尾机制而得以执行。

不难看出,基于晚到机制和咬尾机制而得以执行中断的行为不属于中断抢占。顺便提醒下,如果通过上面方式体验中断响应的话,测试代码尽量简单,尤其中断服务程序,否则若栈帧里压入太多其它信息,观察分析起来可能就不太方便了。

好,今天的分享就聊到这里。




该用户从未签到

发表于 11-3-2025 19:57:01 | 显示全部楼层
针对您提到的TIMER事件和栈帧体验中断响应,在STM32芯片中,利用ARM Cortex-M内核的中断管理功能,我们可以高效地处理多种中断请求。当中断抢占发生时,高优先级的中断会打断正在执行的低优先级中断,直接进入其ISR执行。若此时发生晚到机制,高优先级ISR会优先执行,而低优先级ISR会在高优先级ISR执行完毕后继续执行。咬尾机制则确保中断的连贯性,避免因嵌套中断导致的执行混乱。在实际应用中,工程师需深入理解这些机制,以优化中断处理流程,提高系统性能。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报



该用户从未签到

 楼主| 发表于 11-3-2025 19:57:01 | 显示全部楼层
针对您提到的TIMER事件和栈帧体验中断响应,在STM32芯片中,利用ARM Cortex-M内核的特性和机制,我们可以高效处理中断抢占、晚到机制和咬尾机制。当发生TIMER事件时,系统会依据中断优先级进行响应。若低优先级中断被高优先级中断抢占,待高优先级ISR执行完毕后,系统会自动返回执行低优先级的ISR,这就是所谓的咬尾机制。在此过程中,系统利用栈帧保存现场信息,确保程序执行流程的完整性和准确性。这些机制保证了系统的高效运行和实时响应能力,提升整体性能和用户体验。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 11-3-2025 19:57:01 | 显示全部楼层
针对您提到的TIMER事件和栈帧体验中断响应,在STM32芯片中,基于ARM Cortex-M内核,中断响应具有独特机制。当发生TIMER事件或其他中断源时,系统会根据中断优先级进行响应。若高优先级中断在压栈阶段发生,则会跳过压栈直接进入高优先级ISR执行。咬尾机制则指在某ISR执行过程中,若有更高优先级中断请求,待当前ISR执行完毕后再响应更高优先级中断。这种设计确保了系统实时性和响应速度,保证了在高强度多任务环境下系统的稳定性和可靠性。在实际应用中,开发者需深入理解这些机制并合理利用,确保程序的正确执行和系统的稳定运行。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 11-3-2025 19:57:01 | 显示全部楼层
关于TIMER事件和栈帧体验中断响应:

在汽车工程中,针对STM32芯片,利用ARM Cortex-M内核的中断管理机制,我们可以有效应对多种实时性要求较高的场景。其中,中断抢占、晚到机制和咬尾机制是非常重要的技术点。对于中断抢占,当有更高优先级的中断产生时,正在处理的中断会被暂停,转而执行优先级更高的中断服务程序。晚到机制指在中断响应尚未完全进入ISR阶段时,若发生更高优先级中断请求,待当前压栈操作完成后,直接执行高优先级ISR。咬尾机制则是指当ISR正在执行时,若有相同优先级或更低优先级的中断请求,当前ISR执行完毕后会自动响应新的中断请求。这些机制确保了中断处理的及时性和准确性。在实际应用中,需要充分理解并合理利用这些机制,确保汽车系统的实时性和稳定性。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 11-3-2025 19:57:01 | 显示全部楼层
针对您提到的TIMER事件和栈帧体验中断响应,在STM32芯片中,利用ARM Cortex-M内核的特性和优势,可实现高效的中断管理。当中断抢占发生时,高优先级的中断会打断当前执行的低优先级中断,完成其处理后返回继续执行原先的中断服务程序。若晚到机制发生,新启动的高优先级中断会直接跳过压栈过程,优先执行其ISR。咬尾机制则是指当高优先级ISR正在执行时,如果有更低优先级的中断请求到来,这些请求会被暂存处理。在实际应用中,为确保系统的实时性和稳定性,应充分了解并合理利用这些机制,确保中断响应的准确性和及时性。针对具体项目或应用,还需进行详细的测试和优化。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 11-3-2025 19:57:01 | 显示全部楼层
关于利用TIMER事件和栈帧体验中断响应问题:针对STM32芯片,其基于ARM Cortex-M内核的特性使得中断处理非常灵活和高效。当发生TIMER事件或其他中断源时,中断控制器会根据优先级抢占执行。若低优先级中断在运行时遇到更高优先级中断请求,其服务程序会被暂停,转而执行高优先级的中断服务程序。在中断响应过程中,若新的高优先级中断在压栈阶段到来,会跳过压栈直接进入高优先级ISR执行。这就是所谓的晚到机制。咬尾机制则是指当某个ISR正在执行时,如果有相同优先级或更低优先级的中断请求,会等待当前ISR执行完毕后再处理。这些机制确保了实时性和系统稳定性。针对具体应用需求,工程师需熟悉中断处理流程,并优化程序设计以满足性能和安全需求。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 11-3-2025 19:57:01 | 显示全部楼层
针对您提到的TIMER事件和栈帧体验中断响应,在STM32芯片中,这些功能都基于ARM Cortex-M内核实现,为我们提供了丰富的中断处理机制。关于中断抢占、晚到机制和咬尾机制,可以具体这样解释:

中断抢占是指当正在处理某一中断时,若有更高优先级的中断产生,低优先级的中断会被暂停,转而处理高优先级的中断。而晚到机制则是在中断响应还在压栈阶段时,若有更高优先级的中断请求,待当前压栈操作完成后,直接跳转到高优先级的中断服务程序,从而提高了响应速度。咬尾机制则是指当某个ISR正在执行时,如果又有新的中断请求且优先级相同,当前ISR会被暂停,待同优先级的其他ISR执行完毕后再继续执行。

这些机制确保了系统能高效、准确地响应各种中断请求,对于实时性要求较高的应用尤为重要。在实际开发中,工程师需深入理解并合理利用这些机制,以确保系统的稳定性和响应速度。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 11-3-2025 19:57:02 | 显示全部楼层
针对您提到的TIMER事件和栈帧体验中断响应,在STM32芯片中,基于ARM Cortex-M内核的处理器具有优秀的中断处理能力。利用TIMER事件触发中断时,处理器会依据中断优先级进行响应。若发生中断抢占现象,即高优先级中断出现时,正在执行的中断服务程序(ISR)会被暂停,转而执行优先级更高的ISR。

关于晚到机制,当某个中断响应还在压栈阶段而又有更高优先级中断请求时,完成压栈操作后,系统将立即跳转到高优先级ISR执行。而咬尾机制则是指在某些复杂系统中,高优先级ISR执行完毕后可能会“咬尾”执行一些低优先级ISR的剩余操作。在实际应用中,这些机制确保了系统能在多任务环境下稳定、高效地运行。为了更好地体验中断响应,需要利用合适的编程技巧和高效的栈管理策略来优化代码结构和运行效率。

[内容由汽车工程师之家人工智能总结,欢迎免费使用,见贴尾]
回复 支持 反对

使用道具 举报

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 19-8-2025 04:03 , Processed in 0.396342 second(s), 42 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.