21ic电子技术开发论坛

标题: 遇到个怪事,当局者迷 [打印本页]

作者: 古道热肠    时间: 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个单元。
作者: computer00    时间: 2008-4-2 16:58
标题: 我在keil下试了,无问题。

作者: computer00    时间: 2008-4-2 17:02
标题: 你直接查看内存试试,不要看watch窗口,可能有bug。

作者: 古道热肠    时间: 2008-4-3 16:58
标题: 原因找到了,大家引以为戒
回家路上细思量,内存出错多半是指针赿界,回忆系统新加了一扇区读写512字节的缓冲区,再加上这显存288个字节,一共占用Xdata 890,哈哈仿真器SST89E516最大就768字节,读写最后的单元当然出错。后改小扇区读写缓冲区,系统正常了。
系统设置XData按1K设置,也是目标单片机的配置的最大容量。所以出现此异常。如果按仿真器的配置来设置,则编译时就会报XDATA超标,也许早就会发现问题。
作者: gyt    时间: 2008-4-4 12:54
标题: 谢谢提醒





欢迎光临 21ic电子技术开发论坛 (https://bbs.21ic.com/) Powered by Discuz! X3.5