自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 资源 (1)
  • 收藏
  • 关注

原创 IMX6Q的SD卡启动使用教程【超完整】(2):busybox交叉编译根文件系统

交叉编译busybox,在IMX6Q上挂载启动。

2022-10-31 20:19:13 715 1

原创 Linux下spi驱动分析与测试【详细流程】

驱动是基于ARM的pl022的SSP控制器,内容包括驱动流程调用分析以及模块测试。

2022-10-30 16:58:15 3059

原创 IMX6Q的SD卡启动使用教程【超完整】(1):uboot与kernel编译移植

本文主要介绍的是NXP官方开发板imx6q-sabresdSD卡烧写启动教程。

2022-10-29 17:25:31 2573

原创 I2C驱动框架分析(3):DW_I2C驱动分析

i2c是低速模块中最常见的模块之一,也是linux系统的最基础的框架,本系列内容主要针对dw厂商的i2c IP进行分析

2022-10-28 06:00:00 1728

原创 I2C驱动框架分析(2):I2C框架源码分析

i2c是低速模块中最常见的模块之一,也是linux系统的最基础的框架,本系列内容主要针对dw厂商的i2c IP进行分析

2022-10-27 06:00:00 1396

原创 I2C驱动框架分析(1):I2C重要概念与数据结构

i2c是低速模块中最常见的模块之一,也是linux系统的最基础的框架,本系列内容主要针对dw厂商的i2c IP进行分析

2022-10-26 06:00:00 880

原创 基于IMX6Q的uboot启动流程分析(4):uboot中的串口设备

本文主要分析IMX6Q下的uboot中的串口模块

2022-10-25 11:21:02 1185

原创 基于IMX6Q的uboot启动流程分析(3):_main函数之relocate_code与board_init_r

本文主要分析IMX6Q下的uboot启动流程

2022-10-25 11:17:06 896

原创 基于IMX6Q的uboot启动流程分析(2):_main函数之board_init_f

本文主要分析IMX6Q下的uboot启动流程

2022-10-25 11:04:48 1059

原创 基于IMX6Q的uboot启动流程分析(1):uboot入口函数

本文主要分析IMX6Q下的uboot启动流程

2022-10-25 10:44:48 1305

原创 vscode配置OpenGL开发环境【详细】

vscode配置OpenGL开发环境【详细】

2022-02-11 12:27:22 21059 29

原创 ESP32之WIFI连接方式一

ESP32之WIFI连接方式一本文主要讲的是esp32的wifi配置为sta模式,通过menuconfig的配置路由器信息形式,连接路由器。本次是在ESP-IDF下的esp-idf\examples\wifi\getting_started\station程序进程讲述。app_main函数主程序如下:void app_main(){ //Initialize NVS esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_N

2020-09-18 22:04:43 7282 1

原创 ESP32在阿里云平台使用MQTT协议控制RGB灯

ESP32在阿里云平台使用MQTT协议控制RGB灯本章内容是在ESP-IDF的\examples\protocols\mqtt\tcp工程上进行修改,实现ESP32在阿里云平台使用MQTT协议控制RGB灯。在实验前需要在阿里云平台创建产品并添加设备,获取三元组信息。最后在产品属性里添加HSV调色(我们用这个替代RGB数据传输)。一、主程序步骤1.1 对NVS以及网络进行初始化,连接WIFI:ESP_ERROR_CHECK(nvs_flash_init());ESP_ERROR_CHECK(esp

2020-09-07 16:16:38 2250 2

原创 MQTT笔记:常用的控制报文

MQTT笔记:常用的控制报文MQTT总共有十几种控制报文,本章笔记将会介绍几种常用的控制报文:连接、订阅、取消订阅以及发布几个控制报文。一、CONNECT控制报文客户端与服务器建立连接后的一个控制报文就是connect报文。在一个网络连接上以后,客户端只能发送一次connect报文。CONNECT控制报文由固定报头、可变报头以及有效载荷组成。1.1固定报头固定报头如下表所示:第一个字节为固定的0x10,以后是剩余长度。则固定报头为: 10 ?? ;??表示剩余长度取决于后面的长度,计算

2020-09-07 14:25:14 1113

原创 MQTT笔记:MQTT简介及控制报文简述

MQTT笔记:MQTT简介及控制报文简述一、简介MQTT(消息队列遥测传输)是 ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。 工作在 TCP/IP 协议族上, 是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议, 为此,它需要一个消息中间件 (服务器) 。通过 MQTT 协议, 目前已经扩展出了数十个 MQTT 服务器端程序, 可以通过 PHP, JAVA,Python,C, C#等系统语言来向 MQTT 发送相关消息。此外, 国内很多

2020-09-07 13:33:42 1145

原创 联合体判断大端与小端

大端、小端大端:数据的高字节存放在低地址处,数据的低字节存放在高地址处。小端:数据的低字节存放在低地址处,数据的高字节存放在高地址处。联合体联合体开辟内存法规则是:选取联合体成员变量中,占用内存最大的内存大小,比如联合体内有int char ,float 类型变量,则开辟int型大小的空间。并且这些成员共用这一内存。利用联合体特性,判断大小端typedef union { int a; char b;}UN;int main(){ UN u; u.a = 1; if(u.b

2020-09-02 11:22:23 2257 2

原创 esp32学习笔记:http-request

esp32学习笔记:http-request在esp-idf中的\examples\protocols\http_server\simple文件夹的例程中简单介绍了esp32作为http客户端请求服务器。http-request的过程是建立在socket的tcp协议上,通过访问服务器域名的形式来从服务器来获取数据。大体流程如下:首先初始化相关硬件,其次连接路由器,最后esp32与服务器建立tcp连接并获取信息。下面内容将介绍相关API。1 硬件初始化初始化的硬件主要是NVS,用来保存路由器WIF

2020-09-02 10:47:09 1762

原创 FreeRTOS笔记(六):五种内存管理详解

不同的嵌入式系统对于内存分配和时间要求不同。FreeRTSO将内存分配作为移植层的一部分,这样FreeRTOS使用者就可以设用自己的合适的内存分配方法。当内核需要分配内存时可以调用pvPortMalloc(),释放内存时使用pvPortFree()。FreeRTOS提供了5种内存分配方法,以不同文件的形式存在,分别是heap_1.c、heap_2.c、heap_3.c、heap_4.c、heap_5.c。这5个文件在FreeRTOS源码终,路径为FreRTOS->Source->portta

2020-08-23 21:51:04 2124

原创 Cortex‐M3内核学习笔记(三):SVC和PendSV

一、SVCSVC(系统服务调用,亦简称系统调用)用于产生系统函数的调用请求。例如,操作系统不让用户程序直接访问硬件,而是通过提供一些系统服务函数,用户程序使用 SVC 发出对系统服务函数的呼叫请求,以这种方法调用它们来间接访问硬件。因此,当用户程序想要控制特定的硬件时,它就会产生一个 SVC 异常,然后操作系统提供的 SVC 异常服务例程得到执行,它再调用相关的操作系统函数,后者完成用户程序请求的服务。SVC这种工作模式优点有以下几点:● 它使用户程序从控制硬件的繁文缛节中解脱出来,而是由 OS 负

2020-07-29 15:06:32 1183

原创 Cortex‐M3内核学习笔记(二):位带操作

概念Cortex-M3的存储器系统支持所谓的“位带”(bit‐band)操作。通过它,实现了对单一比特的原子操作。位带操作仅适用于一些特殊的存储器区域中.支持了位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写。在CM3中,有两个区中实现了位带。其中一个是 SRAM 区的最低 1MB 范围,第二个则是片内外设区的最低1MB范围。从上图得知,支持位带操作的两个内存区的范围是:● 0x2000_0000‐0x200F_FFFF(SRAM 区中的最低 1MB;● 0x4000_0000‐0

2020-07-28 16:49:20 697

原创 Cortex‐M3内核学习笔记(一):概览

一、寄存器组R0-R12:通用寄存器R0‐R12 都是 32 位通用寄存器,用于数据操作。但是注意:绝大多数 16 位 Thumb 指令只能访问 R0‐R7,而 32 位 Thumb‐2 指令可以访问所有寄存器。R13: 两个堆栈指针Cortex‐M3 拥有两个堆栈指针,然而它们是 banked,因此任一时刻只能使用其中的一个。●主堆栈指针(MSP):复位后缺省使用的堆栈指针,用于操作系统内核以及异常处理例程(包括中断服务例程)● 进程堆栈指针(PSP):由用户的应用程序代码使用。R14:连接

2020-07-27 22:20:04 1442

原创 嵌入式笔记(二):IAP的初步学习

IAP简介IAP(In Application Programming)即在应用编程, IAP 是用户自己的程序在运行过程中对User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。通常实现 IAP 功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信方式(如USB、 USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这

2020-07-14 17:19:33 494

原创 C/C++入门:关键字static与const详解

C/C++入门:关键字static与const在C/C++中关键字中,最基础最重要的就是static与const,无论是等级考试,还是求职考试都是经常遇见的,今天就详细介绍相关内容。一、static1.1 C语言中static1)修饰局部变量:当再一个函数体内使用static修饰一个变量时,static延长变量的生命周期,不会因为函数调用完而被销毁,只有当整个程序执行完才被销毁。只能被定义处的函数进行访问,函数体外不能被访问。2)修饰全局变量:被static修饰的全局变量,该变量只能在定义

2020-06-20 21:57:47 977

原创 基于STM32和ESP8266的天气预报系统

基于STM32和ESP8266的天气预报系统本章将介绍一个关于STM32+ESP8266的练手小项目,项目来源地址在下面:http://www.openedv.com/forum.php?mod=viewthread&tid=229818&highlight=%CC%EC%C6%F8项目的源码地址请见文章最后。一、实验环境要求1.1硬件要求● STM32单片机● ESP8266WIFI模块● LCD屏幕● SD卡,安装文件系统1.2软件环境要求● Keil5● 程序烧

2020-06-20 20:50:10 13848 12

原创 FreeRTOS笔记(五):任务切换

FreeRTOS笔记(五):任务切换本章是FreeRTOS系统的核心内容,更是面试求职过程中重要的考点。对于实时操作系统,任务切换决定了任务执行顺序,任务切换也决定了效率的高低。下面将详细介绍任务切换的内容。一、PendSV中断任务切换是依靠PendSV中断(可挂起的系统调用)来实现的,因此PendSV中断对操作系统来说是重点。PendSV中断是可编程中断,触发条件是:将中断控制和状态寄存器ICSR的bit28置为1。与SVC不同,它是不精准的,因此它的挂起状态可在更高优先级中断中处理内设置,而且会

2020-06-18 15:29:34 1625

原创 FreeRTOS笔记(四):任务创建/删除,挂起/解挂详解

FreeRTOS笔记(四):任务创建/删除,挂起/解挂详解在第二篇笔记中介绍了任务创建的API,并且简单使用了相关API,本文将详细介绍任务创建的过程。一、任务创建任务创建步骤为:1.创建任务;2.初始化任务;3.任务堆栈初始化;4.任务添加到就绪列表。下面将详细介绍这四个部分。1.1任务创建函数分析任务创建函数为xTaskCreate(),函数的具体实现如下:BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, const

2020-06-18 10:09:02 941

原创 FreeRTOS笔记(三):任务调度器

FreeRTOS笔记(三):任务调度器调度器是 FreeRTOS 操作系统的核心,主要负责任务切换,即找出最高优先级的就绪任务,并使之获得 CPU 运行权。调度器并非自动运行的,需要人为启动它。使用场景如下:int main(void){ //.... //创建任务 vTaskStartScheduler(); //开启任务调度器}一、任务调度器开启函数创建任务之后,就会调用vTaskStartScheduler()函数开启调度器,具体函数如下:vo

2020-06-17 16:55:02 1082

原创 #FreeRTOS学习笔记(二):任务创建/删除,挂起/解挂

FreeRTOS学习笔记(二):任务创建/删除,挂起/解挂上篇文章介绍了任务相关的基础知识,本篇文章对FreeRTOS任务的使用,将会介绍任务创建、删除、挂起以及恢复的API。一、任务创建与删除FreeRTOS最基本的任务操作就是任务创建与删除,其API如下表:1.1动态任务创建xTaskCreate()此函数用动态方法创建一个任务,自动分配内存,任务需要RAM来保存于任务相关的状态信息,还需要一定的RAM来作为任务堆栈。新建的任务默认就是就绪态,如果当前没有比他高的优先级任务的话,就会进入运行

2020-06-17 14:46:12 526

原创 嵌入式笔记(一):引导加载程序bootloader

嵌入式笔记(一):引导加载程序bootloader1.引导加载程序的概念和功能引导加载程序bootloader式底层软件的一部分。嵌入式系统上电复位后首先运行bootloader,它负责系统的上电自检、硬件初始化、建立存储空间映射、配置系统参数、建立上层软件运行环境、加载和启动操作系统。bootloader一般依赖于具体的硬件结构。一般而言,支持不同硬件结构的bootloader程序又不同的版本。bootloader移植是在特定的硬件系统上进行操作系统移植的关键步骤。与bootloader程序相关的

2020-06-14 21:53:51 1580

原创 FreeRTOS学习笔记(一):任务的基础知识

FreeRTOS学习笔记(一):任务的基础知识一、多任务系统1.1 前后台系统在学习操作系统之前都是都是裸机开发的,单片机中没有操作系统。裸机开发的特点就是在main函数里进行一个while(1)的大循环,所有的动作都在这个循环里。当有中断来临时,就去执行中断的程序。这种系统称之为前后台系统,中断服务程序为前台,大循环为后台。**前后台系统缺点:**就是实时性差,多个任务之间是轮询的执行的,当一些紧急的任务也必须排队等候。**前后台系统优点:**资源消耗小。1.2 多任务抢占系统多任务系统是

2020-06-09 14:28:44 684

原创 Crotex-M3中断优先级分组

Crotex-M3中断优先级分组中断简介中断是微控制器一个很常见的特性,中断由硬件产生,当中断产生以后CPU就会中断当前的流程转而去处理中断事务,Crotex-M3内核的MCU提供了一个用于中断管理的嵌套向量NVIC。中断类型Cortex‐M3 在内核水平上搭载了一个中断响应系统, 支持为数众多的系统异常和外部中断。其中,编号为 1-15 的对应系统异常,大于等于 16 的则全是外部中断,支持240个IRQ(中断请求)。除了个别异常的优先级被定死外, 其它异常的优先级都是可编程的。系统异常清单如

2020-06-07 21:41:18 977

原创 串行总线:SPI、IIC、UART

三种常用的串行数据传输总线一、SPI1.1 概念SPI(Serial Peripheral Interface - 串行外设接口)是一种用于短距离通信(主要是嵌入式系统中)的同步串行通信接口规范,这种接口由Motorola发明,已经成了一种事实标准。广泛用于各种MCU处理器中,同传感器,串行ADC、DAC、存储器、SD卡以及LCD等进行数据连接。有主(Master - 控制器)和从(Slave - 外设)之分,在总线中也就只有一个“主人”,其它都是处于服从的位置,也就是Slave,它是一种有时钟信号

2020-06-06 19:43:24 6536 1

原创 Linux网络编程笔记:socket编程(二),简单的并发服务器

Linux网络编程笔记:socket编程(二)一、概述前面一篇笔记主要写了socket的基础知识,包括什么是socket,socket在网络模型中的位置,socket编程常用的函数,最后编写了一个简单的单客户端访问服务器通信的程序。在实际的应用场景中,单客户端访问的机制显然不能满足需求的,要能够实现多个服务器能够同时访问的技术。可以利用多进程和多线程的方式实现多个客户端同时访问的机制。以下主要通过程序的形式,展现是如何实现的。二、多进程实现客户端程序不需要更改,跟前一篇内容相同。在创建多进程进行搭

2020-05-25 14:28:19 166

原创 Linux网络编程笔记:socket编程(一),简单的服务器与客户端通信

Linux网络编程笔记:socket编程(一)一、概念1.1简述socket是一种IPC方法,它允许位于同一主机或使用网络连接起来的不同主机上的应用程序之间交换数据。socket接口是TCP/IP网络的API,通过此接口,可以开发TCP/IP网络上的应用程序。socket是一种特殊的I/O,也是一种文件描述符。调用类似于打开文件的函数打开socket,会返回一个socket描述符。通过此文件描述符,我们可以建立连接,进行数据传输等操作。1.2组成socket实际上可以看成由文件描述符、读缓冲区以

2020-05-24 14:50:53 1137

原创 Linux系统编程笔记:线程同步

线程同步一、基本概念1.1线程同步线程不同步导致共享数据混乱,是由于资源共享、调度随机,缺乏同步机制。情景:程序中有一个全局变量Val,且有两个线程,线程A需要对变量Val进行读取操作,线程B需要对变量Val进行写操作,此时可能会出现对Val资源的抢夺,会导致不能按照客户的意愿进行下去,这时就需要实行线程同步。线程同步:协同步调,对公共区域数据按序访问。防止数据混乱,产生与时间有关的错误。1.2线程同步的方式常见的线程同步方法有:互斥锁、条件变量、信号量等。二、同步方法:互斥锁(互斥量)为

2020-05-23 14:23:54 213

原创 Linux系统编程:线程创建、回收、分离

线程创建、回收、分离一、线程的概念1.1线程与进程的区别进程:分配资源(内存)的最小单位,有独立的 进程地址空间,有独立的pcb。线程:程序执行的最小单位,没有独立的进程地址空间,有独立的pcb。每一个进程由一个或 者多个线程组成,即每个进程至少有一个主线程。1.2线程之间的资源共享独享:栈空间(内核栈、用户栈)共享 ./text ./data ./rodata ./bsss heap 全局变量1.3线程id与进程相似,每个线程都有自己的id,获取线程id函数如下:pthrea

2020-05-21 15:27:51 477

原创 C/C++入门:传值、传指针、传引用的三种交换函数

传值、传指针、传引用的三种交换函数从变量的地址来看,三种交换函数,新手值得看一看,直接上代码,从代码结果分析。一.代码1.1 传值打印传给函数变量的地址。void swap1(int a, int b) { int temp; cout << "-------swap1交换函数-----------------" << endl; cout << "a地址:" << &a << " " << "b地址:" &l

2020-05-20 10:01:16 1023

原创 剑指offer:链表中倒数第k个节点

C++方法解 链表中倒数第k个节点题目描述输入一个链表,输出该链表中倒数第k个结点。思路:先让一个指针a走k-1 步,然后两个指针a,b一起走,当a走到最后,b就为倒第k步骤从头到倒数第k,要走N-k步,从头走到尾要N-1 步两个指针同时要走N-k步,设第一个指针先走x步,走到尾部:x + N-k = N-1 则x = k-1,即第一指针先走k-1步。代码 class Solution { public: ListNode* FindKthToTail(ListNod

2020-05-19 15:40:56 91

翻译 C++笔记:四种类型转换

C++笔记:四种类型转换C++四种强制类型转换:const_cast , static_cast , dynamic_cast , reinterpret_cast1 const_cast:2 static_cast:3 dynamic_cast:4 reinterpret_cast:C++四种强制类型转换:const_cast , static_cast , dynamic_cast , reinterpret_cast1 const_cast:a.常量指针被转化成非常量的指针,并且仍然指向原来的对

2020-05-19 15:20:11 170

Serial.zip

利用QT5.6写的一个串口助手,能够实现两个串口之间数据发送与接收。是QT入门的练手小项目,仅仅适合初学者。

2020-06-08

空空如也

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

TA关注的人

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