Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
msh
ulog
msh shell 线程和 ulog asunc 线程 优先级相同时 会导致uart device open_flag 被篡改
发布于 2023-12-28 10:35:05 浏览:326
订阅该版
[tocm] ## 问题复现步骤如下 1. 开启 msh shell 线程和 ulog async 线程 并且优先级相同 main 线程优先级大于前两者 2. 在main线程中调用日志接口使其输出日志比如 `LOG_I("xxx")` (注意 这里的日志尽可能的长 保证在输出的第一条日志耗时大于ulog async线程时间片) 3. main 线程结束 如果此时先运行ulog async 由于刚刚main线程有一条日志需要输出 所以, 最终ulog 调用函数 ulog_console_backend_output() 开始输出日志 4. 注意这个函数会先保存当前的open_flag 然后调用 rt_device_write 后再写回 **问题就出在这里** 5. 在执行第 4 步的 rt_device_write 将耗时超过时间片, 所以 msh shell 线程 将得到运行 6. 在 msh shell 线程 运行后 又以新的oflag 标志打开了 `uart device` 代码如下(只截取了部分) 7. 此时 uart dev oflag 已经更新 8. 此时 线程msh 时间片结束, ulog 线程得到运行 继续第 4 步 9. 此时会将之前旧的 old_flag 写回给 `open_flag dev->open_flag = old_flag;` 导致刚刚mesh 线程打开的oflag无效 ### 第 3 步 代码 ```c void ulog_console_backend_output(struct ulog_backend *backend, rt_uint32_t level, const char *tag, rt_bool_t is_raw, const char *log, size_t len) { #ifdef RT_USING_DEVICE rt_device_t dev = rt_console_get_device(); if (dev == RT_NULL) { rt_hw_console_output(log); } else { rt_uint16_t old_flag = dev->open_flag; dev->open_flag |= RT_DEVICE_FLAG_STREAM; rt_device_write(dev, 0, log, len); dev->open_flag = old_flag; } #else rt_hw_console_output(log); #endif } ``` ### 第6步代码 ```c void finsh_set_device(const char *device_name) { rt_device_t dev = RT_NULL; RT_ASSERT(shell != RT_NULL); dev = rt_device_find(device_name); if (dev == RT_NULL) { rt_kprintf("finsh: can not find device: %s\n", device_name); return; } /* check whether it's a same device */ if (dev == shell->device) return; /* open this device and set the new device in finsh shell */ if (rt_device_open(dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX | \ RT_DEVICE_FLAG_STREAM) == RT_EOK) { ```
查看更多
1
个回答
默认排序
按发布时间排序
cwq1142173025
2023-12-28
这家伙很懒,什么也没写!
简单解决办法就是将两个任务的优先级设置成不一样 但是这也是一个潜在的bug
撰写答案
登录
注册新账号
关注者
0
被浏览
326
关于作者
cwq1142173025
这家伙很懒,什么也没写!
提问
11
回答
10
被采纳
0
关注TA
发私信
相关问题
1
版本发布时怎样关闭LOG_D打印出的日志
2
怎样通过scons 配置日志输出usart,spi等初始化成功日志
3
请问哪里有rt_thread ulog日志存成文件的例程或者demo
4
文件系统的再次挂载问题
5
关于关闭打印调试信息输出
6
nano 中日志组件打印出现乱码问题
7
ulog_easyflash :Log sector header error
8
uog阻塞fish,无法输入
9
ulog的互斥信号量锁死
10
ulog组件能否输出float类型数据?
推荐文章
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
GD32F450 片内 flash驱动适配
2
STM32H7R7运行CherryUSB
3
RT-Smart首次线下培训,锁定2024 RT-Thread开发者大会!
4
使用RC522软件包驱动FM1722
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
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部