keil C语言求教!

[复制链接]
3785|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放大另外一个文件中定义,此处声明看看
nevsayno 发表于 2011-2-22 17:23 | 显示全部楼层
把这个数据读入到RAM中再判断
 楼主| 电子乌托邦 发表于 2011-2-22 17:30 | 显示全部楼层
楼上朋友,真是感谢啊,
经过试验,你说的外部声明办法的确奏效,
这种办法都能想到,真是佩服。
ayb_ice,谢谢。
结贴。
wookongbun 发表于 2011-2-22 17:40 | 显示全部楼层
u16 const  ID  = 0xffff;
volatile u16 * pseduo_id = (volatile u16 *)(&ID);
if(*pseduo_id == 0xffff)
{
}
这个试试
 楼主| 电子乌托邦 发表于 2011-2-22 17:50 | 显示全部楼层
谢谢5楼7楼,再申请个变量的方法也行,
不过还是感觉4楼的方法“邪恶”。
ayb_ice 发表于 2011-2-22 19:24 | 显示全部楼层
谢谢5楼7楼,再申请个变量的方法也行,
不过还是感觉4楼的方法“邪恶”。
电子乌托邦 发表于 2011-2-22 17:50

我经常测试各种编译器是否聪明,可靠....
johnwjl 发表于 2011-2-22 21:25 | 显示全部楼层
ayb_ice==高手。

我一般这样做:
u16 const  ID;         // 定义一个flash型常量;
...
int main (void)
{
      if(ID != 0x5a5a)              // 检测是程序第一次运行
      {
                   通过IAP,操作flash编程,把ID赋值为0x5a5a;
             dosomething;
      }
}
这样有好处吗?大家不妨继续讨论。
xiang__e 发表于 2011-2-23 11:23 | 显示全部楼层
楼上的做法 可以避免一些难以预料的误操作
 楼主| 电子乌托邦 发表于 2011-2-23 11:47 | 显示全部楼层
10L的写法将不存在帖子的问题啊!好写法
eefanwei 发表于 2011-2-23 20:28 | 显示全部楼层
声明一个变量来存吧。 4楼的方法没搞明白:(
您需要登录后才可以回帖 登录 | 注册

本版积分规则

140

主题

633

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部