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/SW-EK-TM4C129EXL:Hwi

Guru**** 2482105 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/707322/rtos-sw-ek-tm4c129exl-hwi

主题中讨论的其他器件:TM4C123

在下面的代码中,myIsr5()、myIsr6()、myIdleFunc()不起作用。
我能够在上述所有函数上设置断点、但程序流不会进入这些函数、
这些函数中的消息不会打印在控制台窗口上。

/* XDCtools 头文件*/
#include 
#include 
#include 
#include 

/* TI-RTOS 头文件*/
#include 
#include 
#include 

//#include
"Board.h"

bool Hwi5 = false;
bool Hwi6 = false;

//在发生中断5时运行*/
void myIsr5 (UArg arg){
if (arg =10)
{
Hwi5 = true;
system_printf ("在 Hwi 5中!!!!");//能够在此处设置断点,但不在控制台中打印消息*/
}
//

}//*在中断6发生时运行*/
void myIsr6 (UArg arg){
if (arg =12){
Hwi6 = true
system_printf ("在 Hwi 6中!!!!");//能够在此处设置断点,但消息不会在控制台中打印*/
}
}/*


空闲线程检查中断5和中断6的完成情况,并在中断5和中断6都完成后退出。 */
void myIdleFunc ()
{
if (Hwi5&& Hwi6){
system_printf ("两个中断都发生了!");//能够在此处设置断点,但不会在控制台中打印消息*/
System_exit (0);
}
}

int main (void)
{
/*呼叫板初始化函数*/
Board_initGeneral();
Board_initGPIO();

Hwi_Params HwiParams;
Hwi_handle myHwi;
Hwi_Params_init (hwiParams);

/*设置 myIsr6参数*/
hwiParams.arg = 12;
hwiParams.enableInt = false;

/*为中断号6创建一个 Hwi 对象、该中断号使用参数12调用 myIsr6 ()*/
myHwi = Hwi_create (16、myIsr6、&hwiParams、NULL);
system_printf ("进入 Hwi");//能够在此处设置断点,但不会在控制台中打印消息*/
if (myHwi = NULL){
system_abort ("Hwi 创建失败");
}

Hwi_Params hwiParams_1;
Hwi_handle myHwi_1;
Hwi_Params_init (&hwiParams_1);

hwiParams_1.arg = 10;
hwiParams_1.enableInt = false;
/*为中断号18创建一个 Hwi 对象、该中断号使用参数10 */调用 myIsr5 ()
myHwi_1 = Hwi_create (18、myIsr5、&hwiParams_1、NULL);

if (myHwi_1 == NULL){
system_abort ("Hwi 创建失败");//能够在此处设置断点,但消息不会在控制台中打印*/
}

Hwi_enableInterrupt (16);
Hwi_enableInterrupt (18);
System_printf ("进入 Hwi");

/*打开用户 LED */
GPIO_WRITE (Board_LED0、Board_LED_ON);

/*启动 BIOS */
BIOS_start();
返回(0);
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    在 System_printf()之后,您需要添加 System_flush(),以便打印到控制台。

    您正在调用 Hwi_create (16...) 和 Hwi_create (18...) 它们对应于 GPIOA 和 GPIOC。 您是否使用这两个 GPIO 模块来生成中断?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    /*
    === empty_min.c ====
    //
    //* XDCtools 头文件*/
    #include 
    #include 
    #include 
    #include 
    
    /* TI-RTOS 头文件*/
    #include 
    #include 
    #include 
    #include 
    
    /*电路板头文件*/
    #include "Board.h"
    
    bool Hwi5 = false;
    bool Hwi6 = false;
    
    /*在中断39发生时运行*/
    
    void myIsr5 (UArg arg){
    if (arg == 10)
    }{
    Hwi5 = true;
    //GPIO_TOGGLE (Board_LED0);
    system_printf ("已通过!!!!");
    system_flush();
    }
    /*
    
    在中断37发生时运行*/
    void myIsr6 (UArg){
    if (arg==12){
    Hwi6 = true;
    //GPIO_TOGGLE (Board_LED0);
    system_printf ("已通过!!!!");
    system_flush();
    }
    /*
    空闲线程检查中断5和中断6的完成
    情况*,并在中断5和中断6都完成后退出。 */
    
    void myIdleFunc ()
    {
    if (Hwi5 && Hwi6){
    System_printf ("两个中断都发生了!");
    system_flush();
    System_exit (0);
    }
    
    
    }int main (void)
    {
    /*呼叫板初始化函数*/
    Board_initGeneral();
    Board_initGPIO();
    Hwi_Params HwiParams;
    Hwi_handle myHwi;
    Hwi_Params_init (hwiParams);
    
    /*设置 myIsr6参数*/
    hwiParams.arg = 12;
    hwiParams.enableInt = false;
    
    /*为中断号6创建一个 Hwi 对象
    *使用参数12调用 myIsr6 ()*/
    myHwi = Hwi_create (37、myIsr6、&hwiParams、NULL);
    System_printf ("进入 Hwi");
    system_flush();
    if (myHwi = NULL){
    system_abort ("Hwi 创建失败");
    system_flush();
    }
    
    
    Hwi_Params hwiParams_1;
    Hwi_handle myHwi_1;
    Hwi_Params_init (&hwiParams_1);
    
    hwiParams_1.arg = 10;
    hwiParams_1.enableInt = false;
    /*为中断号16创建一个 Hwi 对象、该中断号使用参数12调用 myIsr6 ()*/
    myHwi_1 = Hwi_create (39、myIsr5、&hwiParams_1、NULL);
    
    if (myHwi_1 == NULL){
    system_abort ("Hwi 创建失败");
    system_flush();
    }
    
    Hwi_enableInterrupt (37);
    Hwi_enableInterrupt (39);
    System_printf ("\n 进入 Hwi");
    system_flush();
    /*打开用户 LED */
    //GPIO_WRITE (Board_LED0、Board_LED_ON);
    /*启动 BIOS */
    BIOS_start();
    返回(0);
    }
    

    您好!

       我开始调用 Hwi_create (37)和 Hwi_create (39)、这些是计时器中断、我无法在 myIsr5 ()和 myIsr6 ()函数内打印消息。

       我还在代码中添加了 System_flush()命令。  代码看起来像...

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

    您好!

     我在您的代码中看不到如何配置计时器。 你只在矢量37和39上创建 Hwi。 即使这两个矢量对应于计时器模块、但它们尚未配置(即设置周期并启用超时中断等)。 请看下面的示例、其中使用了 Timer2、并为矢量39创建了 Hwi、该矢量编号对应于 Timer2A。  

    ///------------------------------------
    //项目:使用 Hwi 使 TM4C BIOS 闪烁(解决方案)
    //作者:Eric Wilbur
    //日期:2014年6月
    //
    //注意:函数调用 TimerIntClear (TIMER2_base、TIMER_TINA_TIMEOUT)具有
    // 处于 ISR 中。 这个 fxn 清除了定时器的中断标志来
    // 来自外设-它不清除 CPU 中断标志-该
    // 由硬件完成。 作者很难找到这一部分-因此
    // 注意事项。 在 Swi 实验中、这个 fxn 必须被放置在
    //中 Timer_ISR fxn、因为它将是新的 ISR。
    //
    //按照以下步骤在 CCSv6.0中创建此项目:
    // 1. Project -> New CCS Project
    // 2. 选择 Template:
    //- TI-RTOS for Tiva-C -> Driver Examples -> EK-TM4C123 LP -> Example Projects ->
    // 空项目
    //-空项目包含完整的仪器(UIA、RTOS 分析器)和
    // 为 MSP430Ware 的 TI-RTOS 版本设置的路径
    // 3. 删除以下文件:
    //- Board.h、empty.c、EK_TM4C123GXL.c/h、empty_readme.txt
    // 4. 从 TI-RTOS 专题讨论会解决方案文件中为本实验添加 main.c
    // 5. 根据需要编辑 empty.cfg (添加/减去) BIOS 处理、删除给定任务
    // 6. 构建、加载、运行...
    ///--------------------------------------
    
    
    ///--------------------------------
    // BIOS 头文件
    //---------------
    #include //mand强制-对于 BIOS 类型
    #include、必须首先包含 //mandedis-如果您调用诸如 BIOS_start()
    #include 之类的 API //needed 用于任何 Log_info()调用
    #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)
    {
    
    hardware_init(); //通过 Xware 初始化硬件
    
    Hwi_Params HwiParams;
    Hwi_handle myHwi;
    ERROR_Block EB;
    /*将错误块和 hwiParams 初始化为默认值*/
    ERROR_INIT (&EB);
    Hwi_Params_init (hwiParams);
    hwiParams.enableInt = false;
    myHwi = Hwi_create (39、(Hwi_FuncPtr) ledToggle、hwiParams、&EB);
    if (myHwi = NULL){
    system_abort ("Hwi 创建失败");
    }
    Hwi_enableInterrupt (39);
    
    
    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_MAIN);
    
    //添加 Tiva-C GPIO 设置-启用端口、为输出设置引脚1-3 (
    
    
    
    
    
    
    
    SYSCL_GPIO
    );Timer_GPIO2|SYSC_PIN_PHIN (PHIN_IN_IN_IN/2);Timer_GPIOTP2|SYSC_GPIO_PERIP_PIN_PHIN (PHIN_IN_IN_IN_IN/2)// cfg Timer 2模式-周期性
    
    ui32Period =(SysCtlClockGet ()/2);//周期= CPU clk div 2 (500ms)
    TimerLoadSet (TIMER2_base、timer_A、ui32Period);//设置 TimerIntEnable (
    
    TIMER2_base) Timer2A
    
    (TIMER2_BASE)————启用定时器2—————/TIMER-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、然后是空闲函数、但空闲函数似乎没有运行。 控制台窗口中的代码和代码输出如下所示、

    /* XDCtools 头文件*/
    #include 
    #include 
    #include 
    #include 
    #include 
    
    /* BIOS 头文件*/
    #include 
    #include 
    
    /* TI-RTOS 头文件*/
    
    #include 
    
    /*板头文件*/
    #include "Board.h"
    
    /* Tivaware 头文件*/
    #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/timer #interrupts.h"
    
    
    
    #include 
    
    bool Hwi5 = false;
    
    
    void hardware_init (void);
    void ledToggle (void);
    
    
    void myIsr5 (UArg arg){
    TimerIntClear (TIMER2_base、timer_TINA_TIMEOUT);//必须从计时器清除计时器中的计时器标志
    (如果(arg = 10)
    {
    Hwi5 = true;
    System_printf ("\n 已通过!!!!");
    system_flush();
    }
    
    
    void myIdleFunc()
    {
    if (Hwi5)
    {
    system_printf ("代码的空闲部分!");
    system_flush();
    system_exit (0);
    }
    
    
    void hardware_init()
    {
    
    uint32_t ui32Period;
    
    //将 CPU 时钟设置为40MHz。 400MHz PLL/2 = 200 DIV 5 = 40MHz
    SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN);
    
    //计时器2设置代码
    SysCtlPeripheralEnable (SYSCTL_Periph_TIMER2); //启用计时器2 periph CLKS
    TimerConfigure (TIMER2_base、TIMER_CFG_PERIODICRACASE); // cfg Timer 2模式-周期
    
    ui32Period =(SysCtlClockGet ()/2); //周期= CPU clk div 2 (500ms)
    TimerLoadSet (TIMER2_base、timer_A、ui32Period); //设置 Timer 2周期
    
    TimerIntEnable (TIMER2_base、TIMER_TINA_TIMEOUT); //启用计时器2中断 CPU
    
    TimerEnable (TIMER2_base、TIMER_A); //启用计时器2
    
    
    }
    
    
    int main (void)
    {
    /*呼叫板初始化函数*/
    Board_initGeneral();
    Board_initGPIO();
    hardware_init();
    Hwi_Params HwiParams;
    Hwi_handle myHwi;
    Hwi_Params_init (&hwiParams);
    
    //设置 myIsr5参数*/
    hwiParams.arg = 10;
    hwiParams.enableInt = false;
    myHwi = Hwi_create (39、(Hwi_FuncPtr) myIsr5、&hwiParams、NULL);
    System_printf ("进入 Hwi");
    system_flush();
    if (myHwi = NULL){
    System_abort ("Hwi 创建失败");
    System_flush ();
    }
    Hwi_enableInterrupt (39);
    BIOS_start();
    返回(0);
    }
    

    因此、这些是我的问题。

    1、空闲函数为什么不运行

    TimerLoadSet (TIMER2_base、TIMER_A、ui32Period);根据上述代码、我推断中断每500ms 发生一次如何计算不同毫秒值(如1000ms、200ms、50ms)的周期 我无法理解上述 API

    ui32Period =(SysCtlClockGet ()/2); 我在上面的代码中设置了断点、表明 ui32Period 的值为512... 这意味着什么???? 它是特定的寄存器值吗... 如果是、该寄存器的名称是什么?  

    此致、

    Naveen Kumar  

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

    您能显示您的 cfg 文件吗? 您是否具有用户定义的空闲函数? 请参见下面的。 此外,在 myIdleFunc()中放置一个断点,并检查 Hwi5是否为 true 或 false。  

    ui32Period 来自 ui32Period =(SysCtlClockGet ()/2)行;然而、ui32Period 是 TM4C123的 API、而不是 TM4C129的 API。 我向大家展示了如何设置计时器的示例、但没有意识到您正在使用 TM4C129。 您可以将 ui32Period 替换为所需的计时器周期。 对于 TM4C123、 SysCtlClockGet ()在一秒内以 CPU 周期数的形式返回运行频率。 对于 SysCtlClockGet ()/2、它等于500ms 内的周期数。 无论如何、您不能使用此 API。