自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 Linux 下 C/C++ 程序编译的过程

本文将介绍如何将 C/C++ 语言编写的程序转换成为处理器能够执行的二进制代码的过程,包括四个步骤:预处理()编译()汇编()链接(在此之前,首先来看一下 GCC 工具链。

2024-09-08 15:52:17 796

原创 FreeRTOS 队列 Queue 源码解析

在一文中,我简单地叙述了FreeRTOS中队列的工作机制和基本使用。这一节我将依据的源码深入地去探究队列是如何实现的。学好队列对我们后续学习信号量等知识的时候有很大的帮助。

2024-09-06 10:03:33 4502 23

原创 ELF 文件格式

ELF 是一种常用的可执行文件和可链接库格式。它是一种通用的二进制文件格式,用于在 Unix 和类 Unix 系统上进行可执行文件和库的存储和传输。

2024-09-05 20:50:54 5017 11

原创 LVGL 控件之复选框(lv_checkbox)和下拉列表(lv_dropdown)

下拉列表的图标箭头默认是向下的,如果用户修改了列表的展开方向,此时的箭头方向和展开方向就对应不上了。在上图中, 当用户选中第一个选项,其文本内容(a)将更新到列表头部,如果用户需要设置列表头部的文本为固定内容,可以调用。上述源码中,第一个函数用于获取选中的选项索引,第二个函数用于获取选中的选项文本,并将其保存到指定的 buf 中。上述的函数只会添加一个选项,其形参 pos 表示添加的位置,注意:0 表示列表最上面的位置,以此向下类推。,前者设置的文本是保存在动态分配的内存中的,而后者设置的是静态的文本。

2024-09-05 08:54:59 5752 21

原创 LVGL 控件之图表部件(lv_chart)

前面提过,图表部件默认只支持 10 个数据点,如果我们具有11 个数据,那么图表先显示前 10 个数据,而第 11 个数据会将图表的 10 个数据逐一往左移位,最后把第一个数据点的数值去除了。前面我们讲解到图表部件只支持 10 个数据点,如果我们使用这个函数初始化数据点,则这些数据点的数值都是一样的。此函数主要修改某个数据点的数值,前面我们讲到图表部件默认只支持 10 数据点,这些数据点是从 0 开始自增。添加到当前图表中,该函数具有八个形参,这些形参主要设置刻度线和刻度线的标签。图表默认的垂直范围为。

2024-09-02 09:39:49 8386 41

原创 单片机内存区域划分

/ val1存放在.data段// 初始化的全局变量存放在.data段// 未初始化的全局变量存放在.bss段// val4存放在.rodata(只读数据段)unsigned char Demo(unsigned int num) // num 存放在栈区// var存放在栈区,"123456"存放在常量区// num1存放在栈区// num2存放在.data段// num3存放在栈区void *p;// p存放在堆区free(p);return 1;

2024-09-01 18:09:25 11989 25

原创 LVGL 控件之日历(lv_calendar)

在默认的情况下,日历都是以英文的形式展示(Su、Mo、Tu、We、Th、Fr 和 Sa),如果用户想设置成中文的日名,可调用。在默认的情况下,当用户创建出一个日历部件,该部件的当前日期为 2020 年1 月1 号,如果用户需要设置日期,则可以调用。如果我们仅仅是设置了当前日期,日期部件并不会自动显示该日期,所以我们必须手动跳转当前日期对应的月份,相关的函数为。可以看到,刚才创建的日历除了能看当前月的信息外什么都干不了,所以要加上日历头方便我们操作。:如果单击日期,则发送该事件,通过调用函数。

2024-09-01 10:40:39 11100 19

原创 LVGL 控件之矩阵按钮(lv_buttonmatrix)

按钮矩阵部件中的每个按钮都可以设置文本,如果用户想设置这些按钮文本,则需要定义一个字符串数组(指针),并在该数组中传入所需的文本内容,最后通过。在默认情况下,按钮矩阵中的按钮文本都是黑色的,如果用户需要设置文本为其他的颜色,则必须先调用。在默认情况下,按钮矩阵每一行按钮的宽度都是自动计算的,如果用户想改变按钮的宽度,可以调用。,在设置完文本颜色之后,我们还需要为按钮添加文本重着色的属性,其相关的枚举为。值得注意的是,在按钮矩阵部件中,按钮只能设置相对宽度。函数,为按钮添加文本重着色的属性。

2024-09-01 09:37:14 11157 5

原创 LVGL 控件之按钮(lv_button)

按钮部件(lv_btn)仅有一个组成部分:主体背景,示意图如下:与LVGL 控件之基础对象(lv_obj)) 相比,按钮没有新功能。它们可用于语义目的,并且默认设置略有不同。不可滚动添加到默认组默认高度和宽度设置为button 对象通过创建。因此,这里不再过多叙述 button 的一些东西,这里主要讲一下样式的设置。

2024-08-31 10:14:56 13269 16

原创 LVGL 控件之进度条(lv_bar)

进度条对象(lv_bar)有一个背景和一个指示器。指示器的宽度根据进度条的当前值自动设置。如果设置进度条的宽度小于其高度,就可以创建出垂直摆放的进度条。。不仅可以设置结束,还可以设置进度条的起始值,从而改变指标的起始位置。背景():用于显示范围值;指示器():用于显示当前值。

2024-08-31 09:06:47 12463 3

原创 LVGL 控件之圆弧(lv_arc)

前景弧的角度范围不能超过背景弧的角度范围,否则将会出现显示异常,该异常会在下次更新布局时被修正。圆弧部件旋转是指将整个部件沿顺时针方向旋转某个角度,注意:旋转的角度为相对值(增量),它的范围是。默认情况下,圆弧部件是沿顺时针方向绘制的,如果用户需要修改绘制的方向,可以调用。当圆弧的旋钮被滑动时,前景弧将根据设定的变化率来绘制。度,旋转中心为圆弧的中心。例:当我们拖动按钮或圆弧时,中间的数值也会实时变化。来设置圆弧的值,若用触摸设置,可能会出现显示异常。指的是当前前景弧所指示的值,而。

2024-08-30 15:25:09 13947 17

原创 LVGL 控件之基础对象(lv_obj)

管理其他部件的基本属性;作为背景装饰;辅助布局;界面切换。坐标父对象基于父对象的后代包含样式诸如ClickableScrollable等属性。在面向对象的思想中,基础对象就是LVGL 中所有其他对象都继承自的基类。基础对象的功能可以与其他控件一起使用。例如基础对象可以直接用作一个简单的控件:它只不过是一个矩形。在 HTML 术语中,将其视为 。

2024-08-30 11:04:08 14090 1

原创 FreeRTOS 列表 List 源码解析

FreeRTOS 使用的链表结构是环形的双向链表,而关于链表节点的数据结构都在list.h中定义。

2024-08-29 14:35:11 15281 22

原创 蓝牙BLE协议讲解

蓝牙技术起源于爱立信在 1994 年提出的方案,旨在解决移动电话和其他配件之间进行低功耗、低成本的无线通信连接的方法。蓝牙是一种近距离无线通信技术,运行在 2.4GHz 免费频段,目前已大量应用于各种移动终端,物联网,健康医疗,智能家居等行业。上一小节提到,蓝牙 4.0 以后的版本分为两种模式,单模蓝牙和双模蓝牙。单模蓝牙,即低功耗蓝牙模式,是蓝牙 4.0 中的重点技术,低功耗,快连接,长距离。双模蓝牙,支持低功耗蓝牙的同时还兼容经典蓝牙,经典蓝牙的特点是大数据高速率,例如音频、视频等数据传输。

2024-08-27 16:08:10 18536 27

原创 Linux 下 gdb 的使用

GDB(GNU调试器)是一个功能强大的开源调试工具,可用于调试多种编程语言,包括 C、C ++、Fortran 等。它可以在运行过程中检查程序状态,设置断点以停止程序执行并观察变量值、内存状态等,并提供一系列命令和功能来辅助调试过程。GDB设置断点GDB允许你在程序的某一行代码上设置断点,当程序执行到这一行时会暂停并等待调试命令。单步调试:通过单步调试,你可以逐行执行程序并观察每一行代码的执行情况,方便定位问题。查看变量和内存:在调试过程中,你可以查看各个变量的值,检查它们是否符合预期。

2024-08-26 15:09:40 20149 33

原创 FreeRTOS 快速入门(九)之软件定时器

的时刻是 tX,定时器的周期是 n,那么在 tX+n 时刻定时器的回调函数被调用。定时器的回调函数是在守护任务中被调用的,守护任务不是专为某个定时器服务的,它还要处理其他定时器。能否及时处理定时器的命令、能否及时执行定时器的回调函数,严重依赖于守护任务的优先级。定时器的很多 API 函数,都是通过发送"命令"到命令队列,由守护任务来实现。的时刻是 tX,定时器的周期是 n,那么 tX+n 就是重新确定的超时时间。我们可以指定一个超时时间。函数的时间 tX,新的周期是 n,则 tX+n 就是新的超时时间。

2024-08-26 08:49:30 19956 8

原创 FreeRTOS 快速入门(八)之任务通知

按照 FreeRTOS 官方的说法,使用任务通知比通过信号量等 ICP 通信方式解除阻塞的任务要快 45%,并且更加省 RAM 内存空间(使用 GCC 编译器,-o2 优化级别),任务通知的使用无需创建队列。从 V8.2.0 版本开始提供任务通知这个功能,每个任务都有 一个 32 位 的通知值,在大多数情况下,任务通知可以 替代二值信号量、计数信号量、事件组,也可以替代长度为 1 的队列(可以保存一个 32 位整数或指针值)。默认是为 1 的,所以任务通知是默认使能的。的信号量,队列、事件组等。

2024-08-25 18:43:19 20121 16

原创 FreeRTOS 快速入门(七)之事件组

当期望的时间发生时,这个状态就叫"unblock condition",非阻塞条件,或称为"非阻塞条件成立";来等待事件,可以等待某一位、某些位中的任意一个,也可以等待多位;函数不是直接去设置事件组,而是给一个 FreeRTOS 后台任务发送队列数据,由这个任务来设置事件组。事件组用一个整数来表示,其中的高 8 位留给内核使用,只能用其他的位来表示事件。有一个或多个任务在等待事件,如果这些事件符合这些任务的期望,那么任务还会被唤醒。但是设置事件组时,有可能导致多个任务被唤醒,这会带来很大的不确定性。

2024-08-24 16:50:22 20201 39

原创 ESP32-IDF 在 Ubuntu 下的配置

参考资料:官方文档:Linux 和 macOS 平台工具链的标准设置。参照官方文档,首先下载编译 所需要的软件包:二、获取 ESP-IDF首先创建一个目录用来作为 esp32 的工作目录:为了解决国内开发者从 Github 克隆 esp 相关仓库慢的问题,官方已将 esp-idf 和部分重要仓库及其关联的子模块镜像到了 jihu,这些仓库将自动从原始仓库进行同步。所以先获取官方的工具:(相关信息见 乐鑫开源/esp-gitee-tools)使用如下命令即可使用镜像的 URL:然后就可以克隆远程仓

2024-08-23 20:29:54 20953 15

原创 FreeRTOS 快速入门(六)之互斥量

当该任务释放这个互斥量时,该互斥量处于开锁状态,任务失去该互斥量的所有权。用互斥量处理不同任务对临界资源的同步访问时,任务想要获得互斥量才能进行资源访问,如果一旦有任务成功获得了互斥量,则互斥量立即变为闭锁状态,此时其他任务会因为获取不到互斥量而不能访问这个资源,任务会根据用户自定义的等待时间进行等待,直到互斥量被持有的任务释放后,其他任务才能获取互斥量从而得以访问该临界资源,此时互斥量再次上锁,如此一来就可以确保每个时刻只有一个任务正在访问这个临界资源,保证了临界资源操作的安全性。

2024-08-23 19:02:06 21159 7

原创 FreeRTOS 快速入门(五)之信号量

信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问,其实信号量主要的功能就是实现任务之间的同步与互斥,实现的方式主要就是依靠队列(信号量是特殊的队列)的任务阻塞机制。

2024-08-22 11:26:55 21887 27

原创 FreeRTOS 快速入门(四)之队列

队列通常是一个先入先出(FIFO)的缓冲区,即数据在队列末尾(tail)被写入,在队列前部(head)移出。下图展示了数据被写入和移出作为 FIFO 使用的队列。也可以写入队列的前端,并覆盖已位于队列前端的数据。

2024-08-21 16:02:49 22136 14

原创 FreeRTOS 快速入门(三)之任务管理

要注意的是,函数内部,尽量使用局部变量。因为每个任务都有自己的栈,每个任务运行这个函数时,任务 A 的局部变量放在任务 A 的栈里、任务 B 的局部变量放在任务 B 的栈里。不同任务的局部变量,有自己的副本。函数使用全局变量、静态变量的话,只有一个副本:多个任务使用的是同一个副本。/* 对于不同的任务,局部变量放在任务的栈里,有各自的副本 *//* 任务函数通常实现为一个无限循环 */for(;;/* 任务的代码 *//* 如果程序从循环中退出,一定要使用 vTaskDelete 删除自己。

2024-08-20 10:20:53 23275 23

原创 FreeRTOS 快速入门(二)之内存管理

`FreeRTOS` 提供了几种堆管理方案, 其复杂性和功能各不相同。 你也可以提供自己的堆实现, 甚至同时使用两个堆实现。 同时使用两个堆实现 允许将任务堆栈和其他 `FreeRTOS` 对象放置在 内部 RAM 中,并将应用程序数据放置在较慢的外部 RAM 中。

2024-08-19 17:24:14 23514 3

原创 FreeRTOS 快速入门(一)之 FreeRTOS 的命名规则

FreeRTOS 的命名规约非常独特,假若缺乏事先的了解,研读其源代码将使人感到困惑不解。然而,一旦熟悉了其命名规约,阅读就变得十分轻松了。

2024-08-18 22:17:10 23824

原创 Modbus 通信协议详解

Modbus是由 Modicon(现为施耐德电气公司的一个品牌)在 1979 年发明的,是全球第一个真正用于工业现场的总线协议。ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。为更好地普及和推动Modbus在基于以太网上的分布式应用,目前施耐德公司已将Modbus协议的所有权移交给 IDA(,分布式自动化接口)组织,并成立了 Modbus-IDA 组织。

2024-08-18 12:41:41 27919 9

原创 SPI 通信协议详解

SPI(串行外围设备接口) 通信协议是 Motorola 公司首先在其MC68HCXX 系列处理器上定义的。SPI 接口是一种高速的全双工同步的通信总线,已经广泛应用在众多 MCU、存储芯片、AD 转换器和 LCD 之间。由SPI连成的串行总线是一种三线同步总线,总线上可以连接多个可作为主机的 MCU,装有SPI接口的输出设备,输入设备如液晶驱动、A/D 转换等外设,也可以简单连接到单个 TTL 移位寄存器的芯片。总线上允许连接多个能作主机的设备,但在任一瞬间只允许有一个设备作为主机。

2024-08-17 14:27:45 25781

原创 UART 通信协议详解

UART (通用异步收发器) 是一种常用的串行通信协议,用于在计算机和外部设备之间传输数据。它是一种异步通信协议,也就是说数据的传输不需要事先建立好同步时钟信号。UART 协议定义了数据传输的格式和通信规则。它包括一系列的控制信号和数据线来实现双向的串行通信。常见的 UART 协议有 RS-232、RS-422 和 RS-485 等。UART 协议的数据传输是基于帧(Frame)的概念的。每个数据帧由一个起始位、若干个数据位、一个可选的奇偶校验位和一个或多个停止位组成。

2024-08-16 11:19:36 27206

原创 IIC 通信协议详解

IIC 协议,是一种用于各种电子设备之间进行通信和数据交换的串行通信协议。它是由飞利浦(Philips)公司于 1982 年首次提出并推广的一种简单、高效、低成本的通信协议。I2C协议采用双线结构传输数据,包括一个数据线和一个时钟线(即 SDA 和 SCL 线),其中 SDA()线用于双向数据传输,而 SCL()线则用于同步数据传输的时钟信号。通信始终由主设备(Master)控制,从设备(Slave)被动接收和回应。这种简单的线路连接方式使得设备之间的互连变得非常容易。

2024-08-15 20:12:03 27471

原创 Linux 中断机制(二)之中断子系统框架

用户层:用户层是中断的使用者,主要包括各类设备驱动。这些驱动程序通过中断相关的接口进行中断的申请和注册。当外设触发中断时, 用户层驱动程序会进行相应的回调处理,执行特定的操作。通用层:通用层也可称为框架层,它是硬件无关的层次。通用层的代码在所有硬件平台上都是通用的,不依赖于具体的硬件架构或中断控制器。通用层提供了统一的接口和功能, 用于管理和处理中断, 使得驱动程序能够在不同的硬件平台上复用。硬件相关层:硬件相关层包含两部分代码。

2024-08-14 21:59:15 27784 1

原创 Linux 中断机制(一)之中断和异常

中断(interrupt)是指在 CPU 正常运行期间, 由外部或内部事件引起的一种机制。当中断发生时,CPU 会停止当前正在执行的程序,并转而执行触发该中断的中断处理程序。处理完中断处理程序后,CPU 会返回到中断发生的地方, 继续执行被中断的程序。中断机制允许 CPU 在实时响应外部或内部事件的同时,保持对其他任务的处理能力。

2024-08-12 17:01:39 29396 1

原创 Linux 下利用 Valgrind 进行内存调试

Valgrind是一个开源的内存调试和性能分析工具,用于帮助开发者找出程序中的内存错误,如内存泄漏、使用未初始化的内存、非法内存访问等问题。它在 Linux 平台上广泛使用,并且支持下多种处理器架构。

2024-08-11 15:55:33 30329

原创 Linux 进程调度(三)之进程的优先级

在 Linux 中,每个进程都有一个优先级。优先级决定了进程在系统资源分配中的先后顺序。Linux 中的进程优先级范围从 -20 到 +19,其中 -20 为最高优先级,+19 为最低优先级。

2024-08-10 16:46:04 31381 1

原创 Linux 错误码

在 Linux 系统中,错误码是用来表示操作系统运行过程中发生的错误的数字代码。错误码通常由负数表示,0 表示成功,正数表示警告或其他非致命错误。为了开发者更好地处理系统错误,内核中预定义的错误几乎涵盖了我们可能遇到的所有问题。一些错误的宏定义在,还有一部分定义在中。当函数执行发生错误的时候,操作系统会将这个错误所对应的编号赋值给errno变量,每一个进程都维护了自己的 errno 变量,它是程序中的全局变量,该变量用于存储就近发生的函数执行错误编号。

2024-08-09 16:31:01 32618 3

原创 Linux 进程调度(二)之进程的上下文切换

进程的上下文切换是指在多任务操作系统中,当操作系统决定要切换当前运行的进程时,将当前进程的状态保存起来,并恢复下一个要运行的进程的状态。上下文切换是操作系统实现进程调度和实现多任务的关键机制之一。操作系统一个非常重要的功能就是进程的管理,通过调度策略选择合适的进程来执行,对于单个 CPU 而言,进程是串行分时执行,这就需要内核支持进程切换,挂起一个正在 CPU 中执行的进程,恢复执行之前挂起的进程。

2024-08-09 15:27:04 32112

原创 Linux 调试之动态打印

在 kernel 驱动代码中,使用动态输出是系统内核调试的重要手段之一,printk打印是全局的,只能设置输出等级,而且使用printk每次都要重新编译内核,很不方便。。而动态输出可以在不需要重新编译内核的情况下,方便的打印出内核的 debug 信息。动态输出可以动态选择打开某个内核子系统的输出,可以有选择性地打开某些模块的输出,printk被dev_infodev_dbgdev_err之类的函数代替,dev_xxx函数的本质还是使用printk打印的,只是对printk进行了一层包装。

2024-08-08 16:09:31 32526

原创 Linux 下查看 CPU 使用率

Linux 作为一个多任务操作系统,将每个 CPU 的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉。为了维护 CPU 时间, Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jiffies 记录了开机以来的节拍数。每发生一次时间中断,Jiffies 的值就加 1。节拍率 HZ 是内核的可配选项,可以设置为 100、250、1000 等。不同的系统可能设置不同数值。

2024-08-07 20:50:54 36104

原创 Linux 利用 ftrace 分析内核调用

在 Linux 中,ftrace是一种用于跟踪内核函数调用和事件的工具。它是一个功能强大的跟踪框架,可用于分析和调试内核性能问题。ftrace提供了多种功能,包括函数跟踪、事件记录和性能分析等。它能够记录函数的调用和返回信息,以及函数执行的路径和时间。通过跟踪这些信息,我们可以了解到内核函数的执行情况,从而定位和解决性能问题。ftrace使用了内核中的一些机制来实现跟踪功能。其中一个关键的机制是函数预编译器,它会在每个内核函数的入口和出口处插入一些特殊的指令,用于记录函数的调用和返回信息。

2024-08-07 16:27:35 33467

原创 Linux 中 core dump 异常的分析

在 UNIX 系统中,常将“主内存称为核心(core),因为在使用半导体作为内存材料之前,便是使用核心(core)。而核心映像(core image)就是 “进程”(process)执行当时的内存内容。当进程发生错误或收到 “信号”(signal)而终止执行时,系统会将核心映像写入一个文件,以作为调试之用,这就是所谓的核心转储(core dump)。Core dump是指在程序异常终止时,操作系统将程序的内存映像保存到磁盘上的一种机制。

2024-08-06 21:52:00 34051

原创 Linux 利用 iostat 和 iotop 进行 IO 分析

在Linux 系统上,iostat和iotop这两个 IO 数据工具非常常用。它们都是性能分析领域中不可缺少的工具性软件。如果 Linux 系统性能变慢,我们会用top命令 来查看系统性能。它被用来检查是什么进程在服务器上占有如此高的使用率,对于大多数 Linux 系统管理员来说很常见,现实世界中被 Linux 系统管理员广泛采用。如果在进程输出中你没有看到很大的不同,你仍然有选择查看其他东西。比如你可以在top。

2024-08-06 18:18:55 34412 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除