c语言 - 无法在皮层上运行简单的 printf a55



我正试图开始使用RK3568控制器(皮质a55)我有一个项目和一个makefile我设法输出字符使用寄存器和闪烁的LED。但是,如果我尝试使用printf输出一个字符串,程序就会冻结,没有任何生命迹象。我正在寻找解决这个问题的方法,主要的解决方案是实现_write function(int file, char *ptr, int len),标准的printf函数应该使用它。但这无济于事。我试图从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 *.* 

我很乐意至少提供一些建议

最后我解决了这个问题我试着做如下

  1. 我实现了_sbrk函数(从这得到)
  2. 我试图突出显示堆和堆栈
  3. 我实现了_write功能(但没有触及_write_r[!])
  4. 我提供了memcmp,memset,memmove,memcpy函数的实现实际上,第1项。对工作的影响最大。如果您删除除第4点以外的所有内容,那么代码就可以工作,并且我可以输出"Hello world"!让我提醒你,我使用aarch64-none-elf-gcc第4项我从这里拿走了https://embeddedartistry.com/blog/2017/03/22/memset-memcpy-memcmp-and-memmove/

最新更新