Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
DMA
5
_serial_dma_tx 函数的问题
发布于 2023-12-09 16:21:06 浏览:429
订阅该版
```c rt_base_t level; rt_err_t result; struct rt_serial_tx_dma *tx_dma; tx_dma = (struct rt_serial_tx_dma*)(serial->serial_tx); result = rt_data_queue_push(&(tx_dma->data_queue), data, length, RT_WAITING_FOREVER); if (result == RT_EOK) { level = rt_hw_interrupt_disable(); if (tx_dma->activated != RT_TRUE) { tx_dma->activated = RT_TRUE; rt_hw_interrupt_enable(level); /* make a DMA transfer */ serial->ops->dma_transmit(serial, (rt_uint8_t *)data, length, RT_SERIAL_DMA_TX); } else { rt_hw_interrupt_enable(level); } return length; ``` 这个是serial 框架下DMA发送的一个相关函数`_serial_dma_tx`。 其中第7行`rt_data_queue_push`的函数,我理解是把write的数据地址写入了发送队列,但是再后面的dma_transmit函数中,又把data的地址直接给了DMA。 那前面的写入发送队列还有什么意义?
查看更多
lchnu
2023-12-10
Witness, Understand, Skill
`使用DMA发送,实际也需要花费时间,只是这一段时间CPU可以空闲出来做别的事情。` 为了发送数据时不产生冲突,需要一个标志位来判断上一帧DMA发送的数据是否已经完成。 发送是否完成的判断逻辑,是通过tx_dma->activated进行控制的。 - 当tx_dma->activated为RT_TRUE,表示DMA正忙; - 当tx_dma->activated为RT_FALSE,表示DMA有空,可以发送数据。 `_serial_dma_tx`程序逻辑如下: 1. 将数据写入队列。如果无法写入,则RT_WAITING_FOREVER,线程切换,直到队列允许写入新的数据;如果可以写入队列,则result == RT_EOK。 2. **当数据写入到队列后,不表示此时DMA可以用于发送当前数据**,需要判断tx_dma->activated。只有DMA不忙时,才可以发送数据。因此,此处的逻辑是:**当tx_dma->activated为RT_FALSE,表示DMA空闲,可以直接将当前数据发送出去。**此时,需要将DMA改为忙,开中断,发数据,`对应你所贴代码的13-17行`。 3. 当前数据已经被发送了,刚刚写入到队列的数据怎么办?在rt_hw_serial_isr中,会先pop,再peak。pop的指针到last_data_ptr,触发回调;peak的指针到data_ptr,按写入队列的顺序发送。
1
个回答
默认排序
按发布时间排序
撰写答案
登录
注册新账号
关注者
0
被浏览
429
关于作者
miandain_7
这家伙很懒,什么也没写!
提问
10
回答
26
被采纳
3
关注TA
发私信
相关问题
1
串口DMA发送数据时,数据被覆盖
2
关于串口DMA模式下rt_device_close问题
3
stm32L4 lpuart1DMA下不能打开的问题
4
UART驱动开启DMA后编译报错,UART DMA配置中加入了没有定义的域
5
UART DMA 设计问题
6
UART DMA 拆包问题
7
串口如何有效的清除掉接收缓冲,而不必一个一个的去读取
8
串口接收使用方式问题
9
在studio中打开串口的DMA后,编译出错
10
官方DMA串口例程,使用时数据打印错误
推荐文章
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
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
7
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部