panxiaoyi 发表于 2023-4-3 23:32

请教:辉芒微,就几条C语句,有些芯片编译正确,有些芯片编译报错

本帖最后由 panxiaoyi 于 2023-4-3 23:53 编辑

请教:辉芒微,就几条C语句,有些芯片编译正确,有些芯片编译报错。
都是默认设置,请问,这是为什么?望指点,多谢


报错截图






panxiaoyi 发表于 2023-4-3 23:38

本帖最后由 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;
        }
}


panxiaoyi 发表于 2023-4-4 00:08

工程代码 FT61F14_FT61F13。


panxiaoyi 发表于 2023-4-4 00:28

用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

叶春勇 发表于 2023-4-6 11:28

我试验了一下,也是如此。
改成
temp=(aaa&5)
kkk=func(temp, 2, ccc);//正确
就可以了。

panxiaoyi 发表于 2023-4-7 22:19

叶春勇 发表于 2023-4-6 11:28
我试验了一下,也是如此。
改成
temp=(aaa&5)


是的,我也是使用这样的方法解决的,为了进度只能另寻出路,但是,为了查这个错,花了我超过半天的时间,最后才发现是辉芒微的问题,等下再来一个也是IDE软件错误的例子

panxiaoyi 发表于 2023-4-7 22:33

截图和附件都是全部代码,也是很简单的代码,也是编译器的问题

panxiaoyi 发表于 2023-4-7 22:39

本帖最后由 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,就是错误

panxiaoyi 发表于 2023-4-7 22:52

说明一下,上面的T4UIF=0;//清零 ,是FT61F133的清零方式,FT61F145是=1才清零的,但是,只要程序运行了 LATA=255;说明就有问题

叶春勇 发表于 2023-4-8 15:06

panxiaoyi 发表于 2023-4-7 22:52
说明一下,上面的T4UIF=0;//清零 ,是FT61F133的清零方式,FT61F145是=1才清零的,但是,只要程序运行 ...

我下载了ide ,可以用pic得编译器和sdcc编译器,编译。不过需要自己搞makefile

叶春勇 发表于 2023-4-8 15:13

panxiaoyi 发表于 2023-4-7 22:19
是的,我也是使用这样的方法解决的,为了进度只能另寻出路,但是,为了查这个错,花了我超过半天的时间, ...

这个14系列还是好一点的,真奇怪。

wzjhuohua 发表于 2023-4-10 09:17

辉芒微的编译器有点牛

DanPianJiFangAn 发表于 2023-4-18 10:52

书写代码 aaa=1 ,则:

汇编代码 第一步清零 aaa,第二步 aaa+1

这个好像PIC也是这样的吧.

panxiaoyi 发表于 2023-4-19 08:22

DanPianJiFangAn 发表于 2023-4-18 10:52
书写代码 aaa=1 ,则:

汇编代码 第一步清零 aaa,第二步 aaa+1


是啊,这个的确会带来不良后果,我主程序明明aaa=1,在中断里面判断到的是=0。我是在实际应用中遇到的,当时是液晶屏显示一个变量,当这个变量等于1的时候,发现显示有错,于是一路删减代码排查,最后才发现这个问题的,并不是我故意挑剔,当然,问题找到了,程序中避开它即可

panxiaoyi 发表于 2023-4-19 08:41

不过话也说回来,FT62F0Gx 系列,上面的问题都解决了,函数不会报错了,aaa=1,跟aaa=2,所产生的指令是一样的,而且是 1T 时钟,值得期待

lrhsx33 发表于 2023-4-25 11:53

if+nop   行走天下。IDE一言难尽
页: [1]
查看完整版本: 请教:辉芒微,就几条C语句,有些芯片编译正确,有些芯片编译报错