找回密码
 立即注册
查看: 416|回复: 4

求助关于SDCC使用--stack-auto 编译选项后功能不正常

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-05-02 11:38:17

44

主题

230

回帖

2845

积分

金牌会员

积分
2845
发表于 2024-9-17 15:36:58 | 显示全部楼层 |阅读模式
下边这段代码是实现根据入参计算矩形X轴方向的结束位置,来画电池电量:
  1. void LCD_ShowPower(u16 power) {
  2. // 计算横坐标的结束位置
  3. unsigned int dis, xend;
  4. dis = power*38/3300;
  5. xend = dis + 263;
  6. LCD_Fill(263,16,xend,32,WHITE);
  7. LCD_DrawRectangle(260, 13, LCD_W - 16, 13+22, WHITE); // 首先画出电池的轮廓
  8. LCD_Fill(LCD_W - 15, 21,LCD_W - 12, 27, WHITE);
  9. }
复制代码
但是效果并没有达到预期, 其中电池的轮廓和正极能正常画出来。但是中间的填充画不出来,如视频显示:



这个文件的编译命令:
  1. sdcc -o .pio/build/STC8H8K64U/libdea/LCD/lcd.rel -c --opt-code-size --peep-return -mmcs51 --model-large --stack-auto --std-c99 --less-pedantic -DF_CPU=35000000L -DHEAP_SIZE=128 -DPLATFORMIO=60115 -DSTC8H8KXXU -DSTC8H8K64U -DNAKED_ARCH_MCS51 -DNAKED_MCS51_STC8H8KXXU -DPIO_OS_CPU_MAIN_CLOCK=35000000L -Ilib/LCD/src -I.pio/libdeps/STC8H8K64U/STC8G_H_LIB/include -I.pio/libdeps/STC8H8K64U/STC8G_H_LIB/src lib/LCD/src/lcd.c
复制代码


下边是这个函数的汇编程序:
  1. ;------------------------------------------------------------
  2. ;Allocation info for local variables in function 'LCD_ShowPower'
  3. ;------------------------------------------------------------
  4. ;power                     Allocated to registers r6 r7
  5. ;dis                       Allocated to registers
  6. ;xend                      Allocated to registers r6 r7
  7. ;------------------------------------------------------------
  8. ;        lib/LCD/src/lcd.c:377: void LCD_ShowPower(u16 power) {
  9. ;        -----------------------------------------
  10. ;         function LCD_ShowPower
  11. ;        -----------------------------------------
  12. _LCD_ShowPower:
  13.         mov        r6,dpl
  14.         mov        r7,dph
  15. ;        lib/LCD/src/lcd.c:382: dis = power*38/3300;
  16.         push        ar6
  17.         push        ar7
  18.         mov        dptr,#0x0026
  19.         lcall        __mulint
  20.         mov        r6,dpl
  21.         mov        r7,dph
  22.         dec        sp
  23.         dec        sp
  24.         mov        a,#0xe4
  25.         push        acc
  26.         mov        a,#0x0c
  27.         push        acc
  28.         mov        dpl,r6
  29.         mov        dph,r7
  30.         lcall        __divuint
  31.         mov        r6,dpl
  32.         mov        r7,dph
  33.         dec        sp
  34.         dec        sp
  35. ;        lib/LCD/src/lcd.c:383: xend = dis + 263;
  36.         mov        a,#0x07
  37.         add        a,r6
  38.         mov        r6,a
  39.         mov        a,#0x01
  40.         addc        a,r7
  41.         mov        r7,a
  42. ;        lib/LCD/src/lcd.c:384: LCD_Fill(263,16,xend,32,WHITE);
  43.         mov        a,#0xff
  44.         push        acc
  45.         push        acc
  46.         mov        a,#0x20
  47.         push        acc
  48.         clr        a
  49.         push        acc
  50.         push        ar6
  51.         push        ar7
  52.         mov        a,#0x10
  53.         push        acc
  54.         clr        a
  55.         push        acc
  56.         mov        dptr,#0x0107
  57.         lcall        _LCD_Fill
  58.         mov        a,sp
  59.         add        a,#0xf8
  60.         mov        sp,a
  61. ;        lib/LCD/src/lcd.c:386: LCD_DrawRectangle(260, 13, LCD_W - 16, 13+22, WHITE); // 首先画出电池的轮廓
  62.         mov        a,#0xff
  63.         push        acc
  64.         push        acc
  65.         mov        a,#0x23
  66.         push        acc
  67.         clr        a
  68.         push        acc
  69.         mov        a,#0x30
  70.         push        acc
  71.         mov        a,#0x01
  72.         push        acc
  73.         mov        a,#0x0d
  74.         push        acc
  75.         clr        a
  76.         push        acc
  77.         mov        dptr,#0x0104
  78.         lcall        _LCD_DrawRectangle
  79.         mov        a,sp
  80.         add        a,#0xf8
  81.         mov        sp,a
  82. ;        lib/LCD/src/lcd.c:387: LCD_Fill(LCD_W - 15, 21,LCD_W - 12, 27, WHITE);
  83.         mov        a,#0xff
  84.         push        acc
  85.         push        acc
  86.         mov        a,#0x1b
  87.         push        acc
  88.         clr        a
  89.         push        acc
  90.         mov        a,#0x34
  91.         push        acc
  92.         mov        a,#0x01
  93.         push        acc
  94.         mov        a,#0x15
  95.         push        acc
  96.         clr        a
  97.         push        acc
  98.         mov        dptr,#0x0131
  99.         lcall        _LCD_Fill
  100.         mov        a,sp
  101.         add        a,#0xf8
  102.         mov        sp,a
  103. ;        lib/LCD/src/lcd.c:390: }
  104.         ret
复制代码


将程序中的send写死后想要的效果如下:

6BC00EA295E23D2D7697BC7E4956BD90.png





不争是争
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-05-02 11:38:17

44

主题

230

回帖

2845

积分

金牌会员

积分
2845
发表于 2024-9-17 18:05:42 | 显示全部楼层
测试了下, dis = power*38/3300; 这段的结果是 -1. 感觉像是堆栈中的值被误改了。 但是程序执行到这里还没有开启中断。 应该不会被改。 会不会是栈溢出?
不争是争
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-05-02 11:38:17

44

主题

230

回帖

2845

积分

金牌会员

积分
2845
发表于 2024-9-20 22:01:52 | 显示全部楼层
这个问题解决了。在大明狐 大佬的指点下,将参数改成 float 就能得到准确结果了。
但是遇到了新的问题,尝试用相同的办法解决不太行;

不使用编译的时候只使用 --model-large  结果是正确的, 使用了再加上 --stack-auto 就错了;

感觉像是栈溢出。






不争是争
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:469
  • 最近打卡:2025-05-02 11:38:17

44

主题

230

回帖

2845

积分

金牌会员

积分
2845
发表于 2024-9-21 21:24:51 | 显示全部楼层
问题解决了。。。。。

我感觉不是我的锅。

sdcc的文档没有说连接也需要这个选项,

比如文档中--model-large 写的就很明确:

截图202409212123433894.jpg

但是stack-auto 就没有说link也需要:
截图202409212124488433.jpg
不争是争
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:339
  • 最近打卡:2025-05-02 12:21:25

4

主题

242

回帖

1291

积分

金牌会员

积分
1291
发表于 2024-11-27 13:22:05 | 显示全部楼层
大*** 发表于 2024-9-21 21:24
问题解决了。。。。。

我感觉不是我的锅。

好像我之前也碰到过,不过当时是单纯玩玩就没后续了,有空我试试是不是也是这个原因{:5_290:}
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 22:15 , Processed in 0.144821 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表