1

背景:

我正在使用uCOS IIKeil uVision 5和带有TM4C123GH6PM MCU 的 TIVA 板。我得到了一个 uCOS II 的端口以及一个空白项目文件来开始。我编写了所需的任务并且程序正常工作,但现在我对实现中断感兴趣并试图了解它们如何与 RTOS 共存。这一切都在 C中完成。

问题:

中断不起作用;他们根本不火。在某些情况下,其他任务也不会执行。核心问题是我真的不明白中断如何与 RTOS 共存。我已经在baremetal上编写了代码(在汇编和C中),其中中断可以完美地工作,并且我完全理解当代码和cpu之间没有层时它们是如何工作的。

我试过的:

  • 我阅读了 uCOS-II 附带的书籍和参考手册,并寻找了实现中断的方法。什么都不提;关于中断唯一提到的是它们如何与调度程序交互,因此中断仅涵盖在理论领域。
  • 我在micrium(原始供应商)论坛上问过,没有回复/似乎是一个死论坛
  • 我查看了 uCOS 端口中包含的库,发现了一些有用的东西:

    • bsp_int 是处理中断的库。BSP 代表 Board Support Package,旨在促进软件和代码之间的交互
    • 该库具有注册中断并启用它的功能。rtos 使用自己的 ISR 处理程序表,映射到 cpu 的 NVIC。所有处理程序都通过通用处理程序过滤。该库中的两个有用函数是:
      • bsp_intVectSet 获取中断触发 ID(即 bsp_int_id_gpiof)和指向中断处理程序的指针并注册它
      • bsp_intEn 获取中断 ID 并启用它
  • bsp_int 库包含在 bsp.c 中,它为中断调用初始化函数(来自 bsp_int)(bsp_IntInit())
  • bsp.h 文件包含在主应用程序文件 (app.c) 中
  • app.c main 是程序的入口点。主程序禁用中断,初始化 uCOS(即内核)创建第一个/启动任务称为 AppTaskStart,并启动多任务处理(即,将控制权交给 rtos 并且函数永远不会返回)。我假设内核重新启用中断,因为它需要那些运行
  • 所以 rtos 的工作方式(据我了解)是它劫持了 systick 计时器,因此在每个时钟滴答声中,内核都会被调用并能够安排任务。
  • AppTaskStart 是内核域中执行的第一个任务,它调用 bsp_init(其中调用 bsp_IntInit 来初始化中断表等)并执行其他初始化任务
  • 我之前在没有内核的情况下设置中断的方式是使用 TI 提供的 Tivaware 库(C 语言)。它具有创建中断、指定触发(即上升/下降沿、定时器溢出等)和启用它们的功能。这种方法有效,我认为我应该用它来设置我想要的中断
  • 因此,我使用 tivaware 库在上升沿的一个 gpio 端口(机械开关连接到该端口)上设置中断。此代码以及启动端口 f 外围设备、将开关引脚设置为输入和启用上拉的其他代码都包含在 bsp_init (bsp.c) 中,该程序从 main 调用的 AppTaskStart 调用。到目前为止,一切正常,rtos 已启动,其所有任务都相应地执行。当我尝试将代码直接移动到主程序并将程序闪存到板上时,rtos 初始化(LED 闪烁)但随后任务不执行。任何想法为什么会这样?
  • 如果我使用 tivaware 库中的代码添加代码以启用和注册在同一函数中关闭开关时的中断,则 rtos 不会初始化。
  • 我是否需要使用 tivaware 库设置/注册/启用中断以及使用板支持包 (bsp) 库注册和启用它们?到目前为止,我理解这一点的方式是 bsp 仅为内核注册/启用中断,而 tivaware 代码通过直接写入寄存器来启用它们,因此需要后者来设置中断的 cpu 部分,而前者是需要设置中断的操作系统部分。但我不知道。我真的不明白他们是如何在 uCOS II 下设计合并中断的。它们确实指定了应该如何编写中断处理程序以及要使用哪些宏,但仅此而已。

接下来我应该尝试什么?有人有使用这两个组件(rtos 和板)的经验吗?

我只是停留在这一点上,我一直在玩代码,移动东西,试图找到解决这个问题的线索/线索。我什至无法调试 rtos,因为 uVision 不支持 uCOS,而且我不能使用步进调试,因为每个时钟滴答都会触发中断,并且 PC 不断变化,因此 IDE 无法跟踪它。

我知道 IAR Embedded Workbench 支持 uCOS-II,我的笔记本电脑上有应用程序,我尝试设置一个项目,但我只获得了 Keil 的端口/启动项目,我不知道如何设置一个IAR 电子战。Micrium 网站上唯一的端口是用于 TM4C129 系列的,我尝试使用它来启动 IAR EW 项目,但我无法让它工作(库未链接/缺少文件)。

谢谢你!

4

1 回答 1

1

有人有使用这两个组件(rtos 和板)的经验吗?

恐怕我还没有使用过 uCos(但使用过其他操作系统,主要是 SysBios 和 FreeRTOS),而且我还没有使用过 Tiva(但使用过 Sitara AM335x)。尽管如此,我认为下面的一些提示可能对您有所帮助(尽管您使用不同的实现,但仍然适用)。

接下来我应该尝试什么?

这些是我建议您考虑的步骤。您可以将它们按您认为最有帮助的任何顺序排列。

  • 调用 RTOS 库 API 的 ISR 的中断优先级不得高于 RTOS 考虑的级别,否则 RTOS 内部状态可能会损坏,任何事情都可能发生。请检查您的操作系统文档。

  • 请验证中断向量表的位置及其内容:每个向量表入口是否都指向 RTOS 提供的 ISR 包装处理程序之一,或者您是否还找到“独立”的 ISR 实现?如果是这样,后者是做什么的?如果您找到指向您没有代码的第三方库的指针,请不要放弃。这些可能同样重要……比在 API 中包含正确的标头更重要的bsp_Int...是,所有软件组件的中断管理都通过一个独特的 API 运行,例如,bsp_Int...一个。

  • app.c您对/main()听起来很合理的假设。请确保您也了解间接访问中断的每个组件。

    • AppTaskStart 是内核域中执行的第一个任务,它调用 bsp_init(其中调用 bsp_IntInit 来初始化中断表等)并执行其他初始化任务

    请检查如果您在每个任务函数的顶部放置一个断点会发生什么。然后你应该能够看到所有任务启动并运行到它的断点一次。

    • 我之前在没有内核的情况下设置中断的方式是使用 TI 提供的 Tivaware 库(C 语言)。它具有创建中断、指定触发(即上升/下降沿、定时器溢出等)和启用它们的功能。这种方法有效,我认为我应该用它来设置我想要的中断

    您应该确保 Tivaware 库仅以与您的 RTOS 兼容的方式使用中断。您可以通过 RTM 或阅读源代码来做到这一点。

    • 因此,我使用 tivaware 库在上升沿的一个 gpio 端口(机械开关连接到该端口)上设置中断。此代码以及启动端口 f 外围设备、将开关引脚设置为输入和启用上拉的其他代码都包含在 bsp_init (bsp.c) 中,该程序从 main 调用的 AppTaskStart 调用。到目前为止,一切正常,rtos 已启动,其所有任务都相应地执行。当我尝试将代码直接移动到主程序并将程序闪存到板上时,rtos 初始化(LED 闪烁)但随后任务不执行。任何想法为什么会这样?

    是否是连接到中断的控制器引脚之一的电子问题开始一直触发该中断?

    • 如果我将代码添加到 [...]

    您是否尝试过创建一个 最小的可重现示例?当你这样做时,你可以通过同时进行 橡皮鸭调试来增强效果。

    • 我是否需要使用 tivaware 库设置/注册/启用中断以及使用板支持包 (bsp) 库注册和启用它们?到目前为止,我理解这一点的方式是 bsp 仅为内核注册/启用中断,而 tivaware 代码通过直接写入寄存器来启用它们,因此需要后者来设置中断的 cpu 部分,而前者是需要设置中断的操作系统部分。但我不知道。我真的不明白他们是如何在 uCOS II 下设计合并中断的。它们确实指定了应该如何编写中断处理程序以及要使用哪些宏,但仅此而已。

    这听起来很危险。我还没有使用过 Tiva,而是使用了另一个 TI 芯片 (AM335x)。在那里我们遇到了类似的情况,不同的库通过不同的抽象层访问同一系统资源的不同/重叠部分。当我们清理掉相互忽略的抽象层的混乱并将一些代码移植到一个通用的抽象分层方案时,情况才开始好转。

还有一些 PS:

  • 您可以根据需要用 C 或汇编程序编写 ISR。根据工具链的质量和优化设置,汇编程序可能会产生更好的性能(或根本不会),并且通过从汇编程序调用 C API,一些程序员往往会犯新的错误。在您详细了解操作系统和 IRQ 周围发生的情况之前,我建议您留在 C 中。
于 2020-05-01T16:15:34.313 回答