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.
工具/软件:Code Composer Studio
我们知道、任务可以静态和动态创建、而动态创建的任务可以随时消失。 下面是我的问题:
RTOS 如何知道有多少任务是动态运行的?
2.如果 RTOS 知道动态运行任务、如何以及在何处动态获取所有运行任务的名称?
谢谢、
谢谢 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'
);
运行焊接机
正在运行输入器
任务数= 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 值。
[引用 user="Neil Lu"]我仍然想知道为什么从未在这里使用 Task_Object *数组参数而不是 NULL 值。
我不确定这一决定的历史。