- 博客(43)
- 收藏
- 关注
原创 C++7(拷贝构造函数)
拷贝构造函数是实现对象复制的重要机制,理解浅拷贝与深拷贝的区别对于管理资源(如堆内存)至关重要。同时,空类并非真正的"空",它包含了编译器生成的默认成员函数,这些函数在特定条件下会被隐式调用。
2025-04-19 01:38:57
317
原创 C++5(类的基础)
类(class)是C++中区别于C语言的重要概念,它使C++支持面向对象编程(OOP)。从语法层面看,类可以理解为增加了函数的结构体;从逻辑层面看,类是增加了数据行为的结构体。
2025-04-19 01:13:55
215
原创 C++4(Lambda表达式)
Lambda函数,亦称为Lambda表达式、匿名函数等,是一种函数对象,Lambda函数可以让函数像普通变量一样进行赋值、传递、函数返回等操作。C++中的Lambda函数经常用来解决如下问题:使得程序更加简洁,尤其对于一次性使用的函数。有些库函数要求传递的参数是一个函数,但是你又不想写一个函数出来使得函数可以自由流动,就像变量一样,这给函数式编程模式奠定了语法基础。
2025-04-19 01:11:16
700
原创 C++3(命名空间)
定义一个名字空间,实际上就是定义一个作用域,在名字空间中可以定义变量、函数等,示例代码如下:在以上名字空间 ns 中,定义了一个变量 a 和一个函数 f,但实际上它们的名字是 ns::a 和 ns::f,比如如下示例代码显示了如何正确地引用它们:此处出现了一个新的操作符 ==> :: ,其用法是:这个双冒号的操作符,称为作用域引用符(成员引用符 - 类对象),很显然,双冒号前面必须是一个作用域,在C++中,除了名字空间是作用域之外,后续会讲到的类也是最常见的作用域。
2025-04-17 02:39:19
704
原创 C++2(C过度到C++)
C语言从本质上来说,是没有字符串这种类型的,在C语言中如果要表达字符串,只能间接地借助于字符指针或者字符数组来表达,很明显这是由于C语言的诞生年代过于久远而导致的一种设计缺陷。
2025-04-17 02:28:21
1095
原创 系统编程4(并发编程的原理与应用)
提示:主线程A获取写操作的锁,另外的线程分别获取读操作的锁。练习:设计一个程序,要求在程序中创建两条子线程,主线程创建一个线程的属性对象,并对线程的属性对象进行初始化之后,要求创建的子线程的属性设置为分离属性,子线程A输出”hello”,子线程B输出”world”,主线程创建子线程之后就终止。注意:线程使用的是进程的资源,所以进程退出之后线程也会退出,而进程结束的条件之一就是程序的main函数退出,所以也就是当程序中的main函数调用return语句则进程会被终止,所以进程的其他的线程也会一起退出。
2025-04-14 02:16:38
794
原创 系统编程3(共享内存/信号量)
用户申请成功共享内存之后是无法直接访问的,因为缺少共享内存的入口地址,另外,由于申请的是物理内存,所以还需要把申请的物理内存映射到进程的内存空间,这样用户就可以通过共享内存入口的虚拟地址来直接访问共享内存空间。资源的数量是有限的,当把资源的数量用信号量表示之后,其他的进程想要获取资源则必须提前申请信号量,使用完资源之后必须及时归还信号量(令牌 token 简单理解:钥匙!
2025-04-14 00:07:39
510
原创 系统编程2(消息队列)
ftok()函数的第一个参数指的是系统中已经存在并且可以访问的一个文件的路径,用户可以指定一个文件,但是该文件必须存在且可以被访问,其实就是为了得到文件的属性信息中的inode编号和设备编号,因为Linux系统中一个文件的inode编号是唯一的。msgsnd函数的第二个参数msgp指的是一个指向struct msgbuf类型的结构体指针,该结构体中有两个成员,其中一个成员mtype指的是消息类型,必须是一个大于0的正整数,另一个成员mtext指的是消息正文,类型可以是数组或者其他结构。
2025-04-13 23:36:22
554
原创 系统编程1(进程的概念与原理)
为例,参数pathname是需要加载的指定程序,而arg则是该程序运行时的命令行参数,命令行参数包括程序名本身,并且全部是字符串,其实和带参数的main函数通过命令行传参的流程类似,但是函数的参数列表必须以NULL结束,也就是函数的最后一个参数填NULL即可。可以发现,Linux系统中的所有进程都和一个进程有关系,那就是systemd进程,该进程是Linux系统运行的第一个进程,英文全称是system daemon,中文翻译为系统守护进程,系统中其他进程都是该进程的子进程。
2025-04-12 23:53:36
1093
原创 文件IO7(中文字库的原理与应用/目录检索原理与应用/并发编程的原理与应用)
⦁ 基本概念一般在项目中都会显示汉字,都采用中文简体字符集,计算机早期只有ANSI组织设计的ANSII码,其实也属于字符集,这套字符集并未收录中文,只收录256个字符。所以后期中国国家标准总局设计了一套中文字符集叫做GB2312中文简体字符集。⦁ 汉字结构⦁ 字库生成在嵌入式开发中一般都会使用LCD屏或者OLED屏进行汉字显示,所以都需要使用汉字库或者使用取模软件生成汉字的字模,一般都是采用点阵字库。
2025-04-11 23:41:43
739
原创 文件IO6(开机动画的显示原理/触摸屏的原理与应用)
⦁ 基本原理一般电子产品在开机之后都会加深用户印象,一般开机之后都会播放一段开机动画(视频、GIF…),不管哪种采用形式,内部原理都是相同,都是利用人类的眼睛的视觉暂留效应实现的,可以让用户看到画面是动态的。如果打算实现画面的动态显示则需要确保每秒钟在用户眼睛的前面连续播放若干帧图像,帧率至少是24HZ,也被称为帧刷新率 FPS ,作为开发者而言,需要准备大量的素材,本次就以开机动画为例,实现程序设计。⦁ 准备素材。
2025-04-11 23:13:37
878
原创 文件IO5(JPEG图像原理与应用)
由于libjpeg库不是直接安装在Linux系统下,这个libjpeg库是拷贝出来,所以在Linux系统路径下是找不到libjpeg的头文件和库文件的,所以在编译程序的时候需要使用编译器的选项: -I 指定头文件的路径 -L 指定库文件的路径 -l 指定库文件的名称(lib缩写)同样,JPEG也是一种常用的图像存储格式,JPEG的文件格式有两种文件扩展名:.jpg和.jpeg,这两种扩展名是相同的,我们可以把.jpg的文件改名为.jpeg,而对文件本身不会有任何影响。
2025-04-11 22:57:29
932
原创 文件IO4(提高LCD显示效率/BMP图像原理与应用)
⦁ 内存映射可以发现通过系统IO直接操作LCD的时候LCD屏的部分像素点会显示“黑线”,过段时间或者重新再次运行程序之后“黑线”会慢慢消失。其实这种现象并不是由于硬件原因导致的,而是系统调用的过程中数据传输效率较低导致的。int buf[800*480] -->用户缓冲区–>循环放入颜色分量–>调用write()写入LCD --> 把用户缓冲区的数据拷贝到内核缓冲区—>内核把缓冲区中的颜色分量依次写入LCD的驱动程序–>LCD看到显示效果。
2025-04-11 22:24:59
793
原创 文件IO3(LCD屏的原理与应用)
⦁ 基本概念LCD (Liquid Crystal Display的简称)的中文称为液晶显示器,构造原理就是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置TFT(薄膜晶体管),上基板玻璃上设置彩色滤光片(CF),彩色滤光片是由红、绿、蓝三种颜色构成的滤片,有规律地制作在一块大玻璃基板上。⦁ 结构分析彩色滤光片是LCD液晶屏彩色化的关键部件,彩色滤光片通过滤光的方式可以产生RGB三原色,然后再将三原色以不同的强弱比例进行混合,从而呈现各种颜色,这样LCD才可以显示全彩色。⦁ 显示单位。
2025-04-11 01:26:10
478
原创 文件IO2(标准IO接口说明)
由于Linux系统下“一切皆文件”,也就是Linux系统下的数据和程序都是以文件的形式存储的,所以Linux内核会提供一组操作文件的函数接口,这组函数接口也被称为系统IO,同时为了满足用户访问文件的需求以及提高用户程序的可移植性,标准库也提供了一组操作文件的函数接口,这组函数接口也被称为标准IO,只不过标准库提供的标准IO函数都是遵循ANSI C标准设计出来,是为了方便用户在不同的操作系统下可以调用通用的函数来实现对文件的读写访问,但其实标准IO也是基于内核提供的系统IO设计出来的。
2025-04-11 01:03:01
756
原创 文件IO1(计算机的组成部分/linux系统的目录/文件操作)
⦁ 硬件系统计算机的硬件主要是由五部分组成:控制器、运算器、存储器、输入设备、输出设备。其中运算器和控制器的总称是中央处理器(CPU),指的是计算机中对信息进行高速运算处理的主要部件。存储器则是用来存储程序、数据和文件,一般是由快速的内部存储器(容量可达数百兆字节,甚至数G字节)和慢速的外部存储器(容量可达数十G或数百G以上)组成,比如计算机中的内存条和固态硬件就属于存储器。
2025-04-11 00:34:31
823
原创 数据结构6(算法)
排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。可以将数据按某字段规律排列,所谓的字段就是数据节点的其中一个属性。比如一个班级的学生,其字段就包含学号、姓名、班级、分数等等,我们既可以针对学号排序,也可以针对分数排序。
2025-04-09 23:24:20
602
原创 数据结构5(树的概念和原理)
日常生活中,很多数据的组织形式本质上是一棵树。比如一个公司中的职员层级关系、一个学校中的院系层级关系、淘汰赛中的各次比赛队伍、一个家族中的族谱成员关系等都是树状逻辑结构。由于树状结构表现出来都是具有层次的,因此也被称为层次结构。树是一种非线性结构,其严格的数学定义是:如果一组数据中除了第一个节点(第一个节点称为根节点,没有直接前驱节点)之外,其余任意节点有且仅有一个直接前驱,有零个或多个直接后继,这样的一组数据形成一棵树。树中的数据元素之间的逻辑关系是一对多的。
2025-04-09 22:36:03
993
原创 数据结构4(队列的原理和应用)
队列(Queue)和栈类似,相同点是都属于线性结构,不同点是栈遵循“后进先出”原则,而队列遵循“先进先出”的原则,也被成为“FIFO”结构,就是“First Input First Output”数据结构中的队列的两端都允许操作,只不过要求数据只能从队列的一端插入,从队列的另一端删除,可以把队列理解为一根水管,水管有进水口和出水口。一般把允许数据插入的一端称为队尾(Tail或者Rear),一般把允许删除数据的一端称为队头队首(Head或者Front)。
2025-04-08 00:12:12
276
原创 嵌入式C语言11(宏/程序的编译过程)
宏替换其实就是简单的文本替换,宏名称就是一个用户命名的特定的标识符,一般实际开发中宏名称都采用大写(潜规则)。macro 宏宏名称后面就是用来替换宏名称的替换列表,这个替换列表可以是常量、表达式、if语句以及函数等。定义格式: #define 宏名称(大写) 替换列表 换行(一般就是用户按下回车)
2025-04-07 23:40:21
695
原创 嵌入式C语言10(结构体/联合体/枚举)
思考:用户定义了结构体类型之后,可以利用该结构体类型定义多个变量,但是在某些情况下用户只打算定义一个结构体类型的变量专门用来存储唯一且重要的数据,后期并不打算继续使用该结构体类型定义新的变量,请问是否有方案来满足这种需求?思考:用户在使用结构体类型创建结构体变量的时候,需要写比较繁琐的语句,可能会导致程序可读性不好,请问是否有更加简单的方案来实现相同的效果?如果有,那应该如何设计?
2025-04-07 03:18:22
552
原创 嵌入式C语言9(const/递归思想的应用)
思考:可以看到C语言标准中对于main函数的第二个参数的约束是 char * argv[],但是代码编辑器在定义main函数的时候为什么是 char const *argv[]?为什么多了一个const,这个词表示什么意思,有什么作用?回答:const是C语言的关键字之一,其实是英文constant的缩写,具有常量的含义,const关键字在C语言标准中是类型限定符,一般用于修饰变量的,可以用于降低变量的访问权限,相当于把变量的属性变为只读,变量的存储单元只能读,不能写。
2025-04-07 02:27:06
818
原创 嵌入式C语言8(函数/内存分布)
/函数有参数列表,则应该在函数名称的()中写清楚每个参数的类型,以及每个参数的名称函数类型 函数名称(参数1类型 参数1名称,参数2类型 参数2名称…)//函数的参数是可以可选的,如果没有参数,则需要在函数名称的()中填写void即可函数类型 函数名称(void)注意:void在C语言标准中是一个关键字,含义具有空的意思,所以如果在参数列表中出现,则表示函数没有参数,同样,如果void是函数类型,则表示函数没有返回值。
2025-04-05 03:53:16
1013
原创 嵌入式C语言7(指针)
C语言中把用于存储地址的变量称为指针变量,因为通过变量中的地址可以指向某个存储单元!指针指向的是地址,所以可以把指针理解为地址,也可以把地址当做指针使用,注意:如果打算获取某个地址下的值,必须使用 * 间接运算符 , *地址 == 地址下的值。回答:是会的,所以为了提高程序的可靠性,为了避免异常出现所以就算不存储有效地址,也应该对定义的指针变量进行初始化,注意:对指针变量进行初始化,则应该把指针变量对应的内存初始化为0,但是0只是一个整数,并不是地址,而指针变量就是应该存储地址。int buf[5];
2025-04-02 02:26:45
649
原创 嵌入式C语言6(数组)
数组就是数据的集合,简单的说数组就是由n个数据组合在一起,数组的英文是Array。数组其实就是用户向内核申请的一块空间,只不过内核提供的这块空间的内存地址是连续的,目的就是方便用户存储数据和访问数据。思考:既然用户可以向内核申请一块连续的空间来存储数据,那用户如何访问这块内存呢?
2025-04-01 02:17:16
538
原创 数据结构3(单向循环链表/双向链表的原理与应用)
思考:对于单向链表而言,想要遍历链表,则必须从链表的首结点开始进行遍历,请问有没有更简单的方案实现链表中的数据的增删改查?回答:是有的,可以使用单向循环的链表进行设计,单向循环的链表的使用规则和普通的单向链表没有较大的区别,需要注意:单向循环链表的尾结点的指针域中必须指向链表的首结点的地址,由于带头结点的单向循环链表更加容易进行管理,所以以带头结点的为例:上图所示的就是一个典型的单向循环链表的结构,可以发现单向循环链表的结构属于环形结构,链表中的最后一个结点的指针域中存储的是链表的第一个结点的地址。
2025-03-24 16:27:57
300
原创 数据结构2(链表的原理与应用)
回答:可以根据用户的需要来选择,一般把链表分为两种:一种是不带头结点的链表,一种是带头结点的链表,头结点指的是管理结构体,只不过头结点只存储第一个元素的内存地址,头结点并不存储有效数据,头结点的意义只是为了方便管理链表。顺序表的缺点是:顺序表的数据在进行增删的时候,需要移动成片的内存,另外,当数据元素的数量较多的时候,需要申请一块较大的连续的内存,同时当数据元素的数量的改变比较剧烈,顺序表不灵活。可以知道,头指针是必须的,因为通过头指针才可以访问链表的元素,头结点是可选的,只是为了方便管理链表而已。
2025-03-24 16:07:01
937
原创 数据结构1(基本概念)
数据结构指的是计算机存储数据和组织数据的方式,存储数据和组织数据的目的是为了后期对数据的再次利用,所以存储的数据一般是具有一个或者多个特定关系的集合,利用不同的数据结构可以提高数据的访问效率。数据指的是可以被输入到计算机并且可以被计算机处理的符号的总称,数据的英文是Data。
2025-03-24 15:52:51
535
原创 嵌入式C语言5(模块化编程)
auto是C语言关键字之一,中文具有自动的含义,属于存储类说明符之一,只能用来修饰局部变量,所以只能在函数中使用,auto关键字具有隐式说明,在局部变量创建的时候默认存在,一般用auto修饰的变量也被称为自动变量,指的是变量由系统自动管理,变量创建时系统自动分配内存单元,变量的作用域结束时系统自动释放。这些预处理指令将会在预处理阶段被解释掉,如会把被包含的文件拷贝进来,覆盖掉原来的#include语句,把所有的宏定义展开,所有的条件编译语句被执行,GCC还会把所有的注释删掉,添加必要的调试信息。
2025-03-19 16:34:42
645
原创 集成开发工具
(1) 根据下图的配置,利用该软件连接到开发板的linux系统,注意:端口号不要选错!!!(2) 为了提高文件的传输效率,所以可以利用该软件的tftp协议来实现文件的传输,如下图:从电脑的TFTP主目录传送文件(比如a.txt)到开发板 参数 -g 获取 -r 指定文件名[~]# tftp -g 192.168.10.xxx -r a.txt 192.168.xxx.xxx指的是计算机的IP。
2025-03-19 16:06:01
984
原创 ARM开发板(Cortex-A53-S5P6818为例)的使用
Cortex-A53 系列高性能八核处理器 S5P6818,最高主频高达 1.4GHz,可应用于嵌入式 Linux 和 Android 等操作系统的驱动、应用开发。开发板留有丰富的外设,支持千兆以太网、板载 LVDS 接口、MIPI 接口、USB 接口等。
2025-03-19 00:47:19
977
原创 嵌入式LINUX2(系统文件共享)
想要实现两个不同的系统之间实现文件共享,最简单的一种方案就是设置VMware软件的共享文件夹,利用共享文件夹可以实现linux系统和windows系统之间的文件共享,这样就可以实现在windows系统上编辑程序,然后在linux系统下编译程序以及运行程序,尤其是当使用开发板的时候,这种方案非常好用。(2) 设置主机路径(windows系统的路径,),设置名称(linux系统的文件夹的名称,英文)(1) 点击VMware菜单栏的“虚拟机”,然后点击“设置”,点击“选项”,点击“共享文件夹”
2025-03-18 16:40:46
174
原创 嵌入式LINUX1(环境搭建/常用命令/网络环境配置/编辑器)
1.Linux系统具有更好的可移植性2.Linux系统具有更高的安全特性3.Linux系统具有更好的开源支持。
2025-03-17 22:34:25
762
原创 嵌入式C语言4(输出/缓冲/位操作运算符)
输入输出函数对应的头文件就叫做stdio.h,stdio指的是standard input output,翻译为标准输入输出。在linux系统下stdio.h的位置在/usr/include/stdio.h用户一般都是使用linux系统,在linux系统中是提供了一个帮助文档,叫做man手册,man手册一共有9个章节,只需要打开linux系统的终端(Ctrl+Alt+T)输入命令:man man如果想要针对性查找某些接口,可以指定man手册章节,终端输入命令: man n(1-9) xxx。
2025-03-17 13:41:28
313
原创 freeRTOS命名规范
FreeRTOS 是一个广泛使用的开源实时操作系统(RTOS),其代码和 API 遵循一定的命名规范,以保持代码的一致性和可读性。以下是 FreeRTOS 的命名规范总结:FreeRTOS 使用特定的前缀来标识数据类型,通常以 或 开头的类型是平台相关的。标准类型:自定义类型:FreeRTOS 的函数命名通常采用以下格式:前缀:对象:动作:FreeRTOS 的宏通常以大写字母命名,并使用下划线分隔单词。配置宏:API 宏:错误码宏:FreeRTOS 的变量命名通常采用以下规则:全局变量:局部变量:
2025-02-28 01:20:08
620
原创 进程与线程
进程是资源分配的基本单位,每个进程有独立的内存空间。线程是调度的基本单位,多个线程共享进程的资源。多线程可以提高 CPU 利用率、简化编程模型、提高响应速度,但也带来了同步、死锁和调试复杂性等挑战。合理使用多线程需要根据具体场景权衡利弊,设计良好的线程模型,并确保线程安全和性能优化。通过理解进程和线程的概念及其关系,可以更好地设计并发程序,充分利用多核 CPU 的计算能力,同时避免多线程编程中的常见问题。
2025-02-27 23:23:32
779
原创 多线程与单线程
多线程的基本概念进程:程序运行时的一个实例,包括程序代码、内存和系统资源。一个进程可以包含多个线程。线程:程序中的一个执行流,拥有自己的寄存器(如栈指针、程序计数器),但代码区和部分资源是共享的。多线程:一个程序中包含多个执行流,允许同时运行多个线程来执行不同的任务。多线程是一种强大的编程技术,能够提高程序的并发性和响应速度,尤其在需要处理耗时任务或高并发场景下表现出色。然而,多线程也带来了额外的复杂性和挑战,如共享资源访问、死锁和调试难度等。
2025-02-27 22:51:19
698
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人