【CMake】 gcc分为四步预处理:gcc -E main.c -o main.i编译:gcc -S main.i -o main.s汇编: gcc -c main.s -o main.o链接:gcc main.o -o main。
Linux 进程间通信 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。......
堆和栈的区别 代码在内存种从高地址—>低地址分区为主要有以下几个区别1Strack(栈)由编译器自带分配释放,存放函数的参数值,局部变量等。Heap(堆)程序员自己申请,并指名大小–>malloc函数。2Strack(栈)只要栈剩余空间>所申请空间,都会提供。系统自由分配,速度快Heap(堆)操作系统有记录空闲内存的链表收到申请->遍历链表->寻找->申请空间的堆结点,速度较慢,容易产生内存碎片。3Strack(栈)向低地址扩展的数据结果,连续内存区域,栈获得的空间较小。.........
封装函数API puts(str);//与printf(“%s”,p);作用等价区别是puts();里面自己包含了。memset()函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。功能从输入缓冲区中读取一个字符串存储到字符指针变量str所指向的内存空间。字符串明显特点,结尾有‘\0’;...
input--->输出子系统 回顾:以中断方式处理的“按键驱动程序”。1.确定设备号。2.构造一个“file_operations”结构体3.open函数中申请中断.4.read函数中,若没有按键按下就休眠wait_event_unterruptible(button_waitq, ev_press);有按键按下后,中断程序被调用:在终端服务程序里确定是哪个按键按下。最后唤醒案件程序测试如下:1 先open某个设备文件:2 接下来读取值上面的驱动程序和测试程序的缺点: 上面打开了一个特定的设备文件“/dev/button
驱动开发学习day5-->mmap 作用:将用户空间得地址映射到内核空间 *addr:被映射到内核进程空间得地址--》用户空间地址 lenght:映射地址得长度 prot:内核保护标志,PROT_READ,PROT_WRITE flags:MAP_SHARED,MAP_PRIVATE fd:文件描述符 offset:被映射对象内容得起点。0 返回值:映射成功后得用户空间地址作用:取消映射 *addr:用户空间地址 lenght:映射地址的长度 返回值:成功为0pf
驱动开发学习day4-->阻塞 非阻塞 poll机制 异步 阻塞操作:是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操 作条件后在进行操作。 read()-->HelloRead 驱动中如何实现阻塞?可以定义一个休眠等待队列 wait_queue_head_t q;//定义一个休眠等待队列头 init_waitqueue_head(&q);//初始化休眠等待队列 使用:helloRead: wait_event_interruptible(
驱动开发学习day3-->自动创建设备文件 区分设备文件 ioctl 驱动互斥 创建设备文件的方法:1 手动创建--->sudo mknod /dev/haha0 c 250 0 2 自动创建--->内核函数Linux内核为我们提供了一组函数,可以用来在模块加载时自动在/dev目录下创建相应的设备节点(设备文件),并在模块卸载时删除该设备节点。 内核函数:1 class_create-->创建一个设备文件类--》对应一类设备 2 device_create--
驱动开发学习day2-->字符设备驱动框架 1.1 字符设备 定义:是指只能一个字符一个字符的读写的设备,不能数据读取设备中的某一段数据,读取数据需要按照先后顺序。字符设备是面向字节流的 常见的字符设备:鼠标 键盘 串口 控制台 led设备 块设备:是指可以从设备的任意位置读取一定长度数据的设备。 常见的块设备:硬盘 磁盘 u盘 光盘 sd卡。。。1.2 字符设备框架init: { 申请设备号(静态申请 动态申请 ) 创建一个字符设备--》属性 初始化字符设备--》方法
驱动开发学习day1-->1、驱动的基本概念 定义:驱使硬件动起来的软件种类:裸机驱动---》需求分析--》查看原理图--》查看芯片手册---》code系统驱动--》需求分析--》查看原理图--》查看芯片手册---》设备树文件--》dts/uImage hello.ko--》安装到LInux内核当中Linux内核和驱动模块的关系和关联?关系:包含和被包含的关系关联:将驱动模块用指令安装到内核中sudo insmod hello.ko注意:当被驱动的设备要工作时,驱动模块被调用模块:能够单独命名并且独立完成一定功能的程序语句的集合(程序代码和数据结构-)
ARM学习day6-->看门狗定时器 1.看门狗定时器定时器:设定定时时间 启动 时间到产生中断 中断处理程序中完成相应的任务,工作时系统会提供始终,比如提供的时钟,一个时钟周期的时间是1/8000000s,所以想要实现1s的定时,就需要8000000个时钟周期,也就是需要去数80000000次个时钟周期,就可以实现1s的定时。思考:到底如何定时的?定时器是soc内部的一个外设,工作室系统会提供的时钟8M计数寄存器:需要给这个寄存器设置初始值,为8000000,每隔一个时钟周期这个计数器的值就会自动减1,当减到0的时候,
ARM学习day5-->UART Universal Asynchronous Receiver and Transmitter单工:A->B 一根数据线,方向不能改变全双工:A->B B->A 两根数据线半双工:A->B 或者 B->A 一根数据线,方向可以改变 线程:异步:11221211122211112212121--》不知道下一步是什么同步:121212121212121212121212 --》知道下一步是什么A---->B一帧数据 下一帧数据什么时候来不知道--》异步A---->B一帧数据 下一帧数据1s之后到--》同步有
ARM学习day4-->点亮led灯 裸机编程流程1.硬件连接的是soc的哪个引脚,得需要看硬件得原理图2.对这个引脚进行相应的配置,的需要设置对应的寄存器3.得需要看芯片手册对应得模块才能够指导这个寄存器的地址以及这个寄存器的那几位是干啥的裸机编程的流程1.查看原理图目的:找到要操作的硬件和soc的哪个引脚进行连接2.查看芯片手册目的:找到要实现对应模块的功能的寄存器以及这些寄存器应该如何配置3.编程点亮LED灯...
ARM学习day3-->汇编指令 1.内存的操作指令1.1单个寄存器和内存的访问ldr:将指定地址的内存空间的内存拷贝到一个寄存器中str:将一个寄存器中的内容拷贝到指定的内存空间中a:.word 0x00ldr r0,=a @将a变量的地址赋值给了r0 ldr是伪指令ldr r1,[r0] @r1 = *r0str r1,[r2] @其中r2是b的地址 *r2 = r1.text @告诉编译器以下代码放在代码段if 0int aa = 0x12345678;...
ARM学习day2-->ARM体系结构 目标:指令的格式 指令的作用 指令的用法 机器指令的格式 指令在内存中是如何存储的 指令的执行过程 寄存器的变化指令集:汇编指令集,不同的CPU架构指令也会不同,所以不同CPU架构程序在编译时所使用的编译器也是不一样的,也就是说使用不同的编译器生成的汇编指令是不一样的。使用的编译器为:交叉编译工具链------->一个编译器,编译器是在PC机上运行的,使用它编译后的代码又是在板子上运行的如何理解交叉?(一件事前半部是A-finished,另一部分为B完成)交易编译环境