变量存储

这两天在写一个系统分区遍历的代码。其中有一个对外部数据存储区的读写。

这个外部数据存储区的高32K不是我们通常使用的RAM,而是用Flash表示。

所以对这个数据存储区的读写都必须按照Flash的规则进行,先擦后写。

下面是代码:

uint16 s = 0x18000;

while(s<0x20000){
    MutliFuncHigh_32K(s,x);  //
    s = s+x;
}

//读写高32K
void MutliFuncHigh_32K(uint16 addr,uint16 len)
{
    uint16 i,adr;
    adr=addr;
    P1=0x00;
    EraseSector(addr,1);
    for(i=0;i<len;i++)
    {
        WByte_Flash(addr++,i);
    }
    for(i=0;i<len;i++)
    {    
        P1=~P1;
        ReadByte(adr++);
        P1=~P1;
    }
}

看代码是发现没有什么问题的。

但是在仿真的时候总是出现问题,读写了一会时钟就会停止,很奇怪的现象,因为没有对时钟进行操作,但是时钟却受到了影响。

一下午都在排查这个问题。

最后发现是变量存储的问题。

0x18000,已经超出了uint16的存储范围。uint16的存储范围是0~65535,0x18000是98304,早已经超出了存储范围。

把变量声明为uint32,就OK。

看来以后真的要注意以下存储范围,超出了存储范围会出现一些非常奇怪的问题。

原文地址:https://www.cnblogs.com/cuglkb/p/6472870.html