鸣涧 发表于 2022-4-16 11:04:12

RT-Thread 4.1.0 特性解析之内核

RT-Thread 4.1.0 特性解析之内核


自发布v4.1.0 beta版本以来,我们一直积极收集大家的反馈与问题报告,经过我们和社区小伙伴们的共同努力,一起修复了一些问题,完善了新增的特性,现在RT-Thread v4.1.0 版本正式发布了。
这篇文章是专门介绍内核部分更新的内容的。

内核部分更新新增特性【hook】增加静态宏方式的HOOK机制

【tick】为rt_tick_increase增加HOOK机制

【kservice】增加RT_KSERVICE_USING_STDLIB、增加rt_strcpy

修复的问题修复了一个特定场景下会引起软件定时器停止工作的BUG
其他优化完善了内核的调试日志
特性解析

1. 新增了静态宏方式的HOOK机制

从4.1.0版本开始,RT-Thread在保证向前兼容的基础上对原有的HOOK方式进行了改进,实现了如下的效果:
[*]与原有使用函数指针进行“运行时刻”HOOK的方式兼容,依赖原有方式进行代码插入或HOOK的模块无需修改;
[*]使用RT_USING_HOOK作为总开关- 当未定义该宏时,将关闭所有HOOK功能,也不再生成任何相关代码- 当定义该宏时,在未开启传统“函数指针HOOK”时,默认情况下也不再生成额外代码
[*]允许用户通过“插入宏的方式”在编译时刻精细控制具体HOOK哪个位置- 可以插入任意代码块——其中就包括函数指针、对普通函数的调用等等

具体使用方式可以参考共享者小伙伴的这篇文章:RT-Thread新版本中HOOK的使用方法(请复制以下链接至浏览器打开:https://club.rt-thread.org/ask/article/3669.html)
注意:非rtos资深用户,请谨慎使用HOOK机制


2. 为rt_tick_increase增加HOOK机制
我们为 rt_tick_increase 增加了 HOOK 机制。这样在某些场景下,比如:当用户需要一个精度较高的时间基准,或者要做一些和系统心跳同频的事情的时候,就可以借助这个机制。利用前一部分的静态宏的方式或者使用API rt_tick_sethook设定hook函数的方式,在系统心跳的时候执行一些“非常简短”的操作。
注意:由于rt_tick_increase的执行频率较高,设定的HOOK函数一定不能执行复杂的操作,会增大系统负荷!
3. 增加RT_KSERVICE_USING_STDLIB
增加了一些针对 kservice.c 的配置宏,可以配置使用c库里提供的内存函数替换 RT-Thread Kservice 实现。代码效率更高,但是在地址非对齐的情况下,可能会出问题。

问题修复


软件定时器BUG修复

问题描述:
在特定场景下,软件定时器处理线程会错误的挂起自身,导致如果之后没有启动软件定时器的操作,来唤醒处理线程的话,所有的软件定时器都会停止工作。相关链接:https://github.com/RT-Thread/rt-thread/issues/5623
问题场景:
当一个定时器到达设定的超时时间,此时软件定时器处理线程会尝试获取下一个定时器的超时时间,来决定何时唤醒自身执行超时操作。如果获取不到下次超时时间的话,就会挂起自身,永久等待。这里获取下一次超时时间的函数之前的版本有问题,如果下一次的超时时间恰好为RT_TICK_MAX 的话,也会被认为是没有获取到,就会导致处理线程被异常挂起。问题修复:RT-Thread v4.1.0版本已经修复了这个问题:https://github.com/RT-Thread/rt-thread/pull/5637。推荐大家同步修改此补丁。
其他优化完善了内核的调试日志,添加RT_DEBUG_DEVICE类型,统一使用RT_DEBUG_LOG 宏管理内核的调试日志。

页: [1]
查看完整版本: RT-Thread 4.1.0 特性解析之内核