Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
app
rt-smart
硬实时
5
rt-smart用户态线程实时性差的问题
发布于 2025-03-30 13:38:40 浏览:98
订阅该版
我在树莓派4B上使用v5.2.0 开启smart的rt-thread 并启用SMP多核(4核)内核时,在用户态和内核态运行同样的代码测试: ```c #include
#include
#include
#include
#include
#define MAX_PRIO 0 rt_thread_t base_rate_thread; int simulationFinished = 0; void busy_delay(struct timespec *next) { struct timespec now; do { clock_gettime(CLOCK_MONOTONIC, &now); } while (now.tv_sec < next->tv_sec || (now.tv_sec == next->tv_sec && now.tv_nsec <= next->tv_nsec)); } void base_rate(void *param_unused) { printf("Base rate thread started\n"); struct timespec now, next, start; struct timespec period = {0U, 50000U}; /* 5.0E-5 seconds */ int step_sem_value; int i; (void)param_unused; uint32_t overrun_time = 0; uint32_t num = 0; uint32_t max = 0; uint32_t min = 1000000000; uint32_t sum = 0; while (!simulationFinished) { clock_gettime(CLOCK_MONOTONIC, &start); next.tv_sec = start.tv_sec + period.tv_sec; next.tv_nsec = start.tv_nsec + period.tv_nsec; if (next.tv_nsec >= 1000000000) { next.tv_sec++; next.tv_nsec -= 1000000000; } busy_delay(&next); clock_gettime(CLOCK_MONOTONIC, &now); uint32_t usec = (now.tv_sec - start.tv_sec) * 1000000 + (now.tv_nsec - start.tv_nsec) / 1000; sum += usec; num++; if (usec > max) { max = usec; } if (usec < min) { min = usec; } } printf("sum:%ld num:%ld avg:%ld min:%ld max:%ld over: %ld\n", sum, num, sum/num, min, max, overrun_time); } int main() { printf("APP STARTED\n"); const char *errStatus; int i; simulationFinished = 0; rt_thread_t baseRateTask, extModeTask; baseRateTask = rt_thread_create("baseRateTask", base_rate, RT_NULL, 16834, MAX_PRIO + 9, 1); rt_thread_startup(baseRateTask); for (int i = 0; i < 100; i++) { rt_thread_mdelay(100); } simulationFinished = 1; rt_thread_mdelay(1000); printf("model finish\n"); return 0; } ``` 即使用忙等待的方式测量50us定时性能,发现在内核态时代码平均周期为50us,最小周期为50us,最大周期为57us,性能十分优异,而在用户态运行同样代码,性能劣化为平均周期70多us,最大周期甚至超过100us,实时性大幅下降; 想请教这种现象是用户态使用系统调用的必然结果,还是有什么地方使用的方式不对,又或者是忙等这种延时方式在用户态极大影响性能?
查看更多
0
个回答
默认排序
按发布时间排序
暂无答案,快来添加答案吧
撰写答案
登录
注册新账号
关注者
0
被浏览
98
关于作者
IVMY_7852
这家伙很懒,什么也没写!
提问
2
回答
1
被采纳
0
关注TA
发私信
相关问题
1
【已解决】bootloader跳转后,内存申请函数失败
2
OTA升级,APP程序下载问题
3
RT-Thread Studio 如何下载编译好的APP到app分区。
4
bootload和app内存需要分开吗
5
关于是否可将线程APP化的困扰
6
RT-Thread标准版里没有实现系统调用吗?
7
rtthread APP跳转地址问题
8
bootloader app 中断向量偏移问题
9
为什么无法使用RT-Thread Studio将app烧写到外部Flash中?
10
APP无法跳转到外部FLASH运行?
推荐文章
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
RTT串口查找函数使用过程中遇到的问题。
2
RT-Thread CI编译产物artifacts自动上传功能介绍
3
STM32G030移植RT-Thread
4
CubeMX & RT-Thread Studio 联合开发说明
5
RT-Thread项目助手v0.3 | Ubuntu与MacOS平台的RT-Thread Env
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
rt-smart
RTC
FAL
I2C_IIC
cubemx
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
GD32
定时器
ADC
flashDB
编译报错
socket
中断
rt_mq_消息队列_msg_queue
keil_MDK
Debug
SFUD
ulog
msh
C++_cpp
MicroPython
本月问答贡献
出出啊
1522
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
815
个答案
179
次被采纳
crystal266
555
个答案
162
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
1
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部