用单片机的模式调试linux

s3c_pm_dbg("12345\n");

 uart_rev_a_char();

 

 

void s3c_pm_dbg(const char *fmt, ...)
{
 va_list va;
 char buff[256];

 va_start(va, fmt);
 vsprintf(buff, fmt, va);
 va_end(va);

 printascii(buff);
}

 

 

ENTRY(printascii)
  addruart r3
  b 2f
1:  waituart r2, r3
  senduart r1, r3
  busyuart r2, r3
  teq r1, #'\n'
  moveq r1, #'\r'
  beq 1b
2:  teq r0, #0
  ldrneb r1, [r0], #1
  teqne r1, #0
  bne 1b
  mov pc, lr
ENDPROC(printascii)

ENTRY(printch)
  addruart r3
  mov r1, r0
  mov r0, #0
  b 1b
ENDPROC(printch)


ENTRY(uart_rev_a_char)
  addruart r3
  waituart_rev_over r2, r3
  mov pc, lr
ENDPROC(uart_rev_a_char)

 

 


 .macro waituart_rev_over,rd,rx
  ldr \rd, [ \rx, # S3C2410_UFCON ]
  tst \rd, #S3C2410_UFCON_FIFOMODE @ fifo enabled?
  beq 1001f    @
  @ FIFO enabled...
1003:
  @fifo_level \rd, \rx
  ldr \rd, [ \rx, # S3C2410_UFSTAT ]
  and \rd, \rd, #S3C2440_UFSTAT_RXMASK
  teq \rd, #0
  beq 1003b

@上行汇编-->如果相等,说明结果为0,即cpu状态寄存器的z标志置为1

@也即fifo的接收字节数为0,即fifo还没有接收到任何数据,因此需要死等

@收到数据后即bne,说明结果不为0,即cpu状态寄存器的z标志置为0


        b 1002f
1001:
  @ idle waiting for non fifo
  ldr \rd, [ \rx, # S3C2410_UTRSTAT ]
  tst \rd, #S3C2410_UTRSTAT_RXDR
  beq 1001b
  
1002:  @ exit busyuart
 .endm

 

 

以上的实质是用c调用汇编函数,

uart_rev_a_char();可停止内核的执行流程,等待从串口输入一个字符

void s3c_pm_dbg(const char *fmt, ...)打印,与printk()函数效果相同,但不是先将打印信息存入打印buff,而是直接

打印,直接见效果!好处多多。

 

 

 

你可能感兴趣的:(用单片机的模式调试linux)