|
下面是用唯一ID加密的代码, 在Debug版本下运行正常,但是Release版本下,编译器认为 U_ID 都是0xFFFFFFFF, 所以将比较的过程给优化了,每次执行都是将唯一ID写入U_ID数组中,结果这份代码失去了作用。
而如果给U_ID变量加上 volatile 关键词,U_ID将被分配到RAM区域,也不能起作用。
请教各位高手怎么样解决这个问题。
如果要说是降低优化级别的,那就算了,我发布的版本从来都是最高优化级别的。
- bool bFirmwareOK;
- void FLASH_Write(u32 Addr, const void *buff, u32 len)
- {
- FLASH_Unlock();
- //写入
- u16* p=(u16*)buff;
- for (int i=0;i<len;i+=2)
- {
- FLASH_WaitForLastOperation(100000);
- FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
- FLASH_ProgramHalfWord(Addr + i , *p++);
- }
- FLASH_Lock();
- }
- bool CheckU_ID()
- {
- static u32 const U_ID[3]={0xffffffff,0xffffffff,0xffffffff};
- u32 const *pID=(u32*)(0x1FFFF7E8);
- u32 TmpID[]={pID[0],pID[1],pID[2]};
- u32 ID[3]={U_ID[0],U_ID[1],U_ID[2]};
-
- if (ID[0]==0xffffffff && ID[1]==0xffffffff && ID[2]==0xffffffff)
- {
- FLASH_Write((u32)U_ID, TmpID, sizeof(TmpID));
- return true;
- }
- else if (ID[0]==TmpID[0] && ID[1]==TmpID[1] && ID[2]==TmpID[2])
- return true;
- return false;
- }
- int main()
- {
- bFirmwareOK=CheckU_ID();
- if (!bFirmwareOK) return 0;
- while (1)
- {
- }
- }
复制代码 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|