首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在uCOSⅡ和TM4C123G (ARM M4)单片机上实现硬件中断?

如何在uCOSⅡ和TM4C123G (ARM M4)单片机上实现硬件中断?
EN

Stack Overflow用户
提问于 2020-04-14 22:23:41
回答 1查看 626关注 0票数 1

背景:

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

问题:

中断不起作用,它们根本不起作用。有些情况下,其他任务也不会执行。核心问题是,我并不真正理解中断如何能够与RTOS共存。我在裸金属上编写了代码(在程序集和C中),中断工作非常完美,当代码和cpu之间没有层时,我完全理解它们是如何工作的。

我试过的是:

  • 我阅读了uCOS-II附带的书籍和参考手册,并寻找实现中断的方法。没有提到任何事情;关于中断,唯一提到的是它们如何与调度程序交互,因此中断仅在理论领域中涉及。
  • 我在micrium (原始供应商)论坛上询问,没有回复/似乎是一个死论坛。
  • 我查看了uCOS端口中包含的库,发现了一些有用的东西:
代码语言:javascript
复制
- bsp\_int is the library that deals with the interrupts. BSP stands for Board Support Package and is intended to facilitate the interaction between the software and the code
- The library has functions to register an interrupt and enable it. The rtos uses its own table of ISR handlers mapped to the NVIC of the cpu. All handlers are filtered through a generic handler. The two useful functions from this library are:  
    - bsp\_intVectSet which takes the interrupt trigger ID (i.e bsp\_int\_id\_gpiof) and a pointer to the interrupt handler and registers it
    - bsp\_intEn which takes the interrupt ID and enables it

  • bsp_int库包含在bsp.c中,它为中断(bsp_IntInit())调用初始化函数(从bsp_int)
  • bsp.h文件包含在主应用程序文件(app.c)中。
  • point是程序的入口点。主程序禁用中断,初始化uCOS (即内核),创建名为AppTaskStart的第一个/启动任务,并启动多任务处理(即将控制权交给rtos,函数永远不会返回)。我假设内核重新启用中断,因为它需要运行这些中断
  • 因此,rtos的工作方式(据我理解)是,它劫持了系统定时器,因此在每个时钟滴答时,内核都被调用并能够调度任务。
  • AppTaskStart是内核域中执行的第一个任务,它调用bsp_init (其中调用bsp_IntInit来初始化中断表等等)并执行其他初始化任务。
  • 我以前在没有内核的情况下设置中断的方式是使用TI提供的Tiv自觉库(用C语言)。它具有创建中断、指定触发器(即上升/下降边缘、计时器溢出等)和启用它们的功能。这个方法起作用了,我想我应该用它来设置我想要的中断。
  • 因此,我使用了tiv自觉库在上升边缘的gpio端口上设置中断(机械开关连接到gpio端口)。bsp_init (bsp.c)中包含了用于启动端口f外围设备、将开关引脚设置为输入的其他代码(bsp.c),后者是从main调用的AppTaskStart调用的。到目前为止,所有的事情都很完美,rtos初始化,它的所有任务都相应地执行。当我试图将代码直接移动到主程序并将程序闪现到主板上时,rtos会初始化(leds闪烁),但是任务不会执行。知道为什么会这样吗?
  • 如果我添加了代码来启用和注册中断,当开关在同一个函数中关闭时,使用来自tiv自觉库的代码,rtos不会初始化。
  • 我是否需要设置/注册/启用中断,以及注册并使用板支持包(bsp)库来启用中断?到目前为止,我理解的方式是,bsp只为内核注册/启用中断,而激活感知代码通过直接写入寄存器来启用它们,因此需要后者来设置中断的cpu部分,而前者则需要设置中断的OS部分。但我不知道。我真的不明白他们是如何设计在uCOS II下合并中断的,他们确实指定了如何编写中断处理程序,以及应该使用什么宏,而没有其他的。

接下来我该试试什么呢?有谁有与这两个部门( rtos和董事会)合作的经验吗?

我只是停留在这一点上,我一直在玩代码,移动东西,试图找到线索/导致解决这个问题。我甚至不能调试rtos,因为uVision不支持uCOS,我也不能使用分步调试,因为每个时钟滴答声都会触发中断,而PC正在不断地变化,所以IDE无法遵循它。

我知道IAR嵌入式工作台支持uCOS-II,我的笔记本上有一个应用程序,我试着设置一个项目,但我只得到了一个用于Keil的端口/启动项目,我不知道如何为IAR EW设置一个。Micrium网站上唯一的端口是TM4C129系列,我试着用它启动一个IAR项目,但我无法让它工作(库没有链接/缺少文件)。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2020-05-01 16:15:34

有谁有与这两个部门( rtos和董事会)合作的经验吗?

恐怕我还没有与uCos (但与其他OSes,主要是SysBios和FreeRTOS)合作,也没有与Tiva合作(但与Sitara AM335x合作)。不过,我认为下面的一些提示可能对您有帮助(尽管您正在使用不同的实现)。

接下来我该试试什么呢?

以下是我建议您考虑的步骤。你可以把它们按任何你认为最有用的顺序排列。

  • 调用RTOS库API的ISRs的中断优先级不能高于RTOS所考虑的级别,否则RTOS内部状态可能会损坏,任何事情都可能发生。请查看您的操作系统文档。
  • 请验证中断向量表的位置及其内容:每个向量表入口是否指向RTOS提供的ISR包装处理程序之一,或者您是否还找到“独立”的ISR实现?如果是的话,后者是做什么的?如果您发现指向第三方库的指针没有代码,请不要放弃。这些可能同样重要..。比将正确的头包含到bsp_Int... API更重要的是,对所有软件组件的中断管理通过一个唯一的API运行,例如,bsp_Int...接口。
  • 你对app.c/main()的假设听起来是合理的。请确保您也知道每个访问间接中断的组件。
    • AppTaskStart是内核域中执行的第一个任务,它调用bsp_init (其中调用bsp_IntInit来初始化中断表等等)并执行其他初始化任务。

如果在每个任务函数的顶部放置一个断点,请检查会发生什么情况。然后,您应该能够观察所有的任务开始和运行到它的断点一次。

    • 我以前在没有内核的情况下设置中断的方式是使用TI提供的Tiv自觉库(用C语言)。它具有创建中断、指定触发器(即上升/下降边缘、计时器溢出等)和启用它们的功能。这个方法起作用了,我想我应该用它来设置我想要的中断。

您应该确保Tiv自觉库只以与RTOS兼容的方式使用中断。您可以通过RTM或读取源来完成此操作。

    • 因此,我使用了tiv自觉库在上升边缘的gpio端口上设置中断(机械开关连接到gpio端口)。bsp_init (bsp.c)中包含了用于启动端口f外围设备、将开关引脚设置为输入的其他代码(bsp.c),后者是从main调用的AppTaskStart调用的。到目前为止,所有的事情都很完美,rtos初始化,它的所有任务都相应地执行。当我试图将代码直接移动到主程序并将程序闪现到主板上时,rtos会初始化(leds闪烁),但是任务不会执行。知道为什么会这样吗?

会不会是连接到中断的一个控制器引脚上的电子问题开始一直触发中断?

    • 如果我把密码加到..。

你试过创建一个最小可重现性示例吗?当您这样做时,您可以通过同时执行橡胶鸭调试来增强效果。

    • 我是否需要设置/注册/启用中断,以及注册并使用板支持包(bsp)库来启用中断?到目前为止,我理解的方式是,bsp只为内核注册/启用中断,而激活感知代码通过直接写入寄存器来启用它们,因此需要后者来设置中断的cpu部分,而前者则需要设置中断的OS部分。但我不知道。我真的不明白他们是如何设计在uCOS II下合并中断的,他们确实指定了如何编写中断处理程序,以及应该使用什么宏,而没有其他的。

这听起来很危险。我还没有和Tiva合作过,而是使用了另一个TI芯片(AM335x)。在这种情况下,不同的库通过不同的抽象层访问同一系统资源的不同部分/重叠部分。只有当我们清理了抽象层的混乱,忽略彼此,并将一些代码移植到一个通用的抽象分层方案时,情况才开始改善。

还有一些PS:

  • 你可以用C或汇编语言编写ISR,随你喜欢。取决于工具链的质量和优化设置,成员可能会产生更好的性能(或者根本不会),通过从汇编程序调用C API,一些程序员往往会犯新的错误。我建议保持在C内,直到你详细知道你的操作系统和IRQ周围发生了什么。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61218251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档