This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/MSP430FR5994:8位循环计数器被视为16位

Guru**** 2589280 points
Other Parts Discussed in Thread: MSP430FR5994

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/750569/compiler-msp430fr5994-8-bit-loop-counter-treated-as-16-bit

器件型号:MSP430FR5994

工具/软件:TI C/C++编译器

我已将此循环结构与8位循环计数器一起使用。 如果 count 的值传递为0、则我希望循环执行256次。 当优化器打开(-O2)时、它实际上执行65536次。

静态 uint8_t buffer[256];

void do 循环(uint8_t count)

  uint8_t *p =缓冲区;

  执行*p++= 0;
  while (-count!= 0);

查看列表文件、我看到类似这样的指令(仅保留代码行和注释):

285. ;*********
286. ;*函数名: DO 循环 *
287. ;* *
288 ;*修订的寄存器 :SP、SR、R12、R15 *
289 ;*使用的寄存器 :SP、SR、R12、R15 *
290 ;*本地帧大小:0 args + 0 Auto + 0 Save = 0字节 *
291. ;*********
292. DO 循环:
293 ;*------------------------------------------------------------ *
294 ;* R12分配给$O$L1
295 ;* R12分配给计数
302 ;* R15分配给 p
311 000000 4C4C MOV.B R12、R12 ;[]313
000002 008F! MOVX.A #buffer+0、R15 ;[]|44|
000004 0000
314 ;*------------------------------------------------------------ *
315 ;*开始循环$C$L1
316 ;*
317 ;*循环源代码行 :45
318 ;*循环右括号源代码行:48
319 ;*已知最小行程计数 :1
320 ;*已知最大行程计数 :256
321 ;*已知最大行程计数因子 :1
32 ;*------------------------------------------------------------ *
323 000006 $C$L1:
325 000006 00AF ADDA 1、R15 ;[]|47|
000008 0001
326 00000A 43CF MOV.B #0、-1 (R15) ;[]|47|
00000c FFFF
328 00000e 831C 低于 W 1、R12 ;[]|49|
329 000010 23FA JNE $C$L1 ;[]|49|330
;[]|49|
331 ;*------------------------------------------------------------ *
336 000012 0110 返回 ;[]

因此、即使循环计数器最初加载为8位、递减也是在16位变量上。 如果初始值为0、则会按预期递减到0xFFFF 而不是0xff。

看起来、328行上的指令应该是低于 B、而不是低于 W

将测试更改为 while (--count & 0xff)!= 0)也没有区别。

这是使用编译器16.9.8.LTS 编译的。 我还尝试使用18.1.4.LTS、结果相同。

-vmspx --data_model=restricted -O2 --use_hw_mpy=F5 --include_path="C:/ti/ccsv8/ccs_base/msp430/include --include_path="C:/ti/ccsv8/tools/compiler/ti-cgt-msp430_16.9.8.LTS/include --advice:pow=all --advice:hw_config=all --define=_MSP430FR5994_--define=_mpu_enable-off-erratial-cp2=silicon_off-display_off-display=usion_errati_off-us=us_off-udati_support=us_off-print225-uati_off-off-off-off-off-display_errati_support=silicon_off-display_off-off-off-off-off-off-display_off

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    关于循环,你说...

    [引用 user="Simon large "]它实际上执行65536次

    我同意这是错误的。

    感谢您报告此问题、并提交一份简明的测试案例。  我可以重现相同的结果。  我在 SDOWP 系统中提交了 CodeGen-5574以进行调查。  欢迎您在我的签名中使用下面的 SDOWP 链接进行访问。

    谢谢、此致、

    乔治