打印

keil C语言求教!

[复制链接]
2306|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电子乌托邦|  楼主 | 2011-2-22 16:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
朋友们,请教大家个问题。问题并不简单哦!
环境:MDK 4.12 硬件STM32F103
程序如下:
u16 const  ID  = 0xffff;         // 定义一个flash型常量;
...
int main (void)
{
      if(ID == 0xffff)              // 检测是程序第一次运行
      {
             通过IAP,操作flash编程,把ID赋值为0;
             dosomething;
      }
}

问题来了,编译器自以为是,认为我的      if(ID == 0xffff) 是多余的,直接没有编译。
朋友们,我该如何告诉编译器,我判断一个常量,不是个白痴行为呢?

相关帖子

沙发
ayb_ice| | 2011-2-22 17:01 | 只看该作者
加个volatile试试

使用特权

评论回复
板凳
电子乌托邦|  楼主 | 2011-2-22 17:05 | 只看该作者
楼上回复神速,不过这个办法我之前试过了,
加上volatile后,变量被分配到ram中了,不在flash中定义了。
此法行不通

使用特权

评论回复
地板
ayb_ice| | 2011-2-22 17:17 | 只看该作者
把ID放大另外一个文件中定义,此处声明看看

使用特权

评论回复
5
nevsayno| | 2011-2-22 17:23 | 只看该作者
把这个数据读入到RAM中再判断

使用特权

评论回复
6
电子乌托邦|  楼主 | 2011-2-22 17:30 | 只看该作者
楼上朋友,真是感谢啊,
经过试验,你说的外部声明办法的确奏效,
这种办法都能想到,真是佩服。
ayb_ice,谢谢。
结贴。

使用特权

评论回复
7
wookongbun| | 2011-2-22 17:40 | 只看该作者
u16 const  ID  = 0xffff;
volatile u16 * pseduo_id = (volatile u16 *)(&ID);
if(*pseduo_id == 0xffff)
{
}
这个试试

使用特权

评论回复
8
电子乌托邦|  楼主 | 2011-2-22 17:50 | 只看该作者
谢谢5楼7楼,再申请个变量的方法也行,
不过还是感觉4楼的方法“邪恶”。

使用特权

评论回复
9
ayb_ice| | 2011-2-22 19:24 | 只看该作者
谢谢5楼7楼,再申请个变量的方法也行,
不过还是感觉4楼的方法“邪恶”。
电子乌托邦 发表于 2011-2-22 17:50

我经常测试各种编译器是否聪明,可靠....

使用特权

评论回复
10
johnwjl| | 2011-2-22 21:25 | 只看该作者
ayb_ice==高手。

我一般这样做:
u16 const  ID;         // 定义一个flash型常量;
...
int main (void)
{
      if(ID != 0x5a5a)              // 检测是程序第一次运行
      {
                   通过IAP,操作flash编程,把ID赋值为0x5a5a;
             dosomething;
      }
}
这样有好处吗?大家不妨继续讨论。

使用特权

评论回复
11
xiang__e| | 2011-2-23 11:23 | 只看该作者
楼上的做法 可以避免一些难以预料的误操作

使用特权

评论回复
12
电子乌托邦|  楼主 | 2011-2-23 11:47 | 只看该作者
10L的写法将不存在帖子的问题啊!好写法

使用特权

评论回复
13
eefanwei| | 2011-2-23 20:28 | 只看该作者
声明一个变量来存吧。 4楼的方法没搞明白:(

使用特权

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

本版积分规则

140

主题

633

帖子

2

粉丝