摘要:
日志等级 从zlog帮助文档以及zlog.h源码文件,容易知道zlog默认支持下面几个日志等级(优先级从低到高):DEBUG、INFO、NOTICE、WARN、ERROR、FATAL。 // zlog.h /* 日志消息等级 */ typedef enum { ZLOG_LEVEL_DEBUG = 阅读全文
摘要:
MDC MDC在log4j里解释为Mapped Diagnostic Context,其实就是一个键-值对表。一旦设置了,后面库可以帮你自动打印出来,或者成为文件名的一部分。 来看一个例子,来源于test/test_mdc.c // test/test_mdc.c #include <stdio.h 阅读全文
摘要:
zc_arraylist的设计思想 zc_arraylist数据结构 C++中有vector来表示动态列表(数组),C中如何实现呢? 通常,我们用这样一个数据结构,来表示一个动态列表: typedef struct { int *array; /* 数组指针 */ int len; /* 长度 */ 阅读全文
摘要:
zc_hashtable设计思想 哈希表(hash table),又叫散列表,是根据关键字和值(key-value)直接进行访问的数据结构。哈希表可实现O(1)查找时间复杂度,用于频繁查找的场景,能大大提高效率。哈希表通过关键字和一个映射函数hash(key) 计算出对应value,这个映射函数称为 阅读全文
摘要:
引入头文件 zlog所有接口都是线程安全的,使用时只需要包含头文件 #include "zlog.h" 初始化和清理 总览 ini zlog_init(const char *confpath); int zlog_reload(const char *confpath); void zlog_fi 阅读全文
摘要:
配置文件 zlog是一个通用日志库,基本功能跟专用日志库并没有本质区别。通用日志库,通过配置文件,来简化一些列日志使用和配置,以适应各种不同项目需求。而配置文件承载了这角色,为不同项目需求定制不同的功能,主要包括:把日志打印到哪儿去,用什么格式,如何转档等。 例如,一个完整的配置文件内容如下: # 阅读全文
摘要:
编译环境 我的编译环境(WSL1 + VS Code 1.71.0): OS: Linux 4.4.0 GCC: gcc 5.4.0 编译和安装zlog 下载或fork + clone https://github.com/HardySimpson/zlog 比如,这里是下载安装包zlog-late 阅读全文
摘要:
zlog是什么? zlog是一个高可靠、高性能、线程安全、灵活、概念清晰的纯C编写的开源日志库。 项目主页:http://hardysimpson.github.io/zlog/ github源码地址:https://github.com/HardySimpson/zlog 参考文档地址:http: 阅读全文
摘要:
例程源码exmaple1 本地源码路径freetype-2.10.2/docs/tutorial/example1.c or 官网地址:https://freetype.org/freetype2/docs/tutorial/example1.c 例程主要工作:在控制台打印一行字符串对应的用free 阅读全文
摘要:
矢量字体 什么是矢量字体? 点阵字库显示英文字母和汉字时,大小固定,如果放大或缩小,会出现模糊、锯齿等现象。为了解决该问题,可以使用矢量字体(Vector font)。矢量字体又叫Outline font,即轮廓字体。 矢量字体形成有3步: 1)确定关键点; 2)使用数学曲线(贝塞尔曲线)连接关键点 阅读全文
摘要:
思路 使用交叉编译器编译freetype库源码,将得到的头文件和库文件拷贝到交叉编译器所在目录,从而进行安装。 编译环境 交叉编译器:arm-linux-gnueabihf-gcc (gcc version 6.2.1 20161016 (Linaro GCC 6.2-2016.11)) EVK(评 阅读全文
摘要:
Makefile基础 Makefile规则与示例 简单的Makefile文件 一个简单的Makefile文件包含的一系列“规则”: 目标(target) ... : 依赖(prerequiries) ... <tab>命令(command) 如果“依赖文件”比“目标文件”更加新,那么执行“命令”来重 阅读全文
摘要:
LCD控制原理 Linux系统通过Framebuffer(帧缓冲)驱动程序控制LCD。显示设备也被称为帧缓冲设备。Frame表示帧,buffer表示缓冲。这就是说,Framebuffer是一块内存,里面存放着一帧图像,每帧图像包含每个像素颜色值。BPP,像素深度,指存储每个像素所用的位数,通常值为1 阅读全文
摘要:
工作队列work queue 工作队列(work queue)是中断下半部的一种实现机制,主要用于耗时任务处理,由内核线程代表进程执行。工作队列运行于进程上下文,因此允许阻塞。 运行工作队列的内核线程,称为工作者线程(worker thread),可以使用系统默认的,也可以自行创建(通常无必要理由不 阅读全文
摘要:
tasklet tasklet 是中断下半部的一种实现机制,主要用于小任务处理,耗时较短、不能阻塞的任务,用tasklet处理较合适。对于耗时较长,可以用work queue(工作队列)来处理。 tasklet和内核定时器timer_list都是通过软中断方式来实现的。 tasklet结构体 中断下 阅读全文
摘要:
内核定时器 软件意义的定时器依赖于硬件定时器来实现,内核在时钟中断发生后检测各定时器是否到期,到期后定时器处理函数将作为软中断在底半部执行。实质上,时钟中断处理程序会唤起TIMER_SOFTIRQ软中断,运行当前处理器上到期的所有定时器。 定时器数据结构与函数 Linux设备驱动编程中,可利用Lin 阅读全文
摘要:
基本概念 PinCtrl:Pin Controller,是一个虚拟概念,用于设置IOMUX,让某个引脚连接到指定模块,从而实现某个功能。不同于GPIO子系统,可用于GPIO功能、I2C功能等。 GPIO子系统:配置引脚输入、输出功能,设置方向等GPIO模块内功能。 不过,大多数的芯片并没有单独的IO 阅读全文
摘要:
工厂模式解决什么问题? 在C++中,通常,我们用构造函数创建对象。但这种方式存在几个限制: 没有返回值。构造函数不能返回结构,如果发生错误,调用者无法通过返回NULL指针得知。(不过可以在构造函数内抛出异常) 命名限制。C++要求构造函数名与所在类的名字相同,也就是说,如果我们调用了A类构造函数,那 阅读全文
摘要:
Linux驱动的软件架构 基本思想:将驱动与设备分离,具体来说,驱动只管驱动,设备只管设备,总线负责匹配设备和驱动,而驱动以标准途径拿到板级信息。 设备指与项目有关的板级信息,项目用到的板级资源;驱动指对芯片、对硬件的操作。 Linux字符设备驱动需要编写file_operations成员函数,并负 阅读全文
摘要:
在虚拟设备驱动中,分配一片大小为GLOBALMEM_SIZE(4KB)的内存空间,用于实现自定义的虚拟字符设备globalmem实例。 globalmem 没有任何实用价值,仅用于讲解问题。 globalmem设备驱动 头文件、宏、设备结构体 定义globalmem设备结构 #include <li 阅读全文