工具/软件:TI-RTOS
奇怪的是 、任务 模块 没有 为 列表中的每个任务分配节拍时隙、 如果 优先级较低的任务具有[while (1)]循环。 唯一的另一个独特方面是 (taskFxn (1))在 UARTLogger 示例项目中被静态创建。
为什么静态任务 条目 会失去较 高的优先级? 如何使 while 循环中的任务不 会持续占用所有 任务时间、因此(~.IdleTask) 获得 一些 MCU 时间份额?
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.
工具/软件: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 循环?????????????????????????
在不运行 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
必须在 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 分配放回到一起 、所有操作再次成功。
[引用 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