打印

遇到个怪事,当局者迷

[复制链接]
1849|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
古道热肠|  楼主 | 2008-4-2 16:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定义一个数组做显存uchar xdata ucLEDDisplayMemory[288];        //显示存储器

用memset函数只能更改前255个单元的内容,后32个无法改变,让人无法理解,大家是否遇到此类怪事。

相关帖子

沙发
古道热肠|  楼主 | 2008-4-2 16:47 | 只看该作者

贴上相关代码

void MemorySet(uchar *pDest,uchar ucContent,uint uiLength)
{
    while(uiLength--)
    {
        *pDest++ = ucContent;
    }
}


        RefreshLEDScreen(100);
//        memset(ucLEDDisplayMemory,0,((uint)c_LineWidth)*c_MaxLineCount);
        MemorySet(ucLEDDisplayMemory,0,288);

        RefreshLEDScreen(200);
        MemorySet(ucLEDDisplayMemory,0xff,c_LineWidth*c_MaxLineCount);
        RefreshLEDScreen(200);
        
        memset(ucLEDDisplayMemory,0x5a,c_LineWidth*c_MaxLineCount);
        RefreshLEDScreen(200);
        memset(ucLEDDisplayMemory,0xa5,c_LineWidth*c_MaxLineCount);
        RefreshLEDScreen(200);

使用特权

评论回复
板凳
古道热肠|  楼主 | 2008-4-2 16:49 | 只看该作者

仿真运行监视到的内存情况见下图

255号数组单元还是0,256号数组单元就不对了。

使用特权

评论回复
地板
古道热肠|  楼主 | 2008-4-2 16:51 | 只看该作者

明明是用一个值填充288个显存单元

用系统函数memset和自己改写的函数MemorySet都出错。都只能修改前255个单元。

使用特权

评论回复
5
computer00| | 2008-4-2 16:58 | 只看该作者

我在keil下试了,无问题。

使用特权

评论回复
6
computer00| | 2008-4-2 17:02 | 只看该作者

你直接查看内存试试,不要看watch窗口,可能有bug。

使用特权

评论回复
7
古道热肠|  楼主 | 2008-4-3 16:58 | 只看该作者

原因找到了,大家引以为戒

回家路上细思量,内存出错多半是指针赿界,回忆系统新加了一扇区读写512字节的缓冲区,再加上这显存288个字节,一共占用Xdata 890,哈哈仿真器SST89E516最大就768字节,读写最后的单元当然出错。后改小扇区读写缓冲区,系统正常了。
系统设置XData按1K设置,也是目标单片机的配置的最大容量。所以出现此异常。如果按仿真器的配置来设置,则编译时就会报XDATA超标,也许早就会发现问题。

使用特权

评论回复
8
gyt| | 2008-4-4 12:54 | 只看该作者

谢谢提醒

使用特权

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

本版积分规则

284

主题

6411

帖子

16

粉丝