代码之家  ›  专栏  ›  技术社区  ›  Alexander Sapphire

如何将ARM源文件制作成Raspberry Pi 3B将运行的内核?

  •  0
  • Alexander Sapphire  · 技术社区  · 7 年前

    我的灵感来自 this Starfox fan game 使用树莓圆周率上的手臂组件创建游戏。我也看过 this tutorial series 为了更好地了解邮箱和帧缓冲系统。无论我使用哪个Make/CMake,我都无法从这两个地方获得任何东西来在启动时运行,因为它们应该在原始的Raspberry Pi上运行。我看过Valver的裸机编程教程raspberrypi。org裸机论坛,和无数输出源文件从我自己的C代码只是为了了解如何打印图形在屏幕上,并没有得到任何进展。我在C代码中使用了X11库,结果发现输出ARM源文件只是按原样调用C函数(例如。 bl XOpenDisplay ). 如果我试图执行第二个链接中给出的代码(确保将基址外设地址更改为 0x3F000000 以及视频核心访问 0xC0000000 )在Raspbian运行时,我发现了分割错误。

    我想要一个程序集源文件(例如, main.s kernel7.img 或类似的)当我打开我的树莓Pi 3 B时,它就会运行。

    是的,我知道用高级语言制作GUI更容易,但我决心让游戏在ARM汇编中运行。以下是一些对我个人项目最有帮助的答案:

    1. 从前两个链接移植代码,以便在启动时在我的Pi 3上成功运行,记住它们为我的模型生成了错误的二进制文件。

    1 回复  |  直到 7 年前
        1
  •  1
  •   old_timer    7 年前

    向量。s

    .globl _start
    _start:
        mov sp,#0x8000
        bl notmain
    hang: b hang
    
    .globl PUT32
    PUT32:
        str r1,[r0]
        bx lr
    
    .globl GET32
    GET32:
        ldr r0,[r0]
        bx lr
    
    .globl dummy
    dummy:
        bx lr
    

    诺曼。c

    extern void PUT32 ( unsigned int, unsigned int );
    extern unsigned int GET32 ( unsigned int );
    extern void dummy ( unsigned int );
    
    #define SYSTIMERCLO 0x20003004
    #define GPFSEL3 0x2020000C
    #define GPFSEL4 0x20200010
    #define GPSET1  0x20200020
    #define GPCLR1  0x2020002C
    
    //0x01000000 17 seconds
    //0x00400000 4 seconds
    //#define TIMER_BIT 0x01000000
    #define TIMER_BIT 0x00400000
    
    int notmain ( void )
    {
        unsigned int ra;
    
        ra=GET32(GPFSEL4);
        ra&=~(7<<21);
        ra|=1<<21;
        PUT32(GPFSEL4,ra);
    
        while(1)
        {
            PUT32(GPSET1,1<<(47-32));
            while(1)
            {
                ra=GET32(SYSTIMERCLO);
                if((ra&=TIMER_BIT)==TIMER_BIT) break;
            }
            PUT32(GPCLR1,1<<(47-32));
            while(1)
            {
                ra=GET32(SYSTIMERCLO);
                if((ra&=TIMER_BIT)==0) break;
            }
        }
        return(0);
    }
    

    MEMORY
    {
        ram : ORIGIN = 0x8000, LENGTH = 0x1000
    }
    
    SECTIONS
    {
        .text : { *(.text*) } > ram
        .bss : { *(.bss*) } > ram
    }
    

    建筑

    arm-none-eabi-as --warn --fatal-warnings vectors.s -o vectors.o
    arm-none-eabi-gcc -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding -c notmain.c -o notmain.o
    arm-none-eabi-ld vectors.o notmain.o -T memmap -o notmain.elf
    arm-none-eabi-objdump -D notmain.elf > notmain.list
    arm-none-eabi-objcopy notmain.elf -O binary kernel.img
    

    在pi为零时,删除任何配置。txt,保存或重命名任何内核。img并复制此内核。img和LED将闪烁。

    删除c代码并将其分支到主代码中,将其添加到项目中,就这样。。。

    从pi零开始。。。对于pi3,您将希望处于aarch32模式,您可能需要配置。txt要做的事。如果你不做任何中断,它在很大程度上是一样的,如果你做了,那么有很多裸体的例子来向你展示修改。。。