工具/软件:TI C/C++编译器
编写以下函数是为了验证存储在闪存中的固定测试模式是否可以正确读取:
静态void verify_flash_contant_data (void) { uINT32_t seed = FLASH_DATA_initial_seed; uINT32_t字索引; 对于(word_index = 0;word_index < flash_data_NUM_words;word_index++) { 断言(flash_constitue_data[word_index]==种子); SEED = RAND_GENERATOR (SEED); } }
FLASH_CONSTANT_DATA数组作为常量数组声明给编译器:
#define flash_data_NUM_OLUES 23.5929万 extern const UINT32_t flash_constituate_data[flash_data_NUM_OLUESS];
因此,如果从flash_constant数据读取的数据不是预期的测试模式,则该函数的唯一副作用是使用RTS assert.h include文件中的Assert宏来中止程序。
当使用优化级别2编译程序时,优化器已消除整个 verify_flash_contant_data函数。 在RTS ASSERT.h中,ASSERT宏是使用_ASSERT内置实现的。 优化器在优化级别2错误地删除了唯一副作用是使用 _Assert builtin的函数,这是否是问题?
我让编译器保留生成的汇编文件,并确认在优化级别编译时,没有消除使用Assert的其他两个函数,并且 如果断言失败,将调用_abort_msg()。
我附上了一个CCS 7.1 项目,其中包含演示问题的代码。
Debug (调试)配置的优化级别设置为"OFF"(关闭), 而FLASH_CONSTANCE_DATA函数显示在生成的汇编文件 Debug\TM4C129_self_test.asm中
发行配置的优化级别设置为“2 -全局优化”, 并且在 Release\TM4C129_self_test.asm中未显示FLASH_CONSTANT_DATA函数