Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
UART
关于serial驱动框架中断发送机制
发布于 2019-11-25 10:20:33 浏览:2297
订阅该版
串口发送分为poll和int两种方式,poll比较好理解,代码也没问题,但是int方式下我觉得和poll貌似没什么区别,加入中断方式是为了能够利用中断触发来降低CPU性能消耗,如果和poll方式一样的话那么要中断方式貌似就没有什么意义了,我是用GitHub上正点原子bsp,的代码如下:驱动框架中断发送函数调用putc,bsp中putc采样和poll一样的方式 ```c rt_inline int _serial_int_tx(struct rt_serial_device *serial, const rt_uint8_t *data, int length) { int size; struct rt_serial_tx_fifo *tx; RT_ASSERT(serial != RT_NULL); size = length; tx = (struct rt_serial_tx_fifo*) serial->serial_tx; RT_ASSERT(tx != RT_NULL); while (length) { if (serial->ops->putc(serial, *(char*)data) == -1) { rt_completion_wait(&(tx->completion), RT_WAITING_FOREVER); continue; } data ++; length --; } return size - length; }``````static int stm32_putc(struct rt_serial_device *serial, char c) { struct stm32_uart *uart; RT_ASSERT(serial != RT_NULL); uart = (struct stm32_uart *)serial->parent.user_data; __HAL_UART_CLEAR_FLAG(&(uart->UartHandle), UART_FLAG_TC); uart->UartHandle.Instance->DR = c; while (__HAL_UART_GET_FLAG(&(uart->UartHandle), UART_FLAG_TC) == RESET); return 1; } ``` 是我理解错误还是bsp错误,如果bsp写的有问题,那么应该如何写?
查看更多
19
个回答
默认排序
按发布时间排序
aozima
2019-11-25
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
主要是是中断方式多了 rt_completion_wait。 ![rt_completion_wait](/uploads/201911/25/103407y0ll8y16hahk326k.png) POLL模式下,不管CPU主频几个G,都全被这里吃掉。 而中断的话,是每字节或几个字节,会等一次中断,这样可以释放出一些CPU。
aozima
2019-11-25
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
要支持好INT模式,PUTC也要改造下,让FIFO满后返回-1。 STM32的UART算是1个字节的FIFO吧,基本等于没有FIFO。
写代码的猿
2019-11-25
这家伙很懒,什么也没写!
>要支持好INT模式,PUTC也要改造下,让FIFO满后返回-1。 >STM32的UART算是1个字节的FIFO吧,基本等于没有FIFO ... --- 如果返回-1,那么就直接continue了,并不会执行下面的data++,也就是说不会发送下一个字符
aozima
2019-11-25
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
>那么就直接continue了,并不会执行下面的data++,也就是说不会发送下一个字符 --- 对啊,说明当前字符末发送出去,等有空了接着发。不然当前字符就丢了。
写代码的猿
2019-11-25
这家伙很懒,什么也没写!
>对啊,说明当前字符末发送出去,等有空了接着发。不然当前字符就丢了。 ... --- 我大致明白你的意思了,也就是说发送第一个字节之后字节继续发送下一个字节,然后由于发送失败进入wait,中断触发后发送done,wait返回continue重新调用putc发送,我最开始理解错了,我以为是发送完当前这个字节之后就wait,然后触发中断,中断中发送done,然后线程data++发送下一个继续wait
写代码的猿
2019-11-25
这家伙很懒,什么也没写!
>对啊,说明当前字符末发送出去,等有空了接着发。不然当前字符就丢了。 bsp修改了一下可以了 ```c static int stm32_putc(struct rt_serial_device *serial, char c) { struct stm32_uart *uart; RT_ASSERT(serial != RT_NULL); uart = (struct stm32_uart *)serial->parent.user_data; if(serial->parent.open_flag & RT_DEVICE_FLAG_INT_TX) { if(__HAL_UART_GET_FLAG(&(uart->UartHandle), UART_FLAG_TXE) != RESET) { uart->UartHandle.Instance->DR = c; return 1; } else { return -1; } } else { __HAL_UART_CLEAR_FLAG(&(uart->UartHandle), UART_FLAG_TC); uart->UartHandle.Instance->DR = c; while (__HAL_UART_GET_FLAG(&(uart->UartHandle), UART_FLAG_TC) == RESET); return 1; } } ```
aozima
2019-11-25
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
给楼主点个赞!
yaomo718
2019-11-25
这家伙很懒,什么也没写!
给楼主点赞! 很早之前我也有过同样的疑问,我的解决办法是建了一个比较大的ringbuffer,int_tx就负责往这个ringbuffer里写内容。但是有个问题就是这个缓存要足够大,不然发送的东西太多就会被写满丢数据。不过因为项目上够用,后来就把这个事情搞忘了。今天看到你的帖子,这个很久以前的疑问终于也搞清楚了。:handshake
写代码的猿
2019-11-26
这家伙很懒,什么也没写!
>给楼主点赞! >很早之前我也有过同样的疑问,我的解决办法是建了一个比较大的ringbuffer,int_tx就负责往这 ... --- 你这也是一个办法,不过往ringbuff写满的时候就不要继续写了,把当前线程挂起等待ringbuff有空间了再唤醒线程继续写,最好的办法还是用驱动框架,这里已经给你做好线程挂起唤醒等操作了
yaomo718
2019-11-26
这家伙很懒,什么也没写!
>你这也是一个办法,不过往ringbuff写满的时候就不要继续写了,把当前线程挂起等待ringbuff有空间了再唤醒 ... --- 嗯嗯,我也觉得现有框架的实现机制是最好的解决方式。
撰写答案
登录
注册新账号
关注者
0
被浏览
2.3k
关于作者
写代码的猿
这家伙很懒,什么也没写!
提问
2
回答
7
被采纳
0
关注TA
发私信
相关问题
1
rt thread 2.0.2 usart 接收缓存问题
2
关于STM32串口通信的问题
3
STM32F1+RTT串口接收终端数据丢失问题
4
UART TX丢数据?
5
RTT打开串口的时候如何自定义波特率呢?
6
STM32F4的USART数据接收问题
7
串口1234使用问题
8
串口接收回调函数
9
LPC18xx UART问题讨论
10
x1000串口配置的失败问题
推荐文章
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
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
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
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部