1

我想为 ARM 编写一个裸机 hello-world。消息应在 uart 输出。设备树文件说明了 uart:

            uart@09000 {
            compatible = "arm,pl011", "arm,primecell";
            reg = <0x9000 0x1000>;
            interrupts = <0x5>;
        };

这是我的 hello world 程序。

// vexpress.js:651
const int    DR    = 0x00;
const int    FR    = 0x18;
const int    IBRD  = 0x24;
const int    FBRD  = 0x28;
const int    LCR_H = 0x2c;
const int    CR    = 0x30;
const int    IFLS  = 0x34;
const int    IMSC  = 0x38;
const int    MIS   = 0x40;
const int    ICR   = 0x44;
unsigned int *uart;

void
putc(char c)
{
    // wait for UART to become ready to transmit
    // vexpress.js:707
    while ((uart[FR] & (1 << 7)));
    uart[DR]= c;
    while ((uart[FR] & (1 << 7)));
}

void
puts(char *s) {    
    while(*s)
        putc(*(s++));    
}

int
main()
{
    char s[] = { 'H', 'a', 'l', 'l', 'o' , 0};
    int i;
    // vexpress.js:1455
    uart = (unsigned int*)0x10009000;


    // 1
    putc('H');
    putc('a');
    putc('l');
    putc('l');
    putc('o');
    putc(' ');
    putc('W');
    putc('e');
    putc('l');
    putc('t');
    putc('\n');
    putc('\r');

    // 2
    puts(s);

    // 3
    for(i=97;i<123;i++){
        putc((char)i);
    }

    // 4
    puts("Hello World\n\r");
    while(1);
}

因此,该程序使用多种方式将输出内容输出到 uart。第 1 节(对 putc 的所有调用都有效。但 putc 似乎不喜欢在循环中被调用。2、3 和 4 都不起作用。第一个宪章确实起作用,奇怪的是 '\0' 此后发送,我不知道为什么。输出是

Hallo Welt                                                                      
a\0\0\0\0.........                                                               

我使用 arm-js 是因为它是唯一一个足够完整(mmu,可以运行 linux)并且足够简单到单步(没有 jit 或类似)的 arm 仿真器。

此外,有没有办法集成在构建时读取设备树文件信息的 uart 驱动程序?是否有一个内核可以让我轻松地独立使用该部分?

/编辑

cpu 是 ARMv5 cortex-a9 vexpress 处理器。我不确定还有哪些其他信息感兴趣,所以
这是设备树文件这是汇编代码

4

1 回答 1

3
uart = (unsigned int*)0x10009000;

while ((uart[FR] & (1 << 7)));

所以你取 0x10009000 然后取一个初始化为 0x18 的变量 FR 并将其用作偏移量。uart 被定义为一个 int 所以 32 位所以需要 32 位或 4 字节乘以 0x18 = 0x60。所以你正在读取内存位置 0x10009060,我怀疑这是你想要做的。无论如何,使用这样的指针并不是一个好方法。(您也未能将 uart 声明为volatile)。DR 将是唯一可以作为 0*4 = 0 工作的地址,您将获得地址 0x10009000。

这些更新突出了一些问题,

const int FR = 6;
unsigned int volatile *uart;
于 2013-04-14T13:32:52.203 回答