DevkitARM,模拟器上的白屏如果我在代码中使用for循环?

Posted

技术标签:

【中文标题】DevkitARM,模拟器上的白屏如果我在代码中使用for循环?【英文标题】:DevkitARM, white screen on emulator If I use a for loop in the code? 【发布时间】:2020-07-01 13:52:52 【问题描述】:

此代码运行良好,并按预期输出像素:

int main()

    *(unsigned int *)0x04000000 = 0x0403;
    unsigned short *Screen = (unsigned short *)0x06000000;
    Screen[120 + 80 * 240] = 0x001F;
    Screen[136 + 80 * 240] = 0x03E0;
    Screen[120 + 96 * 240] = 0x7C00;
    Screen[100] = 0x7C00;

    while (1);

    return 0;

但每当我尝试添加 for 循环并从中更改 vram 值时,我在模拟器上得到白屏,它编译时没有错误甚至警告,但我在模拟器上得到白屏。

int main()

    *(unsigned int *)0x04000000 = 0x0403;
    unsigned short *Screen = (unsigned short *)0x06000000;
    
    Screen[120 + 80 * 240] = 0x001F;
    Screen[136 + 80 * 240] = 0x03E0;
    Screen[120 + 96 * 240] = 0x7C00;
    Screen[100] = 0x7C00;
    
    int i;

    for (i = 100; i < 110; i++)
    
        Screen[i] = 0x7C00;
    

    while (1);
    
    return 0;


【问题讨论】:

你能显示两个程序的汇编代码吗?我想知道堆栈是否没有正确设置,在第一个程序中编译器不需要使用它。 @user253751 我没有写一行汇编代码,也不知道如何显示它。 编译器生成汇编代码。学习如何看待它会很有用。 【参考方案1】:

我遇到了同样的问题并找到了解决方案:您的显示控制指针需要为volatile。如果您不将其标记为 volatile,则在编译时会发生一些不需要的优化,从而导致您出现意外行为。

*(volatile unsigned int *)0x04000000 = 0x0403;

【讨论】:

好收获!出于类似的原因,您可能还想要volatile unsigned short *Screen

以上是关于DevkitARM,模拟器上的白屏如果我在代码中使用for循环?的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib pyplot 冻结,除了 Spyder 上的白屏外不显示任何内容

C# winform this.Visible = false后出现一个短暂的白屏

每次运行 iOS 模拟器时都会出现白屏

Laravel 路由上奇怪的白屏(“/”)

使用openGL顶点数组的白屏

CSS如何影响首次加载时的白屏时间