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/LAUNCHXL-CC2650:使用 Task_con构 调用多个函数。

Guru**** 2589245 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/591838/rtos-launchxl-cc2650-call-multiple-functions-with-task_construct

器件型号:LAUNCHXL-CC2650

工具/软件:TI-RTOS

大家好、

我正在处理一个项目、我已经有2个子程序。 基本上、一个程序将数据写入 SD 卡、一个程序将通过 BLE 发送数据、现在我需要编写一个程序来为这两个函数提供数据。 两者都可以通过主函数中的 Task_construct(&task0Struct,(Task_Functr)myTaskFxn、&taskParams、NULL)来调用。 我的问题是:

对于主程序(提供数据)、我只需要调用一次 Task_construction、我可以调用主函数中连接到 Task_construction 的2个函数、或者我是否需要3个具有不同优先级的不同 Task_construction?

Task_params 的堆栈和 STACKSIZE 到底是什么? 我如何估计任务大小?

我对 RTOS 和硬件编程的工作很少、因此非常感谢您提出任何建议和建议。

谢谢、

Henry

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

    以下是在 main()中构建3个任务的示例

    #define TASKSTACKSIZE 1024

    空任务1Fxn (UARg arg0、UARg arg1);
    空 task2Fxn (UARg arg0、UARg arg1);
    空 task3Fxn (UArg0、UArgarg1);

    Task_Structtask1Struct, task2Struct, task3Struct;

    char task1stack[TASKSTACKSIZE]、task2stack[TASKSTACKSIZE]、task3stack[TASKSTACKSIZE];

    MAIN ()

    {  

      Task_Params taskParams;

      Task_Params_init (&taskParams);

      taskParams.STACKSIZE = TASKSTACKSIZE;

      taskParams.stack =_task1Stack;

      taskParams.priority = 1;

      Task_construct(&task1Struct、(Task_FuncPtr) task1Fxn、&taskParams、NULL);

      taskParams.stack =_task2Stack;

      taskParams.priority = 2;

      Task_construct(&task2Struct,(Task_FuncPtr) task2Fxn、&taskParams、NULL);

      taskParams.stack =&task3Stack;

      taskParams.priority = 3;

      Task_construct(&task3Struct,(Task_FuncPtr) task3Fxn、&taskParams、NULL);

    一些要点

    每个任务都需要自己的 Task_Struct.

    2.每项任务都需要自己的堆栈。 堆栈用于存储返回值、局部变量等 taskParams.STACKSIZE 指定堆栈的大小。 您可以

      a.提供堆栈(如上所示)或

      b 让 taskParams.stack 保持为 NULL (这是默认值)。 在这种情况下、Task_con构 将分配堆栈。 注意:在这种情况下、我们建议您提供一个 Error_Block (而不是 NULL)或 Error_Ignore (如果您有较新版本的内核)作为 Task_construction"的最后一个参数。 否则为 NULL 时,如果构造中存在分配失败,程序将终止。

    3.以上各项任务的优先级各不相同,但这并不是必需的。 您可以有多个具有相同优先级的任务。

    4、 上述任务具有不同的进入函数(例如 task3Fxn)、但这不是必需的。 您可以为不同的任务使用相同的输入功能。 一个常见的用例是传入 taskParams.arg1和/或 taskParams.arg2以让条目函数知道要执行的操作。

    堆栈应该有多大尺寸? 开始高电平! 您可以在 CCS 中看到 Tools->ROV 峰值(ROV 也在 IAR 中)。 达到每个用例后,您可以查看 ROV->Tasks->Detailed 以查看峰值并相应地减小大小。 我喜欢保留15-20%的软糖因子、以防我未触及每个用例。 下面是一个讲述堆栈的好视频:  

    希望这有所帮助、

    Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哇、这是一篇非常有用和乐于助人的文章。 谢谢 Todd。

    还有一个问题:
    -我可以为每个任务指定函数的类型吗? 例如、int/char 代替 UArg? 我想我以前试过它、但我有一些错误。
    -是否可以在一项任务中调用其他任务? 在我看来、我的任务是不断从我的传感器收集数据、并调用其他2个函数将数据存储到 SD 卡并将数据发送到我的 Android 应用。 有可能吗?

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

    [引用 user="Huy Nguyen68"]-能否指定每个任务的函数类型? 例如、int/char 代替 UArg? 我想我以前试过它、但我有一些错误。

    否 您需要遵循函数原型。

    [引用 user="Huy Nguyen68"]-是否可以调用任务中的其他任务? 在我看来、我的任务是不断从我的传感器收集数据、并调用其他2个函数将数据存储到 SD 卡并将数据发送到我的 Android 应用。 是否有可能?[/报价]

    不要将某个函数与某个任务混淆。 每个任务都有一个条目函数、该函数是在任务开始运行时调用的第一个函数。 运行后、任务可以调用任何函数。 您确实需要注意线程安全性。 如果您有一个更新某些全局变量的函数(例如 foo()),并且您有多个任务要调用 foo(),则需要确保它们不会同时调用 foo()。 例如,如果一个较低优先级的任务调用 foo()并且正在更新全局变量的中间。 然后、如果一个较高优先级的任务运行(例如、它从 Task_sleep 唤醒)并且调用 foo()、您可能会被损坏。 您需要在 foo()中使用信标或门,以确保一次只有一个任务在关键区域中。

    内核 API 和驱动程序为您处理关键区域管理、但如果您编写自己的"通用"函数、则需要相应地处理。

    Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗨、Todd、很抱歉继续添加问题、但我想真正理解它、尽量避免犯错。 非常感谢您的全面回应。

    假设我们有以下任务:
    Task_construct(&task1Struct、(Task_FuncPtr) task1Fxn、&taskParams、NULL);
    Task_construct(&task2Struct,(Task_FuncPtr) task2Fxn、&taskParams、NULL);
    Task_construct(&task3Struct,(Task_FuncPtr) task3Fxn、&taskParams、NULL);
    BIOS_start();

    似乎任何具有最高优先级的任务都将首先运行(如果三个任务具有相同的优先级、那么它们是否都并行运行?)、而其他较低优先级的任务将在第一个任务完成后运行、或者休眠。 如果我想实现以下目标:
    task1Fxn()//从传感器收集数据并将其存储在全局变量中
    通过设置标志并将 task1Fxn()置于睡眠状态来表示数据可用。
    调用 task2Fxn()和 task3Fxn()以存储数据并通过 ble 发送数据
    以某种方式唤醒任务1Fxn 并再次开始从传感器收集数据。
    如何通过中断使任务进入睡眠状态并将其唤醒? 我想我不知道任务2和3何时完成、以及他们的工作是如何设置 tickPeriod (如果使用 Task_sleep)。

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

    我建议您查看本次专题讨论会以获取更多详细信息: training.ti.com/ti-rtos-workshop-series。 第1.9节详细介绍了任务调度。