请教:辉芒微,就几条C语句,有些芯片编译正确,有些芯片编译报错
本帖最后由 panxiaoyi 于 2023-4-3 23:53 编辑请教:辉芒微,就几条C语句,有些芯片编译正确,有些芯片编译报错。
都是默认设置,请问,这是为什么?望指点,多谢
报错截图
本帖最后由 panxiaoyi 于 2023-4-3 23:54 编辑
全部代码#include "SYSCFG.h"
volatile char W_TMP@ 0x70 ; //系统占用不可以删除和修改
volatile char BSR_TMP@ 0x71 ;//系统占用不可以删除和修改
void user_isr(); //用户中断程序,不可删除
void interrupt ISR(void)
{
#asm; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
#endasm; //系统设置不可以删除和修改
user_isr(); //用户中断函数
}
void user_isr() //用户中断函数
{
}
//上面的是创建 FT61F14 芯片的工程时,软件自动生成的代码
//下面的是我遇到问题,一路排查,最后发现的问题点,以最简单的代码方式展现出来
unsigned char func(unsigned char SW, unsigned char T1, unsigned char T2)
{
return (SW+T1+T2);
}
main()
{
while(1)
{
unsigned char aaa=0;
unsigned char ccc=3;;
unsigned char kkk;
aaa++;
kkk=func((aaa&5), 2, ccc);//正确
kkk=func((aaa&5), 1, ccc);//芯片 FT61F14 报错, FT61F13 正确
kkk=func((aaa&5), 0, ccc);//芯片 FT61F14 报错, FT61F13 正确
kkk=func((aaa^5), 0, ccc);//正确
kkk=func((aaa+5), 0, ccc);//正确
PORTA=kkk;
}
}
工程代码 FT61F14_FT61F13。
用C语言模拟编译也能通过,就是不知道上面的为什么不行?
#include <stdio.h>
unsigned char func(unsigned char SW, unsigned char T1, unsigned char T2)
{
return (SW+T1+T2);
}
void main(void)
{
unsigned char PORTA;
unsigned char aaa=0;
unsigned char ccc=3;;
unsigned char kkk;
aaa++;
kkk=func((aaa&5), 2, ccc);//正确
PORTA=kkk;
printf("PORTA=%d\n",PORTA);
kkk=func((aaa&5), 1, ccc);//芯片 FT61F14 报错, FT61F13 正确
PORTA=kkk;
printf("PORTA=%d\n",PORTA);
kkk=func((aaa&5), 0, ccc);//芯片 FT61F14 报错, FT61F13 正确
PORTA=kkk;
printf("PORTA=%d\n",PORTA);
}运行结果
PORTA=6
PORTA=5
PORTA=4
我试验了一下,也是如此。
改成
temp=(aaa&5)
kkk=func(temp, 2, ccc);//正确
就可以了。 叶春勇 发表于 2023-4-6 11:28
我试验了一下,也是如此。
改成
temp=(aaa&5)
是的,我也是使用这样的方法解决的,为了进度只能另寻出路,但是,为了查这个错,花了我超过半天的时间,最后才发现是辉芒微的问题,等下再来一个也是IDE软件错误的例子 截图和附件都是全部代码,也是很简单的代码,也是编译器的问题
本帖最后由 panxiaoyi 于 2023-4-7 22:43 编辑
//Device: FT61F14X
#include "SYSCFG.h"
//===========================================================
volatile char W_TMP @ 0x70; //系统占用不可以删除和修改
volatile char BSR_TMP@ 0x71; //系统占用不可以删除和修改
void user_isr(void); //用户中断程序不可删除
unsigned char aaa;
//===========================================================
void interrupt ISR(void)
{
#asm; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
NOP; //系统设置不可以删除和修改
#endasm; //系统设置不可以删除和修改
user_isr();
}
void user_isr(void)
{
if(T4UIF)
{
if(aaa==0)
LATA=255; //测试,正常时此语句不应该运行
T4UIF=0; //清零
}
}
//===========================================================
main()
{
OSCCON = 0b01110001; //16MHZ 1:1
WDTCON = 0b11101001; //看门狗复位默认值并使能看门狗
aaa=1;
LATA=0;
TIM4EN = 1; //TIME4时钟使能
T4CEN= 1; //TIME4使能
T4UIF= 0; //清零标记
T4UIE= 1; //允许中断
GIE=1; //全局中断使能
PEIE=1; //外设中断使能
while(1)
{
WDTCON=0b11101001;//看门狗复位默认值并使能看门狗
NOP();
NOP(); //增加/减少空操作语句,可以改变出现错误的命中率
aaa=1; //aaa=1 时会出现错误,aaa=2~255就不会出现错误,因为它们产生的汇编指令不同
NOP();
}
}之前我使用的是 FT62F133,这次我使用的是 FT61F145,都有问题
发现:
如果书写代码 aaa=1 ,则:
汇编代码 第一步清零 aaa,第二步 aaa+1
如果书写代码 aaa=2,则:
汇编代码 就是一条赋值语句,没有清零步骤
分析:
当 aaa=1 时,并且汇编运行到 清零aaa指令后,这时候刚刚好中断,这时,在中断里面读取aaa的值就是=0,就是错误
说明一下,上面的T4UIF=0;//清零 ,是FT61F133的清零方式,FT61F145是=1才清零的,但是,只要程序运行了 LATA=255;说明就有问题 panxiaoyi 发表于 2023-4-7 22:52
说明一下,上面的T4UIF=0;//清零 ,是FT61F133的清零方式,FT61F145是=1才清零的,但是,只要程序运行 ...
我下载了ide ,可以用pic得编译器和sdcc编译器,编译。不过需要自己搞makefile panxiaoyi 发表于 2023-4-7 22:19
是的,我也是使用这样的方法解决的,为了进度只能另寻出路,但是,为了查这个错,花了我超过半天的时间, ...
这个14系列还是好一点的,真奇怪。 辉芒微的编译器有点牛 书写代码 aaa=1 ,则:
汇编代码 第一步清零 aaa,第二步 aaa+1
这个好像PIC也是这样的吧. DanPianJiFangAn 发表于 2023-4-18 10:52
书写代码 aaa=1 ,则:
汇编代码 第一步清零 aaa,第二步 aaa+1
是啊,这个的确会带来不良后果,我主程序明明aaa=1,在中断里面判断到的是=0。我是在实际应用中遇到的,当时是液晶屏显示一个变量,当这个变量等于1的时候,发现显示有错,于是一路删减代码排查,最后才发现这个问题的,并不是我故意挑剔,当然,问题找到了,程序中避开它即可 不过话也说回来,FT62F0Gx 系列,上面的问题都解决了,函数不会报错了,aaa=1,跟aaa=2,所产生的指令是一样的,而且是 1T 时钟,值得期待 if+nop 行走天下。IDE一言难尽
页:
[1]