【发布时间】:2016-12-26 07:23:48
【问题描述】:
在 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”部分。
我的问题是: 这是否意味着线程中的自动/局部变量将被放入“ZI Data”部分,当线程堆栈被放入 RAM 中的“ZI data”部分时? 如果为真,则意味着根本没有堆栈部分。根本只有“RO/RW/ZI Data”和堆部分。
这篇文章给了我不同的答案。我现在对此有点困惑。 https://developer.mbed.org/handbook/RTOS-Memory-Model
【问题讨论】:
-
“堆栈包含自动/局部变量” - 从正在运行的线程的角度来看,它是“那个”堆栈,当然。不过,从操作系统的角度来看,我看不出这些堆栈不能是静态分配变量的理由。您在这里只是提出了一个观察;具体问题是什么?