从这个站点:http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/,我可以使用C代码在qemu模拟器中打印一个字符串。
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康奈选项)做同样的事情,它使用0x40100000或0x40700000作为内存映射的uart地址,但是屏幕上没有显示任何内容。


我试过使用一些数据检查代码,但它仍然无法工作。
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通信。
发布于 2014-10-07 22:19:16
在您的链接页面中,您可能已经注意到以下文本:
模拟QEMU内部串行端口的代码(在源存储库中)从ARM实现了PL011主单元UART功能的子集
和
PL011串口的QEMU模型忽略了发送FIFO的能力;在实际的芯片系统中,在写入UARTDR寄存器之前,必须在UARTFR寄存器中检出“发送FIFO满”标志。
您将无法在QEMU和PXA255上使用相同的代码,因为UART的实现是不同的。
要使PXA255板上的UART功能正确,需要进行更多的设置,通常涉及以下内容:
没有什么可以代替详细阅读UART数据表和跟踪列出的所有信息。
发布于 2014-10-07 22:21:49
除非您没有显示一堆其他代码,否则您在这里遗漏了几件重要的事情:
QEMU中的UART实现是用作调试工具,而不是作为真实设备中UART的完全仿真。仅仅因为某些东西在QEMU中有效并不意味着它将在真正的硬件上工作!
发布于 2016-03-26 12:01:54
qemu应该放松对UART的精确仿真。下面的代码工作:
创业公司:
.global startup
startup:
ldr sp, startup_stack_top
bl c_startup
b .
startup_stack_top:
.word 0xa4000000os.c:
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:
ENTRY(startup)
SECTIONS
{
. = 0x0;
.startup : { startup.o(.text) }
.text : { *(.text) }
.rodata : { *(.rodata) }
.data : { *(.data) }
.bss : { *(.bss COMMON) }
}构建命令:
#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运行命令:
qemu-system-arm -M connex -m 128M -snapshot -pflash flash.imghttps://stackoverflow.com/questions/26243997
复制相似问题