首页 > 其他分享 >嵌入式串口打印信息重定向到当前终端界面

嵌入式串口打印信息重定向到当前终端界面

时间:2024-10-21 14:11:50浏览次数:5  
标签:tty console 打印信息 iter 嵌入式 write init cdev 串口

参考

在tty_init中会创建/dev/console:

int __init tty_init(void)
{
	register_sysctl_init("dev/tty", tty_table);
	cdev_init(&tty_cdev, &tty_fops);
	cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1);
	register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty");
	device_create(&tty_class, NULL, MKDEV(TTYAUX_MAJOR, 0), NULL, "tty");

	cdev_init(&console_cdev, &console_fops);
	cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1);
	register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console");
	consdev = device_create_with_groups(&tty_class, NULL,
					    MKDEV(TTYAUX_MAJOR, 1), NULL,
					    cons_dev_groups, "console");

#ifdef CONFIG_VT
	vty_init(&console_fops);
#endif
	return 0;
}

其中console_fops的定义如下:

static const struct file_operations console_fops = {
	.llseek		= no_llseek,
	.read_iter	= tty_read,
	.write_iter	= redirected_tty_write,
	.splice_read	= copy_splice_read,
	.splice_write	= iter_file_splice_write,
	.poll		= tty_poll,
	.unlocked_ioctl	= tty_ioctl,
	.compat_ioctl	= tty_compat_ioctl,
	.open		= tty_open,
	.release	= tty_release,
	.fasync		= tty_fasync,
};

写/dev/console的时候:

ssize_t redirected_tty_write(struct kiocb *iocb, struct iov_iter *iter)
{
	struct file *p = NULL;

	// 这里会有一个通过redirect实现重定向的操作
	spin_lock(&redirect_lock);
	if (redirect)
		p = get_file(redirect);
	spin_unlock(&redirect_lock);

	/*
	 * We know the redirected tty is just another tty, we can
	 * call file_tty_write() directly with that file pointer.
	 */
	if (p) {
		ssize_t res;

		res = file_tty_write(p, iocb, iter);
		fput(p);
		return res;
	}
	return tty_write(iocb, iter);
}

trace日志如下:

 6)               |  ksys_write() { /* <-__arm64_sys_write+0x24/0x34 */
 6)   1.719 us    |    __fdget_pos(); /* <-ksys_write+0x3c/0xf0 ret=0xffffff88c230d200 */
 6)               |    vfs_write() { /* <-ksys_write+0x80/0xf0 */
 6)               |      security_file_permission() { /* <-vfs_write+0xb8/0x2d8 */
 6)               |        selinux_file_permission() { /* <-security_file_permission+0x5c/0x84 */
 6) + 52.865 us   |          file_has_perm(); /* <-selinux_file_permission+0x178/0x19c ret=0x0 */
 6) + 55.990 us   |        } /* selinux_file_permission ret=0x0 */
 6) + 58.177 us   |      } /* security_file_permission ret=0x0 */
 6)   1.093 us    |      __get_task_ioprio(); /* <-vfs_write+0x188/0x2d8 ret=0x4004 */
 6)               |      redirected_tty_write() { /* <-vfs_write+0x1ec/0x2d8 */
 6)               |        file_tty_write() { /* <-redirected_tty_write+0x8c/0xc4 */
 6)               |          tty_ldisc_ref_wait() { /* <-file_tty_write+0x64/0x2e8 */
 6)   0.989 us    |            __ldsem_down_read_nested(); /* <-tty_ldisc_ref_wait+0x40/0x68 ret=0x1 */
 6)   3.438 us    |          } /* tty_ldisc_ref_wait ret=0xffffff8854c76d80 */
 6)               |          __check_object_size() { /* <-file_tty_write+0x11c/0x2e8 */
 6)   0.937 us    |            check_stack_object(); /* <-__check_object_size+0x54/0x2a4 ret=0x0 */
 6)   0.989 us    |            is_vmalloc_addr(); /* <-__check_object_size+0x84/0x2a4 ret=0x0 */
 6)               |            pfn_is_map_memory() { /* <-__check_object_size+0xc4/0x2a4 */
 6)   1.198 us    |              memblock_is_map_memory(); /* <-pfn_is_map_memory+0x24/0x40 ret=0x1 */
 6)   3.073 us    |            } /* pfn_is_map_memory ret=0x1 */
 6)   0.990 us    |            __check_heap_object(); /* <-__check_object_size+0x1a4/0x2a4 ret=0xffffff88c302b000 */
 6) + 10.781 us   |          } /* __check_object_size ret=0xffffff88c302b000 */
 6)               |          n_tty_write() { /* <-file_tty_write+0x160/0x2e8 */
 6)               |            down_read() { /* <-n_tty_write+0xac/0x4d8 */
 6)   1.302 us    |              preempt_count_add(); /* <-__down_read_trylock+0x4c/0x240 ret=0xffffffd19221585c */
 6)   1.094 us    |              preempt_count_sub(); /* <-__down_read_trylock+0x1e4/0x240 ret=0xffffffd19221585c */
 6)   5.417 us    |            } /* down_read ret=0x1 */
 6)   2.657 us    |            add_wait_queue(); /* <-n_tty_write+0x130/0x4d8 ret=0xffffffd193381818 */
 6)   1.146 us    |            tty_hung_up_p(); /* <-n_tty_write+0x164/0x4d8 ret=0x0 */
 6)               |            tty_write_room() { /* <-n_tty_write+0x210/0x4d8 */
 6)   2.760 us    |              uart_write_room(); /* <-tty_write_room+0x3c/0x54 ret=0xfff */
 6)   4.688 us    |            } /* tty_write_room ret=0xfff */
 6)               |            uart_write() { /* <-n_tty_write+0x314/0x4d8 */
 6)   5.157 us    |              qcom_geni_serial_start_tx(); /* <-uart_write+0x250/0x30c ret=0xffffffd19490f490 */
 6) + 10.781 us   |            } /* uart_write ret=0x1 */
 6)               |            tty_write_room() { /* <-n_tty_write+0x354/0x4d8 */
 6)   2.500 us    |              uart_write_room(); /* <-tty_write_room+0x3c/0x54 ret=0xffe */
 6)   4.271 us    |            } /* tty_write_room ret=0xffe */
 6)               |            do_output_char() { /* <-n_tty_write+0x364/0x4d8 */
 6)               |              uart_write() { /* <-do_output_char+0x1b0/0x1e8 */
 6)   4.166 us    |                qcom_geni_serial_start_tx(); /* <-uart_write+0x250/0x30c ret=0xffffffd19490f490 */
 6) + 48.229 us   |              } /* uart_write ret=0x2 */
 6) + 50.469 us   |            } /* do_output_char ret=0x2 */
 6)               |            uart_flush_chars() { /* <-n_tty_write+0x3b8/0x4d8 */
 6)               |              uart_start() { /* <-uart_flush_chars+0x18/0x28 */
 6)   1.406 us    |                qcom_geni_serial_start_tx(); /* <-uart_start+0x13c/0x184 ret=0xffffffd19490f490 */
 6) + 27.813 us   |              } /* uart_start ret=0xffffffd193381818 */
 6) + 29.687 us   |            } /* uart_flush_chars ret=0xffffffd193381818 */
 6)   2.708 us    |            remove_wait_queue(); /* <-n_tty_write+0x410/0x4d8 ret=0xffffffd193381818 */
 6)               |            up_read() { /* <-n_tty_write+0x46c/0x4d8 */
 6)   1.094 us    |              preempt_count_add(); /* <-__up_read+0x94/0x3d8 ret=0xffffffd19221585c */
 6)   1.094 us    |              preempt_count_sub(); /* <-__up_read+0x170/0x3d8 ret=0xffffffd19221585c */
 6)   5.104 us    |            } /* up_read ret=0xffffffd19221585c */
 6) ! 129.427 us  |          } /* n_tty_write ret=0x2 */
 6)               |          __wake_up() { /* <-file_tty_write+0x2bc/0x2e8 */
 6)   0.260 us    |            __wake_up_common(); /* <-__wake_up+0x84/0xd8 ret=0x1 */
 6)   2.865 us    |          } /* __wake_up ret=0x0 */
 6)   0.937 us    |          ldsem_up_read(); /* <-file_tty_write+0x2c8/0x2e8 ret=0x1 */
 6) ! 154.740 us  |        } /* file_tty_write ret=0x2 */
 6) ! 158.125 us  |      } /* redirected_tty_write ret=0x2 */
 6)   1.042 us    |      __fsnotify_parent(); /* <-vfs_write+0x228/0x2d8 ret=0x0 */
 6) ! 223.802 us  |    } /* vfs_write ret=0x2 */
 6) ! 230.729 us  |  } /* ksys_write ret=0x2 */

标签:tty,console,打印信息,iter,嵌入式,write,init,cdev,串口
From: https://www.cnblogs.com/pengdonglin137/p/18489364

相关文章

  • 华为鸿蒙嵌入式 UI 扩展组件:跨越界限的舞台
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在华为鸿蒙系统的舞台上,UIAbility组件......
  • 项目-STM32F765VIT6+W5500 使用单片机串口发送命令实现OTA远程升级单片机程序测试说明
       测试1,单片机通过SPI1和模块通信; 单片机PA8引脚作为复位模组使用;串口1做日志打印(115200); 2,打开例程 3,使用下载器先下载BootLoader,然后再下载用户程序   4,在网站的根目录建几个文件夹  目录要和mcu_project程序里面的目录一致 ......
  • java读取com串口
    在用java读取com串口之前,需要引用一个jar包RXTXcomm.jar或者用maven(但是maven我试了,好像不行,下载不下来呢)<dependency><groupId>gnu.io</groupId><artifactId>rxtx</artifactId><version>2.1.7</version></dependency>还有两个dll文件:rxt......
  • Qt编写的modbus模拟器/支持网络和串口以及websocket/支持网络rtu
    一、使用说明1.1设备模拟-Com第一步,填写要模拟的设备地址,0表示自动处理,也就是收到什么地址就应答什么地址。第二步,填写对应的串口号和波特率。第三步,单击打开串口,成功后会变成关闭串口字样。单击清空数据会将左侧打印栏的信息清空。右侧一堆微调框用于模拟对应设备多个寄......
  • 嵌入式※~CH395Q-UDP
    我自己的原文哦~ https://blog.51cto.com/whaosoft/11683296网络芯片CH395Q-模块使用Socket0作为UDP组播(多播)通信这里演示一下模块使用Socket0作为UDP组播(多播)通信提醒:无论是SPI,USART,并口,程序操作步骤都是一样的!只是不同的接口发指令发给模块,然后用不同的接收......
  • 痞子衡嵌入式:瑞萨RA系列FSP固件库分析之外设驱动
    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是瑞萨RA系列FSP固件库里的外设驱动。上一篇文章《瑞萨RA8系列高性能MCU开发初体验》,痞子衡带大家快速体验了一下瑞萨MCU开发三大件(开发环境e²studio、软件包FSP、评估板EK),其中软件包FSP为何不叫更通......
  • 嵌入式分享合集192~干货篇
    我自己的原文哦~https://blog.51cto.com/whaosoft/12238584一、电子工程师的常用工具  电子工程师是一个对从事集成电路、电子电气设备等相关产品生产、研发工作的技术人员的统称,一般分为硬件工程师和软件工程师。    硬件工程师主要要了解电路方面的知识,知道常用电......
  • XC6SLX25T-2CSG324C,XC6SLX45T-2FGG484I,XC7K70T-3FBG484E4914, XILINX/赛灵思 嵌入式
    Xilinx是一家总部位于美国的半导体公司,成立于1984年。他们的主要产品是可编程逻辑器件(FPGA和SoC)和相关的开发工具。Xilinx的FPGA产品被广泛应用于各种领域,包括通信、数据中心、工业控制、汽车、物联网等。他们的产品具有灵活性高、性能强大和可定制性强等特点。2018年,Xilinx宣......
  • 嵌入式硬件设计
    1.引言在当今快速发展的科技时代,嵌入式系统已经成为众多应用领域的重要组成部分。从智能家居、物联网设备到汽车电子、医疗仪器,嵌入式系统无处不在。它们以其高效、低功耗和灵活性,满足了现代社会对智能化和自动化的迫切需求。随着技术的不断演进,嵌入式硬件设计也面临着越来越......
  • 嵌入式Linux编程基础 | GCC 静、动态函数库的创建与链接方法
    一、静态库与动态库的区别库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so表示一个命名为libhello的动态库,libhello.a则是一个命名为libhello的静态库。当使用静态库时,连接器找出程序所需的函数,并将其拷贝到可执行文件,一旦链接成功,静态程序库......