嵌入式技术论坛
直播中

fanB

8年用户 1470经验值
擅长:20615
私信 关注
[问答]

新手求助启用RT_USING_POSIX时getchar调用过程

给各位大佬倒茶,想求助下在开启RT_USING_POSIX时,串口getc()函数到系统getchar()函数之间的调用路径。

小弟在调试大佬编写的的web_terminal组件时发现如果开启了RT_USING_POSIX和RT_USING_DEVICE时,宏配置开关为:

1.jpg

此时的finsh_get_device(),finsh_set_device()无效,web_terminal不能正确的将数据读取至finsh模组,想通过自己的方式来实现web_terminal这部分所需要的接口,同时也能学习下finsh的运作原理,但是跟踪到getchar()函数时断了思路,始终不明白串口的数据是怎么样输出到这个函数并返回的

1.jpg

在未启用RT_USING_POSIX时都还能理解,通过设备注册的read,write函数来传递数据,单是当启动了RT_USING_POSIX,就找不到数据传递路径了,特在此求助,感谢回复。

回帖(5)

王萍

2022-11-14 14:17:23
函数指针的使用。
单步F11跟进去!!
举报

fanB

2022-11-14 14:17:57
感谢你的回复朋友,我之前描述的有歧义,实在抱歉。我就是尝试单步跟踪无果后才来提问,结果并没有显示出明确的调用关系。仍然无法弄明白getchar()的实现原理
1.jpg
这里getchar()的定义是getc(stdin),但是看汇编显示调用的是fgetc(),检索整个工程确实有fgetc()函数,但是从map文件分析,这个函数并没有被链接至目标文件,也就是说这个被调用的fgetc()并不是这个文件中的fgetc().
2.jpg
这个fgetc()中间经历了一些列过程,最终到了 _sys_read()函数。
我现在的疑问就是为什么最终会走到_sys_read()函数,有没有这里运作原理的资料内容可以学习。还望不吝赐教
1.jpg
举报

王萍

2022-11-14 14:18:08
(1)搜下struct rt_uart_ops,看看是否存在?类似于下面的,这个是串口最终调用的收发接口

static const struct rt_uart_ops mcu_uart_ops =
{
    .configure = mcu_uart_configure,
    .control = mcu_uart_control,
    .putc = mcu_uart_putc,
    .getc = mcu_uart_getc,
};
(2)rt_hw_usart_init 这个函数是否存在?
(3)list_device,看下是否有串口设备。

怀疑你操作了空设备(空气)
举报

fanB

2022-11-14 14:18:18
以上这些都是存在的,设备也是正常使用的,只是对调用过程比较谜。不知道你手上的板子方不方便这样调试,如果方便的话,可以截一张开启了“RT_USEING_POSIX”后的从get_char()跳转到哪里的截图吗?万分感谢
举报

王辉

2022-11-14 14:18:26
遇到同样的问题,暂时没有思路,但是只要把RT_USING_POSIX关闭finsh就可以输入,插个眼等待后续
举报

更多回帖

发帖
×
20
完善资料,
赚取积分