自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 资源 (2)
  • 收藏
  • 关注

原创 【linux驱动开发】-gpiolib概念与实践

在平常的硬件驱动过程中,很多的硬件都要用到GPIO,GPIO会复用,如果同一时刻GPIO被两个驱动同时控制了,那么就会出现bug,所以内核提供了gpiolib来统一管理系统中所有的GPIO,gpiolib本身就是属于驱动框架的一部分!

2022-08-22 10:27:24 714 1

原创 【linux驱动开发】-驱动入门之LED

可以清晰的看出与之前的区别,之前我们写"散养的"驱动时,我们首先需要注册,这中间就需要调用很多的内核函数,除此之外我们要在sys/class/下面创建类和设备,也需要调用其他的函数,而在驱动框架里,所有的一切都在框架里帮我们完成了,也就是在led-class.c中的led_classdev_register函数!都能够实现,并且程序里使用的led_classdev结构体,也是驱动框架里提供,我们直接用就可以,他的一些变量,比如name、brightness、brightness_set函数指针都是可以直接

2022-08-21 18:20:20 1268

原创 【linux驱动开发】-字符设备驱动高级

在字符设备驱动基础章节,我们使用的注册字符设备驱动的接口为register_chrdev,在本章节我们要学习一种注册字符设备驱动的新接口register_chrdev_region/alloc_chrdev_region+cdev

2022-08-14 22:55:38 632

原创 【linux驱动开发】-字符设备驱动基础(二)

(1)裸机中操作硬件,直接操作的是寄存器的物理地址;习惯用函数指针操作寄存器的方法!(2)操作系统中操作硬件,操作的是寄存器物理地址在内核中映射的虚拟地址。内核中习惯用封装好的io读写函数来操作寄存器,已实现最大程度的可以执行。...

2022-08-14 17:58:19 261

原创 【linux驱动开发】-字符设备驱动基础(一)

API里面的函数,比如open、close等实际调用驱动程序中的open、close这些函数,这些函数直接对接硬件!驱动里面的open、close等操作函数,是定义在file_operations结构体中的,每个设备驱动都需要一个该结构体类型的变量!当设备驱动向内核注册时提供该结构体的变量。向内核中注册时使用的是register_chrdev函数注册!...

2022-08-14 12:38:40 370

原创 【linux驱动开发】-关于驱动学习你得知道的

准确的说,驱动是和操作系统挂钩的,在操作系统中,去操作硬件的那一段代码,才能叫做硬件的驱动程序。平时在裸机程序中,去操作硬件的代码,我们不叫驱动,只是大家都习惯了,所以我们有时候也叫裸机驱动!...

2022-08-12 23:03:36 654

原创 【智能音箱项目】-libvent库

libvent的核心是个集合,把所有的需要监听的事件放在集合中,如果有满足条件的事件,就会触发回调函数去处理!

2022-08-09 11:05:09 382 1

原创 【基础算法】-队列

队列介绍:先进先出(FIFO)-先进队列的元素先出队列。来源于我们生活中的队列(先排队的先办完事)。队尾(tail)——允许插入的一端队头(head)——允许删除的一端

2022-08-08 20:42:44 105

原创 【基础算法】-简单选择排序

基本思想:(1)首先在一个无序数列中,找到一个最小的值,然后把它与第一个数互掉位置;(2)固定第一个值(最小数),然后在剩余无序数列中找到次小数,将它与第二个数互换位置;(3)重复前面的步骤之后,可以得到一个排列好的数列;...

2022-08-08 15:46:36 195

原创 【基础算法】-希尔排序

(1):把待排序列,分为多个间隔为h的子序列,然后对每个子序列进行直接插入排序;(2):重复(1)多次,每次间隔h不同,并且越来越小;(3):最后一次选取,间隔h=1,完成排序!

2022-08-07 15:13:33 148

原创 【算法基础】-冒泡排序

1.比较相邻的元素,如果前一个数的值大于后一个数的值,那么交换他们的位置2.对每一个相邻的元素做同样的比较,从开始到最后,这步做完,最后一个元素就是当前数组中最大的元素。3.当2的步骤执行完毕后(也就是第一轮比较完毕),此时把序列中最大的值排在了最后一位,然后得到了一个新的序列。对这个新的序列再执行2步骤,就可以把次大值排在倒数第二序列,以此类推,可排列为从小到大的一个序列!...

2022-08-06 22:46:34 233

原创 【基础算法】-快速排序

首先,在所有序列元素中随机找出一个,作为“基准值”,然后把整个序列基于基准值进行重新排列,小于基准值的放在它左边,大于基准值的放在它的右边,重新排列完,这个基准值元素的位置就是排序后的位置了,同时,也产生了两个子序列,然后对两个子序列再用同样的方式,找一个基准值,对子序列重新排列…,直到最后子序列只有一个元素或0个元素(递归最底层的情形),这时,序列就排完序了。...

2022-08-06 14:37:32 100

原创 【基础算法】-堆排序

基础算法学习

2022-08-06 13:36:46 256

原创 C语言整理-双向链表和单项链表那些事

链表一般细分为:1、不带头节点的单链表2、带头节点的单链表3、不带头结点的双链表4、带头结点的双链表5、带头结点的双向循环链表其具体的实现过程可以由下图表示:头指针: 头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针 头指针具有标识作用,所以常用头指针冠以链表的名字 无论链表是否为空,头指针均不为空,头指针是链表的必要元素 头节点: 头结点是为了操作的统一和方便而设立的,放在第一元素(首元节点)的结点之前,其数据域一般无意义

2022-05-11 16:49:42 445

原创 【linux网络编程】-实战

socket编程接口介绍服务器需要socket、blind、listen、accept第一个参数是网络域,也就是网络范围;是ipv4/ipv6第二个参数是指定类型;比如TCP类型第三个参数用来制定协议;如果是0就是默认协议;accept返回值是一个fd,accept正确返回就表示我们已经和前来链接我的客户端建立起一个TCP链接了,以后就要通过这个连接和客户端进行读写操作,读写操作就需要一个fd,这个fd就由accept来返回了!客户端用socket、con

2022-04-12 16:22:23 3869

原创 【linux应用编程】-线程全解

第一点线程的引入接上节我们处理同时监测鼠标和键盘的例程,我们再提出一种解决方案-多进程处理!使用多进程处理时的优势:CPU时分复用,单核心CPU可以实现宏观上的并行,微观上其实是串行!实现所任务的系统需求进程的劣势:进程间切换开销大进程间通信麻烦而且效率低!......

2022-04-07 21:48:42 186

原创 【linux应用编程】-高级I/O(阻塞&非阻塞&并发式IO)

第一点

2022-04-06 21:27:55 1120

原创 【linux应用编程】-信号

第一点什么是信号信号是一种内容受限的异步通信机制!他的目的是在于通信!信号是异步的(对比硬件中断)本质上是int型数字编号!信号的来源有:用户在终端按下按键;硬件异常后由操作系统内核发出信号;用户使用kill命令向其他进程发出信号;某种软件条件满足后也会发出信号,如alarm闹钟时间到会产生SIGALARM(sigalarm)信号,向一个读端已经关闭的管道write时会产生SIGPIPE(sigplpe)信号;其实通俗的说,信号就是来源于硬件和软件两部分,硬件产生即通

2022-04-06 10:57:59 325

原创 【linux应用编程】-进程全解

第一点程序的开始和结束程序的开始在操作系统中的应用程序其实在main函数执行前也是需要先执行一段引导代码的,但是我们在写代码之前完全不用考虑引导代码的问题,因为这些都由内部封装完成!上述的这些步骤,拆开的讲就是编译和链接,这两个步骤 由链接器完成,得到我们使用的a.out然后下一步骤再由加载器(操作系统中的程序)负责将这个程序加载到内存中去执行这个程序!程序的结束程序结束分为两种,一种是正常终止(return、exit、_exit) 另一种是非正常终止(自己或他人发信号终止进程)

2022-04-05 17:00:17 2314

原创 【linux应用编程】-获取系统时间

第一点关于时间的概念GMT时间格林尼治时间,可自行百度!UTC时间现在常用的时间概念!自行百度计算机中的时间点时间(RTC:实时时间)段时间(定时器实现)第二点linux系统中的时间jiffies的引入他是内核中的一个全局变量,用来记录以内核节拍时间(也就是调度时间、取决于操作系统的配置、一般为1ms/10ms)为时间单位的一个时间长度。linux系统如何记录时间liunx内核启动时,jiffies就有一个基准值(是通过调用RTC所获得的当前时间点值换

2022-04-02 11:30:42 5258

原创 【linux应用编程】-文件属性

第一点linux各种文件类型和文件标识符普通文件(-)普通文件分为文本文件和二进制文件,文本文件就是方便人的读写,二进制文件不是编码就是数字,主要通过文件的后缀进行辨别!目录文件(d)就是文件夹(特殊文件)用vim也能打开,内部存在路径和文件列表,需要用特殊的API去操作目录文件。设备文件(c)对应的硬件设备(虚拟出来的)不在硬盘中存在,只是在文件系统中存在。例如:dev/sys/proc等管道文件(p)套接字文件(s)符号链接文件(l)第二点常见的文件属性的

2022-03-31 21:07:50 745

原创 C语言高级-操作系统、main()、NULL

第一点操作系统如何工作像人类社会一样的计算机软件系统(有些人只埋头干活,有些人只做管理)(1)人类社会最开始时人人都干活,这时候没有专业分工,所有人都直接做产生价值的工作。当时是合适的,因为当时生产力低下,人口稀少。这就像裸机程序一样(裸机程序的特点是:代码量小,功能简单、所有代码都和直接目的有关,没有服务性代码)。(2)后来人口增加生产力提高,有一部分人脱离了直接产生价值的体力劳动专职指挥(诞生了阶级)。本质上来说是合理的,因为资源得到了更大限度的使用,优化了配置,提升了整体效率。程序也是一样

2022-03-31 16:05:41 858

原创 【linux应用编程】-linux的文件I/O

第一点应用编程的框架整个嵌入式linux核心课程包括5个点,按照学习顺序依次是:裸机、C高级、uboot和系统移植、linux应用编程和网络编程、驱动。典型的嵌入式产品就是基于嵌入式linux操作系统来工作的。典型的嵌入式产品的研发过程就是;第一步让linux系统在硬件上跑起来(系统移植工作),第二步基于linux系统来开发应用程序实现产品功能。基于linux去做应用编程,其实就是通过调用linux的系统API来实现应用需要完成的任务。...

2022-03-31 11:45:38 290

原创 C语言高级-链表、状态机、多线程

第一点链表为什么需要链表为了解决数组的第二个缺陷:就是可以随时改变数组的大小的一种数据结构!什么是链表顾名思义,链表就是用锁链链接起来的表。这里的表指的是一个一个的节点(一个节点就是一个校区),节点中有一些内存可以用来存储数据(所以叫表,表就是数据表);这里的锁链指的是链接各个表的方法,C语言中用来链接两个表(其实就是两块内存)的方法就是指针。简单的来说,链表就像是大学的新校区,主要是为了缓解本部学生拥挤的状态,然后在异地建设新校区,然后本部与新校区之间就通过班车进行沟通链接,本质目

2022-03-29 21:39:19 1904

原创 C语言高级-存储类、作用域、生命周期、链接属性

第一点概念解析存储类一个变量的存储类属性就是描述这个变量存储在何种内存段中;作用域对以下函数进行解读如图可知虽然在for循环内部定义了a,但是在函数外部定义的a++还是显示错误,显示没有定义;这就是作用域的问题!生命周期生命周期就是描述这个变量什么时候诞生(运行时分配内存空间给这个变量)以及什么时候死亡(就是收回给这个变量分配的内存空间)的时间间隔!链接属性编译是将源代码的.C文件编译成.O文件(单个的二进制机器码格式),.O文件中就有很多的符号和代码段、数据段、

2022-03-24 17:16:40 2716

原创 C语言高级-预处理、函数、函数库

第一点关于预处理程序执行的过程(1)源码.c->(编译)->elf可执行程序(2)源码.c->(编译)->目标文件.o->(链接)->elf可执行程序(3)源码.c->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程序(4)源码.c->(预处理)->预处理过的.i源文件->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)-&gt

2022-03-23 21:12:57 1003

原创 【解决bug】-uboot编译

在按照正点原子的阿尔法教程进行uboot编译的时候,需要配置以下框架‘;’在执行第二句命令时,碰到了以下错误:经过询问客服才知道,我是因为没有安装gcc编译器,我当时很纳闷,全部就是按照他们的教程来的,为啥我就会出错?经过细细比对才知道,我的ubuntu没有gcc编译器,如上图所示解决方法:使用 sudo apt install gcc安装gcc编译器原因:我的ubuntu是20.4版本 正点原子是16 他们的ubuntu自带gcc编译器,而我的需要自己安装。..

2022-03-20 11:19:24 434 1

原创 C语言高级-内存解读+字符串+结构体+共用体+大小端+枚举

C语言高级-内存解读+字符串+结构体+数组+共用体+

2022-03-18 21:12:26 1395

原创 C语言高级-复杂表达式和指针高级应用

第一点:指针数组和数组指针指针数组实质是一个数组,这个数组中存储的内容全部就是指针变量;int *p[5] 、 int *(p[5])数组指针的实质是一个指针,这个指针指向的是一个数组;int (*p)[5]......

2022-03-16 19:25:10 545

原创 C语言高级-指针

第一点:使用指针三步骤:定义指针变量、给指针变量赋值(绑定指针)、解引用第一步:定义指针变量int *p第二步:给指针变量赋值,也就是让指针指向另一个变量,当我们没有指定指针变量之前,这个指针不能被解引用;p=&a //实现指针绑定,让p指向变量ap=(int *)4 //实现指针绑定,让p指向地址为4的哪个变量第三步:解引用如果没有绑定指针到某个变量就直接解引用,基本一定会出错。*p=555 //将555放入p指向的变量中......

2022-03-14 17:36:56 3412 1

原创 C语言高级-位操作

第一点:常用的位操作符:位与、位或、位取反、位异或、左移位、右移位;位与是& 逻辑与是&& 位与时两个操作数是按照二进制位批次对应位相与的,逻辑与是两个操作数作为整体来相与的;(举例:0xAA&0xF0=0xA0, 0xAA&&0xF0=1,)位或是| 逻辑或是|| 逻辑或与位或的区别与位与的概念是一样的;位取反是~ 逻辑取反是! 位取反是1和0相互变换,逻辑取反是真假互换;位异或是^ (两数相等 结果为0 两数不等 结果为1)第二点:

2022-03-11 17:31:58 2984

原创 C语言高级-内存

第一点:计算机程序=代码+数据!!冯.诺依曼结构:代码和数据是放在一起的!比如:在三星的S5PV210在LINUX上运行程序时,代码和数据都是存放在DRAM中,是符合冯.诺依曼结构的。哈佛结构:代码和数据是分开的!比如:在普通的单片机中,代码烧录进去的时候是存放在FLASH(NorFlash)中,程序代码是在Flash中运行的,程序中的数据(全局和局部变量)是在RAM(SRAM)[RAM不需要初始化启动]中,因此符合哈佛结构。第二点:SRAM和DRAM的区别是什么?第

2022-03-09 17:17:04 817

原创 【ARM原理学习】-C语言版驱动准备工作

什么是看门狗?现实中因为一些外部因素,电子设备经常会跑飞或者死机(譬如极端温度、工业复杂场景)。在这种场景下我们希望设备自动复位而不需要人工干预。看门狗就是完成这个工作的。它其实就是我们Soc内部的一个定时器,(类似于闹钟或者门口的狗)。定好时间之后看门狗定时器会去计时,时间到之前(狗饿了之前)必须去重新置位看门狗定时器(喂狗),如果没有喂狗系统则会强制复位。系统一般正常工作时,系统软件自己会去喂狗,所以看门狗定时器不会复位,但是系统一旦故障跑飞啥的,看门狗就没人喂了,然后下一个周期就会自动复位,达

2022-03-09 10:19:52 438

原创 【ARM原理学习】-LED灯点亮驱动编写

目标顶格写,后面是冒号,冒号后面是依赖;:依赖就是达成目标的原材料;:命令前面一定是,不能是顶格,更不能是多个空格;命令就是要生成目标要执行的动作。链接器得到的led.elf其实是我们的可执行文件,如果在操作系统下用led.elf完全就可以了,但是在裸机中,我们需要的是可以烧写的文件(也就是镜像文件),因此我们得先用led.elf来制作镜像文件,制造工具是交叉编译链中的arm-linux- objcopy.arm-linux-objdump工具进行反编译(反汇编 ),将可执行文件翻译成汇编语言!

2022-03-08 11:23:02 495

原创 【ARM原理学习】-体系结构总结

2. ARM体系结构与汇编指令2.1CPU与外部存储器接口 内存 内部存储器 用来运行程序的 RAM 外存 外部存储器 用来存储东西的 ROM(硬盘、 FLASH等)CPU连接内存和外存的方式不同,内存需要直接地址访问,通过地址和数据总线来访问(好处: 直接读取,速度快,坏处:占用地址空间) 外存是通过CPU外存接口来连接的(好处:不占地址,坏处是速度慢,时序复杂)SoC常用外存:1)电子式无需启动NorFlash 总线式访问,接到SROM bank,优点是可以直接总线.....

2022-03-05 12:14:27 524

原创 【嵌入式学习】第0部分-LinuxC基础

1.C语言写代码步骤: 第一步:编辑源代码(使用vi或者其他编辑器 比如VScode) 第二步:编译。编译就是用编译器把源程序转化成可执行程序的过程,编译要用到编译器。 我们在linux中使用编译器一般是gcc。 譬如:gcc hello.c 把当前目录下hello.c文件编译,得到的可执行文件名字叫a.out 也可以自己指定编译后生成的可执行程序的名字,使用gcc .........

2022-03-02 21:11:07 284

原创 【嵌入式学习】第 0 部分 - Linux基础知识点

目录1、操作系统基础概念1.1、Windows与linux的关系1.2、多机开发:双系统与虚拟机1.3、搭建开发环境1.4、隐藏文件与非隐藏文件​1.5、相对路径与绝对路径2、linux基础知识与技能2.1、linux内核、发行版2.2、GUI(图形用户界面)和cmdline(命令行)2.3、linux常用命令:3、编辑器vi的使用(vi和vim的联系)​3.1、vi基础使用3.2、vi的高级使用3.3、linux中权限表示&管理3.4、虚

2022-03-01 10:57:55 585

原创 C语言整理-----return、 break、continue关键字

关于C语言学习基础与进阶的感想

2022-02-27 15:43:38 1523

原创 基于电力载波的隧道照明灯的分级控制系统

项目要求: 根据光照传感器所采集的光照变化而控制灯亮度值的分级控制。

2021-12-30 10:26:37 3291

原创 基于MODBUS通讯协议的酒厂温湿度、光照度数据采集系统的设计与实现

目录项目背景:项目准备:1.所需知识点2.项目分工3.涉及知识点归纳4.项目耗材项目背景:分类:实验室项目 此项目是本实验室与酒厂的一项科研合作项目,目的是研制一套可以实时采集酒厂温湿度、光照度的自动化嵌入式设备,并将采集到的数据信息远程传输到监管单位端,并通过上位机实时图形界面显示其一段时间内的温湿度、光照度的变化情况,为酒厂的安全生产提供外围保障。项目准备:1.所需知识点(1)硬件电路设计(2)STM32单片机的使用(3)M...

2021-12-18 11:36:47 2395

基于modbus的温湿光照度数据采集及Lora无线发送系统的设计与实现.rar

MDK直接编译使用,扩展性强,注释全,方案合理,资源丰富

2021-12-18

酒厂项目---温湿度光照度项目.rar

MDK5编译,可以直接拿去用,代码扩展、注释性好,可二次开发,方案、资源齐全

2021-12-18

空空如也

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

TA关注的人

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