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.

[参考译文] 编译器:为什么任务堆栈需要定义为全局?

Guru**** 2587345 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/605270/compiler-why-the-task-stack-needs-to-be-defined-as-global

工具/软件:TI C/C++编译器

早上好,

我有一个基本问题, 我在任何地方都看到任务堆栈声明在main函数之外,如果它声明在main函数内部,我就会收到此错误(我使用的是empty_min示例):

[Cortex_M4_0] FSR = 0x0000
HFSR = 0x4000万
DFSR = 0x0.0001万
MMAR = 0xb4.8564万a
BFAR = 0xb4.8564万a
AFSR = 0x0万
正在终止执行...

我怀疑,如果在内部声明,任务堆栈就超出了函数的范围,因此也是错误。  

我想验证是否是这种情况。

提前感谢!

卡门

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

    有两种方法可以获得动态创建的任务的堆栈。
    1.让Task_create (或Task_construct)调用为您分配它。 这是通过将参数结构中的"stack"字段保留为NULL (默认值)来实现的。
    2.通过"堆栈"字段提供缓冲区。 在这种情况下,提供的缓冲区必须位于持久性位置。 当main()正在运行时,它实际上正在使用系统堆栈。 调用BIOS_START后,系统堆栈将被重置并由HWI/Swi使用。 因此,main()中的任何局部变量基本上都消失了(它仍然存在,到目前为止,新任务和系统堆栈都在使用与堆栈相同的内存...非常糟糕!)。

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

    Todd,您好!

    感谢您的回答!

    一些后续问题:
    1.如果我将stack字段设置为NULL,task_create将根据"size"参数为任务分配大小,对吗?  另外,为什么用户需要通过“堆栈”提供缓冲区,我想知道提供缓冲区而不是将其设置为NULL有什么好处。
    2.动态创建的任务与静态内存有何区别? 我假设“动态”并不意味着任务是在堆内存中分配的,对吗?

    再次感谢!

    :)

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

    [引用user="Carmen Chan]1.如果我将堆栈字段设置为NULL,task_create将根据“size”参数分配大小的任务,对吗? [/引述]

    关闭..."STACKSIZE"。  

    [报价用户="Carmen Chan"]2. 动态创建的任务与静态内存有何区别? 我假设“动态”并不意味着任务分配在堆内存中,对吗?[/QUOT]

    从数据的角度来看,这是相同的。 构建将生成请求大小的缓冲区。 它不是从heap...it中分配的,而是全局变量(使用长的丑陋名称以避免名称空间冲突)。 由于不需要调用Task_create (或Task_construct),因此可以节省一些代码空间。 静态创建还会导致启动时间稍快(因为不必调用Task_create)。

    托德

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

    谢谢!!!

    我做了几次测试,没有在堆栈字段中设置任何缓冲区,只是在"STACKSIZE"中设置。 然后,我在ROV中注意到,HeapMem的总可用内存因定义了缓冲区的测试而减少。 如果stack字段为NULL,则堆栈将分配到堆内存中,对吗?

    谢谢(我真的保证这是我的最后一个问题)。

    卡门

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

    是的。 如果在动态创建时不提供堆栈,则将从堆分配堆栈。

    注:TI-RTOS具有许多高级配置选项,用于表示堆栈,内核对象等的分配使用哪些堆,这些选项在具有内部和外部存储器的较大设备中非常方便。 例如,您可能希望在快速内存中安装堆栈,而不是将其安装在较慢的DDR3内存中。 您可能还需要一些内置,外部和共享内存(用于多核设备)。 当然,这些高级选项通常不需要用于较小的MCU器件。

    btw...no问题:)

    托德