FREERTOS开启TICKLESS后最大只能349tick休眠的原因分析
@[toc] 空闲线程的运行时间分析原因 开启TICKLESS模式后,在PreSleepProcessing和PostSleepProcessing中打印ulExpectedIdleTime变量,即空闲时间.输出如下 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-56thy2v3-1684831702598)(TICKLESS.assets/image-20230523161450180.png)] 代码如下 123456789void PreSleepProcessing(uint32_t *ulExpectedIdleTime){ log_i("ulExpectedIdleTime %lu", *ulExpectedIdleTime);}void PostSleepProcessing(uint32_t *ulExpectedIdleTime){} 分析 为什么是349tick进入一次空闲线程? 分析FREERTOS源码,在portTASK_FUNCTIO...
stop2模式低功耗无法进入的问题分析
@[toc] 低功耗无法进入的问题分析现象 低功耗进入与退出前后加入打印函数.发现进入低功耗后立刻退出低功耗 打印代码如下 1234log_i("in\r\n");UTIL_PowerDriver.EnterStopMode( );UTIL_PowerDriver.ExitStopMode( );log_i("out\r\n"); 原因 中断标志位挂起未清除导致低功耗进入失败 分析挂起的中断标志位查找 完整的进退低功耗函数如下 123456789101112131415161718192021222324252627282930313233343536373839404142434445#define UTIL_LPM_ENTER_CRITICAL_SECTION_ELP() 扩展到:uint32_t primask_bit= __get_PRIMASK(); __disable_irq() #define UTIL_LPM_EXIT_CRITICAL_SECTION_ELP() 扩展到:__set_PRIMASK(prim...
关于RTC的玄学bug分析与解决
关于RTC的玄学bug分析与解决现象:按键长按或者连续按压导致RTC起振异常;RTC经过的时间读取出来没有变化,或者变化异常 发现:经过一下午复现排查后,按键背面为晶振区域;我摁下按键的手法会按压到晶振区域导致晶振异常;人按下按键时未按压到晶振区域.无法复现;如图 另外该现象体现在如下方面: 使用LSE为时钟源,可能导致初始化失败;看图,BootLoader成功跳转,app初始化错误; 这是错误发生位置,APP的时钟初始化; 对比APP和BL的时钟初始化以及RTC导致失败的原因分析发现. bl中仅初始化了HSE,app中还初始化了LSE,使用了RTC硬件资源导致初始化失败 检测使用RTC的时间去处理的函数,例如延时等操作,会一并异常.现象为无法继续运行下去 不在按压RTC器件后,可能现象还会出现,形变还没消失;还会出现上述情况. 得等待结束 总结: 不要接触挤压精密器件部分 硬件布线应考虑布局,按键背面不应该放精密器件
Grubbs’检验 双尾和单尾
@[toc] 一、引言:为何我们讨厌“离群之马”?在数据处理的各个领域——无论是科学实验、工业传感器读数,还是金融数据分析——我们都期望数据是稳定且一致的。然而,现实中总会出现一些“离群之马”,即异常值(Outliers)。这些数值显著偏离数据集中的其他观测值,可能是由于测量错误、设备故障或真实但罕见事件造成的。 如果不加处理,这些异常值会严重扭曲统计分析的结果,如平均值和标准差,从而导致错误的结论。因此,在数据预处理阶段,科学地识别并处理异常值至关重要。Grubbs’检验(Grubbs’ Test),正是为此而生的一种简单、强大且被广泛应用的统计方法。 1234567graph TD A["原始数据集<br/>(包含潜在异常值)"] --> B{"进行统计分析"}; B -- "不处理异常值" --> C["<font color=red>结果被扭曲<br/>(错误的平均值/标准差)</font>"]; ...
FEERTOS的TICKLESS模式下最大低功耗的时间只能是349tick的原因分析
@[toc] FEERTOS的TICKLESS模式下最大低功耗的时间只能是349tick的原因分析原因 开启TICKLESS模式后,在PreSleepProcessing和PostSleepProcessing中打印ulExpectedIdleTime变量,即空闲时间.输出如下 代码如下 123456789void PreSleepProcessing(uint32_t *ulExpectedIdleTime){ log_i("ulExpectedIdleTime %lu", *ulExpectedIdleTime);}void PostSleepProcessing(uint32_t *ulExpectedIdleTime){} 分析 为什么是349tick进入一次空闲线程? 分析FREERTOS源码,在portTASK_FUNCTION函数中调用接口,写入空闲时间值 在赋值后打印变量 12345678910111213141516171819202122if( xExpectedIdleTim...
ARM原子操作
@[toc] 原子操作1.概述原子操作很好用,在两三个小线程要同步变量时,不占用中断,也不过度占用资源。如果使用Mutex等并发原语进行这些优化,虽然可以解决问题,但是这些并发原语的实现逻辑比较复杂,对性能还是有一定的影响的。atomic包提供的方法会提供内存屏障的功能,atomic不仅仅可以保证赋值的数据完整性,还能保证数据的可见性,一旦一个核更新了该地址的值,其它处理器总是能读取到它的最新值。原子操作常用的三个操作有load,store,exchange。load方法会取出addr地址中的值;store方法会把一个值存入到指定的addr地址中;如果不需要比较旧值,只是比较粗暴地替换的话,就可以使用exchange方法,它替换后还可以返回旧值。 2.使用● 最简单的使用途径替换NODE_CRITICAL_SECTION_BEGIN与NODE_CRITICAL_SECTION_END之间的变量操作代码;全局变量,且在不同线程间同步才有意义 ● 理解与使用查看测试文件既可 ● 测试代码在STM32WLE上验证通过;如下验证代码通过可证明原子操作的效果,不会使得变量在不同线程...
U-BOOT CLANGD使用 + 避坑注意事项
[toc] 步骤1 参考如下教程操作;安装clangd + bear https://blog.csdn.net/oushaojun2/article/details/129877412 步骤2 使用方式,看版本 bear make 或者 bear – make 注意事项 出现 Unknown argument: ‘-mword-relocations’ 根目录新建.clangd文件,写入Remove的选项 1234CompileFlags: # Tweak the parse settings Add: [-xc++, -Wall] # treat all files as C++, enable more warnings Remove: -W* # strip all other warning-related flags Compiler: clang++ # Change argv[0] of compi...
objdump反汇编失败的解决办法
[toc] -m 显示添加目标架构 通常,objdump会自己识别目标架构;如果没有识别出来可以自行添加架构 file命令查看.O文件的架构信息 查看后指定目标架构既可 objdump -i 输出所支持的架构 用于选择-m 的参数要输入什么 交叉编译的使用 由于主机的objdump架构与编译目标的架构不同; 需要使用特定的objdump; 例如armv7m要使用arm-none-eabi-objdump
ubantu st-link 调试
@[toc] Linux如何安装/卸载.deb文件 https://blog.csdn.net/vuipp/article/details/126031945 安装.deb 只要输入“sudo dpkg -i 文件名”就可以了 Ubuntu中gcc-arm-none-eabi的安装 https://blog.csdn.net/qq_20016593/article/details/125343260 手动安装(推荐)(1)官网下载:https://developer.arm.com/downloads/-/gnu-rm 1234567pushd .tar -jxf gcc-arm-none-eabi-6-2017-q2-update-linux.tar.bz2sudo mv gcc-arm-none-eabi-6-2017-q2-update /optexportline="export PATH=/opt/gcc-arm-none-eabi-6-2017-q2-update/bin:\$PATH"if grep -Fxq "$...
uboot 调试
@[toc] 成功debug https://blog.csdn.net/qq_39665253/article/details/145641929 u-boot 配置 https://docs.u-boot.org/en/latest/develop/gdb.html 123CONFIG_CC_OPTIMIZE_FOR_DEBUG=yCONFIG_LTO=n CONFIG_LOG_MAX_LEVEL=9 重新编译.得到u-boot的elf文件(不带后缀就是),可以使用file u-boot确认 ST-LINK debug失败12345678910111213141516171819202122232425262728293031{ "version": "0.2.0", "configurations": [ { "name": "Stlink-Debug", "cwd...







