打印
[国产单片机]

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

[复制链接]
1093|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
panxiaoyi|  楼主 | 2023-4-3 23:38 | 只看该作者
本帖最后由 panxiaoyi 于 2023-4-3 23:54 编辑

全部代码
#include        "SYSCFG.h"

volatile char W_TMP  [url=home.php?mod=space&uid=72445]@[/url] 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。


微信截图_20230404000546.png (12.7 KB )

微信截图_20230404000546.png

FT61F14_FT61F13.rar

109.59 KB

使用特权

评论回复
地板
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

使用特权

评论回复
5
叶春勇| | 2023-4-6 11:28 | 只看该作者
我试验了一下,也是如此。
改成
temp=(aaa&5)
kkk=func(temp, 2, ccc);  //正确
就可以了。

使用特权

评论回复
6
panxiaoyi|  楼主 | 2023-4-7 22:19 | 只看该作者
叶春勇 发表于 2023-4-6 11:28
我试验了一下,也是如此。
改成
temp=(aaa&5)

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

使用特权

评论回复
7
panxiaoyi|  楼主 | 2023-4-7 22:33 | 只看该作者
截图和附件都是全部代码,也是很简单的代码,也是编译器的问题

微信图片_20230407223159.jpg (402.5 KB )

微信图片_20230407223159.jpg

FT61F14X_bug.zip

3.97 MB

使用特权

评论回复
8
panxiaoyi|  楼主 | 2023-4-7 22:39 | 只看该作者
本帖最后由 panxiaoyi 于 2023-4-7 22:43 编辑

//Device: FT61F14X

#include "SYSCFG.h"

//===========================================================

volatile char W_TMP    [url=home.php?mod=space&uid=72445]@[/url] 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,就是错误

使用特权

评论回复
评论
DanPianJiFangAn 2023-5-5 16:08 回复TA
这其实还是你的问题,中断用到的变量,定义时需要加 volatile 关键字,你加了再编译看看反汇编的结果. 
9
panxiaoyi|  楼主 | 2023-4-7 22:52 | 只看该作者
说明一下,上面的  T4UIF=0;  //清零 ,是FT61F133的清零方式,FT61F145是=1才清零的,但是,只要程序运行了 LATA=255;  说明就有问题

使用特权

评论回复
10
叶春勇| | 2023-4-8 15:06 | 只看该作者
panxiaoyi 发表于 2023-4-7 22:52
说明一下,上面的  T4UIF=0;  //清零 ,是FT61F133的清零方式,FT61F145是=1才清零的,但是,只要程序运行 ...

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

使用特权

评论回复
11
叶春勇| | 2023-4-8 15:13 | 只看该作者
panxiaoyi 发表于 2023-4-7 22:19
是的,我也是使用这样的方法解决的,为了进度只能另寻出路,但是,为了查这个错,花了我超过半天的时间, ...

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

使用特权

评论回复
12
wzjhuohua| | 2023-4-10 09:17 | 只看该作者
辉芒微的编译器有点牛

使用特权

评论回复
13
DanPianJiFangAn| | 2023-4-18 10:52 | 只看该作者
书写代码 aaa=1 ,则:

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

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

使用特权

评论回复
14
panxiaoyi|  楼主 | 2023-4-19 08:22 | 只看该作者
DanPianJiFangAn 发表于 2023-4-18 10:52
书写代码 aaa=1 ,则:

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

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

使用特权

评论回复
15
panxiaoyi|  楼主 | 2023-4-19 08:41 | 只看该作者
不过话也说回来,FT62F0Gx 系列,上面的问题都解决了,函数不会报错了,aaa=1,跟  aaa=2,所产生的指令是一样的,而且是 1T 时钟,值得期待

捕获.PNG (323.49 KB )

捕获.PNG

使用特权

评论回复
16
lrhsx33| | 2023-4-25 11:53 | 只看该作者
if+nop   行走天下。IDE一言难尽

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

384

帖子

2

粉丝