打印
[PIC®/AVR®/dsPIC®产品]

关于const类型变量使用的问题,请大侠指点,谢谢!

[复制链接]
2264|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 LiangZen 于 2019-2-26 11:11 编辑

详细请参考附件,附件是完整的工程,问题描述也main.c中有描述: //CRC校验
const unsigned int crc16L[] = \
{
    0x0000, 0xC0C1, 0xC181, 0x0140,
    0xC301, 0x03C0, 0x0280, 0xC241,
    0xC601, 0x06C0, 0x0780, 0xC741,
    0x0500, 0xC5C1, 0xC481, 0x0440,
};
const unsigned int crc16H[] = \
{
   0x0000, 0xCC01, 0xD801, 0x1400,
   0xF001, 0x3C00, 0x2800, 0xE401,
   0xA001, 0x6C00, 0x7800, 0xB401,
   0x5000, 0x9C01, 0x8801, 0x4400,
};
unsigned int  i_a;
unsigned int  i_b;
while (1)
    {
        // Add your application code
        i_a = crc16L[3];
        if(i_a == 0x0140){
            i_b = 1;
            NOP();
        } else {
            NOP();
            i_b = 0;
        }
        // The problem is :The variable crc16L cannot be assigned to i_a, Why?
        NOP();
        NOP();
    }

66K40_DEMO.zip

825.37 KB

评论
xch 2019-2-28 09:17 回复TA
被编译器优化了 
沙发
LiangZen|  楼主 | 2019-2-26 11:13 | 只看该作者
如果单单从程序看不出问题,可以下载附件模拟运行试试,结果是i_b = 0;

使用特权

评论回复
板凳
LiangZen|  楼主 | 2019-2-26 11:15 | 只看该作者
使用的芯片是pic18f66k40, 奇怪的是这段代码在其它芯片上运行是没有问题,在这款片子上就出问题;工程编译又没有问题,所以想请高手帮忙,谢谢!

使用特权

评论回复
地板
aqawasaz| | 2019-2-26 15:00 | 只看该作者
理论上应该不会有这个问题,可能是跟环境配置有关,也可以再仔细看下芯片手册。

使用特权

评论回复
5
CoolSilicon| | 2019-2-26 15:56 | 只看该作者
你编译器用free模式, 然后软仿试试看......

使用特权

评论回复
6
oxygenzz| | 2019-2-26 16:33 | 只看该作者
LiangZen 发表于 2019-2-26 11:13
如果单单从程序看不出问题,可以下载附件模拟运行试试,结果是i_b = 0;

程序软件仿真跑了一下,没看到问题。

楼主的程序里说,i_a 如果没有得到正确的值,实际得到的是什么值?
有看过flash里面的crc16L常量数组数据都对吗?

使用特权

评论回复
7
handlike| | 2019-2-26 17:02 | 只看该作者
如果把   unsigned int   都改成unsigned short int 呢?   

使用特权

评论回复
8
LiangZen|  楼主 | 2019-2-27 09:53 | 只看该作者
oxygenzz 发表于 2019-2-26 16:33
程序软件仿真跑了一下,没看到问题。

楼主的程序里说,i_a 如果没有得到正确的值,实际得到的是什么值? ...

crc16L的数据都对,但是i_a的数据都是0

使用特权

评论回复
9
LiangZen|  楼主 | 2019-2-27 10:35 | 只看该作者
handlike 发表于 2019-2-26 17:02
如果把   unsigned int   都改成unsigned short int 呢?

改成unsigned short int 效果一样,i_a 还是给不到值,是“0”

使用特权

评论回复
10
lcczg| | 2019-2-27 10:36 | 只看该作者
我在用GCC编译AVR芯片时会碰到这种问题。这就需要用memory的驱动去读了,例如 FLASH_ReadWord()。可以在MCC里添加memory外设,里面有驱动代码。

使用特权

评论回复
11
LiangZen|  楼主 | 2019-2-27 10:37 | 只看该作者
附件图片是我实时在线仿真的图片,仿真结果还是i_a = 0, 没有按我预期的0x0140; 不知道为什么?

微信图片_20190227103129.jpg (297.82 KB )

微信图片_20190227103129.jpg

使用特权

评论回复
12
LiangZen|  楼主 | 2019-2-27 10:40 | 只看该作者
oxygenzz 发表于 2019-2-26 16:33
程序软件仿真跑了一下,没看到问题。

楼主的程序里说,i_a 如果没有得到正确的值,实际得到的是什么值? ...

从仿真看crc16L寄存器的值,都是正确的;crc16L[3] = 0x0140

使用特权

评论回复
13
LiangZen|  楼主 | 2019-2-27 10:54 | 只看该作者
在线仿真 flash里面的数据是对的,但是就是给值不成功,不知道为啥?

微信图片_20190227105128.jpg (307.09 KB )

微信图片_20190227105128.jpg

使用特权

评论回复
14
LiangZen|  楼主 | 2019-2-27 11:40 | 只看该作者
lcczg 发表于 2019-2-27 10:36
我在用GCC编译AVR芯片时会碰到这种问题。这就需要用memory的驱动去读了,例如 FLASH_ReadWord()。可以在M ...

我还有感温包的温度表,好多,都改成这种方式是不是会很麻烦;关键我还是想找出 出现这种问题的原因;

使用特权

评论回复
15
oxygenzz| | 2019-2-27 11:58 | 只看该作者
楼主,试一下附件的工程,看是否在K40芯片上能正常工作?

66K40_DEMO_0227.zip

893.7 KB

使用特权

评论回复
16
LiangZen|  楼主 | 2019-2-27 12:53 | 只看该作者
正常了!什么问题?怎么解决的?

微信图片_20190227125243.jpg (354.08 KB )

微信图片_20190227125243.jpg

使用特权

评论回复
17
LiangZen|  楼主 | 2019-2-27 12:54 | 只看该作者
oxygenzz 发表于 2019-2-27 11:58
楼主,试一下附件的工程,看是否在K40芯片上能正常工作?

用你的工程可以哦,有什么区别吗?和我的;

使用特权

评论回复
18
oxygenzz| | 2019-2-27 13:55 | 只看该作者
要按照下面文档里面的步骤去做,具体的看一下文档吧,第4页 3.1节:
http://ww1.microchip.com/downloa ... rrata-80000714E.pdf

使用特权

评论回复
19
CoolSilicon| | 2019-2-27 14:18 | 只看该作者
LiangZen 发表于 2019-2-27 12:53
正常了!什么问题?怎么解决的?

有时候 X IDE的观测窗口可能刷新有点问题..重启一下IDE就好了...

使用特权

评论回复
20
LiangZen|  楼主 | 2019-2-27 16:32 | 只看该作者
问题已解决,多谢各位大侠!

Cutter_2019-02-27 04_31_59.336.png (40.65 KB )

Cutter_2019-02-27 04_31_59.336.png

使用特权

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

本版积分规则

2

主题

21

帖子

0

粉丝