- 博客(108)
- 资源 (4)
- 收藏
- 关注
原创 C++继承与派生
/类内定义,初始化列表法//类内定义,非初始化列表法addr=ad;//类内声明//类外定义继承方式基类数据成员属性访问属性公有继承(Public)公有or保护派生类中保持原属性(公有or保护)私有基类私有,派生类不可访问保护继承(Protected)公有or保护在派生类中,成为了保护成员私有基类私有,派生类不可访问私有继承(Private)公有or保护在派生类中,成为了私有成员私有基类私有,派生类不可访问基类数据成员继承方式在派生类中的访问属性。
2025-01-09 11:17:32
861
原创 C++运算符重载实例
注:1)比较规则:调用int strcmp(const char *str1, const char *str2)函数,按照ASCII码表从首字母开始比较str1和str2的值。2)因为算数运算符需要两个对象(左、右各一个操作数),因此只能用友元函数形式。3)运算符重载可以嵌套使用。
2024-12-27 00:45:07
983
原创 一文读懂C++运算符重载&运算符重载函数
通过运算符重载,扩大了C++已有运算符的作用,使运算符能用于类对象;使用运算符重载,能使程序易于编写、阅读和维护;运算符被重载后,其原有的功能仍然保留,没有丧失或改变。二、通过运算符重载函数实现运算符的重载运算符重载函数的一般形式:注:1)形参列表里可以不止一个参数;如果是对象的话,需要“类名&对象名”的形式1、不允许创造新的运算符,只能对已有的C++运算符进行重载。2、重载不能改变运算符运算量的个数(即操作数),不能改变运算符的优先级,不能改变运算符的结合性。3、重载运算符的函数不能带
2024-12-26 17:06:24
1904
原创 C++函数模板与类模板
首先进行模板的声明,完成模板声明后,虚拟类型名就可以用于模板函数的定义;在对程序进行编译时,编译系统会自动将函数名与模板相匹配,将实参的类型取代函数模板中的虚拟类型。模板函数定义的形式如下:函数返回值类型 函数名(虚拟类型名 参数名, 虚拟类型名 参数名,…)1)函数返回值类型可以为void,且不一定必须与参数类型一致!2)当虚拟类型只有一个时,传参就必须传相同类型;3)如果想传入多个不同类型的参数,则在函数模板声明和模板函数定义时,多加几个虚拟参数类型。在模板类之前,加上类模板的声明;
2024-12-19 11:51:46
660
原创 一文读懂C++构造函数&析构函数
class Time //时间类public:Time( ) //类内定义构造函数hour=0;//注意:不用带参数类型minute=0;//注意:不用带参数类型sec=0;//注意:不用带参数类型private:int hour;int minute;int sec;cin>>hour;cin>>sec;Time t1;Time t2;return 0;
2024-12-11 16:55:38
969
原创 C++的对象、类、成员(数据&函数)
class Student //类名private: //数据成员(私有的)int num;char sex;public:void set_data(int n, char *p,char s) //成员函数,为私有数据成员赋值num=n;sex=s;void display() //成员函数,输出私有数据成员//注:类的定义,结尾要加“;int main()//定义对象//使用对象的成员函数,为对象的数据成员赋值//使用对象的成员函数,为对象的数据成员赋值。
2024-12-09 15:28:16
998
原创 C++函数重载与运算符重载
重载运算符是带有特殊名称的函数,函数名是由关键字 operator和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。
2024-12-03 18:43:07
606
原创 define的一些骚操作:##操作连接符、#@字符化操作符、#字符串化操作符、\行继续操作
*使用*//*使用字符串化操作符,将ITEM字符串化*//*使用define定义以简化枚举*/STATUS(KS_RELEASE) /*稳定松开状态*/ \STATUS(KS_PRESS_SHAKE) /*按下抖动状态*/ \STATUS(KS_PRESS) /*稳定按下状态*/ \STATUS(KS_RELEASE_SHAKE) /*松开抖动状态*/ \STATUS(KS_NUM) /*状态总数(无效状态)*/ \/*由于上面使用了define,此处枚举得以简化*//*
2023-07-26 13:57:22
2194
原创 线程创建&回收:pthread_creat和pthread_join
pthread_create()是一个POSIX线程函数,用于创建一个新线程。void *arg);这个函数创建新线程的主要步骤为:1. 检查传入的线程属性attr是否正确,如果为空则使用默认属性。2. 将start_routine函数和参数arg封装为线程任务。3. 系统将分配资源为新线程创建环境,并保存线程ID到thread参数。4. 新创建的线程会调用start_routine(arg)函数开始执行线程任务。5. 如果资源分配成功,pthread_create()返回0,否则返回错误码。
2023-06-20 14:52:04
1679
原创 最详细二进制文件操作fwrite、fseek、fread、ftell、getFilesize…
size*nmemb返回:成功读取的元素总数会以,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。
2023-06-19 18:21:11
2413
原创 延时函数:普通延时,硬件定时器延时,系统定时器延时
此种延时是基于让MCU做一些无意义的循环操作来打发时间,优点是简单易懂,缺点是会占用MCU的处理资源且精度较低,主要用于程序简单、无严格时间要求的场景中。
2023-06-14 09:25:09
10544
原创 F103ZET6使用FSMC和HAL点亮ILI9341
(一)对应关系由STM32内部硬件原理定义,参见STM32F103xE 数据手册 表5 引脚定义(二)PE2 ------> FSMC_A23 地址输入(重要DC)(不同板子可能不同)PD4 ------> FSMC_NOE RD读使能PD5 ------> FSMC_NWE WR写使能PG12 ------> FSMC_NE4 片选(重要)(不同板子可能不同)(三)PG11 ------> LCD_RST 复位PG6 ------> LCD_BK 背光1)16个数据引脚;
2023-05-20 01:45:13
2495
1
原创 再论指针数组与数组指针
fun 函数的第一个形参是为了被修改,返回被复制后的字符串,第二个参数是被复制字符串的源,这个源数组是不能被修改的,但是因为传递的是地址,存在被修改的风险,所以加了 const 修饰,表明 src_str 指向的是“常量”,不能被修改。printf("%p\n", buf) 与 printf("%p\n", &buf) 这两句话的打印结果是相同的,表明它们的值相等,但是 printf("%p\n", buf + 1) 与 printf("%p\n",&buf + 1) 的打印结果完全不同。
2023-04-18 19:34:00
431
原创 使用CJSON 解析JSON 结构体数组【典型】
一、CJSON数据结构定义#define cJSON_False 0#define cJSON_True 1#define cJSON_NULL 2#define cJSON_Number 3#define cJSON_String 4#define cJSON_Array 5 //数组#define cJSON_Object 6 //对象or键名typedef struct cJSON { struct cJSON *next,*prev; /*遍历数组或对象链的前向
2021-11-20 19:46:37
22164
2
原创 RT Thread studio同时生成bin和hex文件
一、RTT默认生成bin文件默认选择Raw binary,则项目对应的debug文件夹下生成bin文件;修改成intel的话,则项目对应的debug文件夹下生产hex文件;二、同时生成bin和hex文件项目 属性-C/C++构建-设置-构建步骤-命令arm-none-eabi-objcopy -O ihex"rtthread.elf" "rtthread.hex"...
2021-09-02 23:12:40
2541
1
原创 调度器锁rt_enter_critical() & rt_exit_critical()
一、函数说明void rt_enter_critical(void); /* 进入临界区*/调用这个函数后,调度器将被上锁。在系统锁住调度器的期间,系统依然响应中断,如果中断唤醒了的更高优先级线程,调度器并不会立刻执行它,直到调用解锁调度器函数才尝试进行下一次度。void rt_exit_critical(void); /* 退出临界区*/当系统退出临界区的时候,系统会计算当前是否有更高优先级的线程就绪,如果有比当前线程更高优先级的线程就绪,将切换到这个高优先级线程中执行;如果无更高优先级线
2021-08-17 12:38:43
4105
原创 快速排序qsort函数用法
一、qsort函数简介排序方法有很多种:选择排序,冒泡排序,归并排序,快速排序等。 看名字都知道快速排序是目前公认的一种比较好的排序算法。因为他速度很快,所以系统也在库里实现这个算法,便于我们的使用。 这就是qsort函数(全称quicksort)。它是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)。功能: 使用快速排序例程进行排序头文件:stdlib.h用法:void qsort(void* base,size_t nu.
2021-08-17 11:10:47
1111
原创 断言ASSERT使用详解
一、assert的定义原以为assert 仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错"在经过对其进行一定了解之后,对其作用及用法有了一定的了解,assert() 的用法像是一种"契约式编程",其表达的意思就是,程序在假设条件下,能够正常良好的运作,其实就相当于一个 if 语句:if(假设成立){ 程序正常运行;}else{ 报错&&终止程序!(避免由程序运行引起更大的错误) }但是这样写的话,就会有无数个 if 语句,甚至会出.
2021-08-07 13:25:14
802
原创 norflash和nandflash;SRAM和SDRAM
一、常见存储类型典型应用 名称 描述 MCU片内flash norflash nor flash数据线和地址线分开,可以实现ram一样的随机寻址功能,可以读取任何一个字节。但是擦除仍要按块(页)擦除。 因为按照字节寻址,所以程序可以在nor flash中运行。嵌入式系统多用一个小容量的nor flash存储引导代码。 U盘 nandflash nand flash同样是按块擦除,但是数据线和地址线复用,不能利用地址线随机寻址。读取只能按
2021-08-04 00:01:24
793
1
原创 电源引脚VDD、VSS、VDDA、VSSA、VREF+、VREF-、VBAT
总体电源框图一、名词解释名称 说明 备注 VCC 电路的供电正电压 一般表示模拟信号电源 GND 电路的供电负电压? 表示模拟信号地 VDD 芯片的工作正电压 表示数字信号电源 VSS 芯片的工作负电压 表示数字电源地 VDDA 芯片的工作正电压(模拟) VSSA 芯片的工作负电压(模拟) VDDD 芯片的工作正电压(数字) VSSD 芯片的工作负.
2021-08-03 17:35:50
32213
原创 线程同步之事件集event
一、事件集一个事件集中包含 32 个事件(一个 32 bit 无符号整型数),特定线程只等待、接收它关注的事件。可以是一个线程等待多个事件的到来(线程 1、2 均等待多个事件,事件间可以使用 “与” 或者 “或” 逻辑触发线程),也可以是多个线程等待一个事件的到来(事件 25)。当有它们关注的事件发生时,线程将被唤醒并进行后续的处理动作。在 RT-Thread 实现中,每个线程都拥有一个事件信息标记,它有三个属性,分别是RT_EVENT_FLAG_AND( 逻 辑 与 ) , RT_EVENT_
2021-05-12 14:01:53
2425
原创 互斥量之:与信号量区别;死锁;优先级翻转;递归锁
一、互斥量(一)互斥量的定义互斥量的状态只有两种,开锁或闭锁(两种状态值)。当有线程持有它后,互斥量将处于闭锁状态,由这个线程获得它的所有权。相反,当这个线程释放它时,将对互斥量进行开锁,失去它的所有权。当一个线程持有互斥量时,其他线程将不能够对它进行开锁或持有它,持有该互斥量的线程也能够再次获得这个锁而不被挂起。(二)互斥量的使用场合互斥量的使用比较单一,因为它是信号量的一种,并且它是以锁的形式存在。在初始化的时候,互斥量永远都处于开锁的状态,而被线程持有的时候则立刻转为闭锁的状态。互
2021-05-11 17:04:35
1620
原创 信号量使用之:线程间同步与互斥,线程与中断同步,资源计数
生产者与消费者问题本质是:解决线程间互斥关系和同步关系问题由于缓冲区是临界资源,它一个时刻只允许一个生产者放入消息,或者一个消费者从中取出消息,所以需要解决互斥访问的问题。同时生产者和消费者又是一个相互协作的关系,生产者生产以后,消费者才能消费,因此又存在一个同步问题。为了解决上述既互斥又同步的问题,需要定义如下3 个信号量分:①lock:信号量锁的作用,因为 2 个线程都会对同一个数组 array 进行操作,所以该数组是一个共享资源,锁用来保护这个共享资源。②empty:空位个数,初
2021-05-10 17:58:36
1129
原创 RT-Thread临界段之rt_hw_interrupt_enable和rt_hw_interrupt_disable
一、PRIMASKPRIMSK=1 ;关闭中断PRIMSK=10;打开中断二、void rt_hw_interrupt_enable(rt_base_t level);有参数,无返回值该功能将设置指定的中断状态,该状态应由rt_hw_intterrupt_disable函数保存。 如果保存的中断状态是中断打开,该功能将打开系统中断状态。三、rt_base_trt_hw_interrupt_disable(void);有返回值,无参数此功能将返回当前系统中断状态并禁用系统中断。返回..
2021-05-07 18:34:38
5887
原创 常用内存操作函数
常用内存操作函数常用内存操作函数1.设置内存数据2.复制内存数据3.移动内存数据4.比较内存数据5.对齐分配内存6.释放对齐分配的内存总结常用内存操作函数内存操作是C语言的基础,常用的内存操作函数大致可以分成如下6类1.设置内存数据代码如下(示例):void* rt_memset ( void * s, int c, rt_ubase_t count )函数功能:此函数将内存的内容设置为指定的值参数s 源内存的地址c 将要设定的值count 源内存要被
2020-12-21 00:50:22
1136
原创 short转换为char,提取单字节
本文描述:将两个字节长度的wdVersion,分别提取出低字节和高字节的值,此方法可以用于不同类型不同长度的单字节提取!(注释种的位操作的方法也可以,先 移位 后 位与 操作)wdVersion的类型为unsigned short。2字节取变量wdVersion(长度2字节)的第一个字节的值! 第一步,取首地址 &wdVersion 第二步,强制转换 (char*)&wdVersion 将2字节da...
2020-06-27 15:49:51
8004
原创 argc和argv,参数个数和参数值
argc:argument count 参数个数argv:argument value 参数值C/C++语言中的main函数,经常带有参数argc,argv,如下:int main(int argc, char** argv)int main(int argc, char* argv[])这两个参数的作用: argc 是指命令行输入参数的个数(以空白符分隔),而argv存储了所有的命令行参数 ;假如有一段程序是test.exe,如下所示#include <st...
2020-06-08 12:53:08
8605
1
原创 linux文件属性、文件权限管理和stat函数
1.linux中各种文件类型1.1 普通文件(-)regular file文本文件:文件中的内容都是由文本构成的,文本指的是ASCII码,Unicode码,utf8码等字符。其实,这些字符码的本质是数字(无论什么编码格式,对应的都是二级制的0和1)。常见的.c文件.h文件.txt文件等都是文本文件,其好处是可以被人轻松的编写和理解。二进制文件:二进制文件中存储的也是二进制的0和1,只不过这些数字并不是符合一定编码规则的数字,而是纯粹的数字0和1。gcc编译生成的a.out文件和arm-.
2020-06-04 00:44:57
1874
原创 linux中的文件IO、文件操作API、标准IO
1. 文件描述符fd2. 文件的打开,读文件,写文件3. OPEN函数的flag_13.1 文件的读写权限(O_RDONLY ; O_WRONLY ; O_RDWR )3.2 文件打开的内容操作(O_TRUNC ; O_APPEND)3.3 结束进程(exit;_exit;Exit)man 2 是系统调用 ; man 3 是库函数4. OPEN函数的flag_24.1 文件“创建打开”方式O_CREAT,不存在则创建(O_CREA...
2020-05-20 22:29:13
1122
原创 KEIL5 MDK5 快捷键 颜色 自动补全 设置
1. 快捷键设置1.1 点击工具栏右侧的小扳手configuration1.2 点击Short Keys标签,弹出快捷键设置页面1.3 左侧选中功能,右侧输入快捷键完成设置2. 自动补全设置2.1点击工具栏右侧的小扳手configuration2.2如下操作后,点击OK,重启MDK后生效3. 颜色设置3.1还是小扳手3.2选项卡选中“Colors&Fonts”即可设置...
2020-05-10 18:46:36
5981
原创 STM32标准库下外设的配置方式
使用STM32标准库,使用的功能如串口USART功能,DMA功能,NVIC功能,I2C功能,SPI功能等都有一个类似的配置流程。先定义端口和引脚(define),再定义初始化结构体(XX_InitTypeDef),然后配置初始化(XX_Config),最后使能一下即可(XX_Cmd)。1. 宏定义端口Port和引脚Pin(#define)1 /**2 * 串口宏定义,不同的串口挂载的总线和 IO 不一样,移植时需要修改这几个宏3 */4 5 // 串口 1-USART.
2020-05-10 18:34:26
1042
原创 删除单向链表的头节点
1、使用pTemp保存头节点的指针域(第二个节点的首地址),2、删除(free)头节点,3、再将pTemp传给新的pHead进而指向新的头节点。/**copyright(c) 2018,HH*All rights reserved.*作 者:HH*完成日期:2020年3月19日*版本号:v1.0**问题描述:生成一条包含5个节点的单向链表,然后从头部开始依次删除,...
2020-03-19 00:33:12
9927
1
原创 C语言位操作 - bit 、byte的清零,置1,提取,判断
一、位操作概述针对MCU的嵌入是开发中经常涉及到寄存器的操作,例如GPIO配置低寄存器GPIOx_CRL(共32个bit),有时需要改变其中的一位或者几位bit值,同时不能影响其它bit位的值。例如,需要设置第0位bit=1时,不能简单的设置为:GPIOx_CRL=0x01 ,这样的方法会使得低配置寄存器GPIOx_CRL的其它比特位都置为0。对于二进制位操作来说:不管该...
2020-03-12 19:08:32
52260
7
原创 删除单向链表的最后一个节点
分为三个步骤:1、找到倒数第二个内存,把它的指针域置为NULL;2、将最后一个节点所占用的内存(堆内存)释放掉;第一步:
2020-03-07 20:05:42
12851
2
原创 向单向链表中部插入节点
构造一条含有两个节点的单向链表:学生A,学生B单向链表的某一节点后插入,知道此节点的指针域next即可例如向节点A后插入,节点C: C.next = A.next; //A的下一个地址,就是B的地址;C连接B A.next = &C;//A连接C向单向链表中部插入“学生C”并输出新的完整的单向链表:学生A,学生C,学生B/**copyrigh...
2020-03-07 10:51:40
558
DL/t698.45国南网报文解析.zip
2020-10-27
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人