Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
链表
请教链表代码理解问题
发布于 2019-11-21 17:48:54 浏览:1438
订阅该版
在研究stm32f407的I2S时发现有几个函数是官方写的,但是在手册和官方文档中没有找到出处,请官方能否忙里偷闲加入这部分内容,我将此部分源码贴出来请官方获知: ```c /** * Audio Memory Node Manage */ struct rt_data_node { char *data_ptr; rt_uint32_t data_size; }; struct rt_data_node_list { struct rt_data_node *node; rt_uint32_t size; rt_uint32_t read_index, write_index; rt_uint32_t data_offset; void (*read_complete)(struct rt_data_node *node, void *user_data); void *user_data; }; int rt_data_node_init(struct rt_data_node_list **node_list, rt_uint32_t size) { int result = RT_EOK; struct rt_data_node_list *list = RT_NULL; struct rt_data_node *node = RT_NULL; list = rt_malloc(sizeof(struct rt_data_node_list)); if (list == RT_NULL) { result = -RT_ENOMEM; goto __exit; } memset(list, 0, sizeof(struct rt_data_node_list)); node = rt_malloc(sizeof(struct rt_data_node) * size); if (size == RT_NULL) { result = -RT_ENOMEM; goto __exit; } memset(node, 0, sizeof(struct rt_data_node)); list->node = node; list->size = size; list->read_index = 0; list->write_index = 0; list->data_offset = 0; list->read_complete = RT_NULL; list->user_data = 0; *node_list = list; return result; __exit: if (list) rt_free(list); if (node) rt_free(node); return result; } int rt_data_node_is_empty(struct rt_data_node_list *node_list) { rt_uint32_t read_index, write_index; rt_base_t level; level = rt_hw_interrupt_disable(); read_index = node_list->read_index; write_index = node_list->write_index; rt_hw_interrupt_enable(level); if (read_index == write_index) { return RT_TRUE; } else { return RT_FALSE; } } void wait_node_free(struct rt_data_node_list *node_list) { while (node_list->read_index != node_list->write_index) rt_thread_mdelay(5); } int rt_data_node_write(struct rt_data_node_list *node_list, void *buffer, rt_uint32_t size) { struct rt_data_node *node = RT_NULL; rt_uint32_t read_index, write_index, next_index; rt_base_t level; level = rt_hw_interrupt_disable(); read_index = node_list->read_index; write_index = node_list->write_index; rt_hw_interrupt_enable(level); next_index = write_index + 1; if (next_index >= node_list->size) next_index = 0; if (next_index == read_index) { rt_kprintf("[node]:node list full, write index = %d, read index = %d
", write_index, read_index); return -RT_ERROR; } level = rt_hw_interrupt_disable(); /* set node attribute */ node = &node_list->node[write_index]; node->data_ptr = (char *) buffer; node->data_size = size; node_list->write_index = next_index; rt_hw_interrupt_enable(level); return size; } int rt_data_node_read(struct rt_data_node_list *node_list, void *buffer, rt_uint32_t size) { struct rt_data_node *node = RT_NULL; rt_uint32_t read_index, write_index, next_index; rt_int32_t remain_len, copy_size; rt_uint32_t read_offset, data_offset; rt_base_t level; rt_uint32_t result = size; level = rt_hw_interrupt_disable(); read_index = node_list->read_index; write_index = node_list->write_index; rt_hw_interrupt_enable(level); read_offset = 0; if (read_index == write_index) { result = 0; } else { do { node = &node_list->node[node_list->read_index]; data_offset = node_list->data_offset; remain_len = node->data_size - data_offset; if (size - read_offset > remain_len) { /* Full*/ copy_size = remain_len; } else { /* reamain buffer */ copy_size = size - read_offset; } memcpy((char *)buffer + read_offset, node->data_ptr + data_offset, copy_size); read_offset += copy_size; data_offset += copy_size; node_list->data_offset = data_offset; if (data_offset >= node->data_size) { /* notify transmitted complete. */ if (node_list->read_complete != RT_NULL) { node_list->read_complete(node, node_list->user_data); } level = rt_hw_interrupt_disable(); read_index = node_list->read_index; write_index = node_list->write_index; rt_hw_interrupt_enable(level); next_index = read_index + 1; if (next_index >= node_list->size) next_index = 0; level = rt_hw_interrupt_disable(); node_list->read_index = next_index; node_list->data_offset = 0; rt_hw_interrupt_enable(level); if (next_index == write_index) { result = read_offset; break; } } } while (read_offset < size); } return result; } static void data_node_read_complete(struct rt_data_node *node, void *user_data) { struct rt_device *dev = RT_NULL; dev = (struct rt_device *)user_data; if (dev->tx_complete != RT_NULL) { dev->tx_complete(dev, node->data_ptr); } } ```
查看更多
14
个回答
默认排序
按发布时间排序
ROG
2019-11-22
这家伙很懒,什么也没写!
>楼主可以提pr给官方 --- 我不会啊:'(
ROG
2019-11-22
这家伙很懒,什么也没写!
>可参考一下这篇:https://www.rt-thread.org/document/site/development-guide/github/github/ --- 我好难:'(
ROG
2019-11-25
这家伙很懒,什么也没写!
>不对呀,楼主,你这个是什么版本的?master上没有这些函数啊 --- 不是系统内部的在驱动组件里面。作者是Zero-Free还是ZeroFree这位开发者写的组件。我不知道这是一个人还是两个人,傻傻分不清
ROG
2019-11-25
这家伙很懒,什么也没写!
>不是系统内部的在驱动组件里面。作者是Zero-Free还是ZeroFree这位开发者写的组件。我不知道这是一个人还 ... --- 这是源码
liu2guang
认证专家
2019-11-25
这家伙很懒,什么也没写!
你这个 sound 驱动是老框架的驱动,这几个函数都是驱动中实现的,新的sound框架已经不需要这些东西了
liu2guang
认证专家
2019-11-25
这家伙很懒,什么也没写!
新的音频框架建议先看看我这个帖子 [https://www.rt-thread.org/qa/thread-422550-1-1.html](https://www.rt-thread.org/qa/thread-422550-1-1.html)
ROG
2019-11-25
这家伙很懒,什么也没写!
>新的音频框架建议先看看我这个帖子 https://www.rt-thread.org/qa/thread-422550-1-1.html --- 这个是适配哪个开发板啊?
ROG
2019-11-25
这家伙很懒,什么也没写!
>新的音频框架建议先看看我这个帖子 https://www.rt-thread.org/qa/thread-422550-1-1.html --- 怎么联系到你,将你的驱动加入进去不响了,原来的最起码还发声呢:'(
liu2guang
认证专家
2019-11-26
这家伙很懒,什么也没写!
>怎么联系到你,将你的驱动加入进去不响了,原来的最起码还发声呢 --- :L 我的是模板啊,没有驱动实现
qz_rtt
2019-11-26
这家伙很懒,什么也没写!
看来楼主有还有待提高,加油:)
撰写答案
登录
注册新账号
关注者
0
被浏览
1.4k
关于作者
ROG
这家伙很懒,什么也没写!
提问
41
回答
121
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
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
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部