Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
串口DMA中断接收函数引用信号量获取keil编译有问题,RT-Thread Studio编译代码正常运行,求解惑
发布于 2024-10-31 21:48:18 浏览:23
订阅该版
//DMA空闲中断回调函数里调用这个函数 ```c rt_err_t rx_callback3(rt_device_t dev, rt_size_t size) { rt_size_t len = 0; rx_len = size; len = rt_device_read(u3_dev, 0, uart3_rx_buf, rx_len); rt_kprintf("COM data len %d = %d \n", len, rx_len ); for (int var = 0; var < len ; var++) { rt_kprintf("COM receive data%d = 0x%X \n", var, uart3_rx_buf[var] ); } if (rx_len != 0) { //这个ringbuf_write函数内有信号量获取 rt_size_t write_size = ringbuf_write(uart3_rx_ringbuf, uart3_rx_buf, rx_len, RT_WAITING_NO); if (write_size == rx_len) { rt_mq_send(uart3_rx_mq, &rx_len, sizeof(rt_size_t)); } else { if (uart3_rx_ringbuf->bufFull) { uart_receive_size = 0; rt_mq_send(uart3_rx_mq, &uart_receive_size, sizeof(rt_size_t)); } if (write_size == 0) { uart_receive_size = 0; rt_mq_send(uart3_rx_mq, &uart_receive_size, sizeof(rt_size_t)); } } } return RT_EOK; } ``` ringbuf_write是同事网上找的代码,原先他用RT-Thread Studio编译,代码居然正常跑,我改keil编译之后在 信号量获取函数里面的 RT_ASSERT断言就通过不了,程序直接跑不了。虽然我修改代码可以解决问题,但是想不明白为什么一模一样的代码,RT-Thread Studio编译出来的程序能正常呢,keil的为啥不行! ```c /* parameter check */ RT_ASSERT(sem != RT_NULL); RT_ASSERT(rt_object_get_type(&sem->parent.parent) == RT_Object_Class_Semaphore); */ ``` ```c rt_size_t ringbuf_write(st_ringbuf_t rbt, void *buffer, rt_size_t size, rt_int32_t time) { rt_size_t ret = 0; rt_size_t tailSize = 0; if (rbt == RT_NULL) { LOG_D("Try to write a null ringbuf, abort."); return 0; } if (buffer == RT_NULL) { LOG_D("Input a null buffer in ringbuf_write, abort."); return 0; } /* take the sem succesfully, then space from the buffer. */ //信号量获取在这里 if (rt_sem_take(rbt->tx_sem, time) == RT_EOK) { /* test the bufFull flag, if the buf is full ,we quit now. */ if (rbt->bufFull == RT_TRUE) { ret = 0; } else { /* buffer size is enough to write all obj. */ if (size <= (rbt->bufMaxSize - rbt->bufNowSize)) { tailSize = (rbt->tailIndex - rbt->txIndex + 1); if (size <= tailSize) { rt_memcpy((rt_uint8_t *)rbt->head + rbt->txIndex * rbt->objSize, buffer, rbt->objSize * size); rbt->txIndex += size; rbt->bufNowSize += size; ret = size; if (rbt->txIndex - 1 == rbt->tailIndex) { rbt->txIndex = 0; } } else { rt_memcpy((rt_uint8_t *)rbt->head + rbt->txIndex * rbt->objSize, buffer, rbt->objSize * (tailSize)); ret += (tailSize); rbt->bufNowSize += ret; size -= ret; rbt->txIndex = 0; rt_memcpy((rt_uint8_t *)rbt->head, (rt_uint8_t *)buffer + ret * rbt->objSize, rbt->objSize * (size)); rbt->txIndex += size; rbt->bufNowSize += size; ret += size; } } else { /* we don't hanlde it when buffer size is not enough to write all objs. */ ret = 0; } /* test if buffr is full or empty, update the flag. */ if (rbt->bufMaxSize == rbt->bufNowSize) { rbt->bufFull = RT_TRUE; rbt->bufEmpty = RT_FALSE; } else { rbt->bufFull = RT_FALSE; } if (rbt->bufNowSize == 0) { rbt->bufEmpty = RT_TRUE; rbt->bufFull = RT_FALSE; } else { rbt->bufEmpty = RT_FALSE; } } rt_sem_release(rbt->tx_sem); } else { ret = 0; } return ret; } ```
查看更多
0
个回答
默认排序
按发布时间排序
暂无答案,快来添加答案吧
撰写答案
登录
注册新账号
关注者
0
被浏览
23
关于作者
lingjiawang511
这家伙很懒,什么也没写!
提问
1
回答
0
被采纳
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
【1024】瑞萨 RA 系列 BSP 制作与适配最新版本的 Keil 、 RSC、固件,较新的 FSP
2
基于 RT-Thread 星火一号开发板的俄罗斯方块
3
RTThread studio 中添加 Micro_ROS 软件包有 Bug
4
【1024 RT-Thread与英飞凌(infineon)合作得板子PSOC 6 板子学习】
5
【1024】用HMI-Board 復刻 X-Track
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
cubemx
PWM
flash
packages_软件包
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
keil_MDK
SFUD
rt_mq_消息队列_msg_queue
C++_cpp
at_device
ulog
本月问答贡献
出出啊
1516
个答案
342
次被采纳
小小李sunny
1440
个答案
289
次被采纳
张世争
793
个答案
171
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
1
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
4
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部