首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在qemu gumstix (connex/PXA255 255)仿真中打印字符串?

如何在qemu gumstix (connex/PXA255 255)仿真中打印字符串?
EN

Stack Overflow用户
提问于 2014-10-07 19:46:13
回答 4查看 694关注 0票数 0

从这个站点:http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/,我可以使用C代码在qemu模拟器中打印一个字符串。

代码语言:javascript
复制
volatile unsigned int * const UART0DR = (unsigned int *)0x101f1000;
void print_uart0(const char *s) {
 while(*s != '\0') { /* Loop until end of string */
 *UART0DR = (unsigned int)(*s); /* Transmit char */
 s++; /* Next char */
 }
}

我需要在C代码中使用qemu中的gumstix (带有-M康奈选项)做同样的事情,它使用0x401000000x40700000作为内存映射的uart地址,但是屏幕上没有显示任何内容。

我试过使用一些数据检查代码,但它仍然无法工作。

代码语言:javascript
复制
volatile unsigned int * const UART0DR = (unsigned int *)0x40100000;
volatile unsigned int * const UART_LSR = (unsigned int *)0x40100014;
#define LSR_TDRQ    (1 << 5)    // Transmit Data Request
void print_uart0(const char *s) {
 while(*s != '\0') { /* Loop until end of string */
    while(( *UART_LSR & LSR_TDRQ ) == 0 ); 
     *UART0DR = (unsigned int)(*s); /* Transmit char */
 s++; /* Next char */
 }
}

可能出什么事了?PXA255使用不同的方式使用uart吗?

我搜索了pxa古姆斯蒂的源代码,也许gumstix可以使用不同的方法在qemu中进行hart通信。

EN

回答 4

Stack Overflow用户

发布于 2014-10-07 22:19:16

在您的链接页面中,您可能已经注意到以下文本:

模拟QEMU内部串行端口的代码(在源存储库中)从ARM实现了PL011主单元UART功能的子集

PL011串口的QEMU模型忽略了发送FIFO的能力;在实际的芯片系统中,在写入UARTDR寄存器之前,必须在UARTFR寄存器中检出“发送FIFO满”标志。

您将无法在QEMU和PXA255上使用相同的代码,因为UART的实现是不同的。

要使PXA255板上的UART功能正确,需要进行更多的设置,通常涉及以下内容:

  • 时钟子系统寄存器的配置,以确保UART外围设备从CPU上的主时钟系统接收时钟。
  • 根据所需用途配置UART外围寄存器。您可能需要配置寄存器来控制波特率寄存器、奇偶校验控制、数据位数。
  • 修改写入UART的代码。UART外围设备通常包含一个FIFO (有时只是一个字节),在传输和接收期间使用。要发送字符,首先必须确保前一个字符已经完成传输,然后才能将下一个字符放置在输出数据寄存器中进行传输。

没有什么可以代替详细阅读UART数据表和跟踪列出的所有信息。

票数 1
EN

Stack Overflow用户

发布于 2014-10-07 22:21:49

除非您没有显示一堆其他代码,否则您在这里遗漏了几件重要的事情:

  • 必须启用UART模块的时钟和电源才能正常工作。请参阅PXA255手册第3节。
  • UART使用的GPIOs必须在UART正确工作之前进行配置(例如,通过设置适当的引脚方向和备用函数)。见PXA255手册第4.1节。
  • 必须配置UART (例如,波特率等)在你开始写数据之前。PXA255手册没有显式地包含这些寄存器的信息;您需要交叉引用16550数据表。
  • 在向UART写入数据时,必须确保UART处于接收数据的适当状态(例如,传输缓冲区未满),如果不是,则等待它进入适当的状态。请参阅16550数据表,或参考有关此UART使用的一般教程。

QEMU中的UART实现是用作调试工具,而不是作为真实设备中UART的完全仿真。仅仅因为某些东西在QEMU中有效并不意味着它将在真正的硬件上工作!

票数 1
EN

Stack Overflow用户

发布于 2016-03-26 12:01:54

qemu应该放松对UART的精确仿真。下面的代码工作:

创业公司:

代码语言:javascript
复制
.global startup
startup:
   ldr sp, startup_stack_top
   bl c_startup
   b .
startup_stack_top:
   .word 0xa4000000

os.c:

代码语言:javascript
复制
void write_uart(char *str)
{
    char c;
    volatile char *uart = (char *)0x40100000;
    while (1) {
        c = *str;
        if (!c)
            break;
        *uart = c;
        str++;
    }
}
void c_startup() 
{
    write_uart("hello\r\n");
}

链接器脚本os.ld:

代码语言:javascript
复制
ENTRY(startup)
SECTIONS
{
   . = 0x0;
   .startup : { startup.o(.text) }
   .text : { *(.text) }
   .rodata : { *(.rodata) }
   .data : { *(.data) }
   .bss : { *(.bss COMMON) }
}

构建命令:

代码语言:javascript
复制
#pfx=arm-none-eabi-

$(pfx)as -g -march=armv5te startup.s -o startup.o
$(pfx)gcc -g -c -march=armv5te os.c -o os.o
$(pfx)ld -T os.ld os.o startup.o -o os.elf
$(pfx)objcopy -O binary os.elf os.bin
dd of=flash.img bs=128k count=128 if=/dev/zero
dd of=flash.img bs=128k conv=notrunc if=os.bin

运行命令:

代码语言:javascript
复制
qemu-system-arm -M connex -m 128M  -snapshot -pflash flash.img
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26243997

复制
相关文章

相似问题

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