ZHCU861A March 2021 – August 2022 TM4C1230C3PM , TM4C1230D5PM , TM4C1230E6PM , TM4C1230H6PM , TM4C1231C3PM , TM4C1231D5PM , TM4C1231D5PZ , TM4C1231E6PM , TM4C1231E6PZ , TM4C1231H6PGE , TM4C1231H6PM , TM4C1231H6PZ , TM4C1232C3PM , TM4C1232D5PM , TM4C1232E6PM , TM4C1232H6PM , TM4C1233C3PM , TM4C1233D5PM , TM4C1233D5PZ , TM4C1233E6PM , TM4C1233E6PZ , TM4C1233H6PGE , TM4C1233H6PM , TM4C1233H6PZ , TM4C1236D5PM , TM4C1236E6PM , TM4C1236H6PM , TM4C1237D5PM , TM4C1237D5PZ , TM4C1237E6PM , TM4C1237E6PZ , TM4C1237H6PGE , TM4C1237H6PM , TM4C1237H6PZ , TM4C123AE6PM , TM4C123AH6PM , TM4C123BE6PM , TM4C123BE6PZ , TM4C123BH6PGE , TM4C123BH6PM , TM4C123BH6PZ , TM4C123BH6ZRB , TM4C123FE6PM , TM4C123FH6PM , TM4C123GE6PM , TM4C123GE6PZ , TM4C123GH6PGE , TM4C123GH6PM , TM4C123GH6PZ , TM4C123GH6ZRB , TM4C123GH6ZXR , TM4C1290NCPDT , TM4C1290NCZAD , TM4C1292NCPDT , TM4C1292NCZAD , TM4C1294KCPDT , TM4C1294NCPDT , TM4C1294NCZAD , TM4C1297NCZAD , TM4C1299KCZAD , TM4C1299NCZAD , TM4C129CNCPDT , TM4C129CNCZAD , TM4C129DNCPDT , TM4C129DNCZAD , TM4C129EKCPDT , TM4C129ENCPDT , TM4C129ENCZAD , TM4C129LNCZAD , TM4C129XKCZAD , TM4C129XNCZAD
顾名思义,中断服务例程将中断程序当前执行的操作,以执行例程内的代码。在最简单的程序中,无论 ISR 是如何编写的,行为通常都是无害的,但是随着程序规模和范围增加,编写高效的 ISR 对于更大程度地缩短中断典型程序执行所需的时间越来越重要。
最好使用 ISR 快速接收和存储数据或获取和发送数据,并/或体现程序其余部分的状态变化。接收或发送数据时,目标应该是处理来自仅触发 ISR 的硬件外设的数据,并使用标志或状态变化来通知主要程序应用数据已经过处理,以便主程序控制该数据在 ISR 外部执行哪些操作。
关于标志和最佳实践,使用 ISR 内部的全局变量作为标志、计数器或任何其他将在 ISR 内部修改的变量时,必须将全局变量声明为 volatile 变量。如果未使用 volatile 关键字,编译器可以确定在 ISR 中未使用该变量,并在 ISR 外部对它进行优化。这样,当 ISR 执行以及程序未正常运行时,可以防止修改变量。使用中断时,全局变量缺少 volatile 声明是常见的编程错误之一,因此在代码审核清单中应始终包含此项。
导致 ISR 问题的主要常见错误包括:在 ISR 中进行数据处理、在 ISR 中运行阻止快速退出的循环或者使用 UARTprintf 等阻塞命令发送数据(在这种情况下,在数据正确发送前,ISR 无法退出)。其中每个错误都会导致 ISR 无法快速执行,并造成影响系统性能的延迟,在每种情况下,都应该在主程序执行中处理这些问题。
如果系统出现异常行为,并怀疑这个问题是 ISR 速度过慢造成的,最简单的方法是使用示波器评估 ISR 的持续时间。通过在进入和退出 ISR 时切换 GPIO,可以评估每次执行 ISR 所用的时间。如果 ISR 有多个分支,可添加附加 GPIO,以便弄清楚正在执行哪个分支。