首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能在皮层a55上运行简单的打印程序

不能在皮层a55上运行简单的打印程序
EN

Stack Overflow用户
提问于 2022-05-25 06:30:18
回答 1查看 140关注 0票数 0

我试着开始使用RK3568控制器(皮质a55),我有一个项目和一个makefile,我设法使用寄存器和闪光灯输出字符。但是如果我尝试使用printf输出一个字符串,程序就会冻结,没有任何生命迹象。我正在寻找这个问题的解决方案,主要的解决方案是实现标准printf函数应该使用的_write function(int file, char *ptr, int len)。但没什么用。我试图从github连接另一个Printf函数,它可以工作。我不明白原因是什么。我尝试从标准库调用其他函数,例如strlen,它具有与printf相同的行为。

代码语言:javascript
复制
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裸金属目标编译器(无精灵),我尝试使用另一个AArch32裸金属目标编译器(臂-无-eabi),但是它还有更多的问题。他甚至不能构建这个项目并抛出汇编程序错误。

代码语言:javascript
复制
Error: selected processor does not support requested special purpose register -- `msr tpidr_el 1,xzr'
Error: ARM register expected -- `ldr x1,=_start'

还有更多相似的

我的马卡费尔,也许能帮上忙

代码语言:javascript
复制
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 *.* 

我很乐意至少给你一些建议

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-27 05:10:24

最后,我解决了这个问题,我试着做了以下工作

  1. 我实现了_sbrk函数(从获得)
  2. 我试图突出显示堆和堆栈。
  3. 我实现了_write函数(但没有接触到_write_r !)
  4. 我提供了memcmpmemsetmemmovememcpy函数的实现,在现实中,项目编号。对工作的影响最大。如果您删除了除第4点以外的所有内容,那么代码可以工作,我可以输出"Hello“!让我提醒你,我用的是我从这里拿来的aarch64-none-elf-gcc项目4,https://embeddedartistry.com/blog/2017/03/22/memset-memcpy-memcmp-and-memmove/
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72372848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档