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.

[参考译文] RTOS/CC2650:如何启动和停止线程

Guru**** 2551110 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/567020/rtos-cc2650-how-start-and-stop-thread

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

工具/软件:TI-RTOS

你好

我想创建一个用于 LED 闪烁的线程。

我执行此代码:

void VD_APP_BlinkChoUSE_createTask (void)

Task_Params taskParams;

//配置任务
Task_Params_init (&taskParams);
taskParams.stack = u8_AppChooseBlinkTaskStack;
taskParams.STACKSIZE = APP_SELECK_TASK_STACK_SIZE;
taskParams.priority = 1;

TaskBlink = Task_create (&VD_APP_CHOOSE_BBIK_taskFxn、&taskParams、NULL);

要停止线程,我执行以下代码: Task_delete (&TaskBlink);。

但我的软件出现运行时错误。  

我已经执行 Task_exit();在我的闪烁线程中,执行 Task_delete,但不起作用。

您能解释一下如何启动和停止以及重新启动...等等一个线程吗?

谢谢

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

    您好!

    我可以想到发生这种情况的几个原因:

    • Task_delete ()可被从中断上下文调用、这是不允许的。
    • 可以启用自动删除已终止任务、在这种情况下、不允许应用程序代码删除任务。
    • 当前运行的任务是调用 Task_delete ()的任务,不允许这样做。

    如果启用了自动删除,则如果调用 Task_exit(),任务将自动删除。

    谢谢、
    Gerardo

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

    你好

    我不从中断上下文调用 Task_delete ()。

    我不会从要删除的任务中调用 Task_delete ()。

    我激活自动删除终止任务并删除 Task_delete ()的调用。 只需从要删除的任务中调用 Task_exit。

    我有相同的问题。  在我的 Disassembly 窗口中,我 可以看到我的代码被停止“XDC_runtime _Error_PolicySpin__E:0x2848:0xE7FE……” "

    谢谢

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

    您是否查看过 ROV (工具菜单下)以查看是否检测到任何错误?
    在 BIOS -> Scan for errors (BIOS ->扫描错误)中查找
    并在"任务"下查看。

    另外、请查看调用堆栈或调试窗口以查看导致问题的代码行。
    您的调试器需要暂停。 您可以附加任何错误消息或窗口的屏幕截图、以帮助我们了解问题所在。

    我建议您禁用自动删除并将 Task_delete 重新放入代码中。 您还必须离开 Task_exit 才能使删除生效。

    请告诉我们您的发现。

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

    你好

    我找不到 ROV。 我在 IAR 工作。

    我禁用 Task.deleteTerminatedTasks 并在  另一个任务的 Task_exit()之后执行 Task_delete (&TaskBlink)

    但问题仍然存在。

    添加我的 c 文件和屏幕截图

    最棒的餐厅

    e2e.ti.com/.../7181.app_5F00_choose.c

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

    我知道 ROV 可用于 IAR、但我不知道如何将其添加到 IAR 项目中。 也许 TI 的某个人可以帮您解决这个问题。

    您可以附加 CallStack 的屏幕截图吗? (您可以从“查看”菜单打开调用栈)

    此外、您能否检查 Task_getMode (...) 如果您在尝试删除任务之前从调用它、则返回? 以下是该函数的原型:

    Task_Mode Task_getMode (Task_Handle handle); 

    可能的返回值:

    typedef 枚举 Task_Mode{
    Task_Mode_Running、
    //任务当前正在执行
    Task_Mode_ready、
    //任务被安排执行
    Task_Mode_Blocked、
    //任务被暂停执行
    Task_Mode_Terminated、
    //任务从执行终止
    Task_Mode_inactive
    //任务在非活动任务列表
    中} Task_Mode; 


    此致、

    米歇尔

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

    1.右键单击您的项目并选择"Options..."。

    2.从左侧菜单中选择"Debugger"。 转至"Plugins"选项卡并向下滚动、直至看到"TI-RTOS"项。 确保选中该复选框。

    3.通过调试器连接时选择"TI-RTOS"菜单项。

    Derrick

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

    你好

    要删除任务、我使用此代码。

    void VD_APP_BlinkChoUSE_deleteTask (void)

    U8_Blink = false;

    while (Task_getMode (TaskBlink)!= Task_Mode_Terminated)

    Task_sleep ((((100)* 1000)/ Clock_tickPeriod);


    Task_delete (&TaskBlink);

    但问题仍然存在

    IAR 窗口

    谢谢

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

    在创建任务时可能会遇到问题。

    请问我的代码是否正确?

    Task_Params taskParams;
    Error_Block EB;
    
    //配置任务
    Task_Params_init (&taskParams);
    Error_init (&EB);
    taskParams.instance->name ="Blink";
    taskParams.stack = u8_AppChooseBlinkTaskStack;
    taskParams.STACKSIZE = APP_SELECT_STACK_SIZE;
    taskParams.priority = 1;
    
    TaskBlink = Task_create (&VD_APP_SELECT_BBIK_taskFxn、&taskParams、&EB); 

    此致

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

    如果这可以帮助我加入我的文件 app_ble.cfg

    谢谢

    e2e.ti.com/.../3531.app_5F00_ble.cfg

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

    您好!

    是否可以尝试将.cfg 文件的第688行中的以下设置更改为 true:

    Task.deleteTerminatedTasks = bool true;

    SysBIOS 将在调用 Task_exit()后自动删除任务。

    注意:如果启用了此功能,则会安装一个空闲函数,该函数将删除通过任务函数或显式调用 Task_exit()终止的动态创建的任务。 启用此功能后、如果用户的应用程序尝试删除已终止的任务、则会产生错误。 如果已终止的任务已经被自动删除、然后用户的应用程序尝试删除它(例如:使用过时的任务句柄)、结果未定义、可能是灾难性的!

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

    不幸的是、我已经意识到了这项测试。
    但问题仍然存在

    您是否有其他想法?

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

    您使用 HeapMin 进行存储器管理(在您之前发布的.cfg 文件中)。 我刚刚查看了 SYSBIOS 用户指南、发现了以下内容:

    HeapMin 是一种占用空间最小的堆实现。 此模块设计用于通常在运行时分配内存和创建模块实例、但绝不显式删除创建的实例或释放内存的应用程序。

    HeapMin 不支持释放内存。 默认情况下,如果应用程序调用 HeapMin_free (),则会以错误状态中止。

    不确定这是否是问题的原因、但值得一试。 查看 SYSBIOS 用户指南内存管理部分、了解哪种堆最适合您的需求。

    Regads、

    米歇尔

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

    除了 Michel 的建议之外、我建议您的应用程序仔细检查您的任务处理。

    在调用 Task_exit()之前,我建议将任务句柄设置为 NULL。
    在调用 Task_delet()之前,我建议检查任务句柄是否为 NULL。

    Derrick

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

    谢谢、我下周测试了这个。
    我会随时通知您。

    此致