在 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