自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 (十)C++与java

C++和Java各有其独特的优势和适用场景。C++以其高性能、手动内存管理和底层访问能力,适合系统编程、游戏开发和需要极致性能的应用。而Java则以其平台无关性、自动内存管理和丰富的库支持,适合快速开发和部署企业级应用和Web应用。选择哪种语言取决于具体的项目需求、性能要求以及开发团队的熟悉程度。

2025-02-08 17:59:34 726

原创 (九)C++的新标准

C++的新标准不断引入新的语言特性和库功能,旨在提高语言的表达能力、性能和安全性。通过了解和掌握这些新特性,程序员可以编写出更高效、更现代的C++代码。

2025-02-08 17:55:22 731

原创 (八)C++的标准模板库(STL)

是C++标准库的核心组成部分,提供了一组通用的模板类和函数,用于处理常见的数据结构和算法。STL的设计目标是提供高效、灵活且可重用的组件,使得程序员能够专注于应用逻辑,而无需从头实现基本的数据结构和算法。以下是对C++ STL的详细介绍,包括其主要组件、常用容器、迭代器、算法以及使用示例。

2025-02-08 17:09:43 661

原创 (七)C++的异常和文件输入与输出

异常机制允许程序在检测到错误时抛出(throw)一个异常,并在适当的位置捕获(catch)并处理该异常,从而提高程序的健壮性和可维护性。异常处理机制允许程序在检测到错误时中断正常的控制流,抛出异常,并在调用栈中向上传递,直到找到适当的异常处理器来处理该异常。编写异常安全的代码,确保在异常抛出时,程序处于一个有效和一致的状态。捕获异常的顺序应从具体到一般,避免先捕获一般异常,再捕获具体异常,否则具体异常将无法被捕获。std::exception:所有标准异常的基类。try:定义一个可能抛出异常的代码块。

2025-02-08 16:54:00 426

原创 (六)C++的函数模板与类模板

在C++中,(Templates)是一种强大的泛型编程工具,它允许程序员编写可重用的代码,而无需为每种数据类型编写重复的代码。模板分为(Function Templates)和(Class Templates),它们分别用于生成函数和类的通用版本。以下是对函数模板和类模板的详细介绍,包括其定义、语法、实现方式、示例以及注意事项。

2025-02-08 16:10:16 355

原创 (五)C++的类继承、多态、组合

类继承是指一个类(派生类)从另一个类(基类)派生出来,从而获得基类的成员(数据成员和成员函数)。派生类可以扩展或修改基类的功能。

2025-02-08 15:57:21 996

原创 (四)C++的类与动态内存分配

返回const对象的引用是指成员函数返回一个对const对象的引用,而不是返回对象的副本或非const引用。避免返回指向局部对象的引用,因为局部对象在函数返回后会被销毁,导致悬挂引用。如果类中包含指针成员,并且这些指针指向动态分配的资源,必须显式定义复制构造函数和赋值运算符,以实现深拷贝,避免多个对象共享同一份资源。如果对象包含指针或动态分配的资源,浅拷贝会导致多个对象共享同一份资源,可能导致悬挂指针或内存泄漏。然而,这需要确保返回的对象在函数返回后仍然有效,以避免悬挂指针或引用。

2025-02-08 14:05:05 982

原创 (三)C++的使用类

引用变量是某个已存在变量的别名。一旦引用被初始化,它就绑定到该变量,不能再绑定到其他变量。与指针不同,引用变量必须在声明时初始化,并且不能为nullptr。

2025-02-08 11:04:27 903

原创 (二)C++的类与对象

要定义一个对象数组,首先需要有一个类定义。

2025-02-08 09:40:40 786

原创 (一)C++的类与对象

定义:抽象是指将复杂的现实世界抽象为简单的模型,只关注对象的关键特性,而忽略次要的细节。实现方式:抽象类:包含纯虚函数的类,不能实例化,只能被继承。接口:只包含函数声明的类,通常用于定义一组方法的规范。优点:简化复杂性:隐藏复杂的实现细节,只暴露必要的接口。提高可维护性:通过抽象,可以更容易地修改内部实现,而不影响外部代码。

2025-02-07 17:41:38 899

原创 (二)Linux驱动开发进阶之platform总线

​ driver模块中,struct platform_driver成员driver的name成员必须指定,但与device模块中name可以不相同。​ device模块中,id的name成员必须与struct platform_device中的name成员内容一致。2.2 id匹配(可想象成八字匹配):一个驱动可以对应多个设备 ------优先级次低。2.3 设备树匹配:内核启动时根据设备树自动产生的设备 ------ 优先级最高。​ 带来的问题-------怎样将二者进行关联(匹配)?

2025-02-03 16:21:14 705

原创 (一)Linux驱动进阶之起源

uevent机制:sysfs + uevent + udevd(上层app)sysfs用途:(类似于windows的设备管理器)

2025-02-03 16:20:40 487

原创 (五)C语言的指针与数组

1.指针赋值字符串:使用指针时,实际上是将指针指向字符串常量的首地址,字符串常量存储在只读的数据段,不能通过指针修改字符串的内容。2.数组赋值字符串:使用字符数组时,会在栈上分配足够的空间来存储字符串的内容,并在数组的末尾添加 null 字符 (‘\0’),可以通过数组进行字符串的读写操作,因为它在栈上分配了一块可读写的内存空间。总体而言,使用指针赋值字符串时,指针指向字符串常量,不能修改字符串内容。而使用字符数组赋值字符串时,数组在栈上分配一块内存,可以进行读写操作。

2024-07-24 00:48:52 232

原创 (四)C语言的函数

(1) 操作对象不同,strcpy 的两个操作对象均为字符串,sprintf 的操作源对象可以是多种数据类型,目的操作对象是字符串,memcpy 的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型。(3) 实现功能不同,strcpy 主要实现字符串变量间的拷贝,sprintf 主要实现其他数据类型格式到字符串的转化,memcpy 主要是内存块间的拷贝。说明:strcpy、sprintf 与 memcpy 都可以实现拷贝的功能,但是针对的对象不同,根据实际需求,来选择合适的函数实现拷贝功能。

2024-07-24 00:35:21 312

原创 (三)C语言的变量与常量

1.使用#define宏定义:#define LENGTH = 102.使用const关键字:const int LENGTH = 10 或 int const LENGTH = 103.使用枚举:enum { PI = 3.14159 };这些方法之间的主要区别在于安全性和作用域。使用#define的常量没有类型,而使用const关键字的常量是有类型的。使用const是更安全和推荐的做法,因为它提供了类型检查,而#define则可能导致潜在的错误。

2024-07-24 00:08:13 274

原创 (二)C语言的内存管理

回答这个问题前需要知道malloc的作用和原理,应用程序通过malloc函数可以向程序的虚拟空间,申请一块虚拟地址空间,与物理内存没有直接关系,得到的是在虚拟地址空间中的地址,之后程序运行所提供的物理内存是由操作系统完成的。栈的分配和释放是由编译器隐式完成的,遵循后进先出(LIFO)的原则。C语言中,已初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。4.栈区是先进后出原则,即先进去的被堵在屋里的最里面,后进去的在门口,释放的时候门口的先出去。

2024-07-23 23:53:52 709

原创 (一)C语言的关键字

volatile 是一个在 C 语言中用于声明变量的关键字,它告诉编译器该变量的值可能在程序执行期间被外部因素更改,因此编译器不应该对该变量的访问进行优化。(1)中断服务程序中的共享变量: 当一个变量同时被中断服务程序和主程序使用时,为了确保对该变量的访问是可见的,可以使用 volatile 声明。使用 extern 可以在一个文件中声明一个在其他文件中定义的全局变量,使得当前文件能够访问该变量。使用 extern 可以在一个文件中声明一个在其他文件中定义的函数,使得当前文件能够调用该函数。

2024-07-23 23:20:39 409

原创 (六)C++之转换函数与模板

成员转换函数:class A{public:operator int() const{ //无返回reutn data;

2024-07-19 08:42:45 267

原创 (五)C++之多态与异常

基类指针可指向派生类对象, 动态联编。虚析构函数(内存泄漏)Exception类。

2024-07-19 08:35:04 190

原创 (四)C++之组合与继承

【代码】(四)C++之组合与继承。

2024-07-19 08:21:44 207

原创 (三)C++之运算符重载

C++准许以运算符命名函数!= 赋值运算符。( ) 仿函数。

2024-07-18 23:54:30 218

原创 (二)C++之类与对象

构造函数(类的初始化,创建类时自动调用;初始化表,this指针)拷贝构造函数 A(const A &x);类外: static int A::x = 10;析构函数(类的解构,销毁类时自动调用)赋值构造函数 operator=?常数据成员(构造函数初始化表赋值)调用方法 A::func();默认构造函数 A();

2024-07-18 23:42:49 429

原创 (一)C到C++

默认参数 : void debug(const char *ptr=“----------”);函数重载 : int cmp(int data1, int data2 );堆内存: malloc(),free() -> new, delete。引用 : void swp(int &a, int &b);面向对象编程(OOP): 类、对象、封装,继承、组合等。名字空间: namespace NAME1{ }

2024-07-18 23:30:03 131

原创 (一)数据库之sqlite3

参数:arg 接收sqlite3_exec 传递来的参数。返回值:成功为0 SQLITE_OK ,出错 错误码。返回值:成功为0 SQLITE_OK ,出错 错误码。callback 回调函数,只有在查询时,才传参。参数:filename 数据库名称。功能:查询语句执行之后,会回调此函数。1)系统命令 , 都以’.'开头。返回值:成功 SQLITE_OK。.schema 查看表的结构。f_name 列的名称。功能:得到错误信息的描述。参数:db 数据库句柄。errmsg 错误消息。

2024-07-13 21:46:53 792

原创 (十一)网络编程

Internet-“冷战”的产物1957年10月和11月,前苏联先后有两颗“Sputnik”卫星上天1958年美国总统艾森豪威尔向美国国会提出建立DARPA (Defense Advanced Research Project Agency),即国防部高级研究计划署,简称ARPA1968年6月DARPA提出“资源共享计算机网络” (Resource Sharing Computer Networks),目的在于让DARPA的所有电脑互连起来,这个网络就叫做ARPAnet,即“阿帕网”,是Interne

2024-07-12 14:22:49 577

原创 (十)进程间通信

对于以只写方式(O_WRONLY)打开的FIFO文件,如果open调用是阻塞的(即第二个参数为O_WRONLY),open调用将被阻塞,直到有一个进程以只读方式打开同一个FIFO文件为止;2 第二个参数中的选项O_NONBLOCK,选项O_NONBLOCK表示非阻塞,加上这个选项后,表示open调用是非阻塞的,如果没有这个选项,则表示open调用是阻塞的。当MAP_PRIVATE时候,mmap中的权限是对内存的限制,只需要文件有读权限即可,操作只在内存有效,不会写到物理磁盘,且不能在进程间共享。

2024-07-12 14:21:24 1064

原创 (九)线程的应用

我们平时创建一个线程,完成某一个任务,等待线程的退出。但当需要创建大量的线程时,假设T1为创建线程时间,T2为在线程任务执行时间,T3为线程销毁时间,当 T1+T3 > T2,这时候就不划算了,使用线程池可以降低频繁创建和销毁线程所带来的开销,任务处理时间比较短的时候这个好处非常显著。2 线程池工作线程,它是任务队列任务的消费者,等待新任务的信号。通俗的讲就是一个线程的池子,可以循环的完成任务的一组线程集合。1 任务队列,存储需要处理的任务,由工作线程来处理这些任务。判断是否有空闲的工作线程。

2024-07-12 14:19:27 605

原创 (三)数据结构之非线性表

树的逻辑结构 :树中任何节点都可以有零个或多个直接后继节点(子节点),但至多只有一个直接前趋节点(父节点),根节点没有前趋节点,叶节点没有后继节点。设完全二叉树的节点数为n,某节点编号为i。有n个节点的完全二叉树可以用有n+1个元素的数组进行顺序存储,节点号和数组下标一一对应,下标为零的元素不用。节点的层数等于父节点的层数加一,根节点的层数定义为一。若树中每个节点的各个子树的排列为从左到右,不能交换,即兄弟之间是有序的,则该树称为有序树。路径中前面的节点是后面节点的祖先,后面节点是前面节点的子孙。

2024-07-12 14:11:58 877

原创 (二)数据结构之线性表

设线性表 L=(a0,a1, ……,an-1),对 L的基本运算有:(1)建立一个空表:list_create(L)定义结构体指针L申请内存malloc判断是否为空初始化L和last标志位返回L(2)置空表:list_clear(L)判断L是否为空初始化L和last起始标志位(3)判断表是否为空:list_empty (L)。若表为空,返回值为1 , 否则返回 0判断last标志位是否为起始标志位4)求表长:length (L)判断L是否为空。

2024-07-12 14:11:17 636

原创 (四)stm32之通信协议

接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节。

2024-07-12 14:05:26 2047

原创 (三)TIM定时器

输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形。不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能。在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域。PWM频率: Freq = CK_PSC / (PSC + 1) / (ARR + 1)计数器计数频率:CK_CNT = CK_PSC / (PSC + 1)

2024-07-12 14:03:04 287

原创 (二)EXIT外部中断

一.中断系统中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。

2024-07-05 23:33:28 347

原创 (一)STM32F1库函数之GPIO

3)keil工程里建分组Start、Library、User,将文件夹内的文件添加到工程分组中。(Library)库函数描述:misc.c/h;4)工程选项,C/C++,Include Paths内声明所有包含头文件的文件夹。(Start)定义SystemInit:System_xx.c/h。(User)定义中断处理函数:stm32f10x_it.c/h。(Start)启动调用函数描述:startup_md.s。(Start)内核寄存器描述:core_cm3.c/h。

2024-07-04 15:09:29 441

原创 (八)Linux的进程与线程

多任务处理是指用户可以在同一时间内运行多个应用程序,每个正在执行的程序被称为一个任务。一个任务包含一个或多个完成独立功能的子任务,其中子任务可以是进程或线程。Linux就是一个支持多任务的操作系统,比起单任务系统它的功能增强许多。

2024-06-25 20:18:36 894

原创 Stm32的C语言

关键字:#define用途:用一个字符串代替一个数字,便于理解,防止出错;提取程序中经常出现的参数,便于快速修改定义宏定义:引用宏定义://等效于int a = 12345;

2024-06-14 21:20:58 453

原创 (七)Linux的I/O编程

标准I/O的对象就是流。当用标准I/O打开一个文件时,就会创建一个FILE结构体描述该文件。其中FILE结构体称为流。标准I/O函数都基于流进行各种操作。标准I/O中的缓冲类型。

2024-05-26 16:35:31 953

原创 (十六)C语言的预处理器与头文件

引用头文件相当于复制头文件的内容,但是我们不会直接在源文件中复制头文件的内容,因为这么做很容易出错,特别在程序是由多个源文件组成的时候。C 或 C++ 程序中,建议把所有的常量、宏、系统全局变量和函数原型写在头文件中,在需要的时候随时引用这些头文件。此时,预处理器会跳过文件的整个内容,编译器会忽略它。有两种类型的头文件:程序员编写的头文件和编译器自带的头文件。1)typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。

2024-05-10 09:20:00 1060

原创 (六)Linux的Shell编程(下)

和 Java、PHP 等语言不一样,sh 的流程控制不可为空。(1)选择语句1)if 语句语法格式:2)if else语法格式:3)if else-if else 语法格式:if else 的 […] 判断语句中大于使用 -gt,小于使用 -lt。如果使用 ((…)) 作为判断语句,大于和小于可以直接使用 > 和

2024-05-08 16:21:32 939

原创 (六)Linux的Shell编程(中)

s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。最高, -a 次之, -o 最低。

2024-05-08 15:29:41 887

原创 (六)Linux的Shell编程(上)

在 Shell 编程中,变量是用于存储数据值的名称。

2024-05-08 10:54:00 2088

空空如也

空空如也

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

TA关注的人

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