在Keil RTX RTOS配置文件中,用户可以配置默认的用户线程堆栈大小。 通常,堆栈包含自动/本地变量。 “ZI数据”部分保存未初始化的全局变量。Keil RTX RTOS线程堆栈大小
因此,如果我更改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字节。 Keil显示如下:
============================================================================== 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
_“堆栈保存自动/本地变量”_ - 从正在运行的线程的角度来看,当然是“该”堆栈。尽管如此,我没有理由认为这些堆栈不能从操作系统的角度来看是静态分配的变量。你只是在这里提出一个观察;具体的问题是什么? – Notlikethat