繁体   English   中英

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

[英]How do I make an ARM source file into a kernel that the Raspberry Pi 3 B will run?

我受到这个Starfox粉丝游戏的启发,在Raspberry Pi上使用ARM组件创建了一个游戏。 我还查看了本教程系列 ,以更好地了解邮箱和帧缓冲系统。 无论我使用哪个Make / CMake,我都无法从这两个地方获得任何东西来启动,因为它们应该在原始的Raspberry Pi上运行。 我看过Valver的裸机编程教程,raspberrypi.org裸机论坛以及我自己的C代码中无数的输出源文件,只是为了了解如何在屏幕上打印图形而一无所获。 我仅在C代码中使用X11库,只是发现输出ARM源文件仅按原样调用C函数(例如bl XOpenDisplay )。 如果我在Raspbian运行时尝试执行第二个链接给出的代码(确保将基本外设地址更改为0x3F000000并将视频核心访问权限更改为0xC0000000 ),则会遇到分段错误。

我想要一个程序集源文件(例如main.s )并将其制作为二进制文件(例如kernel7.img或类似文件),该文件将在我打开Raspberry Pi 3 B时立即运行。

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

  1. 从前两个链接移植代码以在启动时成功在我的Pi 3上运行,请记住它们会为我的模型生成错误的二进制文件。
  2. 用于构建自定义OS的工具可以根据需要注入汇编代码,尽管我不确定这样做是否合理。
  3. 学习如何在ARM程序集中制作GUI且可以在最新的Raspbian上运行而不产生分段错误或类似错误的资源。

谢谢!

裸机可能是正确的选择。 烘焙pi系列很好,很多人都从那里开始,它的问题可能会困扰您。 raspberrypi.org上的baremetal论坛非常好,有一个固定的线程,其中包含许多baremetal信息和示例。

vectors.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

notmain.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);
}

MEMMAP

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-zero上,删除任何config.txt,保存或重命名任何kernel.img,然后复制此kernel.img,LED将会闪烁。

删除c代码并将其分支到您的主目录中,然后将其添加到项目中,然后就可以开始...

视频的帧缓冲区非常容易,一个邮箱握手,您就有一个基地址可以将像素推入...

从pi-zero开始...对于pi3,您将需要处于aarch32模式,这可能需要config.txt来完成。 如果您不执行任何中断,则大多数情况下它都是相同的,如果您这样做,那么有很多裸机示例可以向您展示这些修改...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM