王昱顺 发表于 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
这样可以

你说的对,我也测试发现了这个问题,大概是之前测试的时候有什么变量没控制好
我马上更改这部分的程序






页: 1 2 3 [4] 5
查看完整版本: 解决编译器【REMOVEUNUSED选项】,可能错误移除问题,现象是感觉复位了