请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430FR5739 工具/软件:TI C/C++编译器
/* Greg Fundyler 在2018年8月15日发现的 TI MSP430编译器错误。 * **主要使用-O2 -opt-for-speed=5进行测试 *速度与大小设置似乎无关紧要。 *错误表现为-O2及更高版本。 * *每个 for 循环只执行一次、但 *演示错误需要此结构。 * *通过 ti-cgt-msp430_16.9.1.LTS 和 ti-cgt-msp430_18.1.LTS 测试 * *编译器调用 :*"C:/apps/ti/ccsv7/tools/compiler/ti-cgt-msp430_18.1.3.LTS/bin/cl430 -vmspx -O2 -opt_for_speed=5 -include_path="C:/apps/ti/ccsv7/ccs_base/msp430/include -include_path="C:/apps/ti/ccsv7/tools/compiler/ti-cgt-msp430_18.1.3.LTS/include -advice:power_abit_us_errani_ati_-us=-us_guestines=-us_off-us_guestion_guest-us_guestion_guest-us=-us_guestion_ines=-us-us-us_guestion_guest-ines=-us_guestion_guest-us-ines=-us_guestines=-us_guestines=-us_guestion_guest-ines=-us-us-us-us_guestion_guestion_guestion_ output_all_syms -gen_ACP _raw -preproc_with_compile -preproc_dependence="main.d" * 链接器调用: *"C:/apps/ti/ccsv7/tools/compiler/ti-cgt-msp430_18.1.3.LTS/bin/cl430 -vmspx -O2 -opt_for_speed=5 -advice:power_main.c"-define=勘误表:*"C:-vmspx -O2 -opt_for_speed=silicon_us-us_isot-us_excep-off-us-usion_us-us-us-us_excepdag-us_isot-us-us-ina-us_ison_off-us-us-us-us-us-us-us_excepdag-mag-us-in-ina-us-us_ina-us_excepina-us-ina-us-ina-us-ina-us-display-us-board-ina-us_ gen_aCP_raw -z -m"bug.map"--heap_size=160 --stack_size=160 --cinit_hold_wDT=on -i"C:/apps/ti/ccsv7/ccs_base/msp430/include -"C:/apps/ti/ccsv7/ccs_base/msp430/lib/5xx_6xx_FRxx /apps/ti/ccsv7/ccs_base/msp430/include/lnk_msp430fr5739.cmd -i"C:/apps/ti/ccsv7/tools/compiler/ti-cgt-msp430_18.1.3.LTS/lib -i":cstack_size=160 --cinit_hold_wDT=on -i"C:/apps/ti/ccsv7/tools/compiler/ti-cgt-msp430_18.1.3.LTS/include -"_mpu_ram_line_display_ram_line_display.xml"-lib_ram_isecon_line_line_display_line_display_rom-lib_line_display.xml"-line_display_rom-linep-line_display_line_display_line_display_rom-linep_rom-line_display_line_display_rom_rom_linep_linep-lib_rom.xml_linep_lin #include uint32_t y; int32_t signed_y; int16_t z; int32_t big_z; volatile int32_t outa、 OUTB、outc、outd;//如果在-O3和更高版本缺少'volatil'、则优化 out // volatile int16_t outa、outb、outc、outd;//更改行为轻微 静态内联 int16_t foo (int32_t x){ 返回 x >> 16; } void test1 (void){ 对于(y = 33345;y < 34000;y += 1000){ signed_y =(int16_t) y; outa =(5368UL *(uint16_t) y)>> 16; OUTB = foo (signed_y); // outb = 0 (不正确:应为-1) outc = signed_y >> 16; // outc =-1 (正确) } } void test2 (void){ 对于(y = 33345;y < 34000;y += 1000){ signed_y =(int16_t) y; OUTA =(5368UL * y)>> 16; OUTB = foo (signed_y); // outb = 0 (不正确:应为-1) outc = signed_y >> 16; // outc = 0 (不正确:应为-1) } } void test3 (void){ 对于(y = 33345;y < 34000;y += 1000){ signed_y =(int16_t) y; OUTB = foo (signed_y); // outb = 0 (不正确:应为-1) outc = signed_y >> 16; // outc = 0 (不正确:应为-1) } } void test4 (void){ 对于(y = 33345;y < 34000;y += 1000){ signed_y =(int16_t) y; OUTB = foo (signed_y); // outb =-1 (正确) outc = signed_y >> 16; // outc = 65535 (不正确:应为-1) outd = signed_y >> 17; // outd =-1 (正确) } } void test5 (void){ 对于(y = 33345;y < 34000;y += 1000){ signed_y =(int16_t) y; outc = signed_y >> 16; // outc =-1 (正确) OUTB = foo (signed_y); // outb =-1 (正确) } } void test6 (void){ 对于(z =-20000;z <-19500;z += 1000){ big_z = z; OUTB = foo (big_z); // outb =-1 (正确) outc = big_z >> 16; // outc = 65535 @-O2优化、-1 @所有其他优化 } } void test7 (void){ 对于(z =-20000;z <-19500;z += 1000){ big_z = z; outc = big_z >> 16; // outc =-1 (正确) OUTB = foo (big_z); // outb =-1 (正确) } } void main (void){ WDTCTL = WDTPW + WDTHOLD;//停止 WDT test1(); test2(); test3(); test4(); Test5(); test6(); test7(); while (1){}