内核部分更新
新增特性
【hook】增加静态宏方式的HOOK机制
【tick】为rt_tick_increase增加HOOK机制
【kservice】增加RT_KSERVICE_USING_STDLIB、增加rt_strcpy
修复的问题
修复了一个特定场景下会引起软件定时器停止工作的BUG
其他优化
完善了内核的调试日志
特性解析
新增了静态宏方式的HOOK机制
从4.1.0版本开始,RT-Thread在保证向前兼容的基础上对原有的HOOK方式进行了改进,实现了如下的效果:
与原有使用函数指针进行“运行时刻”HOOK的方式兼容,依赖原有方式进行代码插入或HOOK的模块无需修改;
使用RT_USING_HOOK作为总开关
当未定义该宏时,将关闭所有HOOK功能,也不再生成任何相关代码
当定义该宏时,在未开启传统“函数指针HOOK”时,默认情况下也不再生成额外代码
允许用户通过“插入宏的方式”在编译时刻精细控制具体HOOK哪个位置
可以插入任意代码块——其中就包括函数指针、对普通函数的调用等等
具体使用方式可以参考共享者小伙伴的这篇文章:
RT-Thread新版本中HOOK的使用方法
注意:非rtos资深用户,请谨慎使用HOOK机制
为rt_tick_increase增加HOOK机制
我们为 rt_tick_increase 增加了 HOOK 机制。这样在某些场景下,比如:当用户需要一个精度较高的时间基准,或者要做一些和系统心跳同频的事情的时候,就可以借助这个机制。
利用前一部分的静态宏的方式或者使用API rt_tick_sethook设定hook函数的方式,在系统心跳的时候执行一些“非常简短”的操作。
注意:由于rt_tick_increase的执行频率较高,设定的HOOK函数一定不能执行复杂的操作,会增大系统负荷!
增加RT_KSERVICE_USING_STDLIB
增加了一些针对 kservice.c 的配置宏,可以配置使用c库里提供的内存函数替换 RT-Thread Kservice 实现。代码效率更高,但是在地址非对齐的情况下,可能会出问题。
问题修复
软件定时器BUG修复
问题描述:
在特定场景下,软件定时器处理线程会错误的挂起自身,导致如果之后没有启动软件定时器的操作,来唤醒处理线程的话,所有的软件定时器都会停止工作。
问题场景:
当一个定时器到达设定的超时时间,此时软件定时器处理线程会尝试获取下一个定时器的超时时间,来决定何时唤醒自身执行超时操作。如果获取不到下次超时时间的话,就会挂起自身,永久等待。
这里获取下一次超时时间的函数之前的版本有问题,如果下一次的超时时间恰好为 RT_TICK_MAX 的话,也会被认为是没有获取到,就会导致处理线程被异常挂起。
其他优化
完善了内核的调试日志,添加 RT_DEBUG_DEVICE 类型,统一使用 RT_DEBUG_LOG 宏管理内核的调试日志。
原作者:XQQ