如何在uCOS II和TM4C123G(ARM M4)MCU中实现硬件中断?

问题描述 投票:0回答:1

背景:

我正在使用uCOS IIKeil uVision 5和上面装有TM4C123GH6PM MCU的TIVA板。我获得了uCOS II的移植端口以及一个空白项目文件以开始使用。我编写了所需的任务,程序正常运行,但是现在我对实现中断感兴趣,并试图了解它们如何与RTOS共存。全部完成in C

问题:

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

我尝试过的内容:

  • 我阅读了uCOS-II随附的书和参考手册,并寻找实现中断的方法。什么也没说;关于中断的唯一提及是它们如何与调度程序交互,因此中断仅在理论上涉及。
  • 我在micrium(原始供应商)论坛上询问,但没有答复/好像死了的论坛一样
  • 我查看了uCOS端口随附的库,发现了一些有用的东西:

    • bsp_int是处理中断的库。 BSP代表董事会支持包,旨在促进软件与代码之间的交互。
    • 该库具有注册并启用中断的功能。 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是程序的入口点。 Main禁用中断,初始化uCOS(即内核)创建称为AppTaskStart的第一个/启动任务,并启动多任务处理(即将控制权交给rtos,并且该函数永不返回)。我假设内核重新启用中断,因为它需要运行这些中断
  • 因此,rtos的工作方式(据我了解)是,它劫持了systick计时器,因此在每个时钟滴答时,都会调用内核并能够安排任务。
  • AppTaskStart,这是在内核域中执行的第一个任务,它调用bsp_init(其中,调用bsp_IntInit来初始化中断表等)并执行其他初始化任务
  • 我以前没有内核设置中断的方法是使用TI提供的Tivaware库(C语言)。它具有创建中断,指定触发器(即上升/下降沿,定时器溢出等)并启用它们的功能。此方法有效,我认为这是我应该用来设置所需中断的方法
  • 因此,我使用tivaware库在上升沿的gpio端口之一(与之相连的机械开关)上设置了中断。 bsp_init(bsp.c)中包含用于此目的的代码以及用于启动端口f外设,将开关引脚设置为输入并启用上拉的其他代码,该代码从AppTaskStart调用,而bsp_init(bsp.c)从main调用。到目前为止,一切工作正常,rtos初始化,并且其所有任务都相应执行。当我尝试将代码直接移到主程序并将程序闪存到板上时,rtos会初始化(指示灯闪烁),但是任务无法执行。任何想法可能是为什么?
  • 如果添加代码以在同一功能中关闭开关时也启用并注册中断,则使用tivaware库中的代码,rtos不会初始化。
  • 我是否需要使用tivaware库设置/注册/启用中断以及使用板级支持软件包(bsp)库进行注册和启用?到目前为止,我的理解是bsp仅为内核注册/启用中断,而tivaware代码通过直接写入寄存器来启用它们,因此需要后者来设置中断的cpu部分,而前者是需要设置中断的OS部分。但是我不知道。我真的不明白他们是如何在uCOS II下设计并入中断的。它们确实指定了应如何编写中断处理程序以及要使用哪些宏,但没有其他规定。

接下来我应该尝试什么?是否有人在使用这两个组件(rtos和电路板)方面有任何经验?

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

我知道IAR Embedded Workbench支持uCOS-II,并且我在笔记本电脑上安装了该应用程序,我尝试设置一个项目,但是只给了Keil一个port / starter项目,我不知道如何设置它。准备IAR EW。 Micrium网站上的唯一端口是TM4C129系列的端口,我尝试使用该端口来启动IAR EW项目,但无法正常工作(库未链接/丢失文件)。

谢谢!

embedded interrupt keil rtos ucos
1个回答
0
投票

有人在使用这两个组件(rtos和电路板)上有经验吗?

恐怕我还没有与uCos(但与其他OS,主要是SysBios和FreeRTOS)一起工作,并且我还没有与Tiva(但与Sitara AM335x一起)工作。不过,我认为下面的一些提示可能对您有所帮助(尽管您使用的实现方式有所不同,但仍然可以应用。)>

接下来我应该尝试什么?

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

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

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

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

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

如果将断点放在每个任务功能的顶部,请检查会发生什么。然后,您应该能够看到所有任务开始运行并运行到其断点一次。

    • 我以前没有内核设置中断的方法是使用TI提供的Tivaware库(C语言)。它具有创建中断,指定触发器(即上升/下降沿,定时器溢出等)并启用它们的功能。此方法有效,我认为这是我应该用来设置所需中断的方法
  • 您应确保Tivaware库仅以与RTOS兼容的方式使用中断。您可以通过RTM或阅读源代码来进行此操作。

    • 因此,我使用tivaware库在上升沿的gpio端口之一(与之相连的机械开关)上设置了中断。 bsp_init(bsp.c)中包含用于此目的的代码以及用于启动端口f外设,将开关引脚设置为输入并启用上拉的其他代码,该代码从AppTaskStart调用,而bsp_init(bsp.c)从main调用。到目前为止,一切工作正常,rtos初始化,并且其所有任务都相应执行。当我尝试将代码直接移到主程序并将程序闪存到板上时,rtos会初始化(指示灯闪烁),但是任务无法执行。任何想法可能是为什么?
  • 可能是连接到该中断的控制器引脚之一上的电子故障开始一直触发该中断吗?

    • 如果我将代码添加到[...]
  • 您是否尝试过创建一个minimal reproducible example?执行此操作时,可以通过同时执行来增强效果rubber duck debugging

    • 我是否需要使用tivaware库设置/注册/启用中断以及使用板级支持软件包(bsp)库进行注册和启用?到目前为止,我的理解是bsp仅为内核注册/启用中断,而tivaware代码通过直接写入寄存器来启用它们,因此需要后者来设置中断的cpu部分,而前者是需要设置中断的OS部分。但是我不知道。我真的不明白他们是如何在uCOS II下设计并入中断的。它们确实指定了应如何编写中断处理程序以及要使用哪些宏,但没有其他规定。
  • 这听起来很危险。我还没有使用过Tiva,而是使用了另一款TI芯片(AM335x)。在那里,我们遇到了类似的情况,不同的库通过不同的抽象层访问同一系统资源的不同/重叠部分。当我们整理混乱的抽象层并互相忽略并将一些代码移植到通用抽象层方案时,情况才开始改善。

    还有一些PS:

    • 您可以根据需要用C或汇编语言编写ISR。取决于工具链的质量和优化设置,assember可能会产生更好的性能(或根本没有),并且通过从汇编器调用C API,某些程序员倾向于犯下新的错误。我建议您留在C中,直到您详细了解操作系统和IRQ周围正在发生的事情。
    © www.soinside.com 2019 - 2024. All rights reserved.