LVGL学习(定义)和FreeRTOS小结(任务,信号量,队列)
提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录FreeRTOSLVGL总结FreeRTOSPart1:FreeRTOSFreeRTOS学习小结FreeRTOS内核对象1.任务2.信号量二值信号量互斥锁3.队列消息队列1.1任务任务是一个永不返回的函数其任务状态有运行态就绪态阻塞态挂起态每个任务有独立栈空间。运行态正在占用CPU就绪态准备好了可以运行但是CPU被更高优先级任务占用阻塞态任务等待不占用CPU挂起态任务暂停优先级FreeRTOS中任务优先级数越大优先级越高NVIC一般是优先级数越小优先级越高一般对实时性要求较高的任务应尽量提高优先级任务常用函数vTaskDelay(pdMS_TO_TICKS()); 可使任务进入阻塞态进行其他任务不一直占着CPUvTaskDelete();删除任务vTaskSuspend();挂起任务vTaskResume();恢复被挂起任务xtaskcreate();创建任务vTaskStartScheduler()启动调度器在正常的执行任务流程中首先要创建任务填写里面的形参要确保堆的空间是足够的不然会发送栈溢出导致任务无法执行然后进行启动调度器2.信号量事件首先是二值信号量它主要是通过事件触发不传递数据比如说外部中断按键通过按键按下告诉按键按下这个事件告知程序然后程序回答知道了在执行相应的任务。其次是互斥锁多模块同用一个通信协议为了避免竞争抢夺资源通过互斥锁上锁解锁来保护共享资源,并且中断中不能用互斥锁和互斥锁带有优先级继承特点二值信号量的使用1.一般使用需要先在文件中声明一个信号量句柄SemaphoreHandle_t xSemaphore 句柄名字可以根据逻辑编写没有太大要求2.在调度器前创建二值信号量xSemaphorexSemaphoreCreateBinary();事件发生后释放信号量xSemaphoreGive();然后再要执行任务逻辑前进行取信号xSemaphoreTake();在中断中不能使用上面的信号量函数使用下面的xSemaphoreGiveFromISR()释放中断中不能调用xSemaphoreTakeFromISR();并且中断中要快进快出防止丢失其他中断和防止实时性变差避免过久占用CPU互斥锁中的函数定义xSemaphoreTake()为上锁xSemaphoreGive()为解锁信号量的函数xSemaphoreCreate();xSemaphoreGive();xSemaphoreGiveFromISR();xSemaphoreTake();xSemaphoreTakeFromISR();XsemaphoreCreateMutex();队列数据队列是FreeRTOS用于任务与任务之间中断与任务之间传递数据的FIFO缓冲区特点1.FIFO先进先出先放进去的数据先取出来2.可以存放任意类型数据3.有长度限制队列的使用首先要创建队列的句柄 QueueHandle_t xQueue创建队列XQueuexQueueCreate();任务中发送数据xQueueSend();任务中接收数据xQueueReceive();中断里面发送数据要用xQueueSendFromISR();中断中不要有延时要快进快出队列的常用函数xQueueCreate();队列创建xQueueSend();队列数据传输xQueueSendFromISR();中断队列数据传输xQueueReceive();队列数据接收xQueueReceiveFromISR();中断队列数据接收vQueueDelete();删除队列LVGLPart2:LVGL主要是学习了LVGL的移植以及模拟器的使用觉得LVGL基础的东西还是比较容易学习的LVGL是一个嵌入式的图形库是目前嵌入式经常使用的GUI库它的重要点在对象与父子树LVGL所有界面元素都叫对象采用树形父子结构运用是首先要创建一个父级对象然后在此父级对象的基础上进行子级对象的创建和属性的设置父子关系特点1.子级对象坐标通常是在父级对象左上角2.移动父级对象其子级对象也跟着一起移动3.子级对象只能在父级对象的范围内创建不会超出父级对象的范围voidui_Init(){//获取整个硬件屏幕lv_obj_t*scrlv_screen_active();//创建一个小屏幕lv_obj_t*objlv_obj_create(scr);//创建一个按钮lv_obj_t*buttonlv_button_create(obj);//创建一个滑块lv_obj_t*Sliderlv_slider_create(scr);//设置按钮的位置和大小lv_obj_set_pos(button,35,35);lv_obj_set_size(button,30,30);//设置一个滑块的位置和范围//改变的方式1//lv_slider_set_value(Slider,20,LV_ANIM_ON);//lv_slider_set_range(Slider,20,80);//改变的方式2lv_obj_set_pos(Slider,20,10);lv_obj_set_size(Slider,50,10);}这是此模拟器的现象代码主要是设置了一个父级屏幕然后还有三个子级子级分别是子级屏按钮滑块。代码练习通过按键传递数据在串口打印一些文字与执行的活动#includestm32f4xx_hal.h#includemain.h#includestring.h#includeKey.h#includeFreeRTOS.h#includesemphr.h#includequeue.h#includeDebug.h#includePractice.h#includeDebug.huint8_tnum;staticvoidKey1ClickCallBack(void);externUART_HandleTypeDef huart1;externQueueHandle_t xQueueKey;KeyClickHandleTypedef hkey1;voidKey1_Init(){hkey1.GPIO_PortKey1_GPIO_Port;hkey1.GPIO_PinKey1_Pin;hkey1.KeyClickCallBackKey1ClickCallBack;Key_Init(hkey1);}voidKey1_Trigger(){Key_Trigger(hkey1);}voidKey1ClickCallBack(void){num1;xQueueSend(xQueueKey,num,portMAX_DELAY);}在这里插入代码片KEY2同理#includestm32f4xx_hal.h#includemain.h#includeFreeRTOSConfig.h#includeFreeRTOS.h#includequeue.h#includesemphr.h#includetask.h#includeKey.h#includeDebug.hQueueHandle_t xQueueKey;voidPractice_Init(){xQueueKeyxQueueCreate(10,sizeof(uint8_t));}voidvQueueTask(void*pvParameters){uint8_tnum;for(;;){xQueueReceive(xQueueKey,num,portMAX_DELAY);if(num1){PrintString(骑单车喽);}elseif(num2){PrintString(跳舞);}for(inti0;i10;i){PrintString(.);vTaskDelay(pdMS_TO_TICKS(100));}}}总结在lvgl和FreeRTOS的学习路上碰见了很多bug曲折包括了移植栈溢出优先级变量类型不一样导致任务无法执行以及任务卡死导致整个程序无法运行的问题都通过时间的积淀一一解决还要很长的路要走此文是我学习中碰见的一些点和敲代码片段的一些反映也是我的一些学习经验道阻且长行则将至。

相关新闻

Milvus 代码库业务流程分析

Milvus 代码库业务流程分析

2026/9/24 8:31:51 阅读更多 →
集成隔离电源收发器辐射超标?PCB拼接电容设计实战

集成隔离电源收发器辐射超标?PCB拼接电容设计实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 8:31:51 阅读更多 →
STM32定时器Encoder模式驱动EC11:从软件轮询到硬件正交解码的工程实战

STM32定时器Encoder模式驱动EC11:从软件轮询到硬件正交解码的工程实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 8:31:51 阅读更多 →

最新新闻

Sliver Pivots 完整实战指南:用 C2 流量链式代理穿越受限网络(TCP / Named Pipe)

Sliver Pivots 完整实战指南:用 C2 流量链式代理穿越受限网络(TCP / Named Pipe)

网络安全 【免费下载链接】sliver Adversary Emulation Framework 项目地址: https://gitcode.com/gh_mirrors/sl/sliver 点击查看 免费下载 本指南围绕 Sliver 的 Pivots 功能展开,讲解如何基于已有会话创建 pivot listener,再生成通过该 l…

2026/9/24 9:03:14 阅读更多 →
NXP LPC18Sxx解析:硬件安全与实时控制兼备的工业级MCU

NXP LPC18Sxx解析:硬件安全与实时控制兼备的工业级MCU

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 9:03:14 阅读更多 →
WMS多目标优化与调参实践:PSO算法结合DeepSeek的物流仓储智能调度指南

WMS多目标优化与调参实践:PSO算法结合DeepSeek的物流仓储智能调度指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 9:03:14 阅读更多 →
示波器实测RS485差分信号:从波形定位Modbus物理层故障

示波器实测RS485差分信号:从波形定位Modbus物理层故障

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 9:03:14 阅读更多 →
WebSocket实战:借HTTP握手实现双向通信,跨域与报错排查指南

WebSocket实战:借HTTP握手实现双向通信,跨域与报错排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 9:03:14 阅读更多 →
程序员转型AI解决方案工程师的实战路径

程序员转型AI解决方案工程师的实战路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 9:02:13 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →