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.

[参考译文] CCS/TMS320C6678:Task_sleep()阻止任务并且从不返回控件。 AM572x C66x

Guru**** 2933740 points

Other Parts Discussed in Thread: SYSBIOS, AM5728

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/668066/ccs-tms320c6678-task_sleep-blocks-the-task-and-never-returns-the-control-am572x-c66x

器件型号:TMS320C6678
Thread 中讨论的其他器件:SYSBIOSAM5728

工具/软件:Code Composer Studio

我已经创建了简单的代码来创建一个任务并将其休眠10微秒,但是在控制之后,永远不会从 Task_sleep()返回。 我签入了 ROV,任务在 Task_sleep()调用上进入被阻止状态,从不进入运行状态。

#include

#include
#include

#include

#include
#include

/*
*==== taskFxn ====
*
void taskFxn (UARg a0、UARg A1)

System_printf ("Clock_tickPeriod:%d\n"、Clock_tickPeriod);
//System_printf ("Clock_tickPeriod:%d\n"、Clock_);
system_printf ("enter taskFxn ()\n");

Task_sleep (10);

system_printf ("exit taskFxn ()\n"\});

system_flush();/*强制 SysMin 输出到控制台*/

/*
*==== main ====
*
int main()

Task_Handle 任务;
Task_Params t_params;

ERROR_Block EB;

system_printf ("enter main()\n");

ERROR_INIT (&EB);

Task_Params_init (&t_params);
t_params.instance->name ="task0";
T_params.STACKSIZE = 4096;

任务= Task_create (taskFxn、&t_params、&EB);

if (任务==空)

System_printf ("Task_create() failed!\n");
BIOS_exit (0);

BIOS_start();/*不返回*/
system_printf ("exit main()\n");
返回(0);

 

 

 

配置文件:

VAR 任务= xdc.useModule('ti.sysbios.knl.Task');
VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
VAR 计时器= xdc.useModule('ti.sysbios.hal.Timer');
VAR Hwi = xdc.useModule('ti.sysbios.hal.Hwi');
VAR Swi = xdc.useModule('ti.sysbios.knl.Swi');
VAR 时钟= xdc.useModule('ti.sysbios.knl.Clock');
clock.tickPeriod = 1000;
clock.tickMode = Clock.tickMode_Periodic;
VAR 启动= xdc.useModule('xdc.runtime.Startup');
VAR 信标= xdc.useModule('ti.sysbios.knl.Semaphore');
VAR 事件= xdc.useModule('ti.sysbios.knl.Event');
VAR 邮箱= xdc.useModule('ti.sysbios.knl.Mailbox');
VAR SysStd = xdc.useModule('xdc.runtime.SysStd');
VAR 系统= xdc.useModule('xdc.runtime.System');

System.SupportProxy = SysStd;

Task.defaultStackSize = 4096;
//Task.deleteTerminatedTasks = true;
task.numPriorities = 25;
task.allBlockedFunc =空;
SWI.numPriorities = 30;
program.heap = 8192;
Semaphore.supportsEvents = true;

/*
task.enableIdleTask = true;
VAR task0Params = new Task.Params();
task0Params.instance.name ="task0";
task0Params.priority = 10;
task0Params.arg0 = 10;
task0Params.arg1 = 20;
program.global.task0 = Task.create ("&task0fxn"、task0Params);*/
Clock.swiPriority = 15;

e2e.ti.com/.../task_5F00_sleep.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    团队将收到通知。 他们将直接在此处发布反馈。

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

    首先、请注意、时钟的周期设置为1ms (这是默认设置)。 Task_sleep 的参数是节拍数。 因此 Task_sleep (10)将睡眠10ms、而不是10us。

    我有一些问题。
    1.是否可以将 Task.numPriorities 和 Swi.numPriorities 值更改为2的幂(例如2、4、8、16或32)? 我认为这些不是目前的两个权力。 这是否解决了问题?
    2.您是否在 IDE 控制台中获得第一个 System_printf 输出(即"Clock_tickPeriod:x")?
    3.是否可以让目标运行一个位(>10ms)并暂停。 然后查看以下各项
    a. Tools->ROV->Clock->Module:什么是时钟节拍值。 它应该为非零(如果您运行/停止、则增加)。
    b. Tools->ROV->Task->Detailed:是否可以附加此视图的快照?
    c. Tools->ROV->BIOS->模块:什么是 currentThreadType?

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

    您好 Todd、

    感谢您的回复。

    我尝试了您建议的步骤、但没有成功。

    Task.numPriorities = 16;

    SWI.numPriorities = 16;

    Clock.swiPriority = 8;

    IDE 控制台输出

    输入 main()
    Task_getPri (task):1.
    Clock_tickSource:0
    Clock_getTicks:0

    Clock_tickPeriod:1000
    输入 taskFxn()
    Clock_getTicks:0

    … 由于在 Task_sleep (10)后控制权不返回、因此没有进一步的响应

    快照已附加。

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

    ROV 说任务正在运行而不是被阻止、这一点有点可疑。 是否可以附加.cfg 以及包含 main()和 taskFxn 的文件? 请附上、不要复制/粘贴。 它使线程更易于读取。

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

    尊敬的 Todd:

    快照在运行具有断点的程序之后和执行 Task_sleep()之前共享。

    Task_sleep()之后,任务被阻止,无法获取 ROV 中的任何信息,因为它始终显示“正在获取信息”。

    它是用于 AM57xx 芯片的 Beagle Board Ver0。

    CCS 版本:6.1.2

    e2e.ti.com/.../8662.task_5F00_sleep.zip

    这些文件会附加以供您参考(代码、.cfg、.ccxml、IDE 控制台 logs.txt)。

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

    谢谢。 我使用了您的应用程序(尽管在不同的器件上)、它对我很有用。 但是我没有创建另一个计时器。 我没有 Beagle 板。

    [引用 user="Yogesh Verma"]对于 Task_sleep(),任务被阻止,无法获取 ROV 中的任何信息,因为它始终显示“正在获取信息”。

    当您在运行到 Task_sleep 后停止目标时、调试窗口中的调用堆栈是什么? 我应该处于空闲状态(或者至少在大部分时间处于空闲状态)。 您能在 ROV->Hwi 中查看是否有异常吗?  

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

    尊敬的 Todd:

    我签入了 ROV->HWI,发现没有例外。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当您在运行到 Task_sleep 后停止目标时、调试窗口中的调用堆栈是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Yogesh、

    这是否得到了解决?

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

    尊敬的 Todd:

    我将 SoC 更改为 AM5728、它起了作用。

    感谢您的支持