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:任务问题

Guru**** 2443910 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/626991/rtos-tm4c1294ncpdt-task-issues

器件型号:TM4C1294NCPDT

工具/软件:TI-RTOS

我使用 CFG 来创建两个任务。 Task0的优先级为2、而另一个(Task1)为1。  但任务1不起作用、我认为 MCU 不会进入任务1。 当我设置相同的优先级时、系统工作正常。

当我设置不同的优先级时、如何解决问题。

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

    是否可以发布源代码? 了解每个任务的功能将会很有帮助。

    为此、您可以单击"使用 RTF 格式"、然后使用符号为"</>"的工具栏上的语法"加亮"。

    当优先级相同时、您是否能够同时进入 Task0和 Task1?

    您是否知道 Task0的处理时间是否比重新触发时间长? 如果是这种情况、因为它具有更高的优先级、那么每次它完成处理时、都会在任务1可以处理之前重新输入它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我的任务0代码:

    void UARTPort_Params_setting (void)
    {
    /*创建一个数据处理关闭的 UART。 *
    UART_PARAMS_INIT (uartParams);
    uartParams.writeDataMode = UART_DATA_BINARY;
    uartParams.readDataMode = UART_DATA_BINARY;
    uartParams.readTimeout = 10;
    uartParams.readReturnMode = UART_return_full;
    uartParams.readEcho = UART_ECHO_OFF;
    uartParams.baudrate = 9600;
    UART = UART_OPEN (Board_UART0、&uartParams);
    } 
    空 UART_echoFxn (UARg arg0、UARg arg1)
    {
    char arg;//命令参数
    unsigned int count;// UART RX 读取数据的计数
    无符号字符输入[256]={0};
    const char echoPrompt[]="\fConnecting MCU is SUCCES.\r\n";
    
    /*创建一个数据处理关闭的 UART。 *
    UARTPort_Params_setting();
    
    UART_WRITE (UART、echoPrompt、sizeof (echoPrompt));
    
    /*循环永久回显*/
    while (1)
    {
    UART_CONTROL (UART、UART_CMD_ISAVAILABLE、&arg);//读取 RX 缓冲区、如果数据可用则为 true、
    如果(arg!= 0)
    为 false{
    计数= UART_READ (UART、输入、256);
    UART_Command (UART、输入、计数);
    }
    
    } 

    我的任务1代码:

    void System_taskFxn (UArg0、UArgarg1)
    {
    while (1)
    {
    Mapping_Update();
    }
    } 

    当优先级相同时、UART 可以使用、我也可以通过 I2C 等设置一些值

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

    我认为正在发生的情况是、您的 UART 任务不允许 I2C 任务在抢占它之前完成处理。

    对于 TI-RTOS、如下所示:当您将任务配置为具有相同的优先级时、将按照创建任务的顺序对其进行调度
    配置脚本中。 ( www.ti.com/.../spruex3q.pdf 上的第82页 )

    这意味着当任务的优先级相同时、它们将连续运行。

    但是、当一个任务比另一个任务具有更高的优先级时、它可以优先于较低优先级的任务。 这是因为"与许多为每个任务提供处理器的“公平份额”的时间共享操作系统不同,每当较高优先级的任务准备好运行时,SYS/BIOS 会立即取代当前任务。" (也见上述文件第82页)。

    一种解决方案是允许 UART 任务被阻止一段时间,以便使用信号量或者甚至只是一个 Task_sleep()函数来运行 I2C 任务。 后者可能是一个很好的快速测试、用于查看 UART 任务是否被阻止、然后 I2C 任务可以根据需要运行。

    这将指示您是否需要进一步研究每个任务处理所需的时间、以及是否正在触发 UART 任务、以便在 I2C 任务完成之前准备好执行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我接受您的建议、并在  具有不同 优先级的 UART_echoFxn 函数中添加 Task_sleep(1)。 系统看起来不错、可以正常工作。

    我如何使用信标、我无法理解它的工作原理。 TI 是否有一些示例?

    谢谢

    BR、

    路易  

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

    我们有完整的 TI-RTOS 培训视频系列: training.ti.com/ti-rtos-workshop-series

    我当然建议至少完成第3-8章、但对于第8章中具体涉及的任务和信标。 只需了解这些视频是按顺序完成的、并将参考之前章节中的信息。

    这些视频是了解我们提供的 TI-RTOS 和 RTOS 概念的最佳资源。

    第1章概述了 TI 产品系列和适用于 TI-RTOS 的器件、您似乎知道要使用哪种器件、因此您可能不需要这种器件。 第2章仅介绍 CCS、但如果您不熟悉 CCS、则可以了解如何更好地使用它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ralph:

    谢谢。

    BR、

    路易