Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
BSP
读drv_usart的笔记(一)及对poll_rx函数的ops引入的疑惑
发布于 2019-06-02 00:47:55 浏览:1641
订阅该版
先提问题: 一直使用FreeRTOS,受ARMFly硬汉的影响,打算转RTX,但RT_Thread的设备驱动体系太吸引我这个linux的半罐水了:lol。于是开始对现有BSP的学习,作为最常用的外设,drv_usart自然是第一个被研究的。 从代码中发现,框架serial.c中,_serial_int_rx 和 _serial_dma_rx 均为操作fifo,drv_usart的ISR中也是通过fifo来传输数据,这个没有什么说的,但是, _serial_poll_rx 需要操作 ch = serial->ops->getc(serial) ,这个ops是如何引入的?serial来自于强制转换的dev结构体,而dev结构体只填充了serial结构体的第一项,后面的rt_uart_ops是空的…… 正文(一),(乱糟糟): BSP\libraries\HAL_Drivers\drv_common.c中,定义了rt_hw_board_init()函数,该函数在nano或者早期说明中,都是放在board.c中。 rt_hw_board_init()中调用了drv_uasart.c中的rt_hw_usart_init(),先不管stm32_uart_get_dma_config(), uart_obj是stm32_uart,在drv_usart.h中定义: struct stm32_uart { UART_HandleTypeDef handle; struct stm32_uart_config *config; #ifdef RT_SERIAL_USING_DMA struct { DMA_HandleTypeDef handle; rt_size_t last_index; } dma;#endif rt_uint8_t uart_dma_flag; struct rt_serial_device serial; }; 这个定义BSP可以改。 handle的定义来自HAL库,rt_serial_device在serial.h中定义,这个属于设备驱动框架,是不能改的。如下:struct rt_serial_device{ struct rt_device parent; const struct rt_uart_ops *ops; struct serial_configure config; void *serial_rx; void *serial_tx;}; rt_hw_serial_register()中,注册的也是这个结构体。当然,在最后一个参数,把整个stm32_uart 都打包了。rt_hw_serial_register()中,使用rt_device_register()将rt_serial_device结构体中的rt_device结构体注册到系统中。 框架驱动serial如何调用硬件驱动drv_usart?实际上框架驱动没有使用rt_uart_ops *ops,而是直接操作的fifo,drv_usart中也是使用的fifo来传递的数据。 唯一的例外是poll,比如: rt_inline int _serial_poll_rx(struct rt_serial_device *serial, rt_uint8_t *data, int length){ int ch; int size; RT_ASSERT(serial != RT_NULL); size = length; while (length) { ch = serial->ops->getc(serial); if (ch == -1) break; *data = ch; data ++; length --; if (ch == '
') break; } return size - length;}它使用了drv_usart的static int stm32_getc(struct rt_serial_device *serial); poll函数由rt_serial_read()调用,而这个函数被赋给了框架的ops,这样:device->ops = &serial_ops; 实现如下: static rt_size_t rt_serial_read(struct rt_device *dev, rt_off_t pos, void *buffer, rt_size_t size){ struct rt_serial_device *serial; RT_ASSERT(dev != RT_NULL); if (size == 0) return 0; serial = (struct rt_serial_device *)dev; if (dev->open_flag & RT_DEVICE_FLAG_INT_RX) { return _serial_int_rx(serial, buffer, size); }#ifdef RT_SERIAL_USING_DMA else if (dev->open_flag & RT_DEVICE_FLAG_DMA_RX) { return _serial_dma_rx(serial, buffer, size); }#endif /* RT_SERIAL_USING_DMA */ return _serial_poll_rx(serial, buffer, size);} rt_serial_device第一个元素就是 rt_device ,故可以将rt_device *dev 强制赋值。而_serial_int_rx 和 _serial_dma_rx 均为操作fifo,故 serial->ops 为NULL并无影响,但 _serial_poll_rx 需要操作 ch = serial->ops->getc(serial) ,这个ops是如何引入的……
查看更多
6
个回答
默认排序
按发布时间排序
yqiu
2019-06-02
这家伙很懒,什么也没写!
串口驱动框架文档正在编写中,楼主留个微信号,我加你进来讨论下。
fengxin32
2019-06-02
这家伙很懒,什么也没写!
好的,PowerBearMaster,川熊技穷。 正在学习drv_usart,打算改成我惯用的收发均双缓冲DMA,只是如果像以前那样不开中断,就得在调度的钩子上挂函数。
fengxin32
2019-06-09
这家伙很懒,什么也没写!
标题上的疑问找到了。 int rt_hw_usart_init(void)中: uart_obj[i].serial.ops = &stm32_uart_ops;
sgeeood
认证专家
2019-06-10
这家伙很懒,什么也没写!
>串口驱动框架文档正在编写中,楼主留个微信号,我加你进来讨论下。 --- 您好,方便拉我一下吗?我也正在搞驱动 WX:xu_zhh
leongu
2019-06-28
这家伙很懒,什么也没写!
您好,方便加我微信吗?我也正在搞Uart驱动 WX:xu_zhh
leongu
2019-06-28
这家伙很懒,什么也没写!
您好,方便加我微信吗?我也正在搞Uart驱动 15221850734
撰写答案
登录
注册新账号
关注者
0
被浏览
1.6k
关于作者
fengxin32
这家伙很懒,什么也没写!
提问
5
回答
5
被采纳
0
关注TA
发私信
相关问题
1
STM32 407 串口接收数据 系统卡死
2
RTT nrf24l01 设备驱动程序
3
stm32f10x串口只能发送数据,无法接收
4
第一次尝试移植rt-thread 到stm32F103系列问题
5
有人把stm32L07xx的bsp移到rtt上来了吗?求一个
6
rt-thread线程调度异常在stm32f103芯片上
7
RTT是否支持STM32F429
8
请问谁有 STM32F40x HAL + RT-THREAD 模板
9
rt-thread在stm32f411下的移植问题
10
针对STM32F7系列平台的MPU,Cache特性,需要注意哪些问题?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
简单两步配置RTT源码阅读环境 vsc+clangd
2
恩智浦[FRDM-MCXN947]初探 之 ADC与DAC
3
LVGL使用字库IC芯片显示中文
4
基于STM32H750和Rt-Thread的CANFD通信实现的记录(一)
5
freemodbus主机在freertos的适配,参考rtthread例程
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部