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 , TM4C123FE6PM , TM4C123FH6PM , TM4C123GE6PM , TM4C123GE6PZ , TM4C123GH6PGE , TM4C123GH6PM , TM4C123GH6PZ , TM4C123GH6ZXR , TM4C1290NCPDT , TM4C1290NCZAD , TM4C1292NCPDT , TM4C1292NCZAD , TM4C1294KCPDT , TM4C1294NCPDT , TM4C1294NCZAD , TM4C1297NCZAD , TM4C1299KCZAD , TM4C1299NCZAD , TM4C129CNCPDT , TM4C129CNCZAD , TM4C129DNCPDT , TM4C129DNCZAD , TM4C129EKCPDT , TM4C129ENCPDT , TM4C129ENCZAD , TM4C129LNCZAD , TM4C129XKCZAD , TM4C129XNCZAD

 

  1.   请先阅读
    1.     关于本手册
    2.     术语表
    3.     德州仪器 (TI) 提供的相关文档
    4.     支持资源
    5.     商标
  2. 1TivaWare SDK 简介
    1. 1.1 TivaWare SDK 文件夹细目分类
  3. 2TivaWare 示例工程
    1. 2.1 TivaWare 开发板示例
    2. 2.2 TivaWare 外设示例
    3. 2.3 如何将示例工程导入 CCS
  4. 3在 Code Composer Studio 中将文件和库关联到 TivaWare 工程中
    1. 3.1 在 CCS 中链接文件
    2. 3.2 在 CCS 中链接库
  5. 4如何调试 TivaWare 库
    1. 4.1 如何引导 Code Composer Studio 找到源文件
    2. 4.2 如何重新构建 TivaWare 库
  6. 5如何将 TivaWare 添加到现有 CCS 工程中
    1. 5.1 路径变量
    2. 5.2 包含路径
    3. 5.3 预定义变量
    4. 5.4 库链接
  7. 6TivaWare 引导加载程序
    1. 6.1 在 Code Composer Studio 中修改要用于引导加载的 TivaWare 工程
    2. 6.2 如何使用 LM 闪存编程器引导加载
  8. 7软件最佳做法
    1. 7.1 栈/堆设置和栈溢出
    2. 7.2 中断服务例程
      1. 7.2.1 最佳做法
      2. 7.2.2 TivaWare 矢量表和 IntDefaultHandler
    3. 7.3 TivaWare 硬件头文件
    4. 7.4 ROM 和 MAP TivaWare 前缀
  9. 8TM4C 资源
  10. 9修订历史记录

最佳做法

顾名思义,中断服务例程将中断程序当前执行的操作,以执行例程内的代码。在最简单的程序中,无论 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,以便弄清楚正在执行哪个分支。