王昱顺
发表于 2025-3-18 09:49:38
ercircle 发表于 2025-3-17 23:47
提供一个简单粗暴的解决办法,在头文件中宏替换main函数,看看是否可行:
好方法,这样用户部分就成无感调用了
王昱顺
发表于 2025-3-18 10:24:55
ercircle 发表于 2025-3-17 23:47
提供一个简单粗暴的解决办法,在头文件中宏替换main函数,看看是否可行:
有一点小问题,就是main函数最开头定义变量话会因为C89格式问题导致报错
这里修改了一下
#include "stdio.h"
extern void _m(void);//修正编译器的LCALL 0x0000异常
#define main(x) main(x){_m();while(P0|!P0);sprintf(0, "0");}; void _m(x)
这样编译就正常了
开头定义变量也没问题,因为while(1)的存在,sprintf实际没有执行,但是可以保证编译正常,并且用户区没有写while(1)的时候也不会跑飞
edalab
发表于 2025-3-18 11:58:06
为啥不修改usb库呢?
王昱顺
发表于 2025-3-18 12:26:57
edalab 发表于 2025-3-18 11:58
为啥不修改usb库呢?
您好,USB库早在昨天已经修改完成,现在并没有任何问题。
这个Bug是编译器通用bug,可以查看前面28#的最小触发LCALL问题工程,其中并不包含USB库。
现在的是通用解决方案,后续更新头文件后,即可无感修复这个问题
ercircle
发表于 2025-3-18 15:55:25
#include "stdio.h"
extern void _m(void);//修正编译器的LCALL 0x0000异常
#define main(x) main(x){_m();while(1);sprintf(0, "0");}; void _m(x)
不能这样改,while(1);之后的语句会被认为访问不到优化掉。
这样改把编译器绕晕{:4_164:}
王昱顺
发表于 2025-3-18 16:39:41
ercircle 发表于 2025-3-18 15:55
不能这样改,while(1);之后的语句会被认为访问不到优化掉。
这样改把编译器绕晕
我测试过了,不需要实际执行,只需要让他在那里就行
执行不到也是可以的
我那个写法也可以让LCALL问题消失
你可以试试
你的程序中给bug()函数部分屏蔽了
这样是无法复现LCALL问题的,取消屏蔽你再试试加入这个写法和屏蔽这个写法
用编译器的模拟调试查看就能看到LCALL的不同了
ercircle
发表于 2025-3-18 16:44:24
王昱顺 发表于 2025-3-18 16:39
我测试过了,不需要实际执行,只需要让他在那里就行
执行不到也是可以的
我那个写法也可以让LCALL问题消失 ...
还是不行。。。。
ercircle
发表于 2025-3-18 16:50:40
这样可以
21cnsound
发表于 2025-3-18 16:51:50
ercircle 发表于 2025-3-18 16:44
还是不行。。。。这里的参数加上看看呢
[*]#define main(x) main(x){_m();while(1);sprintf(0, "0");}; void _m(x)
王昱顺
发表于 2025-3-18 17:20:28
ercircle 发表于 2025-3-18 16:50
这样可以
你说的对,我也测试发现了这个问题,大概是之前测试的时候有什么变量没控制好
我马上更改这部分的程序