良晨美景 发表于 2024-8-3 09:57:23

同样的PWM配置,用Keil和SDCC编译,却出现了不同的结果




请教:同样的PWM配置用Keil编译,可以产生38K的方波,而用SDCC编译,有方波但频率变小了,这是为何?SDCC那里还需配置

DebugLab 发表于 2024-8-3 10:06:20

本帖最后由 DebugLab 于 2024-8-3 10:42 编辑

(此处原来有错误的回答已删除)

_奶咖君_ 发表于 2024-8-3 10:09:51

DebugLab 发表于 2024-8-3 10:06
keil能设置优化等级,影响程序大小和速度,sdcc不知道

但问题是这个不是硬件生成的方波么,,硬件的东西也和不同编译器有关?应该不是吧

hsrzq 发表于 2024-8-3 10:17:37

Keil是大端存储,sdcc是小端存储。

对于单字节寄存器不会有啥区别,但对于多字节寄存器影响就大了。
而这里的PWMB_ARR就是个双字节寄存器,所以结果肯定会有区别。

要想结果一致,不要使用PWMB_ARR,应当使用PWMB_ARRL和PWMB_ARRH。

hsrzq 发表于 2024-8-3 10:20:51

DebugLab 发表于 2024-8-3 10:06
keil能设置优化等级,影响程序大小和速度,sdcc不知道

跟这个无关,PWMB_ARR是个双字节寄存器,keil和sdcc大小端不一样而已

_奶咖君_ 发表于 2024-8-3 10:32:13

hsrzq 发表于 2024-8-3 10:20
跟这个无关,PWMB_ARR是个双字节寄存器,keil和sdcc大小端不一样而已

奥奥,,有种拨开云雾的感觉,,,是有这种可能{:4_250:}

soma 发表于 2024-8-3 12:08:15

高位在前低位在后,低位在前高位在后,这个还真乱。但是大小端就是这样。

良晨美景 发表于 2024-8-3 12:08:53

hsrzq 发表于 2024-8-3 10:17
Keil是大端存储,sdcc是小端存储。

对于单字节寄存器不会有啥区别,但对于多字节寄存器影响就大了。


果然高手在论坛里,感谢高手的指点,问题得到解决了

hsrzq 发表于 2024-8-3 12:18:18

soma 发表于 2024-8-3 12:08
高位在前低位在后,低位在前高位在后,这个还真乱。但是大小端就是这样。 ...

其实真要说起来,sdcc才是更符合51原始设计的,从DPTR这些都都看出MCS-51是小端的。
但是keil却偏偏又用大端,而且它几乎是唯一的编译器,STC为了迁就keil扩展的寄存器全是大端了……

大锤子 发表于 2024-8-7 11:24:01

我之前也分享过一个关于大端序小端序问题的文章,除了pwm 还有别的场景可能遇到: https://www.stcaimcu.com/forum.php?mod=viewthread&tid=3127
页: [1] 2
查看完整版本: 同样的PWM配置,用Keil和SDCC编译,却出现了不同的结果