- 博客(18)
- 资源 (10)
- 收藏
- 关注
原创 OpenHarmony Liteos-m 内核内存管理机制探究
OpenHarmony Liteos-m内核采用优化后的TLSF内存管理算法,分为静态和动态内存管理。静态内存管理基于预定义大小的内存块,适合固定需求场景;动态管理则采用高效的分级空闲链表策略,将内存块按大小分为223个区间,通过位图标记快速定位合适空闲块。算法支持内存分割与合并,减少碎片,并具备多段非连续内存整合能力。初始化时创建包含池头、空闲节点和尾节点的内存池,申请时优先匹配最接近需求的空闲块。该设计在性能与碎片率间取得平衡,为嵌入式系统提供了高效的内存管理方案。
2025-07-04 13:38:41
839
原创 探究STM32L4在不同时钟配置下的功耗表现
STM32L4系列MCU通过动态电压/频率调节和多种低功耗模式实现了出色的能效表现。测试显示,在80MHz Range1模式下运行电流达11.8mA,而降至4MHz Range2模式时仅需0.59mA。该芯片提供7种低功耗模式,包含FlexPowerControl等技术,支持1.71V低电压工作,特别适合电池供电场景。测试采用OpenHarmony系统,验证了降低频率可显著节省功耗,Range2模式比Range1效率提升15%,专用低功耗运行模式效率更高。开发低功耗应用时,合理选择工作频率和电压范围是优化能
2025-06-30 18:41:42
1007
原创 OpenHarmony Liteos-m 内核低功耗调试
要启用功耗管理功能,需要使能对应的宏,一般定义在target_config.h中。除此之外,还有两个宏跟功耗管理模块息息相关。#else#endif我对这个宏的理解:源码中注释的解释是:在空闲任务中使能内核功耗管理组件。但是其实无论这个宏使能与否,OsPmNormalSleep这个接口都是在空闲任务中调用。不一样的是,这个宏使能后,将会调用完整的功耗管理机制(后面会说)。
2025-06-04 18:59:04
998
原创 STM32中的LPTIM使用说明
这个函数实现的功能是,在超时时间到达前,如果发生触发事件(例程中是PB6引脚触发),那么定时器清零重新计数,如果没有,则继续计数直到Period周期(其实就是ARR寄存器值)。计数寄存器的值(CNT)从0开始计数,当CNT的值等于CMP时,可触发一些操作(波形输出或者中断,取决于你的配置),此时CNT继续计数,当CNT的值等于ARR时,触发一些操作(波形输出或者中断,取决于你的配置)并且CNT归零。代码不多,也不复杂,由于手上的板子和官方开发板定义不同,所以自己用CubeMX生成了代码。
2025-05-14 18:48:31
648
原创 printf中的%*.*s使用问题
今天在项目中看到同事在printf中使用了%.*s,后面跟了两个参数。原以为是bug,没想到查了资料确实有这种用法。这种后面跟3个参数,第一个指定总宽度,第二个指定字符串输出长度,第三个是字符串指针。这种类似%5s这种用法,可以指定输出宽度,但是实测有问题,应该是跟我使用环境有关。指定字符串的输出长度。后面跟两个参数,第一个是字符串输出长度,第二个是字符串指针。以下是实测,测试环境MDK5 + STM32。
2025-04-15 16:26:34
260
原创 28BYJ-48步进电机的步距角为什么是5.625度 ?
我们先只看一层线圈的情况,例如只考虑上层线圈,转子16个磁极对应定子16的磁极。其实下层跟上层是一样的,只不过爪子的排列刚好跟上层交错一个间距,也就是22.5/2=11.25°。(其实是4个,上层两个,下层两个。这4个线圈共用一个抽头,每层的两个线圈绕线相反,所以产生的磁极也是相反的)这里借用一下视频的截图。首先,28BYJ-48 是个减速电机,里面集成了一个64:1的减速箱。这张图本身用于展示步进电机的原理是没有错的,但是这并不是28byj-48步进电机的构造图,用这幅图更是算不出5.625的步距角。
2025-01-11 21:45:53
759
原创 python中的格式化字符串
其中{}内冒号(:)的前面指定占位符,可以是数字,可以是字符,也可以省略(连后面的:一起省略)。但是占位符不能混用,要么都用数字,要么都用字符,要么都省略。用数字的话,可以指定顺序。用字符的话,后面必须指定字符的值。冒号后面指定显示格式,这个可以参考上面的链接。我的理解是,这个方式同第二种方式大体相同,但写法更简洁,并且最重要的是支持表达式。第一种方式,是使用%操作符,很类似C语言中的转义字符。另外,同第二种方式一样,它也支持一些可选的格式控制字符。第二种方式,是使用字符串对象的format()方法。
2024-06-17 19:27:30
378
原创 python中反向索引的问题
我原本认为,start必须小于end,然后在start到end的区间里,按照step步长取值,step为正,就是从start到end方向取值,step为负,就是从end到start方向取值。取数永远是从start到end,start是可以大于end的,但是这个时候必须是倒序,所以step必须是负值,如果step是正,则返回值是空的。但是,n[:-3:-1]结果应该是什么,我原本的理解是,从头取到第-3个数(不包含),倒序排列,应该是[6,5,4,3,2,1,0]. 但是,实际的结果是[9,8].
2024-06-13 18:21:18
669
1
原创 M0内核单片机中断向量重映射
前段时间,做了个项目,使用了华大HC32L110,一开始没什么,一切顺利。但是做OTA在线升级时,发现了一些问题。不同于M3内核的MCU,M0内核没有中断向量的寄存器(华大是M0+内核,有些网友说M0+是有这个寄存器的,这个我暂时没验证,稍后找资料看看),所以无法重定向中断向量。这就有点麻烦了,岂不是做不了固件升级了?赶紧在网上搜索解决方案,结果发现了ST的STM32F0系列的解决方法,简单来说就是利用地址重映射的功能,让应用程序段的固件能找到正确的中断向量。所以赶紧试一下,what !华大M0+MCU
2022-05-19 10:18:32
2115
5
原创 在485接口上实现SDI-12协议,你调通了吗?
前一段时间调试了一个雷达水位计,输出接口有RS485和SDI-12,协议没有modbus,只有SDI-12.因为我们的设备只有RS485接口,所以只能选择使用485连接。SDI-12的软件协议也比较简单,写完以后与雷达水位计联调却发现始终不通。纠结一番后,查阅了水位计厂家的资料,最后问题终于解决。期间我也在网上查询过,发现很多网友也有同样的问题,协议没问题,串口设置也没有问题,但是就是不通,为了避免更多的人再掉到这个坑里,现将我的经验分享给大家。首先简单介绍下SDI-12协议。这个协议不同于RS
2022-01-15 14:28:02
6592
1
原创 最大功率点跟踪MPPT
太阳能电池最大功率点跟踪MPPT(Maximum Power Point Tracking)技术能够保证在负载或环境光照强度变化时,光伏电池一直保持最大输出功率,以最大化太阳能利用率。从太阳能板的I/V伏安特性曲线(绿线)中可以看出,曲线与纵轴的交点为太阳能板的短路电流ISC,与横轴的交点为开路电压VOC,太阳能板的ISC和VOC均随着光照强度的增加而上升,其输出电流IPANEL随着输出电压VPANEL经过一个先缓后急的逐渐下降过程。当我们把电压与电流相乘,以输出电压为自变量,可以得到太阳能板的P/V伏
2020-12-11 14:12:44
12595
原创 小程序data-*自定义变量名注意要用小写
今日调试小程序时,被data-*这种自定义变量卡了半天,最后发现自定义名称不管你用没用大写,最后在参数传入的时候都是小写。列如:我定义了一个名为inValue的变量,其中V是大写字母。但是JS中直接调用的话,就会提示undefine。控制台打印,发现传入的变量名全部变成小写:所以为了防止出错,最好在页面和js文件中,统一使用小写的变量名。...
2020-11-11 00:10:43
599
转载 模板字符串(反引号字符串)的使用说明
模板字面量 是允许嵌入表达式的字符串字面量。你可以使用多行字符串和字符串插值功能。它们在ES2015规范的先前版本中被称为“模板字符串”。语法`string text``string text line 1 string text line 2``string text ${expression} string text`tag `string text ${expression} string text`描述模板字符串使用反引号(` `) 来代替普通字符串中的用双引号和.
2020-11-06 13:49:51
1948
转载 微信小程序setData的使用
1、设置数据可以设置一个或同时多个data数据 this.setData({ test:'hello world!', info:'data',})console.log(this.data.test) // 结果 =》 “hello world!”console.log(this.data.info) // 结果 =》“data”2、用setData() 设置/修改 对象或数组 里某个属性的值比如修改 下面medias 对象里 id的值...
2020-11-06 11:14:24
1675
转载 微信小程序低功耗蓝牙能力
在无线通信领域,蓝牙是最基础又常用的能力。蓝牙组网十分简单,两设备间做个配对就可以建立起连接,其通信距离理论值为10米至100米以内,是近距离通信应用场景的首选。今天我们想跟大家分享小程序连接蓝牙的能力。目前蓝牙最为普遍的两种规格为蓝牙基础率/增强数据率 (BR/EDR) 和低功耗 (LE) 蓝牙。蓝牙基础率/增强数据率 (BR/EDR) 是经典的蓝牙协议,常用在对数据传输带宽有一定要求的场景上,比如需要传输音频数据的蓝牙音箱等;低功耗 (LE) 蓝牙是从蓝牙4.0...
2020-11-03 10:14:16
1178
转载 微信小程序UI组件库合集
第一款:官方WeUI组件库,地址 https://developers.weixin.qq.com/miniprogram/dev/extended/weui/预览码:第二款:ColorUI:地址 https://github.com/weilanwl/ColorUI预览码: 第三款:vantUI(又名:ZanUI):地址 https://youzan.github.io/vant-weapp/#/intro预览码:第四款:MinUI: 地址...
2020-10-29 17:40:04
965
原创 微信小程序之画布的旋转,你搞懂了吗?
最近在学习微信小程序的时候,学习到画布时,旋转功能把我有点搞糊涂了。因为我一直以为,旋转的是画布,但其实,旋转的坐标系。坐标系方向为:画布向右为x,向左为-x,向上为-y,向下为y程序示例如下: ctx.translate(width/2,height/2) //重新定位坐标原点为画布中心 ctx.rotate( 30 / 180 * Math.PI); //画布旋转30° ctx.beginPath(); //绘制线条1 ctx.moveT
2020-10-22 11:03:56
1775
原创 微信小程序变量赋值失败
本人一直以来都是C程序员,最近有需求,需要做个微信小程序,其中有不少坎坷。C语言编程和高级语言相比,思维逻辑还是有些不一样的。例如今天遇到的问题,我在onload函数中给一个变量赋值,紧接着要使用,但发现变量依旧是空的,代码如下: onLoad: function (options) { news.limit(5).get({ success:res=>{ this.setData({newsList:res.data}) } })
2020-10-20 17:36:28
3485
1
M0内核MCU中断向量重映射【完整boot程序】
2022-05-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人