Embedded 如何在uCOS II和TM4C123G(ARM M4)MCU中实现硬件中断? 背景:
我使用的是uCOS II、Keil uVision 5,以及带有TM4C123GH6PMMCU的TIVA板。我得到了一个uCOS II的端口以及一个空白的项目文件来开始。我编写了所需的任务,程序运行正常,但现在我对实现中断感兴趣,并试图了解它们如何与RTOS共存。这一切都是用C来完成的 问题: 中断不起作用;它们根本就不着火。有些情况下,其他任务也不会执行。核心问题是,我并不真正理解中断如何与RTO共存。我已经在裸机上编写了代码(汇编和C),中断可以完美地工作,我完全理解在代码和cpu之间没有层时它们是如何工作的 我所尝试的:Embedded 如何在uCOS II和TM4C123G(ARM M4)MCU中实现硬件中断? 背景:,embedded,interrupt,keil,rtos,ucos,Embedded,Interrupt,Keil,Rtos,Ucos,我使用的是uCOS II、Keil uVision 5,以及带有TM4C123GH6PMMCU的TIVA板。我得到了一个uCOS II的端口以及一个空白的项目文件来开始。我编写了所需的任务,程序运行正常,但现在我对实现中断感兴趣,并试图了解它们如何与RTOS共存。这一切都是用C来完成的 问题: 中断不起作用;它们根本就不着火。有些情况下,其他任务也不会执行。核心问题是,我并不真正理解中断如何与RTO共存。我已经在裸机上编写了代码(汇编和C),中断可以完美地工作,我完全理解在代码和cpu之间没有层
- 我阅读了UCOSII附带的书籍和参考手册,并寻找实现中断的方法。只字不提,;关于中断,唯一提到的是它们如何与调度器交互,因此中断仅在理论领域中讨论
- 我在micrium(原始供应商)论坛上询问,没有回答/似乎是一个死论坛
- 我查看了uCOS端口附带的库,发现了一些有用的东西:
- bsp_int是处理中断的库。BSP代表Board Support Package,旨在促进软件和代码之间的交互
- 库具有注册中断并启用它的功能。rtos使用自己的映射到cpu NVIC的ISR处理程序表。所有处理程序都通过通用处理程序进行筛选。此库中的两个有用功能是:
- bsp_intVectSet,它接受中断触发器ID(即bsp_int_ID_gpiof)和指向中断处理程序的指针并对其进行注册
- bsp_intEn,它接受中断ID并启用它
- bsp.c中包含bsp_int库,它调用初始化函数(从bsp_int)进行中断(bsp_IntInit())
- bsp.h文件包含在主应用程序文件(app.c)中
- app.c main是程序的入口点。main禁用中断,初始化uCOS(即内核),创建名为AppTaskStart的第一个/启动任务,并启动多任务处理(即控制rtos,函数永不返回)。我假设内核可重入中断,因为它需要这些中断来运行
- 因此,rtos的工作方式(据我所知)是它劫持systick计时器,因此在每个时钟滴答声中,内核都被调用,并且能够调度任务
- AppTaskStart是在内核域中执行的第一个任务,它调用bsp_init(其中,调用bsp_init来初始化中断表等)并执行其他初始化任务
- 我以前在没有内核的情况下设置中断的方法是使用TI提供的Tivaware库(C)。它具有创建中断、指定触发器(即上升/下降沿、定时器溢出等)和启用中断的功能。这个方法很有效,我想我应该用它来设置我想要的中断
- 因此,我使用tivaware库在上升沿上的一个gpio端口(机械交换机连接到该端口)上设置中断。bsp_init(bsp.c)中包含了用于此操作的代码,以及用于启动端口f外围设备、将开关管脚设置为输入和启用上拉的其他代码,该代码由AppTaskStart调用,AppTaskStart由main调用。到目前为止,一切工作都很完美,RTO初始化,其所有任务都相应地执行。当我尝试将代码直接移动到主程序并将程序闪存到板上时,RTO会初始化(LED闪烁),但任务不会执行。你知道为什么吗
- 如果我使用tivaware库中的代码添加代码,以便在同一功能中关闭开关时启用并注册中断,则rtos不会初始化
- 我是否需要使用tivaware库设置/注册/启用中断,以及使用board support package(bsp)库注册和启用中断?到目前为止,我对这一点的理解是,bsp只为内核注册/启用中断,而tivaware代码通过直接写入寄存器来启用中断,因此后者需要设置中断的cpu部分,前者需要设置中断的OS部分。但我不知道。我真的不明白他们是如何在UCOSII下设计合并中断的。它们确实指定了如何编写中断处理程序,以及使用哪些宏,但没有指定其他内容