嵌入式
文章平均质量分 64
杨跟的博客
这个作者很懒,什么都没留下…
展开
-
进程间通信--内存映射区
1.父子进程之间永远共享的东西是什么? 文件描述符 内存映射区上一节讲述了利用文件描述符进行进程间通信,如利用文件,匿名管道pipe以及有名管道fifo进行通信。本节讲述利用内存映射区进行通信。 mmap--创建内存映射,将磁盘文件的数据映射到内存,用户通过修稿内存就能修改磁盘文件。利用内存映射想比较与文件操作的好处就是,文件的操作是IO操作,要读写磁盘,效率较慢,而映...原创 2019-05-18 20:40:10 · 299 阅读 · 0 评论 -
信号
信号的特点是简单、携带的信息量少,且使用在某个特定的场景中。信号有产生、未决以及递达三种状态。1.信号相关的函数:kill ---发送信号给指定的进程 raise----给自己发送信号 函数原型: int raise(int sig);abort---给自己发送异常终止信号 函数原型 :void abort(void); 没有返回值,永远不会调...原创 2019-05-18 21:23:28 · 290 阅读 · 0 评论 -
open与fopen
1.在将open与fopen之前,先讲文件描述符:当一个可执行程序运行以后,就变成进程,操作系统会为每个进程分配一定的虚拟内存空间,32位操作系统就分配4G。虚拟内存空间结构如下图所示: 1G是内核空间使用,剩余3G为用户空间,虚拟内存就是当物理内存(如内存条)不够时,从磁盘上分配一块空间。为什么要虚拟空间了?因为物理内存一般都很小,当有多进程要执行时,物理内存很快就分配完了,剩余...原创 2019-04-25 10:14:39 · 6522 阅读 · 2 评论 -
进程间通信-管道通信(pipe与fifo)
1.进程间通信 IPC--interProcess Communication 进程间通信常用的4中方式:管道-简单 信号-系统开销小 共享映射区--有无血缘关系的进程间通信都可以 本地套接字-稳定 2.pipe管道 pipe管道为匿名管道,就是一个伪文件,是一个内核缓冲区,不占用磁盘空间。管道由读端与写端组成,分别对应两个文件描述符,管道的读写默认是阻塞的。管道的...原创 2019-05-12 09:58:27 · 826 阅读 · 0 评论 -
虚拟文件系统--register_filesystem
每个注册的文件系统都是用一个类型为file_system_type的对象来表示,file_system_type如下所示:struct file_system_type { const char *name; int fs_flags; int (*get_sb) (struct file_system_type *, int, const char *, void ...原创 2019-07-09 20:21:20 · 1462 阅读 · 0 评论 -
LINUX进程调度-CFS
1.概念 进程调度可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统。 CFS(公平调度)主要就是引进了虚拟时钟vruntime的概念,每个进程的虚拟时间是实际时间相对nice(优先级)为0的权重的比值,CFS中的就绪队列是一颗以vruntime为键值的红黑树,虚拟时间越小的进程越靠近整根红黑树的最左端。进程调度时,选择下一个进程就是挑选v...原创 2019-07-20 10:52:37 · 596 阅读 · 0 评论 -
Linux内核源码分析-kmalloc与vmalloc
1.kamllocstatic __always_inline void *kmalloc(size_t size, gfp_t flags){ struct kmem_cache *cachep; void *ret; if (__builtin_constant_p(size)) { //__builtin_constant_p 是编译器gcc内置函数,用于判断一个值是否为编...原创 2019-07-25 10:40:02 · 549 阅读 · 0 评论 -
内存分配-页(page)
1.页内核把物理页作为内存管理的基本单元,并用struct page结构表示系统中的每个物理页。struct page{ unsigned long flags; atomic_t _count; atomic_t _mapcount; unsigned long priva...原创 2019-07-22 15:35:10 · 3102 阅读 · 0 评论 -
CPU上下文切换
1.什么叫做CPU上下文CPU上下文指的就是CPU寄存器与程序计数器。加载新的任务之前,现需要把前一个任务的CPU上下文(寄存器与程序计数器)保存起来,然后加载新的任务的上下文值到寄存器与程序计数器中,然后跳转到程序计数器所指的位置,执行新的任务。CPU上下文切换分为以下三类:进程上下文切换 线程上下文切换 中断上下文切换2.进程上下文切换系统调用:从用户态到内核态的转变...原创 2019-09-07 22:53:30 · 815 阅读 · 0 评论 -
中断和异常
1.定义中断通常定义为一个事件,该事件改变处理器执行的指令顺序。中断通常分为同步中断与异步中断。同步中断:当指令执行时由CPU控制单元产生的,只有在一条指令终止执行后CPU才会发出中断。 异步中断:由其他硬件设备依照CPU时钟信号随机产生的。异常是同步的,I/O中断是异步的。2.中断与异常中断可以分为:可屏蔽中断 I/O设备发出的中断请求(IRQ)都可以被屏...原创 2019-09-10 22:51:02 · 304 阅读 · 1 评论 -
Linux设备驱动-IIC总线
IIC和前面总结的platform框架是相似的,分为三层:控制器驱动层(driver层),核心层(core.c)以及设备层(device,iic里叫adapter-适配器),下面分别从这三个方面总结下,以了解IIC框架。1.adapter层以I2c-s3c2410.c为例:先看入口函数module_init(i2c_adap_s3c_init);static int __i...原创 2019-09-15 10:13:20 · 311 阅读 · 0 评论 -
gcc编译器常用参数
1.gcc 常用参数整理:-v/--version:查看编译器版本-I:编译时指定头文件路径-c:将汇编文件生成二进制文件,得到一个.o文件-o:指定生成文件的名字-g:gdb调试的时候需要-D:在编译的时候指定一个宏一般在测试的时候使用2.重点整理 -I当文件目录结构如下所示:sum.c 为主函数,include目录中包含了头文件head.h...原创 2019-03-16 09:11:27 · 1689 阅读 · 0 评论 -
静态库的制作与使用
静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入,因此程序运行时还需要动态库的存在。静态库制作及使用命名规则 libxxx.a(1)制作步骤原材料:源代码 .c .cpp 将源代码.c文件生成.o文件gcc a.c b.c -c将.o文件打包ar rcs...原创 2019-03-20 09:01:38 · 312 阅读 · 0 评论 -
GCC,MAKE,CMAKE的区别
1.gcc时GNU编译套件,一种编译器,可以编译c,c++,java等语言。当只有一个文件时,使用gcc编译器就很方便,但是当有多个文件时,编译顺序以及包含关系等使用gcc很麻烦。2.make工具:make就相当于一个智能的批处理工具,通过调用makefile实现编译,在makefile规定编译以及链接的顺序,在makefile中也调用了gcc,makefile中定了规定编译以及链接顺序的语法...原创 2019-03-04 21:45:31 · 1846 阅读 · 0 评论 -
uvc-driver.c分析
该程序为USB摄像头驱动程序。 在编写驱动程序之前需要先了解UVC相关的规则, 推荐USB_Video_Payload_MJPEG_1.5文档。UVC规范主要为VC接口与VS接口,其中VC接口用于控制设备的功能,而VS接口用于传输视频数据流。VC中有多个unit实现不同的控制功能,例如PU(process unit)能够控制亮度,白平衡等。VS中有多个formats(数据格式如YUV/M...原创 2017-10-18 15:33:50 · 1125 阅读 · 0 评论 -
嵌入式调试问题
1.insmod 某个驱动程序时,如果init函数中没有return 0;时,编译没有错误,但加载时,会有问题,加载不了2.常用的一些调试指令: 1)ps指令,ps命令是Process Status的缩写,用来列出系统中当前运行的那些进程。 -A :显示所有进程 -a:显示所有进程2)ls -l 将文件名以及文件文件权限、所有者,文件大小列出来3)kill ...原创 2018-03-26 20:30:24 · 431 阅读 · 0 评论 -
Framebuffer 系统
此为LCD的驱动程序。fd=open("/dev/fb0");此系统的核心为fbmem.c,具体的硬件程序使用register_framebuffer()函数,向其注册fb_info结构体,fb_info结构体中设置LCD的具体的硬件信息,提供具体的LCD尺寸大小,显存基地址以及时序设置等信息。1.分析femem.cfbmem_init{ regi...原创 2018-05-08 20:40:13 · 276 阅读 · 0 评论 -
platform 平台总线驱动
platform平台总线是为了将较为稳定的代码与具体的硬件 相关的会变得代码分开其下有两个部分platform_driver_register与platform_device_register1.platform.cint platform_driver_register(struct platform_driver *drv){ drv->driver.bus = &plat原创 2018-05-08 21:51:49 · 298 阅读 · 0 评论 -
usb总线
1.usb的描述符及其之间的关系 usb常用的描述符设备描述符(device descriptor),配置描述符(configuration descriptor),接口描述符(interface descriptor),端点描述符(endpoint descriptor)。 一个usb设备只有一个设备描述符。设备描述符里决定了该设备有多少种配置,每种配置有一个配置描述符;在每个配置描述符...原创 2018-05-13 13:34:45 · 243 阅读 · 0 评论 -
input输入子系统分析
1.查看input子系统支持哪些设备:cat /proc/bus/input/devices2.应用程序如何使用:fd_mouse=open("dev/input/event0",O_RDWR); //event1表示鼠标事件,input下的设备文件主设备号都为13,如下图所示:根据打开设备的主设备号为13,知道为input输入子系统,根据设备的次设备号,可以知道其对应的handler 。一...原创 2018-04-29 20:41:00 · 523 阅读 · 0 评论 -
v4l2
一.以vivi.c为例,分析v4l2流程:a.分配video_device结构体 b.设置 c.注册: video_register_device();1.分配:vfd = video_device_alloc(); if (!vfd) goto unreg_dev;2.设置: /*************************control设置*********...原创 2018-07-20 22:22:48 · 911 阅读 · 0 评论 -
uvc_ioctl分析
1.VIDIOC_QUERYCAP:APP调用struct v4l2_capability{__u8 driver[16]; // 驱动名字__u8 card[32]; // 设备名字__u8 bus_info[32]; // 设备在系统中的位置__u32 version; // 驱动版本号__u32 capabilities; // 设备支持的操作__u32 reser...原创 2018-08-15 11:07:05 · 1078 阅读 · 0 评论 -
HID设备发送消息
基本结构如下:1.分配usb_driver2.设置3.注册(usb_register())/* 1. 分配/设置usb_driver */static struct usb_driver myusb_driver = { .name = "usbmouse_as_key_", .probe = myusb_probe, .disconnect = myusub_dis...原创 2019-03-21 08:57:20 · 842 阅读 · 0 评论 -
nand_flash
以at91_nand.c为例,分析在块设备驱动中,nand_flash 的读写过程:1.分配nand_chip结构体2.设置nand_chip3.添加分区从init开始分析:static int __init at91_nand_init(void){ return platform_driver_register(&at91_nand_driver);}...原创 2018-09-18 16:53:54 · 239 阅读 · 0 评论 -
嵌入式篇---字符的编码方式
计算机刚出来时,是欧美人发明的,利用一个字节(8位)里的低7位来表示字母,ASCII码,从0X0000 0000到0X0111 1111分别对应与欧美所用的128个字符。但当计算机在全世界范围内被广泛使用时,比如中国,常用汉字有6000多个,一个字节的数据不能一一对应每一个汉字,内地就采用2个字节表示汉字(字符编码 不同的地方有不同的标准,即每一个数字所对应的字符会不一样),...原创 2017-08-27 10:14:08 · 1126 阅读 · 1 评论