Keil RTX RTOS线程堆栈大小

时间:2016-08-19 07:54:44

标签: stack arm rtos keil rtx

在Keil RTX RTOS配置文件中,用户可以配置默认用户线程堆栈大小。 通常,堆栈包含自动/局部变量。 " ZI数据" section保存未初始化的全局变量。

因此,如果我在RTX配置文件中更改用户线程堆栈大小,堆栈大小将增加,并且" ZI数据"截面尺寸不会增加。

我测试它,测试结果显示如果我增加用户线程堆栈大小。 " ZI数据"截面尺寸将与相同尺寸同步增加。

在我的测试程序中,有6个线程,每个线程有600个字节的堆栈。我使用Keil构建程序,它告诉我:

      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   

     36810       4052       1226        380       6484     518461   Grand Totals
     36810       4052       1226        132       6484     518461   ELF Image Totals (compressed)
     36810       4052       1226        132          0          0   ROM Totals

==============================================================================

    Total RO  Size (Code + RO Data)                38036 (  37.14kB)
    Total RW  Size (RW Data + ZI Data)              6864 (   6.70kB)
    Total ROM Size (Code + RO Data + RW Data)      38168 (  37.27kB)  

但是如果我将每个线程堆栈大小更改为800字节。凯尔告诉我如下:

==============================================================================


      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   

     36810       4052       1226        380       7684     518461   Grand Totals
     36810       4052       1226        132       7684     518461   ELF Image Totals (compressed)
     36810       4052       1226        132          0          0   ROM Totals

==============================================================================

    Total RO  Size (Code + RO Data)                38036 (  37.14kB)
    Total RW  Size (RW Data + ZI Data)              8064 (   7.88kB)
    Total ROM Size (Code + RO Data + RW Data)      38168 (  37.27kB)

==============================================================================

" ZI数据"节大小从6484增加到7684字节。 7684 - 6484 = 1200 = 6 * 200.且800 - 600 = 200。 所以我看到线程堆栈被放入" ZI数据"部分。

我的问题是: 这是否意味着线程中的自动/局部变量将被放入" ZI数据"当线程堆栈被放入" ZI数据" RAM部分? 如果它是真的,则意味着根本没有堆栈部分。只有" RO / RW / ZI数据"和堆部分。

本文给出了不同的答案。我现在有点困惑。 https://developer.mbed.org/handbook/RTOS-Memory-Model

2 个答案:

答案 0 :(得分:1)

链接器确定存在哪些内存部分。链接器默认创建一些内存部分。在您的情况下,其中三个默认部分显然命名为" RO数据"," RW数据"和" ZI数据"。如果您没有明确指定变量应位于哪个部分,那么链接器将根据变量是声明为const,初始化还是未初始化而将其分配给其中一个默认部分。

链接器不会自动意识到您正在使用RTOS。并且它没有特别了解您打算将哪些变量用作线程堆栈。因此链接器不会为您的线程堆栈自动创建独立的内存部分。相反,链接器会将堆栈变量视为任何其他变量,并将它们包含在其中一个默认内存部分中。在您的情况下,链接器显然将线程堆栈放入ZI数据部分。

如果希望链接器为线程堆栈创建特殊的独立内存部分,则必须通过链接器命令文件显式告知链接器。然后,您还必须指定堆栈变量应位于自定义部分中。有关如何执行此操作的详细信息,请参阅链接器手册。

答案 1 :(得分:0)

任务堆栈必须来自某个地方 - 在RTX中,默认情况下它们是静态分配的,并且具有固定大小。

os_tsk_create_user()允许调用者提供可以以任何方式分配的堆栈(静态地或从堆中分配;从调用者堆栈分配是可能的,但不寻常,可能毫无意义且肯定是危险的)只要它有8字节对齐。我发现RTX的自动堆栈分配几乎没用,除了最简单的应用之外,很少适用。