搜索
bottom↓
回复: 3

函数rt_serial_write()中代码帮忙解惑

[复制链接]

出0入0汤圆

发表于 2010-8-26 20:46:54 | 显示全部楼层 |阅读模式
以下为rt_serial_write()函数中的源代码:
else if (dev->flag & RT_DEVICE_FLAG_DMA_TX)
        {
                /* DMA mode Tx */

                /* allocate a data node */
                struct stm32_serial_data_node* data_node = (struct stm32_serial_data_node*)
                        rt_mp_alloc (&(uart->dma_tx->data_node_mp), RT_WAITING_FOREVER);
                if (data_node == RT_NULL)
                {
                        /* set error code */
                        err_code = -RT_ENOMEM;
                }
                else
                {
                        rt_uint32_t level;

                        /* fill data node */
                        data_node->data_ptr         = ptr;
                        data_node->data_size         = size;

                        /* insert to data link */
                        data_node->next = RT_NULL;

                        /* disable interrupt */
                        level = rt_hw_interrupt_disable();

                        data_node->prev = uart->dma_tx->list_tail;
                        if (uart->dma_tx->list_tail != RT_NULL)
                                uart->dma_tx->list_tail->next = data_node;
                        uart->dma_tx->list_tail = data_node;

                        if (uart->dma_tx->list_head == RT_NULL)
                        {
                                /* start DMA to transmit data */
                                uart->dma_tx->list_head = data_node;

                                /* Enable DMA Channel */
                                rt_serial_enable_dma(uart->dma_tx->dma_channel,
                                        (rt_uint32_t)uart->dma_tx->list_head->data_ptr,
                                        uart->dma_tx->list_head->data_size);
                        }

                        /* enable interrupt */
                        rt_hw_interrupt_enable(level);
                }
        }
在DMA mode Tx 下,从内存池中分配一数据节点(data_node )内存块,并对数据节点初始化,但以下代码不解,请各位释疑
                                /* insert to data link */
                        data_node->next = RT_NULL;

                        /* disable interrupt */
                        level = rt_hw_interrupt_disable();

                        data_node->prev = uart->dma_tx->list_tail;
                        if (uart->dma_tx->list_tail != RT_NULL)
                                uart->dma_tx->list_tail->next = data_node;
                        uart->dma_tx->list_tail = data_node;

                        if (uart->dma_tx->list_head == RT_NULL)
                        {
                                /* start DMA to transmit data */
                                uart->dma_tx->list_head = data_node;
                                ..............................................
                                ..............................................
好像是将该数据节点插入发送链,可插入操作看不懂。RT-Thread中有很多链表操作,基本都看得懂,但看到此处,有点糊涂。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2010-8-26 22:59:09 | 显示全部楼层
这个比较拗口些,下次写得简单些。

data_node->prev = uart->dma_tx->list_tail;
if (uart->dma_tx->list_tail != RT_NULL)
uart->dma_tx->list_tail->next = data_node;
uart->dma_tx->list_tail = data_node;

插入到链表的尾端。(每个数据节点是一个双向链表节点,head、tail指向头和尾,它们并不是一个环形链表)

if (uart->dma_tx->list_head == RT_NULL)
{
/* start DMA to transmit data */
uart->dma_tx->list_head = data_node;

插入完成后,如果头节点是空,说明插入的是第一个节点,
->    对头节点进行赋值
->    发起一次DMA传送。

出0入0汤圆

 楼主| 发表于 2010-8-27 07:21:36 | 显示全部楼层
谢谢ffxz,理解了。此链表并非环形链表,head、tail分别指向此链表的头和尾。
rt_serial_write()函数往此链表添加待发送数据节点,而rt_hw_serial_dma_tx_isr(rt_device_t device)中断服务中查询此链表,只要链表非空,就继续启动DMA发送数据

出0入0汤圆

发表于 2010-8-29 21:30:24 | 显示全部楼层
不好意思,这个DMA模式的例子在哪里,我看到的sam7s的例子 rt_serial_write 没有DMA模式

在stm32 radio里面找到了,感谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 15:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表