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.

[参考译文] TM4C1294NCPDT:NDK 任务不会挤占应用任务

Guru**** 2445440 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/633406/tm4c1294ncpdt-ndk-task-not-pre-empting-application-task

器件型号:TM4C1294NCPDT

您好!

我正在基于 TI RTOS tcpEcho 示例构建应用程序、其中 tcpWorker 任务在被调用时发出信号量、然后启用另一个应用程序任务运行。 为了进行练习、我已使被调用的应用程序任务包含无限循环(任务从未完成。) 我想知道如何使 tcpWorker 任务在应用程序任务运行时抢占应用程序任务。 我已使我的应用程序任务在配置文件中具有优先级1、但在应用程序任务运行时、tcpWorker 任务仍然永远不会运行。 要使 tcpWorker 优先于应用程序任务,我需要做什么? (请参阅下面的代码片段。)

空 tcpWorker (UARg arg0、UARg arg1)
{
int clientfd =(int) arg0;
int bytesRcvd;
int bytesSent;
char buffer[TCPPACKETSIZE];

System_printf ("tcpWorker:start clientfd = 0x%x\n"、clientfd);

Semaphore_post (Semaphore0);

while ((bytesRcvd = recv (clientfd、buffer、TCPPACKETSIZE、0))> 0){
字节 Sent = SEND (clientfd、buffer、字节 Rcvd、0);
if (bytesSent < 0 || bytesSent!= bytesRcvd){
System_printf ("错误:发送失败。\n");
中断;
}
}
system_printf ("tcpWorker stop clientfd = 0x%x\n"、clientfd);

Close (clientfd);
}

//……

void Task_0_Fxn (void){
while (1){
Semaphore_pend (Semaphore0、BIOS_wait_forever);
while (1){
//...
}
}

谢谢你

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

    您能否查看 Tools->ROV->Tasks->Detailed 以查看任务的状态以及同时查看所有优先级。 此外、检查 ROV 中的信标、以查看是否布置了信标0。

    如果您在.cfg 文件中使用 SysMin、您也可以在 ROV->SysMin -> Data Buffer 中查看此处的输出(或类似的内容...我不在工作 PC 上、因此无法验证确切的名称)。

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

    我知道发出信标0是因为在第一次以太网传输到控制器(我没有粘贴在这里的无限循环中有代码)和控制器回波通过以太网提供的内容(tcpWorker 执行它的操作)后、Task_0_Fxn 中的无限循环开始执行。 问题是后续以太网传输(在 Task_0_Fxn 无限循环运行时)永远不会从控制器中得到回声、这意味着 tcpWorker 任务在后续以太网传输中不会运行到完成。 这使我认为 tcpWorker 任务由于优先级而无法抢占 task0。

    使用 ROV、我能够查看所有任务及其优先级。 任务0的优先级低于"NDK 堆栈线程"-这意味着它应该运行? 或者它们的优先级值是否不可比?

    这两个任务也被列出为"就绪"。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果两个线程都"就绪"、那么优先级更高的线程正在运行。 正在运行什么? 更高优先级的任务、Swi 还是 Hwi? 您可以在当前 ThreadType 下的 ROV->BIOS->Module 中查看当前运行的线程类型,然后在线程中(例如 Hwi、Swi 或任务)查看正在运行的线程类型。

    注意:优先级1是最低优先级(空闲除外、它为0)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Todd、

    抱歉、我未正确使用 ROV。 我在 Task_0_Fxn 的无限 while 循环中放置了一个断点、一旦控制器到达该断点、ROV 任务窗口就像这样:  

    这看起来是"正确的"吗? 为什么将 tcpHandler 和 tcpWorker 降级为优先级1? 此外、为什么所有 NDK 任务都被阻止?

    谢谢你

    编辑:正确插入图像

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如何创建 tcpHandler 和 tcpWorker? 如果您没有在传递到 Task_craete (或 Task_con构)的参数中明确设置它、则默认优先级为1。

    由于 Task_0处于一个无限循环中、没有针对具有相同或较低优先级的任务的上下文切换。

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

    我没有更改 tcpWorker 和处理程序中的任何设置-它们与 tcpEcho 示例中的设置完全相同。 如何提高这些任务的优先级? 另外,如果 NDK 堆栈线程的优先级为2 (2>1),为什么它也被阻止? 在配置文件的 TI-RTOS ->产品-> NDK ->网络调度选项卡中、网络任务优先级为3、5、7和9 (默认)。 因此、它们是否应该抢占最低优先级任务0?

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

    tcpHandler 创建代码

      Task_Params_init (&taskParams);
      taskParams.STACKSIZE = TCPHANDLERSTACK;
      taskParams.priority = 1;
      taskParams.arg0 = TcpPort;
      taskHandle = Task_create ((Task_FuncPtr) tcpHandler、&taskParams、&EB);

    tcpWorker 创建代码没有显式的优先级设置、因此默认值为1

      Task_Params_init (&taskParams);
      taskParams.arg0 =(UArg) clientfd;
      taskParams.STACKSIZE = 1280;
      taskHandle = Task_create ((Task_FuncPtr) tcpWorker、&taskParams、&EB);

    NDK 堆栈可能会被阻止、等待以太网驱动程序的输入。 不会被 task_0阻止。 当数据进入以太网时、它将解除阻止、处理数据、然后返回到块、等待更多数据接收(或发送)。  

    NDK 用户指南(第3.1.2.1节)讨论了 NDK 的优先级。  

    基本问题是、您添加了另一个处于无限循环中的任务、因此它将在该级别和更低级别上无法完成其他任务。 如果您将 tcpWorker 和 tcpHandler 上移一个级别,则问题应该会消失。

    Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Todd。 将这些优先级更改为1以上的控制可解决此问题。