互动
最近评论
其乐融融弗雷德0D3S
stonewu
哥哥是不是没写完啊, 缺了函数注释啊, 类似的插件有:FileComments。
文档阅读者
stonewu
static uint32_t next_tick = 0; 原: if(HAL_GetTick() >= next_tick) { next_tick = HAL_GetTick() + 100; HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); }//未处理边界条件,溢出导致逻辑非预期。 改动: if(HAL_GetTick()-next_tick <= UINT32_MAX/2 ) { next_tick = HAL_GetTick() + 100; HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); } ***代码分析:以上代码的作用是每隔一段时间翻转IO口。其巧妙之处,在于利用减法配合溢出将原本因为溢出而需要 考虑的【边界判断省去】了。 ***通用处理: static uint32_t next_tick = 0; #define INTERVAL 100 if(HAL_GetTick()-next_tick <= (UINT32_MAX+1-INTERVAL) ) { next_tick = HAL_GetTick() + INTERVAL; HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); } ***【边界判断省去】原理分析: 原式HAL_GetTick()≥next_tick, 移项变形得到HAL_GetTick()-next_tick≥0, *当HAL_GetTick()等于或者略大于next_tick的时候上式无问题,但是当next_tick增加, *HAL_GetTick()小于next_tick时,由于均是uint32_t,不等式左边的值应是恒≥0的,就比原式错得更多了(原式好歹是边界条件时出错,这直接一开始就出错了),但是仔细观察,next_tick+100后大于HAL_GetTick(),那么HAL_GetTick()-next_tick的值是大于2^32-100的, *那么只需要继续变形为HAL_GetTick()-next_tick<=(2^32-100)是不是就可以了呢? 以上不考虑边界条件,考虑边界条件,则分为两种情况: ①next_tick先溢出, next_tick变得很小,而HAL_GetTick()很大,HAL_GetTick()-next_tick则是一个比较大的值,记其值最小情况为UPLIMIT,为了排除此情况,HAL_GetTick()-next_tick应该<或者≤UPLIMIT。 ②HAL_GetTick()、next_tick均溢出, 此情况就同不考虑边界条件时的分析,HAL_GetTick()-next_tick<=(2^32-100)就可以了。 那么最后,HAL_GetTick()-next_tick是应该<还是≤ UINT32_MAX/2,UPLIMIT,(2^32-100)呢?或者说UPLIMIT应该是多少呢? UINT32_MAX/2是怎么来的,不做考究,当INTERVAL的值大于UINT32_MAX/2则HAL_GetTick()-next_tick <= UINT32_MAX/2 会出错; 当INTERVAL取值100,HAL_GetTick()-next_tick应该和(2^32-100)做比较, 即UPLIMIT应取值(2^32-INTERVAL),<或者≤就自己思考吧。 ***温馨提示or思考:以上代码中两次HAL_GetTick()的值可能是不一样的,也就是翻转IO的周期可能不是简单的INTERVAL*2;还有当INTERVAL取值特别大时,代码可能失效,例如HAL_GetTick()-next_tick<=0或者 <=1时,由于时序问题,调用HAL_GetTick()的时机可能很难满足式子成立。 记HAL_GetTick()为A,记next_tick为B,记INTERVAL为c, 当A=A0=B0>=2^32-c时,B1=B0+c-2^32, B=B1、A>A0→A-B=A-B1=A-(B0+c-2^32)>A0-(B0+c-2^32)=2^32-c; 当A=A2=B2<2^32-c时,B3=B2+c, B=B3、B3>A>A2→[A-B]=[A-B3]=[A-(B2+c)]=A-(B2+c)+2^32>A2-(B2+c)+2^32=2^32-c;
标签
寻找感兴趣的领域
Halo1 action0 Git2 printf1 clang-format1 Tags1 网盘1 单片机1 OpenResty2 ecs1 端口转发1 tableview1 rtthread1 font1 1Panel4 iar3 xfce1 nmap1 modbus1 efsm1 vscode2 仓库1 runner2 gitea3 版本控制5 单元测试2 git9 IAP2 MDK2 rsync1 proxy1 submodule1 version1 自启1 宏1 exfat1 checkout1 scanf1 Keil1 truncate1 lvgl4 代码生成1 rt-thread1 coder1 Submodule1 发布管理1 LABEL0 项目管理1 C语言8 格式化字符串2 docker1 软件1 开发工具1 uart1 clean1 matlab1 UI1 linux0 e2label1 fifo1 lvm4 sspi1 xargs1 powershell1
文章
  • 四月 2026
    1 篇
  • 一月 2026
    1 篇
  • 十二月 2025
    2 篇
  • 十一月 2025
    2 篇
  • 十月 2025
    3 篇
  • 九月 2025
    11 篇
  • 三月 2025
    9 篇
  • 二月 2025
    3 篇
  • 十二月 2024
    1 篇
  • 十一月 2024
    4 篇
  • 十月 2024
    4 篇
  • 九月 2024
    6 篇
  • 八月 2024
    5 篇
  • 七月 2024
    3 篇
  • 六月 2024
    2 篇
  • 五月 2024
    5 篇
  • 四月 2024
    15 篇
  • 三月 2024
    15 篇
  • 二月 2024
    13 篇
  • 微信
    微信
  • 支付宝
    支付宝
功能
显示模式
关于
  • gitea
  • 网盘
标签
Halo1 action0 Git2 printf1 clang-format1 Tags1 网盘1 单片机1 OpenResty2 ecs1 端口转发1 tableview1 rtthread1 font1 1Panel4 iar3 xfce1 nmap1 modbus1 efsm1 vscode2 仓库1 runner2 gitea3 版本控制5 单元测试2 git9 IAP2 MDK2 rsync1 proxy1 submodule1 version1 自启1 宏1 exfat1 checkout1 scanf1 Keil1 truncate1 lvgl4 代码生成1 rt-thread1 coder1 Submodule1 发布管理1 LABEL0 项目管理1 C语言8 格式化字符串2 docker1 软件1 开发工具1 uart1 clean1 matlab1 UI1 linux0 e2label1 fifo1 lvm4 sspi1 xargs1 powershell1
播放音乐
蒙蒙plus个人博客
UI开源库lvgl
首页
关于
gitea
网盘
tb店铺
二次元入口
友链
登录
0
cover
原创 嵌入式开发
lvgl

UI开源库lvgl

蒙蒙plus 字数: 865 阅读耗时: 2 分钟 2024/03/04 2024/04/26 博客独享 热度: 62 评论: 0

本文最后更新于 2024-04-26,文章好久没更新了。

logo

lvgl

参考资料

  1. lvgl源码仓库
  2. 官方手册
  3. 百问网

UI 设计软件

  1. SquareLine Studio
  2. GUI Guider

章节目录

  • font字体生成
  • components组件设计
打赏作者
    感谢你赐予我前进的力量
    • 微信
      微信
    • 支付宝
      支付宝
    赞赏者名单
    因为你们的支持让我意识到写文章的价值🙏
使用手机访问这篇文章
lvgl 4
原创 UI开源库lvgl
UI开源库lvgl
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 蒙蒙plus
cover
上一篇
lvgl的font字体生成
cover
下一篇
UsbEAm Hosts Editor [多平台hosts修改]
阅读建议
cover
2025-12-24
MDK Scatter文件配置说明
cover
2025-11-20
scanf_参考笔记
cover
2025-10-29
IAR 链接与段控制,参数表定位
cover
2025-10-04
核心板产品命名规范
cover
2025-09-28
X-Macro 技术详解
cover
2025-09-19
C语言 printf 格式化字符串完整说明文档

评论
匿名评论 隐私政策
你无需删除空行,直接评论以获取最佳展示效果
你好啊!我是
蒙蒙plus的个人博客
了解更多
文章目录
最新评论
头像
哥哥是不是没写完啊, 缺了函数注释啊, 类似的插件有:FileComments。
其乐融融弗雷德0D3S /
头像
static uint32_t next_tick = 0; 原: if(HAL_GetTick() >= next_tick) { next_tick = HAL_GetTick() + 100; HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); }//未处理边界条件,溢出导致逻辑非预期。 改动: if(HAL_GetTick()-next_tick <= UINT32_MAX/2 ) { next_tick = HAL_GetTick() + 100; HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); } ***代码分析:以上代码的作用是每隔一段时间翻转IO口。其巧妙之处,在于利用减法配合溢出将原本因为溢出而需要 考虑的【边界判断省去】了。 ***通用处理: static uint32_t next_tick = 0; #define INTERVAL 100 if(HAL_GetTick()-next_tick <= (UINT32_MAX+1-INTERVAL) ) { next_tick = HAL_GetTick() + INTERVAL; HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); } ***【边界判断省去】原理分析: 原式HAL_GetTick()≥next_tick, 移项变形得到HAL_GetTick()-next_tick≥0, *当HAL_GetTick()等于或者略大于next_tick的时候上式无问题,但是当next_tick增加, *HAL_GetTick()小于next_tick时,由于均是uint32_t,不等式左边的值应是恒≥0的,就比原式错得更多了(原式好歹是边界条件时出错,这直接一开始就出错了),但是仔细观察,next_tick+100后大于HAL_GetTick(),那么HAL_GetTick()-next_tick的值是大于2^32-100的, *那么只需要继续变形为HAL_GetTick()-next_tick<=(2^32-100)是不是就可以了呢? 以上不考虑边界条件,考虑边界条件,则分为两种情况: ①next_tick先溢出, next_tick变得很小,而HAL_GetTick()很大,HAL_GetTick()-next_tick则是一个比较大的值,记其值最小情况为UPLIMIT,为了排除此情况,HAL_GetTick()-next_tick应该<或者≤UPLIMIT。 ②HAL_GetTick()、next_tick均溢出, 此情况就同不考虑边界条件时的分析,HAL_GetTick()-next_tick<=(2^32-100)就可以了。 那么最后,HAL_GetTick()-next_tick是应该<还是≤ UINT32_MAX/2,UPLIMIT,(2^32-100)呢?或者说UPLIMIT应该是多少呢? UINT32_MAX/2是怎么来的,不做考究,当INTERVAL的值大于UINT32_MAX/2则HAL_GetTick()-next_tick <= UINT32_MAX/2 会出错; 当INTERVAL取值100,HAL_GetTick()-next_tick应该和(2^32-100)做比较, 即UPLIMIT应取值(2^32-INTERVAL),<或者≤就自己思考吧。 ***温馨提示or思考:以上代码中两次HAL_GetTick()的值可能是不一样的,也就是翻转IO的周期可能不是简单的INTERVAL*2;还有当INTERVAL取值特别大时,代码可能失效,例如HAL_GetTick()-next_tick<=0或者 <=1时,由于时序问题,调用HAL_GetTick()的时机可能很难满足式子成立。 记HAL_GetTick()为A,记next_tick为B,记INTERVAL为c, 当A=A0=B0>=2^32-c时,B1=B0+c-2^32, B=B1、A>A0→A-B=A-B1=A-(B0+c-2^32)>A0-(B0+c-2^32)=2^32-c; 当A=A2=B2<2^32-c时,B3=B2+c, B=B3、B3>A>A2→[A-B]=[A-B3]=[A-(B2+c)]=A-(B2+c)+2^32>A2-(B2+c)+2^32=2^32-c;
文档阅读者 /
最近发布
Git 清理未跟踪文件
Git 清理未跟踪文件 2026-04-26 21:42:59
批量迁移子模块到本仓库
批量迁移子模块到本仓库 2026-01-12 09:40:16
MDK Scatter文件配置说明
MDK Scatter文件配置说明 2025-12-24 13:36:38
Git多工作区使用指南
Git多工作区使用指南 2025-12-10 10:29:26
分类
  • 开发工具 0
  • 新闻资讯 2
  • 嵌入式开发 32
  • 硬件设计 0
  • rt-thread 5
  • 开源仓库 4
  • GUI 2
  • 编程设计 7
  • openharmony 1
  • 网站运维 19
  • linux 6
  • git 18
  • 软件分享 7
©2024 - 2026 By 蒙蒙plus的个人博客

博客框架为halo2.x

©2024 - 2026 By 蒙蒙plus的个人博客
订阅 主题 关于 ICP备2024061630号 豫公网安备41160302000113号
复制选中文本
粘贴文本
引用到评论
新窗口打开
复制链接地址
复制此图片
下载此图片
新窗口打开图片
站内搜索
百度搜索
播放音乐
切换到上一首
切换到下一首
查看所有歌曲
复制歌名
随便逛逛 博客分类 文章标签
复制地址
关闭热评
深色模式
轉為繁體