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/TM4C1294NCPDT:动态查找 RTOS 项目(模块)中的所有任务

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/825494/ccs-tm4c1294ncpdt-dynamically-find-all-the-tasks-in-rtos-project-module

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:SYSBIOS

工具/软件:Code Composer Studio

我们知道、任务可以静态和动态创建、而动态创建的任务可以随时消失。  下面是我的问题:

RTOS 如何知道有多少任务是动态运行的?

2.如果 RTOS 知道动态运行任务、如何以及在何处动态获取所有运行任务的名称?

谢谢、  

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

    您好、Neil、

    查看 SYS/BIOS API 参考(CDOC)。 如果您使用的是用于 TivaC 的 TI-RTOS、则可以在 docs\Documentation_Overview_tivac.html 中找到该链接。

    下面是查找静态和动态创建的任务的方法。 我们不会维护动态构建的任务(例如 Task_construction)的列表。 因此、我们没有为它们设置 API。

    Todd

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

    谢谢 Todd 提供的宝贵信息。 我在我的项目中尝试过这些操作、需要您进一步帮助:

    这是空闲任务中函数调用的一部分:

    void mtFxn (void)

    uint32时间;
    int numTask = 0;
    numTask = Task_Object_count();
    Task_handle task_handle = Task_Object_First();
    int i;
    System_printf ("任务数=%d.\n"、numTask);
    System_printf (“任务名称=%s。\n",Task_Handle_name(Task_Handle));

    2.以下内容位于.cfg 文件中  

    VAR task6Params = new Task.Params();
    task6Params.instance.name ="焊机";
    task6Params.priority = 10;
    task6Params.STACKSIZE = 1024;
    program.global.welder_task = Task.create ("&wdFxn"、task6Params);


    task6Params.instance.name ="输入器";
    task6Params.priority = 5;
    task6Params.STACKSIZE = 512;
    program.global.filer_task = Task.create ("&fdFxn"、task6Params);

    结果如下:

    运行焊接机
    正在运行输入器
    任务数= 3.
    任务名称={unknown-instance-name}。

    问题:

    为什么获取"未知实例名称"?  哪里出错了?

    谢谢、

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

    尼尔

    确保在.cfg 文件中设置以下内容

    var text = xdc.useModule('xdc.runtime.Text');
    
    text.isLoaded = true;
    
    var Defaults = xdc.useModule('xdc.runtime.Defaults');
    
    Defaults.common$.namedInstance = true; 

    我们将名称默认不包括在目标中以节省占用空间。

    Todd

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

    感谢您、Todd、我的.cfg 文件中恰好有前三条语句:

    var Text = xdc.useModule('xdc.runtime.Text');
    Text.isLoaded = true;
    var Defaults = xdc.useModule('xdc.runtime.Defaults');
    和  
    Defaults.common$.namedModule = true;
    复制并粘贴以下内容后:
    Defaults.common$.namedInstance = true;
    该方案产生了以下结果:

    运行焊接机
    正在运行输入器
    任务数= 3.
    任务名称= ti.sysbios.family.arm.m3/Hwi:第1095行:e_hardFault:Forced
    TI.SYSBIOS.family.ARM.m3/Hwi:第1172行:E_BUSFault:PRECISERR:立即总线故障、确切的已知地址、地址:4608020e
    在 PC = 0x000047b0的后台线程中发生异常。
    内核0:ThreadType_Task 中发生异常。
    任务名称:TI.SYSBIOS.KNL.Task.IdleTask、句柄:0x20001cb0。
    任务堆栈基地址:0x20000960。
    任务堆栈大小:0x200。
    R0 = 0x4608020e R8 = 0x0000000c
    R1 = 0xFFFF R9 = 0x00000000
    R2 = 0x4608020d R10 = 0x00000000
    R3 = 0x20000afc R11 = 0xffffffff
    R4 = 0x00000000 R12 = 0x00000000
    R5 = 0xffffffff SP (R13)= 0x20000a98
    R6 = 0x00001b23 LR (R14)= 0x0000065b
    R7 = 0x20000afc PC (R15)= 0x000047b0
    PSR = 0x21000000
    ICSR = 0x00423803
    MMFSR = 0x00
    BFSR = 0x82
    UFSR = 0x0000
    HFSR = 0x40000000
    DFSR = 0x0000000A
    MMAR = 0x4608020e
    BFAR = 0x4608020e
    AFSR = 0x00000000
    正在终止执行...

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

    尼尔

     我希望您的空闲堆栈大小太小。 请尝试增大该值。 请查看以下 内容、了解有关堆栈使用和调试异常的更多详细信息:https://training.ti.com/debugging-common-application-issues-ti-rtos

    Todd

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

    在两者都更改后:

    program.stack = 2048 / 768;

    Task.idleTaskStackSize = 2048;//512

    获取:

    运行焊接机
    正在运行输入器
    TI.SYSBIOS.family.ARM.m3/Hwi:第1095行:E_hardFault:Forced
    TI.SYSBIOS.family.ARM.m3/Hwi:第1172行:E_BUSFault:PRECISERR:立即总线故障、确切的已知地址、地址:fffffff8
    在 PC = 0x0000483a 的后台线程中发生异常。
    内核0:ThreadType_Task 中发生异常。
    任务名称:TI.SYSBIOS.KNL.Task.IdleTask、句柄:0x20002ab0。
    任务堆栈基地址:0x20000960。
    任务堆栈大小:0x800。
    R0 = 0x00000000 R8 = 0xffffffff
    R1 = 0x20002e94 R9 = 0xffffffff
    R2 = 0x00004979 R10 = 0xffffffff
    R3 = 0x00000001 R11 = 0xffffffff
    R4 = 0x00000000 R12 = 0x00000000
    R5 = 0x00006824 SP (R13)= 0x20001110
    R6 = 0xffffffff LR (R14)= 0x00004a2b
    R7 = 0xffffffff PC (R15)= 0x0000483a
    PSR = 0x61000000
    ICSR = 0x00423803
    MMFSR = 0x00
    BFSR = 0x82
    UFSR = 0x0000
    HFSR = 0x40000000
    DFSR = 0x0000000A
    MMAR = 0xffffff8.
    BFAR = 0xfffffff8
    AFSR = 0x00000000
    正在终止执行...

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

    当我使用原始设置时、它毫无例外地运行。 如下所示:

    运行焊接机
    正在运行输入器
    任务数= 3.
    任务名称={unknown-instance-name}。
    正在运行焊机
    焊机 stack_used_percentage 为26.9531
    正在运行输入器
    进料器 STACK_USED_Percentage 为50.7812

    唯一的问题是 Task_handle_name (task_handle)为什么返回  {unknown-instance-name}?

    第一个 Task_Handle 空闲任务吗?

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

    尼尔

    您是否 在使用 Task_Object_First()之前检查了它的返回值。 如果没有动态创建的任务、则可以为 NULL。  

    请记住:  

    Task_Object_count 和 Task_Object_Get 用于静态创建的任务

    Task_Object_First 和 Task_Object_Next 用于动态创建的任务(例如通过 Task_create)。

    没有用于动态构建的任务(例如 Task_constructure)的 API。

    Todd

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

    大家好,Todd, Task_Object_get()似乎不关心项目实际拥有多少个任务?  查找我正在运行的代码、其中 I = 0、1、2、3和10。

    Task_handle task_handle;
    Task_handle = Task_Object_get (NULL、0);
    if (task_handle == NULL){
    System_printf (“handle is NULL”);

    否则{
    System_printf (“任务名称=%s。\n",Task_Handle_name(Task_Handle));
    System_printf ("task_handle 地址=%x.\n"、_task_handle);
    system_printf ("task_handle 值=%x.\n"task_handle);

    Task_handle = Task_Object_get (NULL、1);
    if (task_handle == NULL){
    System_printf (“handle is NULL”);

    否则{
    System_printf (“任务名称=%s。\n",Task_Handle_name(Task_Handle));
    System_printf ("task_handle 地址=%x.\n"、_task_handle);
    system_printf ("task_handle 值=%x.\n"task_handle);

    Task_handle = Task_Object_get (NULL、2);
    if (task_handle == NULL){
    System_printf (“handle is NULL”);

    否则{
    System_printf (“任务名称=%s。\n",Task_Handle_name(Task_Handle));
    System_printf ("task_handle 地址=%x.\n"、_task_handle);
    system_printf ("task_handle 值=%x.\n"task_handle);

    Task_handle = Task_Object_get (NULL、3);
    if (task_handle == NULL){
    System_printf (“handle is NULL”);

    否则{
    System_printf (“任务名称=%s。\n",Task_Handle_name(Task_Handle));
    System_printf ("task_handle 地址=%x.\n"、_task_handle);
    system_printf ("task_handle 值=%x.\n"task_handle);

    Task_handle = Task_Object_get (NULL、10);
    if (task_handle == NULL){
    System_printf (“handle is NULL”);

    否则{
    System_printf (“任务名称=%s。\n",Task_Handle_name(Task_Handle));
    System_printf ("task_handle 地址=%x.\n"、_task_handle);
    system_printf ("task_handle 值=%x.\n"task_handle);

    我的项目只有3个任务、包括空闲任务、但 Task_Object_Get (NULL、int I)的第二个参数 I 可以是任何整数、如下所示

    运行焊接机
    正在运行输入器
    任务名称={unknown-instance-name}。
    Task_handle 地址= 20000b28。
    Task_handle 值= 20001c10。
    任务名称={unknown-instance-name}。
    Task_handle 地址= 20000b28。
    Task_handle 值= 20001c5c。
    任务名称={unknown-instance-name}。
    Task_handle 地址= 20000b28。
    Task_handle 值= 20001ca8。
    任务名称={unknown-instance-name}。
    Task_handle 地址= 20000b28。
    Task_handle 值= 20001cf4。
    任务名称={unknown-instance-name}。
    Task_handle 地址= 20000b28。
    Task_handle 值= 20001f08。
    任务数= 3.
    正在运行焊机

    无论我是什么、此函数都将返回一个不带程序的 Task_handle。

    谢谢

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

    尼尔

    以下是展示该功能的所有排列的示例。 只需将其内容复制/粘贴到简单的 TI-RTOS 项目中(例如空)即可。 例如、将 mutex.cfg 的内容复制到 empty.cfg 中。 mutex.c 文件也是如此。

    /cfs-file/__key/communityserver-discussions-components-files/81/2185.mutex.c

    /cfs-file/__key/communityserver-discussions-components-files/81/mutex.cfg

    构建并运行。 您应该会看到:

    有3个静态创建的任务
    0:name ={empty-instance-name}
    1:name = bar
    2:name = ti.sysbios.KNL.Task.IdleTask
    动态创建的任务
    0:name ={empty-instance-name}
    1:name = task2
    动态构建的任务
    name = task3 

    Todd

    [更新:下一个员额的执行情况更好。 它涵盖了零个动态创建的任务的情况]

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

    实际上、mutex.c 文件中有一个小的尼特。 我将 DO 循环更改为 while 循环。 以下是更好的版本:

    /cfs-file/__key/communityserver-discussions-components-files/81/6076.mutex.c

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

    非常感谢您、Todd、您的资源非常丰富、乐于助人。  它会像您一样运行并获得准确的结果。  我认为我可以更好地掌握 我的大多数问题。  我还想知道为什么这里从未使用 Task_Object *数组参数而不是 NULL 值。

    Task_handle Task_Object_get (Task_Object *数组、 int i);
    // 静态创建的第 i 个实例对象的句柄(数组=NULL)
    您能解释一下原因吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Neil Lu"]我仍然想知道为什么从未在这里使用 Task_Object *数组参数而不是 NULL 值。

    我不确定这一决定的历史。