This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TM4C1294NCPDT:Hwi 工作原理问题?

Guru**** 2473260 points
Other Parts Discussed in Thread: SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/678608/rtos-tm4c1294ncpdt-hwi-working-principle-problem

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

您好;

我在处理 hwi、我尝试了基本 SYS/BIOS (TI-RTOS)内核文档示例、如图所示;

此代码示例位于 spruex3t.pdf 文件(SYS/BIOS TI-RTOS 内核)文档的第172-173页。 当我尝试这个简单的示例时,我看不到结果,我还从表达式工具中查看 Hwi5和 Hwi6值。 但它显示什么也不起作用。

我不知道我做了什么错。  

在我创建项目时、我选择如下所示的允许选项、

我创建项目的方式是否错误? 请就此问题帮助我吗? 我真的很担心 Hwi 问题。谢谢。

此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您无法按原样使用该示例、因为您不知道该示例针对哪个器件编写。 它甚至可能是一个不针对任何特定 TI 器件的伪示例。  Hwi_enableinterrupt (5)和 Hwi_enableinterrupt (6)用于 TM4C 器件中的总线故障和使用故障。 有关详细信息、请查看数据表中的异常和中断表。 例如、如果你想为 Timer2A 启用中断、那么它被映射到矢量39、你将调用 Hwi_enableinterrupt (39)来启用它。 您需要找出要生成中断的外设并相应地启用它。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles;

    我也尝试过计时器矢量编号、但它不起作用。 此外、我还创建计时器中断。 对于 timer1B 和 timer2A、然后启用该函数的 Hwi 中断。所以我尝试了这两种方法、但没有任何意外结果与之前相同。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles;

    我还从 SYSBIOS XGCONF 静态创建。 在这里、我使用了 timer3。 如果我没有为定时器实例指定任何函数名称、即使 Hwi 是使用相对的定时器矢量编号创建的、Hwi 也不起作用。 我需要为 Timer3实例指定函数名(为 Hwi 创建哪个函数。) 这样、系统就可以正常工作。 我想知道,创建 Hwi 是为了给该示例中的函数或 ISR 提供最高的抢占功能?

    此致、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您是否尝试使用您从上面粘贴的用户指南中获取的示例、只需将矢量编号更改为39? 您是否配置了计时器模块、例如计时器周期、启用计时器模块等?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles;

    是的,我已经完成了所有你说的,我还配置了计时器;

    *==== empty.c ======
    //
    //* XDCtools 头文件*/
    #include 
    #include 
    
    /* BIOS 头文件*/
    #include 
    #include 
    #include 
    
    /* TI-RTOS 头文件*//
    #include 
    #include 
    //#include 
    //#include 
    //#include 
    //#include 
    //#include 
    //#include 
    //#include 
    #include 
    #include 
    
    bool Hwi6 = false;
    Timer_handle tmrH;
    /* Board Header 文件*/
    #include "Board.h"
    void myIsr6 (UArg arg);
    
    //发生中断6时运行*/
    
    main (void){
    Timer_Params tmrP;
    Hwi_Params HwiParams;
    Hwi_handle myHwi;
    ERROR_Block EB;
    /*将错误块和 hwiParams 初始化为默认值*/
    ERROR_INIT (&EB);
    Hwi_Params_init (&hwiParams);
    //设置 myIsr6参数*/
    hwiParams.arg = 12;
    hwiParams.enableInt = false;
    //为中断号6 *创建一个 Hwi 对象
    ,该对象使用参数12调用 myIsr6 ()*/
    
    myHwi = Hwi_create (51、myIsr6、&hwiParams、&EB);
    if (myHwi = NULL){
    system_abort ("Hwi 创建失败");
    }
    Hwi_enableInterrupt (51);
    
    Timer_Params_init (_tmrP);
    tmrP.arg=0;
    tmrP.period=1000000;
    tmrP.periodType=Timer_PeriodType_microsecs;
    tmrH=Timer_create (51、NULL、&tmrP、NULL);
    Timer_start (tmrH);
    
    /*启动 BIOS */
    BIOS_start();
    }
    void myIsr6 (UArg arg){
    System_printf ("Hello Hwi");
    if (arg =12){
    Hwi6 = true;
    }
    }/*
    空闲线程检查中断5和中断6的完成
    情况*,并在中断5和中断6都完成后退出。 */
    void myIdleFunc ()
    {
    if (Hwi6){
    System_printf ("两个中断都发生了!");
    System_exit (0);
    }
    } 


    但结果是相同的无更改、无控制台日志、当我停止程序并逐步运行时、它卡在 SYSMIN_Putch 函数上;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这与计时器2A (向量 num:39)、计时器3A (向量 num:51)和计时器3B (向量 num:52)相同。 所有结果相同。 我不明白,它应该起作用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可能会发现此帖子对您有所帮助。 e2e.ti.com/.../512202
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     不确定您的问题是否已解决。 再看一下您的代码、Timer_create 调用是错误的。 您将51作为第一个参数传递给 Tiemr_create。 要传递的参数是计时器实例编号、而不是中断向量编号。 如果要使用 Timer3A、则需要通过3而不是51。 不能同时在同一个 Timer3A 上使用 Timer_create 和 Hwi_create。 Timer_create 内置为处理已经发生的中断(矢量51)。 在这种情况下、您不需要使用 Hwi_create。 下面是使用 Timer_create 的 Timer2A 的示例代码、它适用于我。

    ///--------------------------------
    // BIOS 头文件
    //---------------
    #include //mand强制-对于 BIOS 类型
    #include、必须首先包含 //mandedis-如果您调用诸如 BIOS_start()
    #include 之类的 API //needed 用于任何 Log_info()调用
    #include 用于静态定义的对象/句柄
    #include 的//头文件 
    #include 
    #include 
    #include 
    
    ///----------------------
    // TivaWare 头文件
    //---------------
    #include 
    #include 
    
    #include "inc/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    #include "inc/hw_ints.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/timer.h"/----
    
    
    
    //原型
    ///----------------
    void hardware_init (void);
    void ledToggle (void);
    
    
    //---------------
    //全局
    //---------------
    volatile Int16_t i16ToggleCount = 0;
    
    
    //---------------
    // main()//-----------------
    
    void main (void)
    {
    
    Timer_Params Timer2;
    Timer_handle myTimer;
    
    hardware_init();//通过 Xware
    
    Timer_Params_init (&Timer2)初始化硬件;
    Timer2.arg=0;
    Timer2.period=100000;
    Timer2.periodType=Timer_PeriodType_microsecs;
    myTimer=NULL_create (2、(Timer_Functr)、Timer&tle);Timertoggle 2
    Timer_start (myTimer);
    
    BIOS_start ();
    
    }
    
    
    //---------------
    // hardware_init ()
    //
    //其 GPIO 引脚用于切换 LED
    /../../---------------
    void hardware_init (void)
    {
    //uint32_t ui32Period;
    
    //将 CPU 时钟设置为40MHz。 400MHz PLL/2 = 200 DIV 5 = 40MHz
    SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTAL_16MHz|SYSCTL_OSC_MAIN);
    
    //添加 Tiva-C GPIO 设置-启用端口,为输出设置引脚1-3 (SysCtl)引脚;-_GPIOM-/-/-/-PIN_PIN_GPIO-2-
    (-/-|GPIOM-/-|PIN_PIN_PIN_GPIO-2-)
    
    
    
    
    
    
    // ledToggle ()
    //
    //切换 Tiva-C LaunchPad 上的 LED
    //---------------------------
    void ledToggle (void)
    {
    TimerIntClear (TIMER2_base、TIMER_TINA_TIMEOUT);//必须从计时器中清除计时器标志
    
    // LED 值- 2=红色、4=蓝色、8=绿色
    IF (GPIOPinRead (GPIO_PORTF_BASE、GPIO_PIN_2))
    {
    GPIOPORTF_BASE、8= GPIO_PIN_PIN_2|GPIO_PIN_PIN_PIN_PIN_BASE、GPIO_3|GPIO_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_2|GPIO_PIN_PIN_PIN_PIN 0);
    }
    否则
    {
    GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、4);
    }
    
    i16ToggleCount += 1;//跟踪#toggle
    
    Log_Info1 ("LED 翻转[%u]次"、i16ToggleCount);//将切换计数发送到 UIA
    
    }
    
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    HWI_Handle hwi0Hande;
    Hwi_Params hwi0Params;
    
    Timer_Handle timer2Handle;
    Timer_Params timer2Params;
    
    Hwi_Params_init (&hwi0Params);
    hwi0Params.enableInt=true;
    
    
    void hwi0Fxn(){
    
    一些代码.....
    .
    
    
    。}
    
    
    int main (void){
    hwi0Hand = Hwi_create (39、hwi0Fxn、和 hwi0Params、NULL);
    
    /*此处的计时器参数初始化、参数和 ETC 设置*/
    …
    …
    …
    timer2Handle=Timer_create (2、NULL、&timer2Params、NULL);
    
    /*此处 为 Hwi 中断设置了计时器*/
    
    system_printf ("启动示例\n 系统提供程序设置为 SysMin。 "
    "停止目标以查看 ROV 中的任何 SysMin 内容。\n");
    /* SysMin 仅在您调用 flush 或 exit 时才会打印到控制台*/
    system_flush();
    
    /*启动 BIOS */
    BIOS_start();
    
    }
    

    您好、Charles;

    谢谢,这是一个很好的计时器使用示例和非常有启发性的信息。我用了它,计时器中断工作正常。 我们是否能够像 Timer İnterrupt 一样实现 Hwi。 我只想知道的是通过设置计时器中断来使用 Hwi、就像以前那样。 例如,我们是否可以执行上述代码之类的操作? 再次感谢你。

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不、我不这么认为。 正如我之前说过的、Timer_create 已经为你处理了 Hwi 中断。 调用 Timer_create (2、...)时 它知道您正在使用 TIMER2A 模块创建一个定时器、并且该中断已经映射到39。 Hwi_create (39、...) 是冗余的、我想您会混淆操作系统。 你是否会对 Hwi_create()和 Timer_create()使用相同的回调函数。 在我显示的示例中,两个都将调用 ledToggle ()。 您需要使用 Hwi 来实现计时器中断、或者只使用内置 TI-RTOS 计时器模块、而不是同时使用这两个模块。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Charles、

    现在、我更清楚地看到了这一点。

    此致
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴您现在清楚了。