- 博客(25)
- 收藏
- 关注
原创 LVGL图像导入和解码
经转换器生成的C语言数组,适用于页面中不常改变的固定图像。存储系统中的外部图像,比较灵活,可以通过插卡或从网络中获取,但需要配置相应的驱动和解码器,解码过程也需要占用时间和内存。SYMBOL类型的文本,和label组件类似。其中第三种比较容易实现,第一种仅需经过官方工具生成二进制数据,再在代码中引用即可。本文重点说明第二种情况即外部图像的使用,并以PNG类型图片为例介绍LVGL图像的解码和显示。
2025-05-10 21:54:07
1046
原创 LVGL源码学习之渲染、更新过程(3)---绘制和刷写
终于研究完了整个流程,原理倒是不难懂,但代码总感觉不是很漂亮,特别多冗余的代码(为了健壮性考虑,在后面的版本,多少都精简了),比如经常要取无效区域的当前对象坐标区域的交集,这种操作几乎每一层函数调用都在发生,看多了容易理得很乱。全刷新模式下,使用大缓冲(或者显示器大小的缓冲),渲染速度较慢,反而使用小缓冲,速度更快,代价是容易花屏,但整体速度都不如普通模式;直写模式下,必须使用显示器大小缓冲,否则会报错,速度上略慢于普通模式,但差距很小;
2025-05-09 19:01:43
555
原创 μC/OS-Ⅱ源码学习(6)---事件标志组
事件标志组(Event flag group)/* 事件标志组类型 *//* 等待链表,里面的每一个节点都记录了相关任务等待事件标志位的信息 *//* 当前存在的标志 */#endif与其他事件不同,事件标志组不共享OS_EVENT结构,而是有自己特殊的结构。其中OS_FLAGS#endif#endif#endif链表用来记录等待该事件标志组的所有任务及其需求,通常通常用一个节点对象/* 等待列表的下一个节点 *//* 等待列表的前一个节点 */
2024-12-16 12:13:50
1012
原创 μC/OS-Ⅱ源码学习(5)---消息队列
本文进一步解析事件模型中,消息队列类型的函数源码。先回顾一下之前的通用事件控制块类型消息队列有自己的专属结构,该结构通过指针挂载在中。
2024-12-13 17:07:06
896
原创 μC/OS-Ⅱ源码学习(4)---信号量
这一操作不是一定能成功的,只有当当前计数器值大于0或没有任务等待该信号量时,才能成功设置(这也是合理的,如果有任务正在苦苦等待该信号量,手动设置一个新值会让该任务立即就绪,从而影响了系统的执行时序。这里只有事件对任务的单向解绑定,没有任务对事件的解绑,和上面的双向绑定有出入,同时也没有后面优先级就绪表的操作。信号量创建后一般是没必要删除的,μC/OSⅡ默认也不会开启删除功能,但为了逻辑的连贯性,这里也分析一下删除的源码。,发生在任务开始等待事件时,将任务等待的事件控制块记录在TCB内,并将。
2024-12-13 15:48:34
977
原创 μC/OS-Ⅱ源码学习(1)---多任务系统的实现(上)
在之前的文章中通过多个模型来建立对多任务的概念,本文将会从源码角度解析模型的具体实现。μC/OS-Ⅱ中的多任务。
2024-12-03 16:59:49
1083
原创 .H头文件开头的那些宏定义都是啥意思
else#endif这一种写法对于第一次遇到的同学来说是最奇怪的,改写法本质上也是为了避免重复定义,但与第一种写法又不太一样。通常来说,我们仅在源文件中定义全局变量,然后在某个头文件中用extern继承该变量,其它源文件要使用该全局变量就得引用该头文件。但如果我想让源文件足够整洁,只在头文件中定义全局变量(注意C语言虽然不建议该写法,但编译器并不禁止),就可以用这种写法,让不同的源文件在引用该头文件时具有不同的效果。如下图:在源文件my_App.c中定义了宏OS_Globals于是“
2024-11-28 17:21:56
1073
原创 详解过零点检测原理
实际的采样数据是离散的,我们以一个上升沿为例,假设采样频率为5000Hz,则50Hz交流电一个周期的采样点数就是100个。有了过零点边缘信息,就可以用这些数据进行周期、频率及更多的计算了。即过零点处正弦波斜率的变化率为0,可以认为在该处附近用直线拟合是代价最低的。从ADC采样的数据中分析出信号特征,是后续操作的前提。对于周期信号,过零点检测是这些分析方法中最简单也是效率最高的一种,使用过零点检测技术,可以轻松获取周期的端点,并为后续各种指标的计算提供关键信息。在这种情况下,信号周期的边界就模糊起来,
2024-11-14 10:46:51
2182
原创 采样交流电的功率计算
①无功功率的概念可以类比于用吸管喝水,我们用吸管的时候会发现总有一部分约等于吸管容量的水吸不上来,那部分就有些类似于无功容量,那部分水的作用是填满吸管以便于液体在容器和口腔中交换,喝水之前需要额外用力吸一下就是无功功率,最后这一部分液体会返回到容器中,你虽然没喝到,但是却对这部分做了功;对于电网中的各种用电设备,都可以用功率来形容它们的能量消耗情况,功率越大,表示单位时间所需能量越大,如一个额定功率2.2kVA的吹风筒,以220V的家庭用电,需要有效值为10A的电流才能驱动。对于无功功率,由于有功。
2024-11-12 17:41:36
1006
原创 采样交流电的有效值
可以看到,有效值的计算结果其实就是均方根值(Root Mean Square Value),二者在计算方式上是相通的。但二者的出发点不同,有效值是为了衡量交变信号的大小而定义的,而均方根更多是指一种算法,与使用场景无关。有效值(Virtual Value)是衡量交变电信号能量水平的一种方式,由于交流电通常周期信号,且均值为0,使用平均值无法计算出信号的有效大小,因此引入有效值的方式进行测量。先介绍有效值的背景:有效值是以电热效应为依据进行定义的,假设一直流电流大小为。,则该交流电的有效值等于。
2024-11-12 17:33:15
1299
原创 锁相环的核心:鉴相器
本文讨论的锁相环仅考虑软件算法,不涉及硬件部分。如下图,锁相环是对受控信号进行调控使其和基准信号同频同相,是一个经典的反馈控制算法。其中最重要的部分是鉴相器(相位频率比较器),鉴相器可以通过对比基准信号和受控信号的特征得到当前的误差,后续再由PID或简单滤波将误差转换成输出量对受控信号进行调整。所以问题的关键便在于鉴相器如何得到误差。
2024-11-04 12:15:32
3767
原创 算术平均滤波背后的原理
上一篇文章里,写到一阶滞后滤波器的形式:在正式引入算术平均滤波器之前,有必要先谈一谈下面这种形式:粗略一看,和一阶滞后滤波器很像,这也是一种低通滤波器,输出仅与当前以及上一次的输入有关,并对两次输入做了加权。进行初步仿真,将a=0.1和a=0.9带入后,得到两幅频率响应特性图:a=0.1时的频率响应曲线a=0.9时的频率响应曲线。
2024-10-30 16:26:56
881
原创 USB CustomHID设备驱动从USB IP迁移至OTG IP(标准库)
在发现问题所在时便就有个疑惑:既然驱动都用错了,应该不可能能连接上,而不是先连接上,但会偶发错误!后面在调试的过程中,我反复地对比USB驱动和OTG驱动在运行过程中的数据,发现二者所用的数据结构基本类似,相关寄存器也能对应的上,可以说这两套驱动本是同源(哭笑),但内核不一样终究会出问题。本文虽然写了不少,但内容只是个大概,没有针对每个文件进行细说,这里边还是得自己边调试边照着文档一步步来。
2023-07-19 23:24:55
838
原创 μC/OS-Ⅱ中的多任务
在学习单片机上使用uscos系统时,思考的一些问题和总结,自己也画了一些图来描述这些想法。本文主要分析问题和模型结构,不会过多涉及具体代码。
2023-04-15 21:03:56
550
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人