Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Kernel
15天入门第四次:空闲任务及钩子
发布于 2018-05-21 01:25:33 浏览:2870
订阅该版
1.前期问题答疑 ①没有头文件,太简单了,不需要. ②先学怎么用.用的熟练以后,再慢慢深入了解原理. ③比较时候,颠倒过来主要防止笔误等低级错误.如果笔误,写成 if(res=RT_EOK) 也是可以通过的, ,语法没问题.没有有效起到比较的作用.所以一般 常量写在前面 if (RT_EOK == res) ④scons 安装包,直接使用setup.py install 进行安装 ⑤所有任务 优先级设置相同,故意这么做的,实际项目中一般不会存在折后总情况. 实际项目中其实是可以分出优先级的, 比如,pid 自稳控制计算 >导航结算> 数据链收发<灯语显示.正常的任务,都是先排出个优先级的. ⑥延时 进入后,立即进行任务调度.不是等到延时结束后再调度. 2.空闲任务必要性讨论: 就类似于windowns 开机后什么程序都不运行. main { while(1) { led key nrf display; 没事情就是空闲任务,空转.CPU当然不能停下来. } } 3.空闲任务优先级 最低 RT_THREAD_PRIORITY_MAX - 1 #define RT_USING_SAMPLE_IDLEHOOK scons --target=mdk5 -s 任务数量可配置,#define RT_THREAD_PRIORITY_MAX 32 空闲任务的创建是在int rtthread_startup(void) 中: rt_thread_idle_init(); 通过静态创建线程的方式创建: /* initialize thread */ rt_thread_init(&idle, "tidle", rt_thread_idle_entry, RT_NULL, &rt_thread_stack[0], sizeof(rt_thread_stack), RT_THREAD_PRIORITY_MAX - 1, 32); 当使用空闲任务的钩子函数时候,就需要修改堆栈大小. 什么是钩子函数?使用场合. 设置一段函数,当你空闲时候,顺便运行一下这段代码,对实时性要求不高的情况,可以 安排在空闲任务中执行,因为空闲任务也消耗资源,比如堆栈占了256个字节.闲着也是闲着, 就执行这段吧. 空闲任务做了什么? 停止任务的回收等. 如何使用钩子函数? 使能RT_USING_HOOK 默认是打开的. 一个例子,空闲时候计算CPU 使用率.```/* 一个项目开发完成后,比较好的CPU使用率是70%左右.为后续功能增加考虑. ==CPU使用率统计原理分析?可参考论坛. 100-cpu 空闲率,就是计算10个滴答间隔时间内,统计cpu 空闲率. 然后100- cpu 空闲率来实现. /* 记录CPU使用率为0时的总count数 */ 作业: 1.修改 系统滴答时钟,观察系统滴答时钟频率对CPU使用率 的影响 100 1000 2000. /* CPU使用率打印线程入口 */ 中 休眠tick = 10个时候,同时打开LED例子. 滴答时钟频率为100时:cpu usage 最大1.87%.大部分都是0.几%. 滴答时钟频率为1000时:打印速度明显变快,最大19.11%, 并且大部分时候,都是1.3% 左右. 2.使用率 float double ,看看cpu 使用率小数点后 是多少. float 感觉差别不大. * 程序清单:空闲任务钩子例程 * * 这个例程设置了一个空闲任务钩子用于计算CPU使用率,并创建一个线程循环打印CPU使用率 * 通过修改CPU使用率打印线程中的休眠tick时间可以看到不同的CPU使用率 */ #include
#include
#define THREAD_PRIORITY 25 #define THREAD_STACK_SIZE 512 #define THREAD_TIMESLICE 5 /* 指向线程控制块的指针 */ static rt_thread_t tid = RT_NULL; #define CPU_USAGE_CALC_TICK 10 #define CPU_USAGE_LOOP 100 static rt_uint8_t cpu_usage_major = 0, cpu_usage_minor = 0; static float cpu_usage = 0.0; /* 记录CPU使用率为0时的总count数 */ static rt_uint32_t total_count = 0; /* 空闲任务钩子函数 */ static void cpu_usage_idle_hook() { rt_tick_t tick; rt_uint32_t count; volatile rt_uint32_t loop; if (total_count == 0) { /* 获取 total_count */ rt_enter_critical(); tick = rt_tick_get(); while (rt_tick_get() - tick < CPU_USAGE_CALC_TICK) { total_count ++; loop = 0; while (loop < CPU_USAGE_LOOP) loop ++; } rt_exit_critical(); } count = 0; /* 计算CPU使用率 */ tick = rt_tick_get(); while (rt_tick_get() - tick < CPU_USAGE_CALC_TICK) { count ++; //空闲时候才++, loop = 0; while (loop < CPU_USAGE_LOOP) loop ++; } /* 计算整数百分比整数部分和小数部分 */ if (count < total_count) { count = total_count - count; cpu_usage_major = (count * 100) / total_count; cpu_usage_minor = ((count * 100) % total_count) * 100 / total_count; cpu_usage = (float)(count*100)/(float)(total_count); } else { total_count = count; /* CPU使用率为0 */ cpu_usage_major = 0; cpu_usage_minor = 0; } } void cpu_usage_get(rt_uint8_t *major, rt_uint8_t *minor) { RT_ASSERT(major != RT_NULL); RT_ASSERT(minor != RT_NULL); *major = cpu_usage_major; *minor = cpu_usage_minor; } /* CPU使用率打印线程入口 */ static void thread_entry(void *parameter) { rt_uint8_t major, minor; char temp[20]; while (1) { cpu_usage_get(&major, &minor); rt_kprintf("cpu usage: %d.%d%
", major, minor); sprintf(temp,"%f",cpu_usage); rt_kprintf("cpu use :%s
",temp); /* 休眠50个OS Tick */ /* 手动修改此处休眠 tick 时间,可以模拟实现不同的CPU使用率 */ rt_thread_delay(10); } } int cpu_usage_init() { /* 设置空闲线程钩子 */ rt_thread_idle_sethook(cpu_usage_idle_hook); /* 创建线程 */ tid = rt_thread_create("thread", thread_entry, RT_NULL, /* 线程入口是thread_entry, 入口参数是RT_NULL */ THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if (tid != RT_NULL) rt_thread_startup(tid); return 0; } /* 如果设置了RT_SAMPLES_AUTORUN,则加入到初始化线程中自动运行 */ #if defined (RT_SAMPLES_AUTORUN) && defined(RT_USING_COMPONENTS_INIT) INIT_APP_EXPORT(cpu_usage_init); #endif /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(cpu_usage_init, idle hook sample); ```
查看更多
0
个回答
默认排序
按发布时间排序
暂无答案,快来添加答案吧
撰写答案
登录
注册新账号
关注者
0
被浏览
2.9k
关于作者
小住住
这家伙很懒,什么也没写!
提问
129
回答
126
被采纳
2
关注TA
发私信
相关问题
1
请教cpu使用率分析
2
选择FreeRTOS, 还是RT-Thread。
3
thread heap stack overflow ?
4
rtt消息队列delay问题
5
释放被删除线程的内存地方在哪里啊
6
请教:各线程结束后,释放其中的内存的连续性问题
7
STM32F103中断关于信号量、邮箱问题
8
RTT中的线程栈大小如何控制
9
关于线程由执行态变为挂起态的代码实现,,,
10
rt_malloc(rt_size_t size)内存分配函数最小分配尺寸问题
推荐文章
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
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部