首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >A20 SoC上的数据中止

A20 SoC上的数据中止
EN

Stack Overflow用户
提问于 2016-08-11 15:19:30
回答 1查看 102关注 0票数 0

我正在尝试编写一个小应用程序,它通过串口显示一条消息。这个二进制文件是在没有操作系统的情况下执行的,所以它是裸金属。

守则如下:

代码语言:javascript
复制
#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引导启动这个二进制文件,实际上二进制引导很好,直到它达到:

代码语言:javascript
复制
*uart0 = (unsigned int)(*str);

一旦我试图写入这个内存,我就会得到一个数据中止错误。看起来我不允许在这个内存地址上写东西,但是看看A20用户手册,我发现UART0实际上被映射到0x01C28000,所以我应该可以在那里写东西。

这是输出:

代码语言:javascript
复制
=> 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定义为常量之后,现在正在“更好地”工作。它还是不能正常工作,因为我收到垃圾而不是我的短信。

下面是更新的代码:

代码语言:javascript
复制
#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");
}

产出如下:

代码语言:javascript
复制
=>  go 0x42000000
## Starting application at 0x42000000 ...
��ᚕ��
    ��

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

代码语言:javascript
复制
arch/arm/cpu/armv7/sunxi/early_print.c

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

事先谢谢

EN

回答 1

Stack Overflow用户

发布于 2016-08-11 22:51:54

这里最可能的答案是,您没有正确地构建一个裸金属应用程序。请查看under中的hello_world示例/独立示例,以了解如何更重要地链接应用程序。首先,您可能希望调用一些导出的函数,以确认您已经克服了这些障碍,然后才开始直接销毁硬件。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38900328

复制
相关文章

相似问题

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