博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
串口 (五) linux串口之应用
阅读量:4285 次
发布时间:2019-05-27

本文共 17237 字,大约阅读时间需要 57 分钟。

对串口 的使用

1. 内核打印信息解读2. dmesg没有显示内核最开始的打印信息,如何调整.3. 控制台级别及打印级别4. dmesg 的使用

1. 内核打印信息解读

Starting kernel ... 是 U-boot 打印的最后一句[    0.000000] Booting Linux on physical CPU 0x0 是Linux打印的第一句,前面是时间戳
  • pr_notice("%s", linux_banner);
Linux version 4.4.76 (pop@ubuntu) (gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) ) #22 SMP Sat Oct 6 19:29:17 PDT 2018
  • pr_notice(“Kernel command line: %s\n”, boot_command_line);
Kernel command line: root=/dev/nfs rw         nfsroot=192.168.131.142:/home/pop/linux-debug/rootfs init=/linuxrc         ip=192.168.131.140  console=ttyAMA0
  • mm_init
Memory: 512592K/524288K available (4881K kernel code, 156K rwdata, 1392K rodata, 284K init, 152K bss, 11696K reserved, 0K cma-reserved)Virtual kernel memory layout:    vector  : 0xffff0000 - 0xffff1000   (   4 kB)    fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)    vmalloc : 0xa0800000 - 0xff800000   (1520 MB)    lowmem  : 0x80000000 - 0xa0000000   ( 512 MB)    modules : 0x7f000000 - 0x80000000   (  16 MB)      .text : 0x80008000 - 0x80628758   (6274 kB)      .init : 0x80629000 - 0x80670000   ( 284 kB)      .data : 0x80670000 - 0x806971a0   ( 157 kB)       .bss : 0x8069a000 - 0x806c03b8   ( 153 kB)SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
  • console_init
Console: colour dummy device 80x30
  • vfs_caches_init
Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
  • kernel_init_freeable
before kernel_init_freeableCPU0: thread -1, cpu 0, socket 0, mpidr 80000000Setting up static identity map for 0x60008280 - 0x600082d8Brought up 1 CPUsSMP: Total of 1 processors activated (525.92 BogoMIPS).CPU: All CPU(s) started in SVC mode.before do_basic_setupdevtmpfs: initialized  //driver_init->driver_initbefore do_initcallsdo do_initcall_level :0 begindo do_initcall_level :0 enddo do_initcall_level :1 beginVFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 0clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 nsfutex hash table entries: 1024 (order: 4, 65536 bytes)NET: Registered protocol family 16do do_initcall_level :1 enddo do_initcall_level :2 beginDMA: preallocated 256 KiB pool for atomic coherent allocationscpuidle: using governor laddercpuidle: using governor menudo do_initcall_level :2 enddo do_initcall_level :3 beginof_amba_device_create(): amba_device_add() failed (-19) for /memory-controller@100e0000of_amba_device_create(): amba_device_add() failed (-19) for /memory-controller@100e1000of_amba_device_create(): amba_device_add() failed (-19) for /watchdog@100e5000of_amba_device_create(): amba_device_add() failed (-19) for /smb/motherboard/iofpga@7,00000000/sysctl@01000of_amba_device_create(): amba_device_add() failed (-19) for /smb/motherboard/iofpga@7,00000000/wdt@0f000hw-breakpoint: debug architecture 0x4 unsupported.CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.4.76 #28Hardware name: ARM-Versatile Express[<80016420>] (unwind_backtrace) from [<80012e80>] (show_stack+0x10/0x14)[<80012e80>] (show_stack) from [<802452b8>] (dump_stack+0x84/0x98)[<802452b8>] (dump_stack) from [<80642654>] (pl011_init+0x8/0x48)[<80642654>] (pl011_init) from [<8000973c>] (do_one_initcall+0x90/0x1d8)[<8000973c>] (do_one_initcall) from [<80629f90>] (kernel_init_freeable+0x200/0x2b4)[<80629f90>] (kernel_init_freeable) from [<804a4bcc>] (kernel_init+0x24/0x114)[<804a4bcc>] (kernel_init) from [<8000f478>] (ret_from_fork+0x14/0x3c)Serial: AMBA PL011 UART driver10009000.uart: ttyAMA0 at MMIO 0x10009000 (irq = 35, base_baud = 0) is a PL011 rev1console [ttyAMA0] enabled1000a000.uart: ttyAMA1 at MMIO 0x1000a000 (irq = 36, base_baud = 0) is a PL011 rev11000b000.uart: ttyAMA2 at MMIO 0x1000b000 (irq = 37, base_baud = 0) is a PL011 rev11000c000.uart: ttyAMA3 at MMIO 0x1000c000 (irq = 38, base_baud = 0) is a PL011 rev1do do_initcall_level :3 enddo do_initcall_level :4 beginSCSI subsystem initializedusbcore: registered new interface driver usbfsusbcore: registered new interface driver hubusbcore: registered new device driver usbAdvanced Linux Sound Architecture Driver Initialized.do do_initcall_level :4 enddo do_initcall_level :5 beginclocksource: Switched to clocksource arm,sp804NET: Registered protocol family 2TCP established hash table entries: 4096 (order: 2, 16384 bytes)TCP bind hash table entries: 4096 (order: 3, 32768 bytes)TCP: Hash tables configured (established 4096 bind 4096)UDP hash table entries: 256 (order: 1, 8192 bytes)UDP-Lite hash table entries: 256 (order: 1, 8192 bytes)NET: Registered protocol family 1RPC: Registered named UNIX socket transport module.RPC: Registered udp transport module.RPC: Registered tcp transport module.RPC: Registered tcp NFSv4.1 backchannel transport module.do do_initcall_level :5 enddo do_initcall_level :6 beginhw perfevents: enabled with armv7_cortex_a9 PMU driver, 1 counters availablesquashfs: version 4.0 (2009/01/31) Phillip Lougherjffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.9p: Installing v9fs 9p2000 file system supportio scheduler noop registered (default)clcd-pl11x 10020000.clcd: PL111 rev2 at 0x10020000clcd-pl11x 10020000.clcd: /clcd@10020000 hardware, 1024x768@59 displayConsole: switching to colour frame buffer device 128x48clcd-pl11x 1001f000.clcd: PL111 rev2 at 0x1001f000clcd-pl11x 1001f000.clcd: /smb/motherboard/iofpga@7,00000000/clcd@1f000 hardware, 640x480@59 display40000000.flash: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000000 Chip ID 0x000000Intel/Sharp Extended Query Table at 0x0031Using buffer write method40000000.flash: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000000 Chip ID 0x000000Intel/Sharp Extended Query Table at 0x0031Using buffer write methodConcatenating MTD devices:(0): "40000000.flash"(1): "40000000.flash"into device "40000000.flash"libphy: smsc911x-mdio: probedsmsc911x 4e000000.ethernet eth0: attached PHY driver [Generic PHY] (mii_bus:phy_addr=4e000000.etherne:01, irq=-1)smsc911x 4e000000.ethernet eth0: MAC Address: 52:54:00:12:34:56isp1760 4f000000.usb: bus width: 32, oc: digitalisp1760 4f000000.usb: NXP ISP1760 USB Host Controllerisp1760 4f000000.usb: new USB bus registered, assigned bus number 1isp1760 4f000000.usb: Scratch test failed.isp1760 4f000000.usb: can't setup: -19isp1760 4f000000.usb: USB bus 1 deregisteredusbcore: registered new interface driver usb-storagemousedev: PS/2 mouse device common for all micertc-pl031 10017000.rtc: rtc core: registered pl031 as rtc0mmci-pl18x 10005000.mmci: Got CD GPIOmmci-pl18x 10005000.mmci: Got WP GPIOmmci-pl18x 10005000.mmci: No vqmmc regulator foundmmci-pl18x 10005000.mmci: mmc0: PL181 manf 41 rev0 at 0x10005000 irq 31,32 (pio)ledtrig-cpu: registered to indicate activity on CPUsusbcore: registered new interface driver usbhidusbhid: USB HID core driverinput: AT Raw Set 2 keyboard as /devices/platform/smb/smb:motherboard/smb:motherboard:iofpga@7,00000000/10006000.kmi/serio0/input/input0aaci-pl041 10004000.aaci: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 30aaci-pl041 10004000.aaci: FIFO 512 entriesoprofile: using arm/armv7-ca9NET: Registered protocol family 179pnet: Installing 9P2000 supportdo do_initcall_level :6 enddo do_initcall_level :7 beginRegistering SWP/SWPB emulation handlerrtc-pl031 10017000.rtc: setting system clock to 2018-10-07 03:22:01 UTC (1538882521)smsc911x 4e000000.ethernet eth0: SMSC911x/921x identified at 0xa12a0000, IRQ: 28input: ImExPS/2 Generic Explorer Mouse as /devices/platform/smb/smb:motherboard/smb:motherboard:iofpga@7,00000000/10007000.kmi/serio1/input/input2IP-Config: Guessing netmask 255.255.255.0IP-Config: Complete:     device=eth0, hwaddr=52:54:00:12:34:56, ipaddr=192.168.131.140, mask=255.255.255.0, gw=255.255.255.255     host=192.168.131.140, domain=, nis-domain=(none)     bootserver=255.255.255.255, rootserver=192.168.131.142, rootpath=ALSA device list:  #0: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 30do do_initcall_level :7 endafter do_initcallsafter do_basic_setupVFS: Mounted root (nfs filesystem) on device 0:13.after kernel_init_freeable
  • prepare_namespace();
VFS: Mounted root (nfs filesystem) on device 0:13.
  • 最后的打印信息
VFS: Mounted root (nfs filesystem) on device 0:13. // 这一句是 kernel_init_freeable 打印出来的.Freeing unused kernel memory: 284K (80629000 - 80670000) //这一句是 free_initmem->free_reserved_area 打印出来的 ----------------------------------- //从这一句开始就不是内核打印的了.是 init 用户进程打印出来的 welcome to A9 vexpress board-----------------------------------Please press Enter to activate this console.

2. dmesg没有显示内核最开始的打印信息,如何调整.

调整 CONFIG_LOG_BUF_SHIFT可以直接修改 .config,也可以直接修改 def_configmake menuconfig 位置在General setup  --->    (14) Kernel log buffer size (16 => 64KB, 17 => 128KB)help 信息  | CONFIG_LOG_BUF_SHIFT:                                                                                                                 |    |                                                                                                                                       |    | Select the minimal kernel log buffer size as a power of 2.                                                                            |    | The final size is affected by LOG_CPU_MAX_BUF_SHIFT config                                                                            |    | parameter, see below. Any higher size also might be forced                                                                            |    | by "log_buf_len" boot parameter.                                                                                                      |    |                                                                                                                                       |    | Examples:                                                                                                                             |    |            17 => 128 KB                                                                                                               |    |            16 => 64 KB                                                                                                                |    |            15 => 32 KB                                                                                                                |    |            14 => 16 KB                                                                                                                |    |            13 =>  8 KB                                                                                                                |    |            12 =>  4 KB                                                                                                                |    |                                                                                                                                       |    | Symbol: LOG_BUF_SHIFT [=14]                                                                                                           |    | Type  : integer                                                                                                                       |    | Range : [12 21]                                                                                                                       |    | Prompt: Kernel log buffer size (16 => 64KB, 17 => 128KB)                                                                              |    |   Location:                                                                                                                           |    |     -> General setup                                                                                                                  |    |   Defined at init/Kconfig:820                                                                                                         |    |   Depends on: PRINTK [=y]

3. 控制台级别及打印级别

$ cat /proc/sys/kernel/printk    8                 4           		1              		 7    当前控制台 		   default 			 minimum 			  boot-time-default    当前控制台日志级别   默认的消息日志级别    最低的控制台日志级别    默认的控制台日志级别小于等于 控制台 loglevel 的 log 才能打出来勘误:小于 控制台 loglevel 的 log 才能打出来
一般不会改的几个值.    default 			 minimum 			  boot-time-default    默认的消息日志级别	  最低的控制台日志级别    默认的控制台日志级别        默认的消息日志级别 	: 一般为4,printk("<4>" "level 4!\n");和 printk("level 4!\n");  和 pr_warning("level 4!\n"); 效果是一样的    最低的控制台日志级别 : 一般为1.如果此时控制台级别设置为1,此时 KERN_EMERG(0) 和 KERN_ALERT 仍会打印出来.    默认的控制台日志级别 : 一般为7,此时 KERN_DEBUG(7) ... KERN_EMERG(6) 都会打印出来.
怎么改变控制台日志级别	1. 改变 dts chosen 节点中的 loglevel=5 为 loglevel=6,将当前控制台信息级别改为6.        改变的 是 cat /proc/sys/kernel/printk 中的第一个值, 控制台 loglevel	2. echo 1 > /proc/sys/kernel/printk ,将当前控制台信息级别改为1
怎么 改变打印级别    loglevel=   All Kernel Messages with a loglevel smaller than the            console loglevel will be printed to the console. It can            also be changed with klogd or other programs. The            loglevels are defined as follows:            0 (KERN_EMERG)      system is unusable            1 (KERN_ALERT)      action must be taken immediately            2 (KERN_CRIT)       critical conditions            3 (KERN_ERR)        error conditions            4 (KERN_WARNING)    warning conditions            5 (KERN_NOTICE)     normal but significant condition            6 (KERN_INFO)       informational            7 (KERN_DEBUG)      debug-level messages             #define KERN_EMERG "\001" "<0>" 通常是系统崩溃前的信息            #define KERN_ALERT "\001" "<1>" 需要立即处理的消息            #define KERN_CRIT "\001" "<2>" 严重情况            #define KERN_ERR "\001" "<3>" 错误情况            #define KERN_WARNING "\001" "<4>" 有问题的情况            #define KERN_NOTICE "\001" "<5>" 正常情况,但仍然要注意            #define KERN_INFO "\001" "<6>" 信息型消息            #define KERN_DEBUG "\001" "<7>" 用作调试作用printk("\001" "<0>" "level 0!\n"); // printk(KERN_EMERG "level 0!\n");printk("\001" "<1>" "level 1!\n"); // printk(KERN_ALERT "level 1!\n");printk("\001" "<2>" "level 2!\n");printk("\001" "<3>" "level 3!\n");printk("\001" "<4>" "level 4!\n");printk("\001" "<5>" "level 5!\n");printk("\001" "<6>" "level 6!\n");printk("\001" "<7>" "level 7!\n"); 内核提供了动态打印的系统,例如pr_debug,dev_debug这种接口。他们是对printk(log_level " ")的二次封装include/linux/kernel.h#define pr_emerg(fmt, ...) \        printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__)#define pr_alert(fmt, ...) \        printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__)#define pr_crit(fmt, ...) \        printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__)#define pr_err(fmt, ...) \        printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)#define pr_warning(fmt, ...) \        printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)#define pr_notice(fmt, ...) \        printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)#define pr_info(fmt, ...) \        printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)#define pr_cont(fmt, ...) \		printk(KERN_CONT fmt, ##__VA_ARGS__) // NOT LEVEL 7     /* If you are writing a driver, please use dev_dbg instead */                      #if defined(CONFIG_DYNAMIC_DEBUG)                                                  /* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here */         #define pr_debug(fmt, ...) \                                                              dynamic_pr_debug(fmt, ##__VA_ARGS__)                                              #elif defined(DEBUG)                                                                  #define pr_debug(fmt, ...) \                                                              printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)                                     #else                                                                                 #define pr_debug(fmt, ...) \                                                              no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)                                  #endif

4. dmesg 的使用

BusyBox v1.30.0.git (2019-02-15 18:29:52 PST) multi-call binary.Usage: dmesg [-c] [-n LEVEL] [-s SIZE]Print or control the kernel ring buffer        -c              Clear ring buffer after printing // 打印后清空buf        -n LEVEL        Set console logging level // 设置当前控制台优先级        -s SIZE         Buffer size  //        -r              Print raw message buffer // 可看出打印优先级ubuntu dmesg 		dmesg -T  // 按照标准事件显示 		dmesg -d  // 显示两条信息的时间间隔 		dmesg -d -T 		dmesg | tail // 最近一次内核输出 		dmesg -l 5  // 只打印level 5

5. early_printk 如何使用

内核侧配置 CONFIG_EARLY_PRINTK=yuboot侧配置 earlyprintk=ttySAC0,115200 (一般根据console=的值进行调整)setenv bootargs "root=/dev/mtdblock2 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200 bootmem_debug earlyprintk=ttySAC0,115200"

6.

其他

  • 在内核中添加log,然后从dmesg 输出log
printk(KERN_EMERG "mylog level 0!\n");dmesg -l 0 -T -d

logcat

安卓下打印上层应用的log , logcat 原理类似于dmesg 的原理,只不过dmesg是在内核空间维护环形buff,另一个是在用户空间维护环形buffadb logcat -c // 清log缓冲区adb logcat  // 实时打印到终端adb logcat > D:\logcat.txt // 打印到文件里
  • logcatd 启动时机
# cat /system/etc/init/logcatd.rc# logcatd serviceservice logcatd /system/bin/logcatd -L -b ${
logd.logpersistd.buffer:-all} -v threadtime -v usec -v printable -D -f /data/misc/logd/logcat -r 1024 -n ${
logd.logpersistd.size:-256} --id=${
ro.build.id} class late_start disabled # logd for write to /data/misc/logd, log group for read from log daemon user logd group log writepid /dev/cpuset/system-background/tasks oom_score_adjust -600

转载地址:http://daigi.baihongyu.com/

你可能感兴趣的文章
AutoAssign源码分析
查看>>
Rethinking Training from Scratch for Object Detection
查看>>
机器学习常用库简介
查看>>
人眼定位识别
查看>>
解决TensorFlow程序无限制占用GPU
查看>>
SSD检测几个小细节
查看>>
Kalman实际应用总结
查看>>
linux+eclipse+lua
查看>>
Linux下常见问题的解决方法
查看>>
C语言学习笔记
查看>>
Linux下设计并发网络程序
查看>>
android 多渠道打包---使用python 3.3.2
查看>>
python学习笔记
查看>>
ubuntu下lua的安装
查看>>
linux phpmyadmin
查看>>
cocos2d-x lua开发
查看>>
lua学习笔记
查看>>
巴科斯范式(BNF)
查看>>
cocos2d-x lua
查看>>
php protobuffer
查看>>