[英]Raspberry Pi 3 Model B ARM assembly Illegal Instruction (Core Dumped)
[英]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汇编中运行。 以下是一些对我的个人项目最有帮助的答案:
谢谢!
裸机可能是正确的选择。 烘焙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.