自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 linux -- do{...}while(0)作用

do能确保大括号里的逻辑被执行,while(0)确保该逻辑只能被执行一次。这个宏的好处与作用?example 1:#define middle(x) up(x); down(x)调用 middle(aaa)该宏被扩展成up(aaa); down(aaa)放在函数中使用:if (bbb) middle(aaa);被扩展成if (bbb) up(aaa); down(aaa);这样就违背了初衷但加上了do while,就能正常运行。为什么不直接用 { }呢?exampl

2020-12-14 15:03:15 379

原创 linux kernel --- dts概念及编写

dts:device tree source一、dts的加载过程dts加载:dts通过dtc编译成dtb。在系统启动时,u-boot可以将保存在flash中的dtb copy到内存,并将dtb的地址传递给kernel二、dts中符号的含义

2020-12-08 16:31:17 1235

原创 linux kernel --- dts的相关操作函数

linux kernel — dts以及相关of函数

2020-12-07 14:28:22 4943

原创 C语言笔记 -- char*,char**,char a[],char *a[]

https://blog.csdn.net/liusicheng2008_liu/article/details/80412586主要讲跟 int 不一样的地方字符数组与字符指针的区别1、定义了一个char * char ** char *[]字符串 “hello,world” 的类型是char *定义了二重指针的使用const char **strings;//strings是二维数组strings = kzalloc(sizeof(**strings), GFP_KERNEL);//一定

2020-12-05 15:53:40 816

原创 linux kernel --- 延迟函数udelay msleep usleep_range...

linux 驱动开发过程中,经常会用到延迟函数:udelay,mdelay,usleep,msleep,usleep_range…一、mdelay和msleep的本质区别1、从模块本身分析:mdelay,属于忙等待函数(相当于for循环),在延迟过程中无法运行其他任务,这个时间是准确的,需要等待多少实际就会等待多少时间;msleep,属于休眠函数,不会忙等待,时间是不准确的,比如msleep(200),大概率是会等待多于200ms的。2、从系统角度分析:mdelay,会占用系统资源,导致其他功能

2020-11-24 17:39:34 12283

原创 linux 电源管理 --- clock

一、时钟的概念时钟是以固定频率传输的信号发生器。二、为什么要使用时钟呢?因为在数据传输过程中,只有对时序进行严格的定义和要求,才能保证数据在传输的过程中不出差错,而在此期间时钟信号充当了这一时序的基准。我们可以用它来确认其他信号的宽度,也用它来保证收发数据的同步。还要看外设是挂在什么总线上,比如AHB APB AXI…不同的外设可能挂在不同的总线上,基准时钟就会不一样。三、clock相关器件clock相关的器件包括:用于产生clock的Oscillator(有源振荡器,也称作谐振荡器)或者Cry

2020-11-16 16:29:57 871

原创 linux kernel --- checksum相关ip_summed和feature字段解释

checksum

2020-11-16 14:50:39 1951

原创 Linux 内存管理 --- DMA

https://blog.csdn.net/jasonchen_gbd/article/details/79462064

2020-11-13 21:15:49 1445

原创 linix kernel --- 注册驱动 module_platform_driver

一、code 基本框架static const struct of_device_id sgo_drv_match[] = { { .compatible = "sgo_comp", .data = &sgo_data}, { }};MODULE_DEVICE_TABLE(of, sgo_drv_match);//可无static struct dev_pm_ops sgo_pm_ops = { .suspend_noirq = sgo_suspend, .resume_noirq

2020-10-19 15:09:41 325

原创 UDP 协议头部格式

以下定义是在kernel4.14中1、结构struct udphdr { __be16 source; __be16 dest; __be16 len; __sum16 check;};2、含义source:16位源端口;这个字段占据 UDP 报文头的前 16 位,通常包含发送数据报的应用程序所使用的 UDP 端口。接收端的应用程序利用这个字段的值作为发送响应的目的地址。这个字段是可选的,所以发送端的应用程序不一定会把自己的端口号写入该字段中。如果不写入端口号,则把这个字段设置为 0。这

2020-09-29 14:49:04 1291

原创 TCP 协议头部格式

ipv4

2020-09-29 14:38:55 571

原创 IP 协议头部格式

ipv6

2020-09-29 14:03:38 1089

原创 C语言笔记 -- 结构体成员前加 . 点

加 “.”的话可以不考虑赋值顺序,表示在这个结构体中选择这个变量来赋值,所以可以不考虑结构体中变量的顺序

2020-08-21 17:48:18 5375 3

原创 C语言笔记 -- 数组 结构体 名称与地址

struct sipa_dele_smsg_work_type { int b; struct sipa_delegator *delegator; int c;};struct sipa_delegator { int a; struct sipa_dele_smsg_work_type reg_work;};void func1(struct sipa_delegator *delegator){

2020-08-21 17:25:30 2435 1

原创 linux kernel --- per_cpu

一、 为什么要有 per_cpu1、 在多CPU的前提下,每个core有各自的数据,不会进行交互,但是对这些数据有共同的处理方法。2、为了保持每个cpu独立的处理自己的任务,不给其他cpu带来困扰。对于共同结构的数据,进行per_cpu 编程处理,有自己私有的数据段。3、如果没有 per_cpu 变量,当多个cpu要对同一个数据进行处理时,需要在处理时加锁,有了per_cpu,就省去了加锁步骤。二、 几个 API1、devm_alloc_percpu#define devm_alloc_perc

2020-08-10 19:28:10 474

原创 C语言笔记 -- extern 使用

含义extern 表明函数或变量是在其他文件中定义的用法在 a.c 中 int a = 5; 在 b.c 中 extern int a;如果不想要其他.c文件包含该文件中的变量,在变量前加上 static 即可参考: https://blog.csdn.net/qq_27664167/article/details/82859852...

2020-08-10 15:09:14 175

原创 linux kernel --- sysfs文件系统

sysfs 作为内核中的一种内存文件系统,其作用主要是用来让内核空间和用户空间进行交互。其挂载在/sys下。sysfs的信息来源是kobject层次结构,读一个sysfs文件,就是动态的从kobject结构提取信息,生成文件。kobject层次结构就是linux的设备模型。以下源码分析是在kernel4.14上一、 sysfs_create_filestatic inline int __must_check sysfs_create_file(struct kobject *kobj,const

2020-08-07 18:06:09 2932 1

原创 linux kernel 同步机制 -- completion完成量

在linux内核中,引入锁机制主要是解决资源并发与竞争问题;主要常用锁机制:信号量,自旋锁,互斥锁;线程间的 同步大多使用completion信号量,而互斥资源的保护大多使用自旋锁和互斥锁。.该篇文章主要讲解的是completion完成量。也算是信号量中的一种。completion信号量是一个轻量级的机制,它允许一个线程告诉另一个线程某个工作已经做完了。一般信号量的的处理会限制在一个函数内,但是有时候函数A的处理的前提条件是函数B,A必须等待B处理后才能继续,可以用信号量来进行处理,但linux

2020-08-05 20:59:39 1073 1

原创 linux kernel --- cpumask and 设置irq的affinity

以下分析的源码是在kernel4.14中1. struct cpumask 结构typedef struct cpumask { DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;#define DECLARE_BITMAP(name,bits) \ unsigned long name[BITS_TO_LONGS(bits)] //kernel4.14/include/linux/types.h#define BITS_TO_LONGS(nr) DIV_

2020-08-04 13:23:48 3056

原创 linux kernel --- struct list_head 结构

内核中采用链表来管理对象,内核中对链表的定义如下

2020-07-18 19:05:29 288

空空如也

空空如也

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

TA关注的人

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