1

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

因此,如果我在 RTX 配置文件中更改用户线程堆栈大小,堆栈大小会增加,“ ZI 数据”部分大小不会增加。

我测试了一下,测试结果显示如果我增加用户线程堆栈大小。“ ZI 数据”节的大小将与相同的大小同步增加。

在我的测试程序中,有 6 个线程,每个线程都有 600 字节的堆栈。我使用 Keil 构建程序,它向我展示了:

      代码(包括数据) RO 数据 RW 数据 ZI 数据 调试   

     36810 4052 1226 380 6484 518461 总计
     36810 4052 1226 132 6484 518461 ELF 图像总数(压缩)
     36810 4052 1226 132 0 0 ROM 总数

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

    RO 总大小(代码 + RO 数据)38036 (37.14kB)
    总 RW 大小(RW 数据 + ZI 数据)6864 (6.70kB)
    总 ROM 大小(代码 + RO 数据 + RW 数据)38168 (37.27kB)  

但是如果我将每个线程堆栈大小更改为 800 字节。Keil 向我展示如下:

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


      代码(包括数据) RO 数据 RW 数据 ZI 数据 调试   

     36810 4052 1226 380 7684 518461 总计
     36810 4052 1226 132 7684 518461 ELF 图像总数(压缩)
     36810 4052 1226 132 0 0 ROM 总数

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

    RO 总大小(代码 + RO 数据)38036 (37.14kB)
    总 RW 大小(RW 数据 + ZI 数据)8064 (7.88kB)
    总 ROM 大小(代码 + RO 数据 + RW 数据)38168 (37.27kB)

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

“ZI 数据”部分的大小从 6484 字节增加到 7684 字节。7684 - 6484 = 1200 = 6 * 200。而 800 - 600 = 200。所以我看到线程堆栈放在“ ZI Data ”部分。

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

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

4

2 回答 2

1

链接器确定存在哪些内存段。默认情况下,链接器会创建一些内存段。在您的情况下,其中三个默认部分显然被命名为“RO Data”、“RW Data”和“ZI Data”。如果您没有明确指定变量应位于哪个节中,则链接器将根据变量是声明为 const、已初始化还是未初始化,将其分配给这些默认节之一。

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

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

于 2016-08-19T12:43:39.293 回答
0

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

允许调用者提供可以以任何方式分配的os_tsk_create_user()堆栈(静态或从堆;从调用者堆栈分配是可能的,但不寻常,可能毫无意义并且肯定很危险),只要它具有 8 字节对齐。我发现 RTX 的自动堆栈分配几乎毫无用处,除了最微不足道的应用程序外,几乎不适合所有应用程序。

于 2016-09-04T08:37:27.133 回答