<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[xiaolz88的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/xiaolz88</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; xiaolz88]]></copyright><item><title><![CDATA[Framebuffer 驱动]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/144934011</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/144934011</guid><author>xiaolz88</author><pubDate>Sat, 04 Jan 2025 20:39:07 +0800</pubDate><description><![CDATA[Imx6 Framebuffer驱动]]></description><category></category></item><item><title><![CDATA[基于stm32移植使用u8g2 库]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/134491161</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/134491161</guid><author>xiaolz88</author><pubDate>Sun, 19 Nov 2023 15:36:07 +0800</pubDate><description><![CDATA[前面我已经写了如何使用stm32 使用软件IIC的方法驱动OLED，但是其实我们可以有更简单的使用方法，对于SSD1306 这款OLED 显示屏来说，其实已经有开源库可以直接使用了，我们只需要将对应的库移植过来，做一些简单的修改，即可以使用。为了大家学习方面，这些文章也会在我的微信公众号同步，方便大家随时查看，欢迎大家扫码关注。参考博客：https://www.cnblogs.com/frozencandles/p/16358483.html。]]></description><category></category></item><item><title><![CDATA[IIC 通信协议之stm32 驱动OLED]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/134490150</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/134490150</guid><author>xiaolz88</author><pubDate>Sun, 19 Nov 2023 15:18:33 +0800</pubDate><description><![CDATA[使用stm32 驱动4 Pin 的OLED， 现在网上开源的资料多的是，但是为了锻炼自己使用第一手资料的能力，今天我还是从数据手册开始，从头造一波轮子，同时也是为了加深自己对 IIC 协议的理解 ，本系列内容我会从单片机和linux两个板子做一些OLED的 验证，希望后面大家在学习IIC 相关内容的时候，可以少走一些弯路。为了大家学习方面，这些文章也会在我的微信公众号同步，方便大家随时查看，欢迎大家扫码关注。]]></description><category></category></item><item><title><![CDATA[c++中一种数据封装的技巧]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/133175132</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/133175132</guid><author>xiaolz88</author><pubDate>Fri, 22 Sep 2023 17:09:10 +0800</pubDate><description><![CDATA[在cpp 文件中详细定义了这个Impl的类；这种做法叫做piml 惯用法，它的主要作用是实现了对数据的隐藏。即当我们对外提供接口的时候，我们会以动态库和头文件的形式对外提供，我们只想通过头文件展示 我们对外提供的接口，其他的辅助接口以及数据都不需要对外展示，就可以通过这种方式实现。在c++ 中我们看到有的在class 声明了一个class Impl，并且声明了这个类型的一个指针 Impl *impl = nullptr;]]></description><category></category></item><item><title><![CDATA[使用meson 交叉编译glib 库的过程]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/129999608</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/129999608</guid><author>xiaolz88</author><pubDate>Thu, 06 Apr 2023 22:31:28 +0800</pubDate><description><![CDATA[背景：因为开发需要使用glib, 所以需要将glib交叉编译到我自己的开发板中。]]></description><category></category></item><item><title><![CDATA[嵌入式开发板_ubuntu_windows 互通完美解决]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/126594837</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/126594837</guid><author>xiaolz88</author><pubDate>Mon, 29 Aug 2022 23:40:18 +0800</pubDate><description><![CDATA[开发板_windows_ubuntu 互通完美解决]]></description><category></category></item><item><title><![CDATA[sqlite 基本语法小记]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/120772065</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/120772065</guid><author>xiaolz88</author><pubDate>Sat, 16 Oct 2021 11:20:14 +0800</pubDate><description><![CDATA[sqlite 的数据类型

sqlite 的常见操作
（1）第一种方式：sqlite3 databaseName.db   --直接创建数据库
（2）第二种方式：.open databaseName.db  --如果数据库不存在，就创建之后打开它
创建成功之后，可以使用.databases 来查看是否在数据库列表中
.databases
3.当在同一时间有多个数据库可用，您想使用其中的任何一个。SQLite 的 ATTACH DATABASE 语句是用来选择一个特定的数据库，使用该命令后，所有的 SQLi.]]></description><category></category></item><item><title><![CDATA[IO多路复用 epoll 以及 epoll反应堆模型]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/120515098</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/120515098</guid><author>xiaolz88</author><pubDate>Mon, 27 Sep 2021 20:00:15 +0800</pubDate><description><![CDATA[一 	 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]]></description><category></category></item><item><title><![CDATA[内功修炼(二)-------数据结构：线性表]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/119833460</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/119833460</guid><author>xiaolz88</author><pubDate>Sat, 21 Aug 2021 00:02:22 +0800</pubDate><description><![CDATA[接上一篇博客内容:
https://blog.youkuaiyun.com/xiaolz88/article/details/119194749
上一篇讲的是线性表的数组方式实现，接下来是使用链表对实现线性表；
废话不多说，直接上代码：


typedef void Linklist;

/*定义的链表节点*/
typedef struct _tag_linklistnode
{
	struct _tag_linklistnode *next;
}LinklistNode;

/*
* brief 创建链表
* pa.]]></description><category></category></item><item><title><![CDATA[内功修炼(一)-------数据结构：线性表]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/119194749</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/119194749</guid><author>xiaolz88</author><pubDate>Fri, 20 Aug 2021 23:47:43 +0800</pubDate><description><![CDATA[1.线性表定义
线性表是0个或者多个数据元素的集合；
线性表中的元素之间是有顺序的；
线性表中的数据元素个数是有限的；
线性表中的数据元素的类型必须相同；
性质：
抽象表达：线性表是a0,a1,a2…,an;有序的数据元素集合，其中a0是线性表的第一个元素，只有一个后继；
an是线性表的最后一个元素，只有一个前驱，除了a0和an外的其他元素都是即有前驱，又有后继，线性表能够逐项访问和顺序存储；
1.1.1 线性表的操作

...]]></description><category></category></item><item><title><![CDATA[类模板与友元函数]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/118978357</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/118978357</guid><author>xiaolz88</author><pubDate>Wed, 21 Jul 2021 22:40:22 +0800</pubDate><description><![CDATA[一. 类模板中全局函数类内实现
template &lt;typename T1, typename T2&gt;
class Person
{
	
	
public:
	Person(T1 name, T2 age)
	{
		this-&gt;m_name = name;
		this-&gt;m_age = age;
	}
#if 0
	//全局函数类内实现
	friend void printPerson(Person&lt;T1, T2&gt; &amp;p)
	{
		std::cout &lt]]></description><category></category></item><item><title><![CDATA[C++实战案例----基于多态的企业员工管理系统]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/118686341</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/118686341</guid><author>xiaolz88</author><pubDate>Mon, 12 Jul 2021 23:38:01 +0800</pubDate><description><![CDATA[前言：
本案例是b站黑马C++视频教程里面的，本人学了一段时间的C++，然后也看一了部分视频，然后按照视频讲义在linux环境下敲了一遍。本人感觉学习C++语言还是要勤动手才行；
一. 本项目通过手动敲一遍培养了自己的C++代码的手感，毕竟以前是写C代码的，起初写C++代码还是有点不太习惯，但是通过本项目的训练，我觉得自己已经慢慢培养了C++代码的手感；
二.写代码代码的需求：
可以通过视频的讲义中查看：
本教程主要利用C++来实现一个基于多态的职工管理系统



公司中职工分为三类：普通员工、经理、老板，]]></description><category></category></item><item><title><![CDATA[c++ -- 多态的含义、原理剖析]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/118501080</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/118501080</guid><author>xiaolz88</author><pubDate>Tue, 06 Jul 2021 00:07:10 +0800</pubDate><description><![CDATA[一. C++中的多态
1.在c++中多态分为动态哦多态和静态多态；
静态多态：像函数重载和运算符重载就是静态多态，一个显著的特点就是复用函数名；
动态多态：派生类和虚函数实现运行时多态；
2.动态多态和静态多态的区别
静态多态函数地址早绑定—在编译阶段就已经确定了函数的地址；
动态多态函数地址晚绑定—在运行阶段确定函数地址；
class Animal
{
public:
	void speek(void)
	{
		printf("animal speek\n");
	}
};

class Cat:pub]]></description><category></category></item><item><title><![CDATA[Linux IO多路复用--select]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/118345521</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/118345521</guid><author>xiaolz88</author><pubDate>Wed, 30 Jun 2021 23:37:35 +0800</pubDate><description><![CDATA[一.IO多路复用的目的
在linux中IO多路复用的一个目的就是让应用程序在一个进程同时检查多个文件描述符，看这些文件描述符是否准备好了执行IO操作(看IO系统调用是否可以非阻塞地执行)。实际上这些操作都不会执行实际的IO操作，他们只是告诉我们某个文件描述符已经处于就绪状态了，我们需要调用其他的接口来完成实际的IO操作。
在linux中为我们提供了三种技术:select,poll,epoll;

1.1 三种技术的优缺点：

优点:select 和 poll存在时间比较长，具有较好的可移植性；
缺点：在同时]]></description><category></category></item><item><title><![CDATA[linux线程同步机制二:条件变量(Condition Variable)]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/118122277</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/118122277</guid><author>xiaolz88</author><pubDate>Wed, 23 Jun 2021 23:42:44 +0800</pubDate><description><![CDATA[一.条件变量的使用场景
1.1 在生产者-消费者模型中，生产者线程负责生成一些“产品单元”来供主线程消费。主线程则使用while()不停的查询是否有“产品单元”可供消费。这样的编程模式会造成CPU资源浪费。如果采用条件变量的机制，就不存在这一问题了。允许主线程休眠，直到等到另一线程的信号通知再去执行其他的一些动作。
1.2. 在实际使用的场景中，条件变量经常结合互斥量来使用。条件变量就共享变量的状态改变发出通知，而互斥量则提供对该共享变量访问的互斥。
二. 条件变量的类型
2.1 静态分配的条件变量
条件变]]></description><category></category></item><item><title><![CDATA[linux同步机制_互斥量(mutex)]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/118097867</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/118097867</guid><author>xiaolz88</author><pubDate>Tue, 22 Jun 2021 01:28:07 +0800</pubDate><description><![CDATA[一.linux中线程间通信同步机制方法1——互斥量(mutex)
1.为啥要有互斥量？
在linux编程享受多线程带来便利的同时，也需要注意多线程在访问一段共享资源的代码片段(术语:临界区)，这段代码的执行不应该被其他线程中断，要保证这段代码的执行是原子操作。
其中linux中的互斥量就可以保证多线程对共享资源访问的时的原子操作。当然还有其他的方法，比如：条件变量。本文我们只介绍互斥量(mutex).
二.互斥量的使用方法
2.1.静态分配的互斥量且使用默认属性
初始化直接使用PTHREAD_MUTEX_I]]></description><category></category></item><item><title><![CDATA[基于C语言实现的一个ftp_client demo]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/118076265</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/118076265</guid><author>xiaolz88</author><pubDate>Sun, 20 Jun 2021 22:27:40 +0800</pubDate><description><![CDATA[一 .FTP协议
FTP全称：文件传输协议(File Transfer Protocol)， 不同于普通的C/S通信方式，ftp协议是建立两个链路去传输数据和控制消息。
有两种工作模式:主动连接模式(PORT)和被动连接模式(PASV),这两种工作方式的描述都是从服务器角度出发描述的。简单来说就是：服务器主动连接客户端，这就是主动模式；如果是客户端主动去连接服务器就是被动模式。
主动模式：客户端随机打开一个大于1024的端口N向服务器命令端口(21),发起连接，同时开放N+1端口监听，并向服务器发出“por]]></description><category></category></item><item><title><![CDATA[tcp多进程并发服务器]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/115152316</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/115152316</guid><author>xiaolz88</author><pubDate>Tue, 23 Mar 2021 23:57:22 +0800</pubDate><description><![CDATA[1.多进程并发服务器需要注意的点就是回收子进程的资源

2.使用linux下的nc命令可以测试连接效果



#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;unistd.h&gt;
#include &lt;errno.h&gt;
#include &lt;signal.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;s.]]></description><category></category></item><item><title><![CDATA[git 常用命令学习]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/105171756</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/105171756</guid><author>xiaolz88</author><pubDate>Sat, 04 Apr 2020 16:09:46 +0800</pubDate><description><![CDATA[首先使用的ubuntu系统安装好git，安装的教程很多，在此不再赘述；

1. 配置环境：

git config --global user.name = "自己的名字"

git config --global user.email = "自己的邮箱"

 配置完成之后，可以使用 git config -l 命令 查看配置的环境

2. 创建本地版本库

（1）创建一个空的目录， git ...]]></description><category></category></item><item><title><![CDATA[ubuntu16.04 搭建http服务器总结]]></title><link>https://blog.youkuaiyun.com/xiaolz88/article/details/103883412</link><guid>https://blog.youkuaiyun.com/xiaolz88/article/details/103883412</guid><author>xiaolz88</author><pubDate>Tue, 07 Jan 2020 23:30:28 +0800</pubDate><description><![CDATA[一 环境：ubuntu 16.04

  任务：基于ubuntu搭建http服务器，可以远程访问该服务器。

参考：

   (1)https://blog.youkuaiyun.com/cfycyf/article/details/79420007

   (2)https://blog.youkuaiyun.com/qq_38240926/article/details/99610158


...]]></description><category></category></item></channel></rss>