找回密码
 立即注册
查看: 1859|回复: 22

[新问题在17楼]好像找到32位模式下除法引起重启问题的点了,确实跟芯片无关

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:392
  • 最近打卡:2025-05-01 15:00:39

24

主题

305

回帖

2556

积分

荣誉版主

积分
2556
发表于 2024-7-8 17:01:18 | 显示全部楼层 |阅读模式
本帖最后由 大明狐 于 2024-7-12 15:26 编辑

在STC8051U的32-bit模式下遇到一个诡异的问题

尝试将OLED12864的驱动程序移植进STC8051U,
源驱动程序之前在STC8、STC32上都是正常运行的,
添加进STC8051U的8-bit模式也很顺利,


但是到了8051U的32-bit模式的时候,


当显示的字符超出有边界需要换行的时候,单片机就会重启。


全部函数全部屏蔽逐一尝试之后,发现是在换行判断的时候出的问题。
这个函数的参数 y 是 unsigned char 类型的

QQ截图20240708164002.jpg


出问题的代码,是图中程序281行的 y += fontsize / 8;


当字号参数 fontsize 的值是 8 的时候,就会反复重启,
fontsize 是 8 以外的其它数值时,却一切正常。
===========================================

经过几个试验发现,如果将图中第281行,换成图中282行、283行、284行、285行中的某一种写法


L282: //     y = y + fontsize / 8;

L283: //     y += (unsigned char)(fontsize / 8);
L284: //     y += (8 / 8);
L285: //     y += fontsize / 7 + 1;


或者将271行的参数里的 y 的数据类型换成除了“char”和“unsigned char”以外的类型,比如 int

程序也都可以正常运行下去。


(以上几种改法,放进8051U的8-bit模式,还有STC8H里试了下,也都可以正常运行)

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

虽然通过替换表达式写法或者数据类型(尤其是282行和283行)解决了
但是很好奇为什么只有在 8051U的32-bit模式 里会这样。

能体会到发现一个不理解的现象然后找原因然后要么解决掉问题要么被问题解决掉的那种快乐是我的幸运
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:392
  • 最近打卡:2025-05-01 15:00:39

24

主题

305

回帖

2556

积分

荣誉版主

积分
2556
发表于 2024-7-8 17:22:40 | 显示全部楼层
应该是Keil的问题,
那就暂时先用不出问题的那几种写法,或者避免换行操作。
期待完美解决方案
{:5_300:}


能体会到发现一个不理解的现象然后找原因然后要么解决掉问题要么被问题解决掉的那种快乐是我的幸运
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-01 09:54:52
已绑定手机

19

主题

3190

回帖

4866

积分

论坛元老

积分
4866
发表于 2024-7-8 18:29:56 | 显示全部楼层
fontsize定义为unsinged char , fontsize/8为可能不为unsigned char,所以可能报错,估计这样

点评

姚总已经找工程师研究这个问题了,目前结论是发现是C251版Keil里的BUG,除法之后多生成了一个复位码。解决方法还在研究中。  详情 回复 发表于 2024-7-8 19:25
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:392
  • 最近打卡:2025-05-01 15:00:39

24

主题

305

回帖

2556

积分

荣誉版主

积分
2556
发表于 2024-7-8 19:25:58 | 显示全部楼层
so*** 发表于 2024-7-8 18:29
fontsize定义为unsinged char , fontsize/8为可能不为unsigned char,所以可能报错,估计这样 ...

姚总已经找工程师研究这个问题了,
目前结论是发现是C251版Keil里的BUG,
除法之后多生成了一个复位码
解决方法还在研究中。
能体会到发现一个不理解的现象然后找原因然后要么解决掉问题要么被问题解决掉的那种快乐是我的幸运
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2024-7-8 19:39:47 | 显示全部楼层
研发答复,测试过了:

就算是选择STC32G12K128型号,编译也一样会出错,
在STC32G12K128里面运行也一样会有问题

这个问题确实比较诡异,简单的除法运算,
C251编译器居然会多编译出一条复位指令出来

C51没问题

问:
能否给出 编译器的应用注意事项来 ?

答:
目前还不知道这编译器是怎么回事,
不知道如何让编译器不犯这个错,如何避免

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-7-8 21:51:59 | 显示全部楼层
为什么我不能复现问题, 函数代码原封不动的用文字发出来,我贴进去编译一下试试看

点评

因为是移植了一部分的时候遇到的问题,然后知道了是Keil的原因,以为没用了就拿掉了。 这是昨天那段代码 问题代码出现在oled.c里的 271行 OLED_ShowChar 函数里的 281行, 282、283、284、285行是不出问题的写  详情 回复 发表于 2024-7-9 09:47
楼主的附件可能被楼主删除了  详情 回复 发表于 2024-7-8 22:18
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2024-7-8 22:18:58 | 显示全部楼层
tzz1*** 发表于 2024-7-8 21:51
为什么我不能复现问题, 函数代码原封不动的用文字发出来,我贴进去编译一下试试看 ...

楼主的附件可能被楼主删除了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:392
  • 最近打卡:2025-05-01 15:00:39

24

主题

305

回帖

2556

积分

荣誉版主

积分
2556
发表于 2024-7-9 09:47:05 | 显示全部楼层
tzz1*** 发表于 2024-7-8 21:51
为什么我不能复现问题, 函数代码原封不动的用文字发出来,我贴进去编译一下试试看 ...


因为是移植了一部分的时候遇到的问题,然后知道了是Keil的原因,以为没用了就拿掉了。

这是昨天那段代码
20240708_2USBHID32bit硬件SPI_OLED.rar (56.05 KB, 下载次数: 116)


问题代码出现在oled.c里的 271行 OLED_ShowChar 函数里的 281行,
282、283、284、285行是不出问题的写法


点评

收到, 谢谢, 确实是! 应该是链接定位器出问题了, 把?C?SIDIV的地址放在了 0X0000 [attachimg]50770[/attachimg]  详情 回复 发表于 2024-7-9 10:45
能体会到发现一个不理解的现象然后找原因然后要么解决掉问题要么被问题解决掉的那种快乐是我的幸运
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:455
  • 最近打卡:2025-05-01 08:13:06
已绑定手机

27

主题

341

回帖

1687

积分

金牌会员

机长

积分
1687
发表于 2024-7-9 09:49:30 | 显示全部楼层
神*** 发表于 2024-7-8 19:39
研发答复,测试过了:

就算是选择STC32G12K128型号,编译也一样会出错,

这……这……这……无言以对
业余撸代码,专业开飞机
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-7-9 10:45:27 | 显示全部楼层
本帖最后由 tzz1983 于 2024-7-9 10:52 编辑
大*** 发表于 2024-7-9 09:47
因为是移植了一部分的时候遇到的问题,然后知道了是Keil的原因,以为没用了就拿掉了。

这是昨天那段代 ...

收到, 谢谢, 确实是!
应该是链接定位器出问题了, 把?C?SIDIV的地址放在了 0X0000  ???

截图202407091045128136.jpg

这应该是发现Keil C251 编译器的 第三个BUG了, 看看什么时候整理一下


回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:08 , Processed in 0.132657 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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