新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > GNU ARM汇编--(十五)linux下的printascii

GNU ARM汇编--(十五)linux下的printascii

作者: 时间:2016-11-26 来源:网络 收藏
[cpp]view plaincopy
  1. asmlinkageintprintk(constchar*fmt,...)
  2. {
  3. va_listargs;
  4. intr;
  5. #ifdefCONFIG_DEBUG_LL
  6. externvoidprintascii(constchar*);
  7. charbuff[256];
  8. #endif
  9. va_start(args,fmt);
  10. r=vprintk(fmt,args);
  11. #ifdefCONFIG_DEBUG_LL
  12. vsprintf(buff,fmt,args);
  13. #endif
  14. va_end(args);
  15. #ifdefCONFIG_DEBUG_LL
  16. printascii(buff);
  17. #endif
  18. returnr;
  19. }


重新编译内核烧写后,发现kernel的输出都有了,这说明kernel的串口驱动有问题,或者说要去研究要bootloader如何向kernel传递参数的。另外一个疑惑就是printk没有输出,为什么printascii有输出呢?

查看源码才知道,printascii是针对arm平台的debug函数:

在archarmkerneldebug.S中

[html]view plaincopy
  1. ENTRY(printascii)
  2. addruartr3
  3. b2f
  4. 1:waituartr2,r3
  5. senduartr1,r3
  6. busyuartr2,r3
  7. teqr1,#
  8. moveqr1,#
  9. beq1b
  10. 2:teqr0,#0
  11. ldrnebr1,[r0],#1
  12. teqner1,#0
  13. bne1b
  14. movpc,lr

在includeasm-armarch-s3c241debug-macro.S中,addruart宏定义如下:

[html]view plaincopy
  1. .macroaddruart,rx
  2. mrcp15,0,x,c1,c0
  3. tstx,#1
  4. ldreqx,=S3C24XX_PA_UART
  5. ldrnex,=S3C24XX_VA_UART
  6. #ifCONFIG_DEBUG_S3C_UART!=0
  7. addx,x,#(S3C2410_UART1_OFF*CONFIG_DEBUG_S3C_UART)
  8. #endif
  9. .endm
从p15协处理器来查看MMU是否打开了,从而用PA或者VA,这说明MMU打开前或者后都可以用printascii进行debug。

在includeasm-armplat-s3cdebug-macro.S中,有senduart、busyuart和waituart的定义,具体代码就不贴出来了,这三个代码实现了串口的输出,这三个宏定义针对fifo和非fifo的情况都做了处理,保证代码的健壮。

到这里,可以看出来printascii基于bootloader或者kernel对串口的初始化后才能起作用,但一般用printascii辅助debug主要用于kernel的最开始部分,这时候的串口初始化用的还是bootloader的。当然,在kernel的串口驱动正常工作后,printascii同样是起作用的。最后,printascii代码还是很健壮的,而且printascii的生命周期也是相当长的,从kernel启动开始到kernle关闭之时,printascii都是能向串口输出信息的。

在用printascii函数debug和分析printascii是如何实现之后,对于开头的问题,进一步缩小了分析目标,后面的分析将围绕bootloader与kernel之间的参数传递问题,以及linux的串口驱动。


上一页 1 2 下一页

评论


技术专区

关闭