不能 运行 皮质 a55 上的简单 printf
Can't run simple printf on cortex a55
我正在尝试开始使用 RK3568 控制器 (cortex a55)
我有一个项目和一个 makefile
我设法使用寄存器输出字符并使 LED 闪烁。
但是如果我尝试使用 printf 输出一个字符串,程序就会死机而没有任何生命迹象。
我一直在寻找问题的解决方案,主要解决方案是实现标准 printf 函数应该使用的 _write function(int file, char *ptr, int len)
。但这没有帮助。
我尝试从 github 连接另一个 Printf 函数,它起作用了。我不明白这是什么原因。
我尝试调用标准库中的其他函数,例如 strlen
并且它具有与 printf
相同的行为
int _write(int file, char *ptr, int len)
{
__io_putchar('w');
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
__io_putchar( *ptr++ );
}
return len;
}
我正在使用 AArch64 裸机目标编译器 (aarch64-none-elf)
我尝试使用另一个 AArch32 裸机目标编译器 (arm-none-eabi),但它还有更多问题。他甚至无法构建项目并抛出汇编程序错误。
Error: selected processor does not support requested special purpose register -- `msr tpidr_el 1,xzr'
Error: ARM register expected -- `ldr x1,=_start'
还有更多类似的
我的 makefile,也许有帮助
PWD := $(shell pwd)
PRJ_BUILD := $(PWD)/build
CC := aarch64-none-elf-gcc
LD := aarch64-none-elf-ld
OBJCOPY := aarch64-none-elf-objcopy
OBJDUMP := aarch64-none-elf-objdump
SRC := src/entry_point.S
SRC += src/cache.S
SRC += src/main.c
SRC += src/stub.c
SRC := $(addprefix $(PWD)/,$(SRC))
INCLUDES := .
INCLUDES += src
INCLUDES := $(addprefix -I$(PWD)/,$(INCLUDES))
CFLAGS := -c -g
#CFLAGS += -march=armv8.2-a -mcpu=cortex-a55
CFLAGS += -mcpu=cortex-a55
#-mcpu=cortex-a55 -mfloat-abi=hard
define get_library_path
$(shell dirname $(shell $(CC) $(CFLAGS) -print-file-name=$(1)))
endef
LDFLAGS += -L $(call get_library_path,libc.a)
LDFLAGS += -L $(call get_library_path,libgcc.a)
LDFLAGS += -T $(PWD)/link.lds -lgcc -lc
all: app.elf
app.elf:
$(info $(PWD))
$(info SRC:[$(SRC)])
$(info INCLUDES:[$(INCLUDES)])
cd $(PRJ_BUILD) && $(CC) $(CFLAGS) $(INCLUDES) $(SRC)
cd $(PRJ_BUILD) && \
$(LD) -o app.elf $(PRJ_BUILD)/*.o \
$(LDFLAGS) -Map app.map
cd $(PRJ_BUILD) && $(OBJCOPY) -O binary app.elf app.bin
cd $(PRJ_BUILD) && $(OBJDUMP) app.elf -dS > app.lst
clean:
cd $(PRJ_BUILD) && rm -f *.*
我很乐意至少提供一些建议
最后我解决了这个问题
我尝试执行以下操作
- 我实现了
_sbrk
函数(来自this)
- 我试图突出显示堆和堆栈
- 我实现了
_write
功能(但没有触及_write_r
[!])
- 我提供了
memcmp
、memset
、memmove
、memcpy
函数的实现
实际上,项目编号对工作的影响最大。 4.如果你删除除第 4 点以外的所有内容,那么代码就可以工作,我可以输出“Hello world”!
让我提醒你,我使用 aarch64-none-elf-gcc
第 4 项我从这里 https://embeddedartistry.com/blog/2017/03/22/memset-memcpy-memcmp-and-memmove/
我正在尝试开始使用 RK3568 控制器 (cortex a55)
我有一个项目和一个 makefile
我设法使用寄存器输出字符并使 LED 闪烁。
但是如果我尝试使用 printf 输出一个字符串,程序就会死机而没有任何生命迹象。
我一直在寻找问题的解决方案,主要解决方案是实现标准 printf 函数应该使用的 _write function(int file, char *ptr, int len)
。但这没有帮助。
我尝试从 github 连接另一个 Printf 函数,它起作用了。我不明白这是什么原因。
我尝试调用标准库中的其他函数,例如 strlen
并且它具有与 printf
int _write(int file, char *ptr, int len)
{
__io_putchar('w');
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
__io_putchar( *ptr++ );
}
return len;
}
我正在使用 AArch64 裸机目标编译器 (aarch64-none-elf) 我尝试使用另一个 AArch32 裸机目标编译器 (arm-none-eabi),但它还有更多问题。他甚至无法构建项目并抛出汇编程序错误。
Error: selected processor does not support requested special purpose register -- `msr tpidr_el 1,xzr'
Error: ARM register expected -- `ldr x1,=_start'
还有更多类似的
我的 makefile,也许有帮助
PWD := $(shell pwd)
PRJ_BUILD := $(PWD)/build
CC := aarch64-none-elf-gcc
LD := aarch64-none-elf-ld
OBJCOPY := aarch64-none-elf-objcopy
OBJDUMP := aarch64-none-elf-objdump
SRC := src/entry_point.S
SRC += src/cache.S
SRC += src/main.c
SRC += src/stub.c
SRC := $(addprefix $(PWD)/,$(SRC))
INCLUDES := .
INCLUDES += src
INCLUDES := $(addprefix -I$(PWD)/,$(INCLUDES))
CFLAGS := -c -g
#CFLAGS += -march=armv8.2-a -mcpu=cortex-a55
CFLAGS += -mcpu=cortex-a55
#-mcpu=cortex-a55 -mfloat-abi=hard
define get_library_path
$(shell dirname $(shell $(CC) $(CFLAGS) -print-file-name=$(1)))
endef
LDFLAGS += -L $(call get_library_path,libc.a)
LDFLAGS += -L $(call get_library_path,libgcc.a)
LDFLAGS += -T $(PWD)/link.lds -lgcc -lc
all: app.elf
app.elf:
$(info $(PWD))
$(info SRC:[$(SRC)])
$(info INCLUDES:[$(INCLUDES)])
cd $(PRJ_BUILD) && $(CC) $(CFLAGS) $(INCLUDES) $(SRC)
cd $(PRJ_BUILD) && \
$(LD) -o app.elf $(PRJ_BUILD)/*.o \
$(LDFLAGS) -Map app.map
cd $(PRJ_BUILD) && $(OBJCOPY) -O binary app.elf app.bin
cd $(PRJ_BUILD) && $(OBJDUMP) app.elf -dS > app.lst
clean:
cd $(PRJ_BUILD) && rm -f *.*
我很乐意至少提供一些建议
最后我解决了这个问题 我尝试执行以下操作
- 我实现了
_sbrk
函数(来自this) - 我试图突出显示堆和堆栈
- 我实现了
_write
功能(但没有触及_write_r
[!]) - 我提供了
memcmp
、memset
、memmove
、memcpy
函数的实现 实际上,项目编号对工作的影响最大。 4.如果你删除除第 4 点以外的所有内容,那么代码就可以工作,我可以输出“Hello world”! 让我提醒你,我使用aarch64-none-elf-gcc
第 4 项我从这里 https://embeddedartistry.com/blog/2017/03/22/memset-memcpy-memcmp-and-memmove/