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:添加到堆栈的较低优先级任务不允许在任何运行时间执行较高优先级的静态任务。

Guru**** 2538950 points
Other Parts Discussed in Thread: SYSBIOS, TM4C1294NCPDT

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/570414/rtos-task-of-lower-priority-added-to-stack-is-not-allowing-higher-priory-static-task-any-run-time

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

工具/软件:TI-RTOS

奇怪的是 、任务 模块 没有 为  列表中的每个任务分配节拍时隙、 如果 优先级较低的任务具有[while (1)]循环。 唯一的另一个独特方面是 (taskFxn (1))在 UARTLogger 示例项目中被静态创建。  

为什么静态任务 条目 会失去较 高的优先级? 如何使 while 循环中的任务不 会持续占用所有 任务时间、因此(~.IdleTask) 获得 一些 MCU 时间份额?    

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

    在带有[while (1)]循环的函数调用底部有一个返回值的情况下,(Task.IOT)只运行一次,而任务(~ć_idle_loop_E)持续运行。

    任务模块在1次 终止较低的任务优先级(8)后执行。  通过 在   while }之前将一个 C++(return)语句放置在 while (1)循环的底部、可以自然地退出任务。

    什么可能出错?,    ,,,,,在函数 声明中是否需要开关 来停止过早终止?

    //任务函数列表*/
    var task0Params = new Task.Params ();
    task0Params.instance.name ="Task.IOT ";
    task0Params.stackHeap =空;
    task0Params.vitalTaskFlag = false;
    task0Params.priority = 8;
    program.global.task0 = Task.create ("&IOTAppLoop _taskFxn"、task0Params); 

    /*物联网环路。*/
    while (g_BOnline)
    {
    
    一些代码
    }
    
    }
    
    /*退出 BIOS 任务
    * IOTLOOPFxn */
    返回;
    }
    }
    //*
    
    
    HQS_IOT END */ 

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

    ROV 仅显示调试挂起时终止的任务。 UART 记录器实时事件表示任务模块正在加载(CtxChg TSK data1= 0:0) Task.IOT、但在从(return;)断开第一个云连接后不再加载(bOnline)。

    如果在 while 循环的底部没有(return;)、则当任务模块似乎永远不会处理较高优先级的0 IDLE 记录器时、不会发生 UART0 Live IDLE 事件。

    如果没有(返回;)、为什么任务模块不控制 while 循环?????????????????????????

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    仅当任务函数在未处理 while 循环后立即返回时、才会指示 Task.IOT Live 事件(CtxChg)。

    Task.IOT in not Servicing a disconnected loop indicing ind沙 丘持续表示一个 Live 事件(Load、Data1 0.0)并且从不切换到(CtxChg)。

    在没有 TI-RTOS 的应用程序中、同样的功能也非常有用。 任务和 while 循环在不断开 TCP 底层 HAL 进程的情况下进行云连接时存在一些模糊的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在不运行 BIOS 的情况下启动 IOT.task while (1)循环任务,从而抢占任何调用(BIOS_Start)。
    因此 永远不会调用静态创建的 UARTLogger BIOS 空闲任务、也 不会发布任何 CCS 调试实时事件 COM 端口数据。 放置 BIOS_start 函数而不是(return)会启动静态 UARTLogger 空闲任务、但会在1个周期和 COM 端口活动事件出现后终止 IOT 任务。
     
    哇!

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

    我错了、被 RTOS 空闲 线程管理器加载(taskFxn)的错误骗了、 即使  它保持了优先级 (1)。 注释掉 BIOS_start、任务模块(加载 IOT。task) 会终止内核。 取消注释 BIOS_start 和 IOT。任务运行、但空闲打印实时事件任务 UART0 (taskFxn)永远不会被分配 任何(内核空闲时间) 来 打印实时事件。

    下面的静态任务由 静态内核 空闲 线程管理 器(隐藏 的 RTOS 任务)调用 (~_KNL_Idle_Loop _E) 应该加载如下  所示的任务(tskFxn)。

    /*
    === taskFxn ====
    *此函数的任务是静态创建的。 请参阅工程的.cfg 文件。
    */
    void taskFxn (UArg0、UArg0 arg1)
    {
    无符号整数转换持续时间= 100;
    unsigned int id =(unsigned int) arg0;
    unsigned int count = 0;
    
    while (1){
    Task_sleep (sleepDurs);
    log_print2 (Diags_User1、"任务%d 唤醒、计数=%d"、ID、计数);
    count++;
    }
    } 

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

    您好!

    根据您的第一条评论"很奇怪 、任务 模块 没有 为  列表中的每个任务分配节拍时隙"、我认为您对 TI-RTOS 调度程序(以及可能是大多数其他 RTOS 调度程序)有误解。 TI-RTOS 调度程序是抢先式调度程序。 因此、如果已准备好运行、则最高优先级的线程会运行。 因此、如果你放置一个 while (1);在优先级为 N 的任务中、优先级为0 -(N)的所有其他任务将永远不会运行。 注:我包含 N、而不是(N-1)。 该计划不会在优先级内执行循环(但是、有一个简单的技巧可以执行此操作)。 如果就绪、较高优先级的任务(或者 Swi 或 Hwi)将运行(或者针对 HwI/Swi 情况置位)。


    这有道理吗?

    Todd

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

    [引用 user="ToddMullanix"]该计划不会在优先级级别内循环

    后来发现的优先级(0) task_loop_E 是另一个创建的静态任务挂钩 、  在 (uartlogging.c)中找不到  、用于 SYSBIOS 堆栈 任务监视器等。

    事情是   、优先级更高的(1)静态(taskFnx)被首先调用 、 并且通常 显示 为就绪、如 ROV 所示。  低优先 级(8) IOTaskFxn while (1)循环 假定 下一 个最高优先级、 似乎内核优先于任务 Fxn (1) 以阻止时间、并且从未加载任务。 该任务或静态任务违反 了 SYS/BIOS 约束。

    (task.c)优先  级顺序错误似乎与 此帖子报告的条件匹配、并存在于 前几行附近。  

    TI-RTOS 文本状态 BIOS_start()调用 应该是 最后 一次调用 ,但它似乎 可以被调用,并且仍然在 应用程序中调用接下来的几行代码。

     CCS 调试记录器的嵌套函数调用在   (main.c)之外使用(BIOS_start)实时打印状态:

    BIOS_start();
    
    while (1)
    {
    /*休眠50ms */
    Task_sleep (sleepDurs);
    log_print2 (Diags_User1、"任务%d 唤醒、计数=%d"、0、计数);
    count++;
    } 

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

    必须在 main()中调用 BIOS_start()。 它必须是 main 中的最后一项、因为它永远不会返回。 您认为为什么要执行 BIOS_start 函数下的循环?

    在构建期间、空闲任务(优先级0)被静态创建。 当您在 main 中时、所有静态创建的任务都处于"就绪"状态(除非您创建时具有-1...inactive 的优先级)。 调用 BIOS_start 函数后、最高优先级的任务会一直运行、直到它阻断(例如、Task_sleep、具有非零超时的 Semaphore_pend 函数、并且不会发出信号、等等)。  

    您可以附加有问题的项目吗?  

    Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    另外、请注意优先级0是最低优先级。 高数字表示 TI-RTOS 具有高优先级。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="ToddMullanix"]编号高意味着 TI-RTOS 具有高优先级。

    奇怪 的     是、当尝试将0分配给任何新任务时、弹出消息会指出它是保留的、逻辑上最高优先级和1将是次高优先级。  M3 Hwi 中断优先级也是如此、 根据   帮助 文本、较小的值比较大的值具有更高的优先级。

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

    必须在 main()中调用

    ToddMullanix 说:
    BIOS_start()。 [/报价]

    文本状态 BIOS_start 必须是最后一次调用、 如果在(main.c)中执行、  如果放在外部、则不会返回该调用、 从未 在  (main.c)中声明它必须存在。  要点是非 RTOS 任务函数如何 执行 CCS 调试实时 诊断 打印、除非它 首先调用 BIOS_start 并且确实如此、 因为 while 循环 永远不会返回 到(main.c) 、如 上一帖子和下面的代码 snip 所示。 已在 (main.c)中验证本地打印在没有 BIOS_start 的情况下工作正常、但 RTOS IOT 打印任务会以某种方式返回、因为在 BIOS_start 函数之后才能执行该任务。 不确定 下面的物联网循环是如何 返回(main.c)执行 BIOS_start 的、但它似乎必须执行、或者任务是如何加载/运行的????   

     与独立任务相同的基本打印循环 会锁定 我的应用中的 USB 端口初始化、Tivaware USB 大容量设备驱动程序调用并 停止所有执行。  它甚至会与 TCP 混淆 以获取 IP 地址 、但 BIOS_Start 是 (main.c)中的最后一个调用。 将 打印循环代码 与客户端 IP 分配放回到一起 、所有操作再次成功。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    确定再次检查,但为什么保留最低优先级? 当相反的情况是典型的时、对我来说毫无意义。 在这种情况下、真的无关紧要、感谢您指出。 :-)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在每个任务睡眠时间内、代码可能会从 while (1)循环返回到(main.c)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您必须放慢速度:)让我们更有条理地处理这一点。

    最低任务优先级为0。 TI-RTOS 为空闲任务保留此值。 空闲任务执行后台操作、如 CPU 负载确定(如果启用)、Hwi 堆栈检查(如果启用)、电源管理(如果启用)等。 您可以将自己的函数插入空闲任务。

    2.任务优先级的数量由.cfg 文件中的 Task.numPriorities 决定。 如果未设置、则大多数器件采用默认值16。

    系统中的最高优先级是 Task_numPriorities - 1.

    4.必须从 main()调用 BIOS_start 函数,并且它永远不会返回。 如果您有测试用例证明了其他情况、请附加完整项目。

    在回答其他问题之前、请确保我们处于与上述陈述相同的页面。

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

    [引用 user="ToddMullanix">您可以将自己的函数插入空闲任务。
    [/报价]

    再次检查 发布的 ROV 捕获 表明 是用于启动 User1诊断打印任务的方法。

    [引用 user="ToddMullanix"]任务优先级的数量由.cfg 中的 Task.numPriorities 决定

    知道 总共16个任务 、但不知道(1)  被视为最高优先级、也不知道是否与硬件优先级语义保持一致。  优先级 值未在 RTOS 任务优先 级帮助文本中讨论。

    ToddMullanix 说:
    BIOS_start 必须从 main()调用,并且永远不会返回

    使用  while (User1 print)发布的上述任务并非真实且经过验证。 BIOS_Start 位于(main.c)之外、并打印调试实时状态、从而 指示 正在 调用 BIOS 任务。

    ToddMullanix 说:
    让我们确保我们位于包含上述语句的同一页上

    我在(uartlogg.c)中注释静态创建任务的唯一原因是、在 BIOS_start 之前的(1)调用期间、当我引入应用程序时、该任务停止工作。  静态任务 User1打印任务不应在 BIOS_start 函数被调用时被抢先或禁用、无论从何处调用! 因此、似乎有一个宽松的任务限制 、例如 甚至不知道。

    已发现如果 中的 User1 UART 打印任务未在 (main.c)中静态创建 、则可以在 (main.c)之外调用 BIOS_start。  也许可以停止在   TI 示例中执行静态任务、而是将 示例任务或桩线添加到任务模块中、以便后续程序员可以轻松 地将 应用程序合并到任务调用堆栈中以用于 UIA 诊断。

    BIOS_start 必须能够调用(main.c)以外 的顺序 、以便将一个应用程序 while (1)循环添加 到内核任务控制模块中。 特别是  由于任务模块 线程管理器 在 (main.c)中未静态创建任务时似乎失去了对虚拟任务内存空间的控制。   在我看来、SYS/BIOS 主要是一种诊断工具、不应以  示例试图强制馈送的方式接管 TM4C 外设调用、而 PWM0 BIOS 初始化调用是一个很好的例子、说明了如何以任何方式不执行此操作!  添加到 BIOS 内核 的应用程序平台主要用于 UIA 诊断、通常处理所有外设 配置、而不是其他方式。 BTW: 多个程序示例 TM4C1294NCPDT 随意添加 LaunchPad 静态任务按钮扫描 (未找到 示例项目) 在      向 任务模块添加2个新任务名称后、ROV 现在将占先2。

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

    ToddMullanix 说:
    BIOS_start 必须从 main()调用,并且永远不会返回

     下面 的帮助文本中的语句似乎解释了根据   任务 放置的上下文、创建挂钩如何具有不同的行为。  在 (main.c)中创建的静态任务的 UARTLogger 示例实时打印 是导致  动态 任务条目发生的任何其他用户应用程序任务调用立即 被抢先的罪魁祸首。  他们根本没有调用的动态任务的优先级无关紧要。

    我的案例第二个动态任务(本地 Telnet 客户端)由于 EMAC0链路状态寄存 器测试 (bHaveLink) 未包含在  IP 地址分配(用于循环)中而导致 BIOS 崩溃。 如果没有集成 到 应用程序中的 BIOS、这不是问题、即使在 for 循环中放置了多个位置、1秒的延迟也没有帮助。 因此 、在过去、复位后的 EMAC 链路状态初始化必须 有更少的时间来恢复链路状态、以影响 BIOS 崩溃的任何内容。 奇怪的是、TI 示例以太网应用程序不检查 DHCP 循环中的 EMAC0链路状态寄存  器、因为我已添加到循环的 IP 地址分配中、该分配修复了 SYS/BIOS 动态任务调用中的 LWIP v1.4.1地址分配。

    现在一切都很好、两个动态任务 都运行/阻止并具有调试空闲诊断实时状态打印 、但(main.c)中没有静态任务。

    创建:创建任务时调用的函数。 这包括静态创建的任务以及使用创建或构造动态创建的任务。 对于静态创建的任务,在 main()和中断启用之前调用 create hook。 对于动态创建或构造的任务,在创建或构造任务的相同上下文中调用 create hook,即如果在 main()中创建了一个任务,则在主上下文中调用 create hook,如果在另一个任务中创建了该任务, 它在任务上下文中调用。 创建挂钩在 Task_disable/enable 块之外调用、并在任务添加到就绪列表之前调用。

    谢谢 Todd