单片机遇到“auto segment too large“怎么办

遇到这个情况有可能是某一个数组太大,然后单片机内部数据存储区不够用,

所以可以把这个数据存在单片机外例如

     int led[8][8]={
        {1,1,1,1,1,1,1,1},//1
        {1,0,0,0,0,0,0,1},//2
        {1,0,0,0,0,0,0,1},//3
        {1,0,0,0,0,0,0,1},//4
        {1,0,0,0,0,0,0,1},//5
        {1,0,0,0,0,0,0,1},//6
        {1,0,0,0,0,0,0,1},//7
        {1,1,1,1,1,1,1,1}//8

}

解决的办法是在变量前面加前缀xdata.改为

    xdata int led[8][8]={
        {1,1,1,1,1,1,1,1},//1
        {1,0,0,0,0,0,0,1},//2
        {1,0,0,0,0,0,0,1},//3
        {1,0,0,0,0,0,0,1},//4
        {1,0,0,0,0,0,0,1},//5
        {1,0,0,0,0,0,0,1},//6
        {1,0,0,0,0,0,0,1},//7
        {1,1,1,1,1,1,1,1}//8

}

这样就可以了,如果是直接修改keil的配置,后面会发生另外的意外,如果使用这个办法不会发生那样的事情。所以这个方法应该更好,例如把数据全部存在外部,那么访问速度会更慢

//注意了:如果按照上面办法会发生另外的错误

因为使用如果要使用上面的方法,或者把keil的设置更改为large,最后在Proteus仿真的时候都要外接一个RAM才能够模拟,而初学者是没有学习怎么外接RAM的,所以最好可以这么改

   unsiged char code led[8][8]={
        {1,1,1,1,1,1,1,1},//1
        {1,0,0,0,0,0,0,1},//2
        {1,0,0,0,0,0,0,1},//3
        {1,0,0,0,0,0,0,1},//4
        {1,0,0,0,0,0,0,1},//5
        {1,0,0,0,0,0,0,1},//6
        {1,0,0,0,0,0,0,1},//7
        {1,1,1,1,1,1,1,1}//8

}

这个code的意思:表示要把数据粗存在程序储存区,AT89C51单片机有64K之多,远远大于128B

足够用了。

你可能感兴趣的:(单片机,嵌入式硬件)