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.

[参考译文] CC1310:无法使用 ti-RTOS 创建任务

Guru**** 2482105 points
Other Parts Discussed in Thread: CC1310

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1237792/cc1310-failed-to-create-task-using-ti-rtos

器件型号:CC1310

最近、人们发现在项目中创建任务可能是由于无法分配足够的任务堆栈大小、导致任务创建失败。

在项目中、我首先创建了一个1024任务、然后在此任务中创建了两个512任务。 此时,程序没有问题,可以正常创建任务。 但是、如果我创建另一个512任务、则会失败。

我可以问一下、如何查看最大可用任务堆栈大小并修改此值?

此外、

我在实验过程中遇到的问题似乎是、程序的可用任务堆栈总大小约为2.5k、因为我只能创建3个任务、 累计任务堆栈大小为2k (还有一个缺省堆栈大小为512的空闲任务)。 当我想继续创建任务时、将失败。

我想问的是、是否有大约2.5k 的总堆栈大小参数可供任务使用、如果可以、我可以在哪里修改它? 如果没有、为什么我只能创建累积在2k 左右的任务?

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

    尊敬的 Alex:

    若要查看当前分配的任务堆栈大小上限、可以使用 ROV:

    但实际上、若要检查总堆栈限制、可以查看编译时存储器分配工具:

    在这个项目(互斥)中、我们看到可用堆总数为4096、分配的栈大小为1024。

    但您可以在链接器文件中进行配置、如下所示:

    因此、您能否尝试根据您的需求调整这些值、并让我知道它是否有效?

    此致、

    亚瑟

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

    感谢您的认真回答。 我之前犯了一个错误、需要更正它。 该程序还包括一个1k 消息队列和一个1字节消息队列。 但仍有几个问题。

    1.在使用 IAR 开发环境时、我不确定是否可以通过 IAR 查看 ROV 信息。 由于我还没有找到在 IAR 中查看 ROV 信息的方法、请您尽可能提供一个使用链接吗? 谢谢!

    我知道在 IAR 开发环境中、有必要修改项目中的(CC1310_LAUNCHXL_TIRTOS)文件。 相关内容如下:

    /*
    * Define CSTACK block to contain .stack section. This enables the IAR IDE
    * to properly show the stack content during debug. Place stack at end of
    * retention RAM, do not initialize (initializing the stack will destroy the
    * return address from the initialization code, causing the processor to branch
    * to zero and fault)
    */
    define symbol STACKSIZE = 1024;
    define block CSTACK with alignment = 8, size = STACKSIZE { section .stack };
    place at end of RAM_region { block CSTACK };
    do not initialize { section .stack, section .noinit};
    
    /* Export stack top symbol. Used by startup file */
    define exported symbol STACK_TOP = RAM_end__ + 1;
    
    /* HeapMem Primary Heap configuration */
    define symbol HEAPSIZE = 0x1000;
    define block primary_heap with alignment = 8, size = HEAPSIZE { };
    
    /* Place heap just before CSTACK */
    place at end of RAM_region { block primary_heap };

    2.关于 ICF 文件的相关信息,我是这样理解的,对吗? 最初、堆栈大小只被用来设定 CSTACK、而 CSTACK 被用来在调试期间查看堆栈信息(我不知道如何查看它?)

    后来的 HEAPSIZE 实际上是否可用于任务的堆栈?

    3.增加两个消息队列的大小将消耗约3.5k 以上,这将解释任务创建失败的原因。 但是、我试图将 HEAPSIZE 从0x1000更改为0x2000并重建项目、但仍然遇到任务创建失败的问题。 您是否需要任何其他步骤?

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

    嗨、团队:

    上述问题是否有更新?

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

    已发现在 IAR 中修改 ICF 文件不起作用的原因。 这是因为生成的 IAR 项目默认使用 SDK 文件路径中的 ICF 文件,而不是项目路径中的 ICF 文件(这不是正式的好做法,直接在项目中修改 ICF 文件可能会被误解)。 只需将 IAR 中的 ICF 文件的路径更改为当前项目下的路径。 这将使得修改 HEAPSIZE 成为可能。

    但是、CSTACK 和 PRIMARY_HEAP 在.ICF 文件中被用作 RAM_REGION 末尾的位置。 这不是冲突吗?

    IAR 中还有一个查看 ROV 信息的链接、或者希望您能提供这些信息、谢谢!

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

    嗨、团队:

    上述问题是否有更新?

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

    尊敬的 Alex:

    谢谢您提供的信息、很抱歉耽误您的时间。

    关于 ROV、它实际上在 IAR 中不被称为 ROV、而是被称为 TI-RTOS awareness、您可以在 IAR 的导航栏中找到它:

    再次使用 互斥量 例如、您可以查看信标计数、例如:

    关于 CSTACK 问题、mutex.map 有以下答案:

    *******************************************************************************
    *** PLACEMENT SUMMARY
    ***
    
    "A0":  place at address 0x0 { ro section .intvec };
    "A1":  place at end of [from 0x0 to 0x1'ffff] { ro section .ccfg };
    "P1":  place in [from 0x0 to 0x1'ffff] { ro };
    define block CSTACK with size = 1K, alignment = 8 { section .stack };
    "A2":  place at end of [from 0x2000'0000 to 0x2000'4fff] { block CSTACK };

    此致、

    亚瑟