gpt4 book ai didi

c - A20 SoC 上的数据中止

转载 作者:太空宇宙 更新时间:2023-11-04 08:11:46 25 4
gpt4 key购买 nike

我正在尝试编写一个通过串行端口显示消息的小型应用程序。该二进制文件在没有操作系统的情况下执行,因此它是裸机。

代码如下:

#include <stdint.h>
#define FIFO 0x0
#define NOFIFO 0x1
#define FIFO_STATUS 0x0

#define THR_READY 0x1
#define THR_STATUS 0x5

#define UART_MEM 0x1C28000


volatile unsigned int *uart0 = (unsigned int *)UART_MEM;
volatile unsigned int *uart_str = (unsigned int *)(UART_MEM + 0x7c);
volatile unsigned int *uart_lstr = (unsigned int *)(UART_MEM + 0x14);


void print_smth(const char *str) {
while (*str != '\0') {
while ((*uart_lstr & (1 << THR_STATUS)) != THR_READY)
;
*uart0 = (unsigned int)(*str);
str++;
}
}

void c_entry(void) {
print_smth("Hello");
}

我正在使用 u-boot 启动这个二进制文件,实际上二进制文件启动正常,直到它到达:

*uart0 = (unsigned int)(*str);

一旦我尝试写入此内存,就会收到数据中止错误。看起来我不允许写这个内存地址,但看看 A20 User Manual我看到实际上 UART0 被映射到 0x01C28000,所以我应该可以在那里写入。

这是输出:

=> loadx
## Ready for binary (xmodem) download to 0x42000000 at 115200 bps...
CxyzModem - CRC mode, 2(SOH)/0(STX)/0(CAN) packets, 2 retries
## Total Size = 0x000000c4 = 196 Bytes
=> go 0x42000000
## Starting application at 0x42000000 ...
data abort
pc : [<4200007c>] lr : [<420000ac>]
reloc pc : [<0d0a207c>] lr : [<0d0a20ac>]
sp : 000010b0 ip : 7fe79000 fp : 000010bc
r10: 00000002 r9 : 7af3dee0 r8 : 7efb47a8
r7 : 7af3fab8 r6 : 42000000 r5 : 00000002 r4 : 7af3fabc
r3 : ee070f15 r2 : 0000001e r1 : 7af3fabc r0 : 000000b0
Flags: nZCv IRQs off FIQs off Mode SVC_32
Resetting CPU ...

resetting ...

你知道为什么会这样吗?

有没有可能是代码没有映射到 RAM,这就是我收到此错误的原因?

== 更新 ==

将 vars 定义为常量后,现在工作“更好”了。它仍然无法正常工作,因为我得到的是垃圾而不是我的文本。

这里是更新的代码:

#include <stdint.h>

#define TEMT_STATUS (0x1 << 6)

#define UART0 0x1C28000
#define UART_LSR 0x14



volatile unsigned int *const uart0 = (unsigned int *)(UART0);
volatile unsigned int *const uart_lsr = (unsigned int *)(UART0 + UART_LSR);


void print_smth(const char *str) {

while (*str != '\0') {
while ( !(*uart_lsr & TEMT_STATUS))
;
*uart0 = (unsigned int)(*str);
str++;
}
}

void c_entry(void) {
print_smth("os");
}

输出是:

=>  go 0x42000000
## Starting application at 0x42000000 ...
��ᚕ��
��

我确定我遗漏了什么,但我不确定是什么。我看了一下 u-boot 正在使用的驱动程序,位于:

arch/arm/cpu/armv7/sunxi/early_print.c

而且实际上它并没有比我做得更多。所以我想知道失败在哪里。

提前致谢问候

最佳答案

这里最有可能的答案是您没有正确构建裸机应用程序。请查看 examples/standalone 下 U-Boot 中的 hello_world 示例,了解如何最重要地链接应用程序。您可能希望首先调用一些导出的函数,以确认您已经克服了这些障碍,然后再继续直接攻击硬件。

关于c - A20 SoC 上的数据中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38900328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com