Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Embedded 如何在uCOS II和TM4C123G(ARM M4)MCU中实现硬件中断? 背景:_Embedded_Interrupt_Keil_Rtos_Ucos - Fatal编程技术网

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

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之间没有层

我使用的是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下设计合并中断的。它们确实指定了如何编写中断处理程序,以及使用哪些宏,但没有指定其他内容
下一步我应该试试什么?是否有人有使用这两个组件(RTO和主板)的经验? 我只是停留在这一点上,我一直在玩代码,移动东西,试图找到解决这个问题的线索/线索。我甚至不能调试RTO,因为uVision不支持uCOS,我也不能使用分步调试,因为中断会在每一个时钟点触发,并且PC会不断更改,所以IDE无法跟踪它

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

非常感谢。 是否有人有使用这两个组件(RTO和主板)的经验

恐怕我还没有使用过uCos(但使用过其他操作系统,主要是SysBios和FreeRTOS),我也没有使用过