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/EK-TM4C1294XL:静态任务参考

Guru**** 2468560 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/673730/rtos-ek-tm4c1294xl-static-task-reference

器件型号:EK-TM4C1294XL

工具/软件:TI-RTOS

您好!

我在 app.cfg 中创建了一个任务、如下所示:

program.global.Task_heartbeat= Task.create ("&HeartBeatFxn"、task1Params);

我想用一个按钮来停止并开始此任务、因此有以下问题:

1) 1)停止和启动此任务的最佳方法是什么?我应该阻止/解除阻止它、或者将它的优先级设置为-1、并将其恢复到高于0的某个优先级以启用它或其他某种功能?

2) 2)如何获取有关此任务的参考以停止和启动它? 由于它是在 app.cfg 中创建的、因此我不确定如何在按下按钮时触发的代码中引用此任务。

提前感谢您的帮助!

谢谢、

Tim

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

    Tim、

    您必须在应用程序中定义一个名为"HeartBeatFxn"的函数。 此函数将作为您的任务并在 BIOS_Start()之后开始执行。

    作为快速测试用例、您可以使用下面的伪代码等内容来确保任务按预期运行:

    Void HeartBeatFxn (void * someArg)
    {
    while (1)
    {
    /*切换 LED */
    /*睡眠1秒*/
    }
    }
    

    1.启动和停止任务的最佳方法是阻止/解除阻止。 这可以使用信标轻松实现。 查看以下伪代码:

    /*您的心跳功能默认为"运行"*/
    静态易失性 uint8_t isHeartRunning = 1;
    
    void pushButtonInterrupt (void)
    {
    
    IF (isHeartRunning = 1)
    {
    isHeartRunning = 0;
    }
    其他
    {
    IsHeartRunning = 1;
    
    /*
    *这将解除阻止心跳功能/任务。 自此
    *这是在中断上下文中、调度程序不会这样做
    *直到此 ISR 完成。
    *
    Semaphore_post (Heartbeat);
    }
    
    /*添加代码以清除按钮中断*/
    
    }
    
    
    void HeartBeatFxn (void * someArg)
    {
    while (1)
    {
    
    /*在此禁用中断*/
    IF (isHeartRunning = 0)
    {
    /*在此重新启用中断*/
    
    /*这将阻止任务,直到按下按钮。 *
    Semaphore_pend (Heartbeat);
    }
    其他
    {
    /*重新启用中断*/
    }
    
    /*此处显示您的心跳代码。 */
    }
    } 

    2.您将能够使用信标来实现阻断/解除阻断。 因此、您不需要对该任务进行任何引用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Derrick、我将为您介绍一下结果、并告诉您。

    不过、我要问的是、如何确保任务以阻止的方式启动? 在 app.cfg 中创建后、是否有方法阻止它? 该按钮将用于解除任务阻止、我希望任务运行一次、然后再次阻止任务本身。

    非常感谢您迄今为止的帮助!

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

    您好、Tim、

    实际上、您可以通过两种方法来解决您的问题-我的原始答复解决了一个问题。

    更简单的解决方案是使用 Task_setPri ()。 任务优先级可设置为-1、这将放置
    任务进入非活动状态、任务将不会运行。

    task1Params.priority =-1;
    Program.global.Task_心跳= Task.create ("&HeartBeatFxn"、task1Params); 

    这将导致任务最初处于非活动状态。 然后、您可以在应用内部执行以下操作:

    #include 
    #include 
    
    #include 
    
    void pushButtonInterrupt (void)
    {
    
    静态 uint32_t 任务优先级= 6;
    
    /*
    *以下函数 Task_setPri ()接受新的优先级和
    *返回旧的优先级。 此代码假定初始优先级
    *是(-1)、在 application.cfg 文件中设置。 此 ISR 将切换
    *(-1)和(6)之间的优先级。 这也假定的优先级为
    *此任务未在应用程序中的任何其他位置进行修改。
    *切换任务优先级。
    *
    任务优先级= Task_setPri (Task_heartbeat, task优先 级);
    
    /*添加代码以清除按钮中断*/
    
    }
    
    void HeartBeatFxn (UArg arg0、UArg arg1)
    {
    while (1)
    {
    /*此处显示您的心跳代码。 */
    }
    } 

    如果您选择坚持我的原始方法、您希望了解任务是如何以阻止的方式开始的。 在这种情况下、您可以将您的全局标志 isHeartRunning 设置为零。 然后、任务将立即阻止、直至按下按钮。 请注意、这也取决于初始计数为0时所创建的信标。

    Derrick