- 博客(39)
- 资源 (1)
- 收藏
- 关注
原创 IMX6Q的SD卡启动使用教程【超完整】(1):uboot与kernel编译移植
本文主要介绍的是NXP官方开发板imx6q-sabresdSD卡烧写启动教程。
2022-10-29 17:25:31
2894
原创 I2C驱动框架分析(3):DW_I2C驱动分析
i2c是低速模块中最常见的模块之一,也是linux系统的最基础的框架,本系列内容主要针对dw厂商的i2c IP进行分析
2022-10-28 06:00:00
2107
原创 I2C驱动框架分析(2):I2C框架源码分析
i2c是低速模块中最常见的模块之一,也是linux系统的最基础的框架,本系列内容主要针对dw厂商的i2c IP进行分析
2022-10-27 06:00:00
1615
原创 I2C驱动框架分析(1):I2C重要概念与数据结构
i2c是低速模块中最常见的模块之一,也是linux系统的最基础的框架,本系列内容主要针对dw厂商的i2c IP进行分析
2022-10-26 06:00:00
987
原创 基于IMX6Q的uboot启动流程分析(3):_main函数之relocate_code与board_init_r
本文主要分析IMX6Q下的uboot启动流程
2022-10-25 11:17:06
1021
原创 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
7511
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
2393
2
原创 MQTT笔记:常用的控制报文
MQTT笔记:常用的控制报文MQTT总共有十几种控制报文,本章笔记将会介绍几种常用的控制报文:连接、订阅、取消订阅以及发布几个控制报文。一、CONNECT控制报文客户端与服务器建立连接后的一个控制报文就是connect报文。在一个网络连接上以后,客户端只能发送一次connect报文。CONNECT控制报文由固定报头、可变报头以及有效载荷组成。1.1固定报头固定报头如下表所示:第一个字节为固定的0x10,以后是剩余长度。则固定报头为: 10 ?? ;??表示剩余长度取决于后面的长度,计算
2020-09-07 14:25:14
1187
原创 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
1235
原创 联合体判断大端与小端
大端、小端大端:数据的高字节存放在低地址处,数据的低字节存放在高地址处。小端:数据的低字节存放在低地址处,数据的高字节存放在高地址处。联合体联合体开辟内存法规则是:选取联合体成员变量中,占用内存最大的内存大小,比如联合体内有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
2482
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
1907
原创 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
2555
原创 Cortex‐M3内核学习笔记(三):SVC和PendSV
一、SVCSVC(系统服务调用,亦简称系统调用)用于产生系统函数的调用请求。例如,操作系统不让用户程序直接访问硬件,而是通过提供一些系统服务函数,用户程序使用 SVC 发出对系统服务函数的呼叫请求,以这种方法调用它们来间接访问硬件。因此,当用户程序想要控制特定的硬件时,它就会产生一个 SVC 异常,然后操作系统提供的 SVC 异常服务例程得到执行,它再调用相关的操作系统函数,后者完成用户程序请求的服务。SVC这种工作模式优点有以下几点:● 它使用户程序从控制硬件的繁文缛节中解脱出来,而是由 OS 负
2020-07-29 15:06:32
1287
1
原创 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
777
原创 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
1595
原创 嵌入式笔记(二):IAP的初步学习
IAP简介IAP(In Application Programming)即在应用编程, IAP 是用户自己的程序在运行过程中对User Flash 的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。通常实现 IAP 功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信方式(如USB、 USART)接收程序或数据,执行对第二部分代码的更新;第二个项目代码才是真正的功能代码。这
2020-07-14 17:19:33
561
原创 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
1082
原创 基于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
15006
12
原创 FreeRTOS笔记(五):任务切换
FreeRTOS笔记(五):任务切换本章是FreeRTOS系统的核心内容,更是面试求职过程中重要的考点。对于实时操作系统,任务切换决定了任务执行顺序,任务切换也决定了效率的高低。下面将详细介绍任务切换的内容。一、PendSV中断任务切换是依靠PendSV中断(可挂起的系统调用)来实现的,因此PendSV中断对操作系统来说是重点。PendSV中断是可编程中断,触发条件是:将中断控制和状态寄存器ICSR的bit28置为1。与SVC不同,它是不精准的,因此它的挂起状态可在更高优先级中断中处理内设置,而且会
2020-06-18 15:29:34
1882
原创 FreeRTOS笔记(四):任务创建/删除,挂起/解挂详解
FreeRTOS笔记(四):任务创建/删除,挂起/解挂详解在第二篇笔记中介绍了任务创建的API,并且简单使用了相关API,本文将详细介绍任务创建的过程。一、任务创建任务创建步骤为:1.创建任务;2.初始化任务;3.任务堆栈初始化;4.任务添加到就绪列表。下面将详细介绍这四个部分。1.1任务创建函数分析任务创建函数为xTaskCreate(),函数的具体实现如下:BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, const
2020-06-18 10:09:02
1031
原创 FreeRTOS笔记(三):任务调度器
FreeRTOS笔记(三):任务调度器调度器是 FreeRTOS 操作系统的核心,主要负责任务切换,即找出最高优先级的就绪任务,并使之获得 CPU 运行权。调度器并非自动运行的,需要人为启动它。使用场景如下:int main(void){ //.... //创建任务 vTaskStartScheduler(); //开启任务调度器}一、任务调度器开启函数创建任务之后,就会调用vTaskStartScheduler()函数开启调度器,具体函数如下:vo
2020-06-17 16:55:02
1153
原创 #FreeRTOS学习笔记(二):任务创建/删除,挂起/解挂
FreeRTOS学习笔记(二):任务创建/删除,挂起/解挂上篇文章介绍了任务相关的基础知识,本篇文章对FreeRTOS任务的使用,将会介绍任务创建、删除、挂起以及恢复的API。一、任务创建与删除FreeRTOS最基本的任务操作就是任务创建与删除,其API如下表:1.1动态任务创建xTaskCreate()此函数用动态方法创建一个任务,自动分配内存,任务需要RAM来保存于任务相关的状态信息,还需要一定的RAM来作为任务堆栈。新建的任务默认就是就绪态,如果当前没有比他高的优先级任务的话,就会进入运行
2020-06-17 14:46:12
584
原创 嵌入式笔记(一):引导加载程序bootloader
嵌入式笔记(一):引导加载程序bootloader1.引导加载程序的概念和功能引导加载程序bootloader式底层软件的一部分。嵌入式系统上电复位后首先运行bootloader,它负责系统的上电自检、硬件初始化、建立存储空间映射、配置系统参数、建立上层软件运行环境、加载和启动操作系统。bootloader一般依赖于具体的硬件结构。一般而言,支持不同硬件结构的bootloader程序又不同的版本。bootloader移植是在特定的硬件系统上进行操作系统移植的关键步骤。与bootloader程序相关的
2020-06-14 21:53:51
1886
原创 FreeRTOS学习笔记(一):任务的基础知识
FreeRTOS学习笔记(一):任务的基础知识一、多任务系统1.1 前后台系统在学习操作系统之前都是都是裸机开发的,单片机中没有操作系统。裸机开发的特点就是在main函数里进行一个while(1)的大循环,所有的动作都在这个循环里。当有中断来临时,就去执行中断的程序。这种系统称之为前后台系统,中断服务程序为前台,大循环为后台。**前后台系统缺点:**就是实时性差,多个任务之间是轮询的执行的,当一些紧急的任务也必须排队等候。**前后台系统优点:**资源消耗小。1.2 多任务抢占系统多任务系统是
2020-06-09 14:28:44
827
原创 Crotex-M3中断优先级分组
Crotex-M3中断优先级分组中断简介中断是微控制器一个很常见的特性,中断由硬件产生,当中断产生以后CPU就会中断当前的流程转而去处理中断事务,Crotex-M3内核的MCU提供了一个用于中断管理的嵌套向量NVIC。中断类型Cortex‐M3 在内核水平上搭载了一个中断响应系统, 支持为数众多的系统异常和外部中断。其中,编号为 1-15 的对应系统异常,大于等于 16 的则全是外部中断,支持240个IRQ(中断请求)。除了个别异常的优先级被定死外, 其它异常的优先级都是可编程的。系统异常清单如
2020-06-07 21:41:18
1178
原创 串行总线:SPI、IIC、UART
三种常用的串行数据传输总线一、SPI1.1 概念SPI(Serial Peripheral Interface - 串行外设接口)是一种用于短距离通信(主要是嵌入式系统中)的同步串行通信接口规范,这种接口由Motorola发明,已经成了一种事实标准。广泛用于各种MCU处理器中,同传感器,串行ADC、DAC、存储器、SD卡以及LCD等进行数据连接。有主(Master - 控制器)和从(Slave - 外设)之分,在总线中也就只有一个“主人”,其它都是处于服从的位置,也就是Slave,它是一种有时钟信号
2020-06-06 19:43:24
6904
1
原创 Linux网络编程笔记:socket编程(二),简单的并发服务器
Linux网络编程笔记:socket编程(二)一、概述前面一篇笔记主要写了socket的基础知识,包括什么是socket,socket在网络模型中的位置,socket编程常用的函数,最后编写了一个简单的单客户端访问服务器通信的程序。在实际的应用场景中,单客户端访问的机制显然不能满足需求的,要能够实现多个服务器能够同时访问的技术。可以利用多进程和多线程的方式实现多个客户端同时访问的机制。以下主要通过程序的形式,展现是如何实现的。二、多进程实现客户端程序不需要更改,跟前一篇内容相同。在创建多进程进行搭
2020-05-25 14:28:19
183
原创 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
1168
原创 Linux系统编程笔记:线程同步
线程同步一、基本概念1.1线程同步线程不同步导致共享数据混乱,是由于资源共享、调度随机,缺乏同步机制。情景:程序中有一个全局变量Val,且有两个线程,线程A需要对变量Val进行读取操作,线程B需要对变量Val进行写操作,此时可能会出现对Val资源的抢夺,会导致不能按照客户的意愿进行下去,这时就需要实行线程同步。线程同步:协同步调,对公共区域数据按序访问。防止数据混乱,产生与时间有关的错误。1.2线程同步的方式常见的线程同步方法有:互斥锁、条件变量、信号量等。二、同步方法:互斥锁(互斥量)为
2020-05-23 14:23:54
222
原创 Linux系统编程:线程创建、回收、分离
线程创建、回收、分离一、线程的概念1.1线程与进程的区别进程:分配资源(内存)的最小单位,有独立的 进程地址空间,有独立的pcb。线程:程序执行的最小单位,没有独立的进程地址空间,有独立的pcb。每一个进程由一个或 者多个线程组成,即每个进程至少有一个主线程。1.2线程之间的资源共享独享:栈空间(内核栈、用户栈)共享 ./text ./data ./rodata ./bsss heap 全局变量1.3线程id与进程相似,每个线程都有自己的id,获取线程id函数如下:pthrea
2020-05-21 15:27:51
518
原创 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
1089
原创 剑指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
100
翻译 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
180
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人