奇怪的问题
最近在尝试将51的程序转到251,重新编译后出现错误:My_Fun_STC8.c(1327): error C11: internal error: (asmgen - triple=t0207)
看来看去不知道哪里错了。。。
内部错误,我没见过这个提示,应该是电脑或软件的问题 截个全图,大家好帮忙
重新安装了一遍keil,问题任然存在,可能只能重写软件了。。。。:'( alanding 发表于 2023-3-17 13:02
重新安装了一遍keil,问题任然存在,可能只能重写软件了。。。。
可以用我们已经建立并编译好的实验箱或者核心功能实验板里面的程序来试一下:深圳国芯人工智能有限公司-实验箱https://www.stcai.com/syx
本帖最后由 alanding 于 2023-3-21 16:31 编辑
经过试验,把 除以1 去掉,或者把 j 的定义改成 unsigned int 就没事了,char 8 位的不行,想不通。
还发现一个比如 fun(u + 1) 这样也报错,参数被截断.
alanding 发表于 2023-3-21 16:26
经过试验,把 除以1 去掉,或者把 j 的定义改成 unsigned int 就没事了,char 8 位的不行,想不通。
还发现 ...
直接报错还是警告? My_Fun_STC32.c(644): warning C188: 'parameter 1': value truncated alanding 发表于 2023-3-21 16:53
My_Fun_STC32.c(644): warning C188: 'parameter 1': value truncated
这只是调用函数时传递的参数类型跟函数定义的参数类型不一致情况下,编译器提示参数有可能会被裁剪。
至于前面说的错误,最好能提供可以复现故障的完整项目程序,这样才好分析。 本帖最后由 alanding 于 2023-3-22 12:56 编辑
不明白是怎么造成的错误,想出一个临时方法,把所有8位变量改成16位变量就能编译通过了,包括警告也没了,下面是原来内部错误的源码:第41行,把除号改成加减乘都没错
#include <STC_32G.H>
#include <INTRINS.H>
//#include <My_Fun_STC32.H>
unsigned long int edata abc;
unsigned long int edata aaa;
unsigned char far led;
void my_fun_gmt_to_days(unsigned char *s, unsigned long int u)
{
unsigned int d, i, y;
unsigned char j;
// u = u + (un.inf.time_zone * 3600L) + (un.inf.ext_time_zone * 1800L); // Convert to local time
d = u / 86400L;
u = u % 86400L;
y = 1970;
while(d > 365)
{
if ((y % 4) == 0) d -= 366; else d -= 365;
y++;
}
if ((d == 365) && ((y % 4) != 0)) // No leap year
{
d -= 365;
y++;
}
s = (unsigned char)(y / 1000) | 0x30;
i = y % 1000;
s = (unsigned char)(i / 100)| 0x30;
i = y % 100;
s = (unsigned char)(i / 10) | 0x30;
i = y % 10;
s = (unsigned char)(i / 1) | 0x30;
s = '0';
s = (unsigned char)(d / 100)| 0x30;
j = d % 100;
s = (unsigned char)(j / 10) | 0x30;
j = d % 10;
s = (unsigned char)(j / 1) | 0x30;
// s = (unsigned char)((unsigned int)j / 1) | 0x30;
i = u / 3600;
u = u % 3600;
s = (unsigned char)(i / 10) | 0x30;
s = (unsigned char)(i % 10) | 0x30;
i = u / 60;
u = u % 60;
s = (unsigned char)(i / 10) | 0x30;
s = (unsigned char)(i % 10) | 0x30;
s = (unsigned char)(u / 10) | 0x30;
s = (unsigned char)(u % 10) | 0x30;
s = 0;
}
void xxx(void)
{
unsigned char j, s;
s = (unsigned char)(j / 1) | 0x30;
// s = (unsigned char)((unsigned int)j / 1) | 0x30;
}
void main(void)
{
unsigned char j, s;
xxx();
my_fun_gmt_to_days(s, 0L);
s = (unsigned char)(j / 1) | 0x30;
// s = (unsigned char)((unsigned int)j / 1) | 0x30;
_nop_();
aaa = abc * 3;
led = 2;
}
页:
[1]
2