- 博客(31)
- 资源 (2)
- 收藏
- 关注
原创 基于stm32移植使用u8g2 库
前面我已经写了如何使用stm32 使用软件IIC的方法驱动OLED,但是其实我们可以有更简单的使用方法,对于SSD1306 这款OLED 显示屏来说,其实已经有开源库可以直接使用了,我们只需要将对应的库移植过来,做一些简单的修改,即可以使用。为了大家学习方面,这些文章也会在我的微信公众号同步,方便大家随时查看,欢迎大家扫码关注。参考博客:https://www.cnblogs.com/frozencandles/p/16358483.html。
2023-11-19 15:36:07
523
1
原创 IIC 通信协议之stm32 驱动OLED
使用stm32 驱动4 Pin 的OLED, 现在网上开源的资料多的是,但是为了锻炼自己使用第一手资料的能力,今天我还是从数据手册开始,从头造一波轮子,同时也是为了加深自己对 IIC 协议的理解 ,本系列内容我会从单片机和linux两个板子做一些OLED的 验证,希望后面大家在学习IIC 相关内容的时候,可以少走一些弯路。为了大家学习方面,这些文章也会在我的微信公众号同步,方便大家随时查看,欢迎大家扫码关注。
2023-11-19 15:18:33
887
原创 c++中一种数据封装的技巧
在cpp 文件中详细定义了这个Impl的类;这种做法叫做piml 惯用法,它的主要作用是实现了对数据的隐藏。即当我们对外提供接口的时候,我们会以动态库和头文件的形式对外提供,我们只想通过头文件展示 我们对外提供的接口,其他的辅助接口以及数据都不需要对外展示,就可以通过这种方式实现。在c++ 中我们看到有的在class 声明了一个class Impl,并且声明了这个类型的一个指针 Impl *impl = nullptr;
2023-09-22 17:09:10
304
原创 sqlite 基本语法小记
sqlite 的数据类型sqlite 的常见操作(1)第一种方式:sqlite3 databaseName.db --直接创建数据库(2)第二种方式:.open databaseName.db --如果数据库不存在,就创建之后打开它创建成功之后,可以使用.databases 来查看是否在数据库列表中.databases3.当在同一时间有多个数据库可用,您想使用其中的任何一个。SQLite 的 ATTACH DATABASE 语句是用来选择一个特定的数据库,使用该命令后,所有的 SQLi.
2021-10-16 11:20:14
799
原创 IO多路复用 epoll 以及 epoll反应堆模型
一 IO多路复用epoll相关接口1.int epoll_create(int size);功能:创建一个epoll句柄size: 用来告诉内核这个监听的数目一共有多大,参数 size 并不是限制了 epoll 所能监听的描述符最大个数,只是对内核初始分配内部数据结构的一个建议值;2.int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);功能:对要操作的文件fd进行上树或者下树操作;epfd: 是epoll_c
2021-09-27 20:00:15
1224
原创 内功修炼(二)-------数据结构:线性表
接上一篇博客内容:https://blog.youkuaiyun.com/xiaolz88/article/details/119194749上一篇讲的是线性表的数组方式实现,接下来是使用链表对实现线性表;废话不多说,直接上代码:typedef void Linklist;/*定义的链表节点*/typedef struct _tag_linklistnode{ struct _tag_linklistnode *next;}LinklistNode;/** brief 创建链表* pa.
2021-08-21 00:02:22
107
原创 内功修炼(一)-------数据结构:线性表
1.线性表定义线性表是0个或者多个数据元素的集合;线性表中的元素之间是有顺序的;线性表中的数据元素个数是有限的;线性表中的数据元素的类型必须相同;性质:抽象表达:线性表是a0,a1,a2…,an;有序的数据元素集合,其中a0是线性表的第一个元素,只有一个后继;an是线性表的最后一个元素,只有一个前驱,除了a0和an外的其他元素都是即有前驱,又有后继,线性表能够逐项访问和顺序存储;1.1.1 线性表的操作...
2021-08-20 23:47:43
115
原创 类模板与友元函数
一. 类模板中全局函数类内实现template <typename T1, typename T2>class Person{ public: Person(T1 name, T2 age) { this->m_name = name; this->m_age = age; }#if 0 //全局函数类内实现 friend void printPerson(Person<T1, T2> &p) { std::cout <
2021-07-21 22:40:22
183
原创 C++实战案例----基于多态的企业员工管理系统
前言:本案例是b站黑马C++视频教程里面的,本人学了一段时间的C++,然后也看一了部分视频,然后按照视频讲义在linux环境下敲了一遍。本人感觉学习C++语言还是要勤动手才行;一. 本项目通过手动敲一遍培养了自己的C++代码的手感,毕竟以前是写C代码的,起初写C++代码还是有点不太习惯,但是通过本项目的训练,我觉得自己已经慢慢培养了C++代码的手感;二.写代码代码的需求:可以通过视频的讲义中查看:本教程主要利用C++来实现一个基于多态的职工管理系统公司中职工分为三类:普通员工、经理、老板,
2021-07-12 23:38:01
463
3
原创 c++ -- 多态的含义、原理剖析
一. C++中的多态1.在c++中多态分为动态哦多态和静态多态;静态多态:像函数重载和运算符重载就是静态多态,一个显著的特点就是复用函数名;动态多态:派生类和虚函数实现运行时多态;2.动态多态和静态多态的区别静态多态函数地址早绑定—在编译阶段就已经确定了函数的地址;动态多态函数地址晚绑定—在运行阶段确定函数地址;class Animal{public: void speek(void) { printf("animal speek\n"); }};class Cat:pub
2021-07-06 00:07:10
222
原创 Linux IO多路复用--select
一.IO多路复用的目的在linux中IO多路复用的一个目的就是让应用程序在一个进程同时检查多个文件描述符,看这些文件描述符是否准备好了执行IO操作(看IO系统调用是否可以非阻塞地执行)。实际上这些操作都不会执行实际的IO操作,他们只是告诉我们某个文件描述符已经处于就绪状态了,我们需要调用其他的接口来完成实际的IO操作。在linux中为我们提供了三种技术:select,poll,epoll;1.1 三种技术的优缺点:优点:select 和 poll存在时间比较长,具有较好的可移植性;缺点:在同时
2021-06-30 23:37:35
376
原创 linux线程同步机制二:条件变量(Condition Variable)
一.条件变量的使用场景1.1 在生产者-消费者模型中,生产者线程负责生成一些“产品单元”来供主线程消费。主线程则使用while()不停的查询是否有“产品单元”可供消费。这样的编程模式会造成CPU资源浪费。如果采用条件变量的机制,就不存在这一问题了。允许主线程休眠,直到等到另一线程的信号通知再去执行其他的一些动作。1.2. 在实际使用的场景中,条件变量经常结合互斥量来使用。条件变量就共享变量的状态改变发出通知,而互斥量则提供对该共享变量访问的互斥。二. 条件变量的类型2.1 静态分配的条件变量条件变
2021-06-23 23:42:44
417
原创 linux同步机制_互斥量(mutex)
一.linux中线程间通信同步机制方法1——互斥量(mutex)1.为啥要有互斥量?在linux编程享受多线程带来便利的同时,也需要注意多线程在访问一段共享资源的代码片段(术语:临界区),这段代码的执行不应该被其他线程中断,要保证这段代码的执行是原子操作。其中linux中的互斥量就可以保证多线程对共享资源访问的时的原子操作。当然还有其他的方法,比如:条件变量。本文我们只介绍互斥量(mutex).二.互斥量的使用方法2.1.静态分配的互斥量且使用默认属性初始化直接使用PTHREAD_MUTEX_I
2021-06-22 01:28:07
494
原创 基于C语言实现的一个ftp_client demo
一 .FTP协议FTP全称:文件传输协议(File Transfer Protocol), 不同于普通的C/S通信方式,ftp协议是建立两个链路去传输数据和控制消息。有两种工作模式:主动连接模式(PORT)和被动连接模式(PASV),这两种工作方式的描述都是从服务器角度出发描述的。简单来说就是:服务器主动连接客户端,这就是主动模式;如果是客户端主动去连接服务器就是被动模式。主动模式:客户端随机打开一个大于1024的端口N向服务器命令端口(21),发起连接,同时开放N+1端口监听,并向服务器发出“por
2021-06-20 22:27:40
941
3
原创 tcp多进程并发服务器
1.多进程并发服务器需要注意的点就是回收子进程的资源2.使用linux下的nc命令可以测试连接效果#include <stdio.h>#include <stdlib.h>#include <arpa/inet.h>#include <unistd.h>#include <errno.h>#include <signal.h>#include <sys/types.h>#include <s.
2021-03-23 23:57:22
317
原创 git 常用命令学习
首先使用的ubuntu系统安装好git,安装的教程很多,在此不再赘述;1. 配置环境:git config --global user.name = "自己的名字"git config --global user.email = "自己的邮箱" 配置完成之后,可以使用 git config -l 命令 查看配置的环境2. 创建本地版本库(1)创建一个空的目录, git ...
2020-04-04 16:09:46
195
原创 ubuntu16.04 搭建http服务器总结
一 环境:ubuntu 16.04 任务:基于ubuntu搭建http服务器,可以远程访问该服务器。参考: (1)https://blog.youkuaiyun.com/cfycyf/article/details/79420007 (2)https://blog.youkuaiyun.com/qq_38240926/article/details/99610158...
2020-01-07 23:30:28
1755
原创 ubuntu16.04 搭建ftp服务器总结
一 环境:ubuntu 16.04 任务:基于ubuntu搭建ftp 服务器,可以远程访问该服务器。参考: (1)https://www.cnblogs.com/YangJieCheng/p/8252577.html 第一步: 首先保证ubuntu可以访问外网: 验证方法:基于shell 终端,ping www.baidu.......
2020-01-05 17:16:55
622
原创 GNU的扩展属性之__attribute__的函数扩展属性
1、 在碰到这个问题以前,在学习linux的启动时也知道main函数之前也会执行很多的初始化相关的程序,但是今天在一个应用程序中碰到了一个现象,就是函数的执行在main之前,废话不多说先写一个demo程序:#include <stdio.h>__attribute__((constructor)) void before(void){ printf("run...
2019-06-19 23:26:51
255
原创 linux常用知识点小记
1、linux中使用 -I来指定头文件所在的路径;2、可以在某个目录下查找:例如在/usr/include 目录下查找EXIT_结尾的宏定义,可以用grep EXIT_ *.h3、在linux中库是预先编译好的一组函数的集合,他们是按照可重用的原则编写的。在linux中标准库文件一般存储在/usr/lib和/lib目录下面。linux中库的名字是有一定的规则的:以lib开始,后面表示的具体...
2019-06-12 22:54:52
192
原创 linux命令行参数解析函数----getopt()函数的使用学习
今天在看代码时发现getopt函数的一段代码,从网上找了相关的博客,学会了该函数的基本使用方法。总结记录如下:1、这个函数在linux命令行下:可以使用man 3 getopt 来查看对该函数的介绍:int getopt(int argc, char * const argv[], const char *optstring);该函数有三个参数:其中前...
2019-06-07 23:41:28
471
原创 Makefile文件中的wildcard、patsubst、notdir、obj=(dir:%.c=%.o)的用法学习
1、今天在看Makefile文件的时候看到了一个BUILD_SO = $(LSRCS:%.c=$(BUILD_DIR)/%.o) ,不太明白这个具体是什么含义。在网上找了一下根据前人的分享,自己也记录一下: BUILD_SO = $(LSRCS:%.c=$(BUILD_DIR)/%.o) ,这句代码的意思将变量LSRCS中所有的以.c结尾的文件都用目录BUILD_DIR下的.o替换。另...
2019-06-07 13:23:34
3112
原创 git 常用命令学习
我的环境:ubuntu14.04 + git 1.9.1git的安装:ubuntu能够上网,使用apt-get install git 命令安装。1.安装完成之后,首先需要设置名字和邮箱地址:git config --global user.name "xiaoyuzhou"git config --global user.emial "your email@example.c...
2019-06-02 22:35:05
158
原创 Makefile学习笔记
Makefile是做Linux方向经常用到的文件,Makefile主要用来管理代码的编译,代码的编译顺序,以及在后期某个文件发生变动,就只编译该文件,而不用所有文件都编译一次;Makefile的编写基本是一劳永逸的,编写一次,后面基于该Makefile做相应的修改即可。 Makefile文件一般可以命名为Makefile或者makefile,在linux内核中一般是选用的前...
2019-05-10 22:31:28
146
原创 STM32 软件模拟SPI时序驱动NRF24L01
其实stm32本身的硬件SPI也很好用,但是还是想用软件来模拟一下PSI的时序。 SPI 是一种高速的,全双工,同步串行的通信总线。SPI通信方式相当于是一个环形结构,由CSN、MISO、MOSI、SCLK四线组成,主要是在SCLK时钟线的驱动下,进行数据转换。 接下来直接上程序配置: 使用32模拟SPI时序的IO口配置,应该注意的是MISO应该选择模拟输入方式GPIO_Mode_
2017-07-11 10:07:39
12555
3
原创 DMA+ADC单通道转换、多通道转换
在stm32中,使用ADC时往往采用DMA传输方式,由DMA把转换的数据传输到SRAM,再进行处理。 一、单通道转换 本章节选用ADC1进行配置实验: ADC通道与GPIO对应表: ADC结构体成员变量: typedef struct { uint32_t ADC_Mode; FunctionalState ADC_ScanConvMode; FunctionalState A
2017-07-01 18:38:55
3916
原创 DMA +串口通信
DMA,全称为: Direct Memory Access,即直接存储器访问, DMA 传输将数据从一个地址空间复制到另外一个地址空间。 当 CPU 初始化这个传输动作,传输动作本身是由DMA 控制器 来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的 内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。 DMA 传输对于高效能嵌入式系统算法和网络是很
2017-06-28 16:15:16
2382
原创 C 语言位操作
1、对某位清零操作 将一个char 类型的变量a的第七位清零操作: a &=~(1<<6); //1 左移六位 得到二进制数 0100 0000 //按位取反 得到二进制数 1011 1111 所得的数与a 做”&”运算 //a的第7位被置 0 其他位保持不变 2、置1 操作 a
2017-06-27 18:19:10
524
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人