自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 make/Makefile学习之三Makefile文件中各类函数的使用

make/Makefile学习之三Makefile文件中各类函数的使用一、文件名操作函数1.1、取目录函数说明本小节所有实例主要采用Linux-Kernel-4.13中的首Makefie源码片断,未采用部分,在案例中备注了源码出处实现中Makefile文件路径为:/opt/linux-kernel/linux-kernel-4.13/linux-4.13一、文件名操作函数1.1、取目录函数1、语法:$(dir <string)2、功能:从字符串(或变量)中根据文件名反回对应的目录3、举

2020-09-16 20:44:38 579

原创 make/Makefile学习之二Makefile文件中条件判断和字符串处理函数的使用

Makefile文件中条件判断和函数的使用一、条件判断语句1.1 ifeq 判断条件是否相等,相等则向下执行1.2 ifneq 判断条件是否不相等,不相等则向下执行一、条件判断语句1.1 ifeq 判断条件是否相等,相等则向下执行1、语法: ifeq (<argv1> , <argv2>) #最常用 ifeq '<argv1> , <argv2>' ifeq "<argv1>

2020-09-13 19:33:21 9021 1

原创 make/Makefile学习之一Makefile文件书写规则

make/

2020-09-12 13:47:06 497

原创 嵌入式LINUX驱动学习之15 i2c代码举例(三轴加速度传感器MMA8653)方式二

嵌入式LINUX驱动学习之15 i2c代码举例(三轴加速度传感器MMA8653)方式二一、代码举例二、用户空间程序(参考方式一)本实例是通过i2c_new_device函数添加I2C设备,相比于板级添加,减少了去源码中查看启动函数的麻烦一、代码举例#include <linux/init.h>#include <linux/module.h>#include <linux/i2c.h>#include <linux/fs.h>#include &

2020-09-08 10:07:07 310

原创 嵌入式LINUX驱动学习之15 i2c代码举例(三轴加速度传感器MMA8653)方式一

嵌入式LINUX驱动学习之15 i2c代码举例(三轴加速度传感器MMA8653)一、软件驱动代码二、用户空间代码举例一、软件驱动代码功能:读取mma8653的x,y,z轴数值,并传递给用户空间#include <linux/init.h>#include <linux/module.h>#include <linux/i2c.h>#include <linux/fs.h>#include <linux/miscdevice.h>#i

2020-09-06 13:08:22 407

原创 嵌入式LINUX驱动学习之15 i2c总线源码分析

嵌入式LINUX驱动学习之15 i2c总线源码分析(一)一、i2c设备的注册1.1、struct i2c_board_info结构体及头文件1.2、i2c_register_board_info()函数头文件1.2.1、i2c_register_board_info()函数实现二、i2c驱动软件信息3.1结构体及函数一、i2c设备的注册1.1、struct i2c_board_info结构体及头文件//头文件位置 : include/linux/i2c.h //结构体定义struct i2c_bo

2020-09-05 18:14:56 485

原创 嵌入式LINUX驱动学习之14软硬件分离编程(四)代码举例(通过测试程序操作LED灯 ioctl、set_bit/clear_bit)

嵌入式LINUX驱动学习之14软硬件分离编程(三)代码举例(通过测试程序操作LED灯 ioctl、set_bit/clear_bit)一、硬件信息驱动程序二、代码举例(软件驱动)三、测试程序(用户空间)一、硬件信息驱动程序同 《嵌入式LINUX驱动学习之14软硬件分离编程(三)代码举例(通过struce device 成员void *platform_data 实现)》 ->一、代码举例(定义硬件信息)二、代码举例(软件驱动)功能:用户空间程序打字符设备文件后,可以通过ioctl文件打

2020-09-01 12:59:47 239

原创 嵌入式LINUX驱动学习之14软硬件分离编程(三)代码举例(通过struce device 成员void *platform_data 实现)

嵌入式LINUX驱动学习之14软硬件分离编程(二)代码举例(通过struce device 成员void *platform_data 实现)一、代码举例(定义硬件信息)二、代码举例(软件驱动)一、代码举例(定义硬件信息)#include <linux/init.h>#include <linux/module.h>#include <linux/platform_device.h>/*定义结构体对象,用于保存LED灯硬件信息 phy_addr :用

2020-08-30 19:14:37 124

原创 嵌入式LINUX驱动学习之14软硬件分离编程(二)代码举例(通过struct resource结构体方式实现)

嵌入式LINUX驱动学习之14软硬件分离编程(二)代码举例一、硬件信息配置二 、软件驱动代码:一、硬件信息配置//btn_led_dev.cinclude <linux/init.h>#include <linux/module.h>#include <linux/platform_device.h>struct resource led_src_B[] = { { //用于保存寄存器地址 .start = 0XC001B000,

2020-08-29 18:35:33 150

原创 嵌入式LINUX驱动学习之14软硬件分离编程(一)源码部分

嵌入式LINUX驱动学习之12软硬件分离编程一、描述硬件信息头文件、函数及说明二、描述软件信息头文件、函数及说明一、描述硬件信息头文件、函数及说明//头文件位置:linux/platform_device.h/* struct platform_device{}结构体 功能:保存驱动的硬件信息*/struct platform_device { /* name 和id配合使用; 当id = -1时,注册到kobject列

2020-08-29 16:01:37 146

原创 嵌入式LINUX驱动学习之13内核数据结构(链表)

嵌入式LINUX驱动学习之13内核数据结构(链表)一、头文件、函数及说明一、头文件、函数及说明/* 1、初始化链表函数 :INIT_LIST_HEAD()*/ static inline void INIT_LIST_HEAD(struct list_head *list){ list->next = list; list->prev = list;}/* 2、向链表添加节点函数:list_add() 参数说

2020-08-29 13:29:15 101

原创 嵌入式LINUX驱动学习之12内核内存分配

嵌入式LINUX驱动学习之12内核内存分配一、头文件、函数及说明:一、头文件、函数及说明://头文件位置 : include/linux/slab.h/*申请内存函数: kmalloc() 实现方式一般参考源文件:include/linux/slab_def.h 、 include/linux/slob_def.h、 include/linux/slub_def.h 功能:分配一段物

2020-08-28 18:17:17 91

原创 嵌入式LINUX驱动学习之11 物理地址-用户空间虚拟地址映射mmap()

嵌入式LINUX驱动学习之10 物理地址-用户空间虚拟地址映射mmap()一、头文件、函数及说明一、头文件、函数及说明//头文件位置:include/linux/mm.hint remap_pfn_range(struct vm_area_struct *, unsigned long addr,\ unsigned long pfn, unsigned long size, pgprot_t);...

2020-08-22 13:44:25 219

原创 嵌入式LINUX驱动学习之10 物理地址-内核虚拟地址映射 ioremap()/iounmap()

@[TOC](嵌入式LINUX驱动学习之10物理地址-内核虚拟地址映射 ioremap()/iounmap())一、头文件、函数及说明//源码位置:arch/arm/include/asm/io.h #define MT_DEVICE 0#define MT_DEVICE_NONSHARED 1#define MT_DEVICE_CACHED 2#define MT_DEVICE_WC #define ioremap(cookie,size)

2020-08-21 17:58:49 396

原创 嵌入式LINUX驱动学习之9等待队列

嵌入式LINUX驱动学习之9等待队列一、头文件、函数及说明一、头文件、函数及说明/* wait_queue_head_t 结构体 源码位置:include/linux/wait.h*/struct __wait_queue_head { spinlock_t lock; struct list_head task_list;};typedef struct __wait_queue_head wait_queue_head_t;/* 初

2020-08-19 19:37:51 102

原创 嵌入式LINUX驱动学习之8竞态和并发相关问题(六)整型原子操作

嵌入式LINUX驱动学习之8竞态和并发相关问题(六)整型原子操作一、头文件、函数及说明附 A1.1一、头文件、函数及说明/* 结构体 atomic_t头文件位置:include/linux/types.h*/typedef struct { int counter;} atomic_t;/* 整型原子操作函数 : atomic_add_return()、atomic_sub_return() atomic_add()、atomic_

2020-08-18 19:55:24 127

原创 嵌入式LINUX驱动学习之8竞态和并发相关问题 (五)位原子操作

嵌入式LINUX驱动学习之8竞态和并发相关问题 (五)位原子操作一、位原子操作相关头文件函数及说明二、位原子操作用法附A.1附 A.1.1附A.1.2原子操作分为位原子操作的整形原子操作,即每次操作1位或1个整型;位原子操作,建议最大修改的数据位为:BITS_PER_LONG -1,当大于或等于BITS_PER_LONG可能出现吐核心情况一、位原子操作相关头文件函数及说明/* 位操作函数: set_bit()、clear_bit()、change_bit() 源码位置:include/asm-

2020-08-18 18:45:13 184

原创 嵌入式LINUX驱动学习之8竞态和并发相关问题(四)信号量

嵌入式LINUX驱动学习之8竞态和并发相关问题(四)信号量一、头文件、函数及说明附A.1附1.2信号量运行在进程中,可以因超时或中断信号而结束,可以进行休眠操作一、头文件、函数及说明//源码位置:include/linux/semaphore.h//结构体对象:struct semaphore {}struct semaphore { raw_spinlock_t lock; unsigned int count;

2020-08-17 19:57:25 74

原创 嵌入式LINUX驱动学习之8竞态和并发相关问题(三)衍生自旋锁

嵌入式LINUX驱动学习之8竞态和并发相关问题(三)衍生自旋锁一、头文件、函数及说明附A.1附A.1.1一、头文件、函数及说明衍生自旋锁主要是基于自旋锁和中断屏蔽实现,对于使用衍生自旋锁的内容不能进行休眠操作/* 对要操作的全局变量或寄存器添加衍生自旋锁函数: spin_lock_irqsave(lock,flags); 参数: lock : spinlock_t lock; flags: unsigned long flags);

2020-08-17 17:33:10 84

原创 嵌入式LINUX驱动学习之8竞态和并发相关问题(二)自旋锁

嵌入式LINUX驱动学习之8竞态和并发相关问题(二)自旋锁一、头文件、函数及说明附A 1.1附A 1.1.1一、头文件、函数及说明/* spinlock_t源码位置 : include/linux/spinlock_types.h*/ typedef struct spinlock { union { struct raw_spinlock rlock;//实现见附A 1.1#ifdef CONFIG_DEBUG_LOCK_ALLOC# def

2020-08-16 17:17:53 73

原创 嵌入式LINUX驱动学习之8竞态和并发相关问题(一)中断屏蔽

嵌入式LINUX驱动学习之8竞态和并发相关问题(一)中断屏蔽一、中断屏蔽的方法头文件及说明二、代码举例(内核空间)三、代码举例(用户空间)四、测试一、中断屏蔽的方法头文件及说明//源码位置:include/linux/irqflags.h#define local_irq_save(flags) \ do { \

2020-08-14 20:08:39 81

原创 嵌入式LINUX驱动学习之8竞态和并发相关问题(零)基础理论

嵌入式LINUX驱动学习之8竞态和并发相关问题(零)基础理论一、什么是并发和竞态?二、什么是互斥访问三、互斥访问的方法:3.1 中断屏蔽3.1.1 中断屏蔽的特点:3.1.2 中断屏蔽的互斥访问过程:3.1.3 使用中断屏蔽可能带来的问题和需要注意的事项3.2 自旋锁3.2.1 自旋锁的特点:3.2.1 衍生自旋锁的特点3.3 信号量3.3.1 信号量特点:3.4 原子操作3.4.1 原子操作特点:一、什么是并发和竞态?并发: 多个执行单元同时发生;执行单元是指:进程和中断;竞态:多个执行单元对

2020-08-13 19:11:41 114

原创 嵌入式LINUX驱动学习之7中断相关(五)延迟处理函数

嵌入式LINUX驱动学习之7中断相关(五)延迟处理函数一、忙延迟方法头文件及说明(主要用于中断处理函数内)二、休眠延迟方法头文件、函数及说明(进程中使用)linux系统中,任务的延迟分为两种:一种:是忙延迟,主要用在中断相关的函数中,实现的方式为原地空转,类似于while(n),这种方式不会释放资源,而是一直处理等待状态;另一种:是休眠延迟,这种方式主要用于进程,一但使用休眠延迟,进程将释放资源,待延迟时间结束后重新获取资源,继续运行一、忙延迟方法头文件及说明(主要用于中断处理函数内)//源码位置

2020-08-13 17:39:59 254

原创 嵌入式LINUX驱动学习之7中断相关(四)软件定时器

嵌入式LINUX驱动学习之7中断相关(四)定时器一、头文件、函数及说明二、代码举例说明:linux定时器是基于软中断实现的,不能进行休眠操作一、头文件、函数及说明//源码位置:include/linux/timer.hstruct timer_list { //.............省略更多,由内核维护或一般不用关心的结构体成员................... unsigned long expires; //给定时器设定的时间 void (*function)(u

2020-08-13 12:31:15 102

原创 嵌入式LINUX驱动学习之7中断相关(三)底半部机制之work_struct

嵌入式LINUX驱动学习之7中断相关(二)底半部机制之work_struct一、头文件、函数及说明work_struct工作在进程上下文,允许进行休眠操作一、头文件、函数及说明struct work_struct { atomic_long_t data; struct list_head entry; // 内核维护的工作队列列表 work_func_t func; //延迟处理函数 #ifdef CONFIG_LOCKDEP st

2020-08-12 12:16:43 145

原创 嵌入式LINUX驱动学习之7中断相关(二)底半部机制之tasklet_struct

嵌入式LINUX驱动学习之7中断相关(二)底半部机制之tasklet_struct一、头文件、函数及说明二、代码举例一、头文件、函数及说明//源码位置:include/linux/interrupt.hstruct tasklet_struct{ struct tasklet_struct *next; unsigned long state; atomic_t count; void (*func)(unsigned long);

2020-08-11 18:11:20 205

原创 嵌入式LINUX驱动学习之7中断相关(一)中断处理函数

嵌入式LINUX驱动学习之7中断相关(一)中断处理函数一、函数、头文件及说明二、编译举例:一、函数、头文件及说明//头文件位置:include/linux/interrupt.hextern int __must_checkrequest_threaded_irq(unsigned int irq, irq_handler_t handler,\ irq_handler_t thread_fn,\ unsigned

2020-08-10 13:19:03 331

原创 嵌入式LINUX驱动学习之6.混杂设备(一):结构体和函数使用

嵌入式LINUX驱动学习之6.混杂设备(一):结构体和函数使用 一、头文件位置及主要结构体主要成员变量说明二、内核代码举例:三、用户空间代码实现:四、测试嵌入式LINUX驱动学习之6.混杂设备(一):结构体和函数使用 )混杂设备主设备号为10,一般只需要分配次设备号,可以自己指定(如果重复会报错),也可以交给内核分配使用混杂设备方式编程,混杂设备注册时,自动创建了字符设备,不需要执行mknod命令,具体实现方式见misc_register函数一、头文件位置及主要结构体主要成员变量说明头文件位置:i

2020-08-08 20:00:58 152

原创 嵌入式LINUX驱动学习之5.ioctl字符设备驱动编程(三)用户空间实现代码

嵌入式LINUX驱动学习之5.ioctl字符设备驱动编程(三)用户空间实现代码include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/ioctl.h>#define LED_ON 0X100#define LED_OFF 0X101#defi

2020-08-06 20:07:53 96

原创 嵌入式LINUX驱动学习之5.ioctl字符设备驱动编程(二)内核空间实现代码

嵌入式LINUX驱动学习之5.ioctl字符设备驱动编程(二)内核空间实现代码#include <linux/init.h>#include <linux/module.h>#include <linux/gpio.h>#include <mach/platform.h>#include <linux/fs.h>#include <linux/cdev.h>#include <linux/uaccess.h>

2020-08-06 20:05:31 106

原创 嵌入式LINUX驱动学习之5.ioctl字符设备驱动编程(一)函数说明

嵌入式LINUX驱动学习之5.ioctl字符设备驱动编程(一)一 、内核空间使用的对应函数unlocked_ioct()1.1函数头文件及原型1.2 初始化unlocked_ioctl()函数操作接口二、用户空间的编程函数:ioctl(2)说明:一般的字符设备可以使用ioctl函数替代write()和read()函数一 、内核空间使用的对应函数unlocked_ioct()1.1函数头文件及原型//头文件位置:include/linux/fs.hstruct file_operations {

2020-08-06 20:01:20 151

原创 嵌入式LINUX驱动学习之4.字符设备驱动编程(四)用户空间实现代码之驱动测试

嵌入式LINUX驱动学习之4.字符设备驱动编程(四)用户空间实现代码之驱动测试//编译好之后在下位机执行#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>/* 打印LED灯现在的运行状态(开灯|关灯)*/void print_led_state(int fd){ int ubuf[

2020-08-05 19:38:31 106

原创 嵌入式LINUX驱动学习之4.字符设备驱动编程(三)用户空间实现代码之驱动注册和卸载

嵌入式LINUX驱动学习之4.字符设备驱动编程(三)用户空间实现代码之驱动注册和卸载一、注册驱动 模块:二、查看注册的主设备号三、根据主设备号创建字符设备文件3.1方式一:通过bash创建方式二:通过C语言编写代码创建,代码见附A,以编译好的文件名为:mychrdev_reg为例:四卸载驱动模块附A说明:本例以生成的驱动模块为文件mychrdev.ko为例 ,所有执行都在下位机一、注册驱动 模块:insmod mychrdev.ko二、查看注册的主设备号cat /proc/devices

2020-08-05 19:37:22 133

原创 嵌入式LINUX驱动学习之4.字符设备驱动编程(二)内核驱动实现代码

@TOC内核驱动实现代码 )#include <linux/init.h>#include <linux/module.h>#include <linux/fs.h>#include <linux/cdev.h>#include <asm/gpio.h>#include <mach/platform.h>#include <linux/uaccess.h>static dev_t file_dev_num;/

2020-08-05 18:50:45 154

原创 linux驱动学习之alloc_chrdev_region源码分析(二):__register_chrdev_region

linux驱动学习之alloc_chrdev_region源码分析:__register_chrdev_region/*major : 主设备号baseminor : 次设备号minorct : 次设备号数目name : 名称(标签)*/static struct char_device_struct *__register_chrdev_region(unsigned int major, unsigned int baseminor,

2020-08-04 20:07:25 670

原创 linux驱动学习之alloc_chrdev_region源码分析(一)

linux驱动学习之alloc_chrdev_region源码分析(一)linux驱动学习之alloc_chrdev_region源码分析(一))函数实现:fs/char_dev.c/*形参一 dev:主设备号,一般定义为全局静态变量形参二:baseminor:次设备号,一般从0开始形参三:count:次设备号个数,根据需要填写形参四:name : 名字(标签),最大64个字节*/int alloc_chrdev_region(dev_t *dev, unsigned baseminor,

2020-08-04 20:05:21 860

原创 嵌入式LINUX驱动学习之4.字符设备驱动编程(一)

嵌入式LINUX驱动学习之4.字符设备驱动编程(一)一、字符设备操作接口数据结构:truct file_operations1.1 头文件1.1.1THIS_MODULE宏实现1.2 struct file_operations结构体使用1.2.1用户空间和内核之间进行数据传输的函数:copy_to_user() 、 copy_from_user()二、定义初始化字符设备对象2.1头文件2.2函数实现(了解即可)三、向内核添加注册字符设备对象:cdev_add()1.4.1 头文件1.4.2 函数实现四、向

2020-08-02 19:49:43 116

原创 嵌入式LINUX驱动学习之3.字符设备(设备号申请)

嵌入式LINUX驱动学习之3.字符设备(设备号申请)一、设备号申请函数:alloc_chrdrv_region()1.1 函数头文件1.2 函数功能:1.3 函数参数:1.4 关键宏函数使用二、释放设备号函数2.1 函数头文件1.2 函数功能:1.3 函数参数:三、举例:一、设备号申请函数:alloc_chrdrv_region()1.1 函数头文件//头文件位置:include/linux/fs.h//函数实现:fs/char_dev.c#include <linux/fs.h>i

2020-08-02 13:53:14 154

原创 嵌入式LINUX驱动学习之1.linux 内核打印函数printk

1.linux 内核打印函数printk一、函数有头文件二、定义的关键宏三、函数原型合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入一、函数有头文件 路径:/opt/kernel/include/linux/printk.h 头文件

2020-08-01 02:08:00 1232

原创 通过共享内存完成进程间的通信:shmget() shmat() shmdt()

1、shmget(2)#include <sys/ipc.h>#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg);功能:创建一块共享内存区域的ID号参数:key :通过ftok()函数返回值获得size:共享内存区块大小,单位:Byteshmglf:一般用IPC_CREAT|0...

2020-04-24 16:36:33 186

空空如也

空空如也

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

TA关注的人

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