背景:
我正在使用uCOS II、Keil 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 项目,但我无法让它工作(库未链接/缺少文件)。