野火霸天虎V2学习记录

文章目录

    • 嵌入式开发常识汇总
      • 1、嵌入式Linux和stm32之间的区别和联系
      • 2、stm32程序下载方式
      • 3、Keil5安装芯片包
      • 4、芯片封装种类
      • 5、STM32命名
      • 6、数据手册和参考手册
      • 7、什么是寄存器、寄存器映射和内存映射
      • 8、芯片引脚顺序
      • 9、stm32芯片里有什么
      • 10、存储器空间的划分
      • 11、如何理解寄存器说明
      • 12、如何操作寄存器的某一位
    • STM32F407芯片学习
      • 1、stm32单片机启动流程
        • stm32启动模式选择
        • 启动流程
      • 2、新建一个工程
        • 1、本地目录设置
        • 2、Keil新建工程
        • 3、编译项目,看有无错误
      • 3、GPIO寄存器分析和使用
        • 1、GPIO寄存器
        • 2、 使用GPIO点亮LED灯

嵌入式开发常识汇总

1、嵌入式Linux和stm32之间的区别和联系

1)嵌入式MPU:Miroc Processor Unit 微处理器单元,一般指性能更高的芯片,可以运行Linux+ARM架构,一般跑Linux或者Android系统,可以移植Qt。
2)嵌入式MCU:Micro Control Unit 微控制器单元,常见的有stm32、51、ESP8266等,芯片资源较少,性能较低。
3)嵌入式DSP:Digital Signal Procrssor :专门用于数字信号处理的芯片。
MPU和MCU都是芯片,只不过性能和资源不同,在MCU比如stm32Fxx系列的单片机性能较低,不能支持Linux这些较大的系统运行,只能运行FreeRTOS等实时系统,这些系统内核较为简单,运行起来并不需要太多的资源。在MCU上可以使用emXGUI、emWIN等图形框架。在MPU上可以运行Linux、Android等系统,界面开发一般选用Qt。在stm系列中有也有性能强大的芯片可以支持Linux系统。所以,MCU和MPU并不是以芯片公司或名称区分,只看芯片的性能。

2、stm32程序下载方式

1)串口下载:此方法需要USB转TTL下载器。stm32从系统存储器启动,boot0=1,boot1=0,需要串口转TTl,电脑安装CH340驱动,使用串口下载助手,将USB 转 TTL下载器(CH340)的TXD、RXD、GND与开发板的RXD、TXD、GND连接好,下载器另一头插电脑,下载文件即可(工具软件:FlyMcu)
2)STLINK:此方法需要STLINK下载器。电脑安装STLINK驱动,将ST-Link V2的SWDIO、GND、SWCLK、3.3V接到开发板的DIO、GND、CLK、3.3引脚上,有些板的丝印标法不同,但都能对应的看出来,然后将ST-Link插电脑上,在Keil软件上设置好Debug选项,直接下载。此方法下载程序到stm32 的Flash,所以boot引脚和串口下载不同。

3、Keil5安装芯片包

为了可以支持对相应芯片的开发,在安装好Keil软件之后还需要自己安装芯片包,否则在新建工程时找不到对应芯片。keil软件官方提供各种芯片所需要的包。地址:http://www.keil.com/dd2/pack/

4、芯片封装种类

参考文档:https://blog.csdn.net/ffdia/article/details/116222777

5、STM32命名

在这里插入图片描述

6、数据手册和参考手册

在这里插入图片描述
数据手册主要用于芯片选型和设计原理图时参考,参考手册主要用于在编程的时候查阅外设的功能和寄存器说明

7、什么是寄存器、寄存器映射和内存映射

STM32有32根地址线,理论上其寻址空间为2的32次方,所以STM32的有效地址最多有4G个,每个地址代表1B,STM32的存储地址就有4GB。
然而上述都是理论上的,STM32可以使用的存储空间远远没有4GB。
映射的意思就是将理论上存在的地址对应到具体的设备,如:0x1234 5678 ~ 0x2234 5678 ==>flash,在硬件上将对应的线路连接至Flash,这样在访问这些地址时就是在访问Flash设备,通过指针对这些地址读写就是对Flash的读写。

内存映射(存储器映射): 将理论上的地址对应到具体的外设上。
寄存器映射 :给对应的内存地址取个别名,便于记忆和访问内存地址 例如:define REGISTER 0x1111 2222
寄存器:为不同内存地址取的别名,别名与内存映射的外设有关,如上面的REGISTER,若定义 (uint_16*)REGISTER,则REGISTER寄存器就代表 0x1111 2222 往后的16个地址,对寄存器的操作就是对这16个地址操作,一般使用定义结构体,这样只需要将结构体首地址对应到寄存器基地址,结构体中的成员就可以按照对应的基地址往后占位,操作结构体成员,就是在对基地址之后的地址操作。

在存储器 Block2 这块区域,设计的是片上外设,它们以四个字节为一个单元,共 32bit,每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。我们可以找到每个单元的起始地址,然后通过 C 语言指针的操作方式来访问这些单元,如果每次都是通过这种地址的方式来访问,不仅不好记忆还容易出错,这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。

8、芯片引脚顺序

一般在芯片的一角有一个缺口或者小圆点,此处为1脚,引脚按逆时针排序。

9、stm32芯片里有什么

1)ContexM内核====>相当于CPU,由ARM公司设计
2)片上外设====>ISP、USART、ADC、DAC、FSMC、Flash、RAM等,这些由ST厂家设计
3)系统总线矩阵==>连接外设和内核,由ST厂家设计。

10、存储器空间的划分

存储器空间被ARM公司打开划分为8块(block0~block7),每块大小为512MB。最重要就是Block0 ~ 2 这三块,Block0 为内部Flash,用作程序存放,Block1为内部RAM,Block2为外设地址,ST公司将Block2划分为AHB、APB,APB又划分为APB1、APB2,AHB又划分为AHB1、AHB2.
在这里插入图片描述

11、如何理解寄存器说明

在这里插入图片描述

12、如何操作寄存器的某一位

使用逻辑或或逻辑与,例如操作寄存器32位reg的第六位
置1:( * reg)|=( 0x01<<6);
置0:( * reg)&=~(0x01<<6)

STM32F407芯片学习

1、stm32单片机启动流程

stm32启动模式选择

在这里插入图片描述
复位后,在 SYSCLK 的第四个上升沿锁存 BOOT 引脚的值。BOOT0 为专用引脚,而 BOOT1 则与 GPIO 引脚共用。一旦完成对 BOOT1 的采样,相应 GPIO 引脚即进入空闲状态,可用于其它用途。BOOT0与BOOT1引脚的不同值指向了三种启动方式:

从主Flash启动。主Flash指的是STM32的内置Flash。选择该启动模式后,内置Flash的起始地址将被重映射到0x00000000地址,代码将在该处开始执行。一般我们使用JTAG或者SWD模式下载调试程序时,就是下载到这里面,重启后也直接从这启动。
从系统存储器启动。系统储存器指的是STM32的内置ROM,选择该启动模式后,内置ROM的起始地址将被重映射到0x00000000地址,代码在此处开始运行。ROM中有一段出厂预置的代码,这段代码起到一个桥的作用,允许外部通过UART/CAN或USB等将代码写入STM32的内置Flash中。这段代码也被称为ISP(In System Programing)代码,这种烧录代码的方式也被称为ISP烧录。关于ISP、ICP和IAP之间的区别将在后续章节中介绍。
从嵌入式SRAM中启动。显然,该方法是在STM32的内置SRAM中启动,选择该启动模式后,内置SRAM的起始地址将被重映射到0x00000000地址,代码在此处开始运行。这种模式由于烧录程序过程中不需要擦写Flash,因此速度较快,适合调试,但是掉电丢失。
原文链接
启动模式只决定程序烧录的位置,加载完程序之后会有一个重映射(映射到0x00000000地址位置);真正产生复位信号的时候,CPU还是从开始位置执行。
值得注意的是STM32上电复位以后,代码区都是从0x00000000开始的,三种启动模式只是将各自存储空间的地址映射到0x00000000中。

启动流程

1)进入启动文件(厂家提供)
2)设置内存地址
3)设置向量表
4)设置时钟
5)初始化寄存器
6)设置堆栈
7)设置各指针值
8)进去main函数
以上操作在启动文件中的顺序可以参考启动文件中的汇编代码。

2、新建一个工程

1、本地目录设置

1)在本地新建项目文件夹
在这里插入图片描述
2)新建子目录用于存放对应文件
在这里插入图片描述
3)将厂家提供的文件放至对应新建目录
在这里插入图片描述

CMSIS下的文件
启动文件
在这里插入图片描述
寄存器配置文件、管理文件
在这里插入图片描述
内核外设文件,拷贝至Lib
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2、Keil新建工程

1)创建项目
2)设置项目目录
在这里插入图片描述
3)向项目目录添加文件
在这里插入图片描述
4)设置项目,使用C库文件,在使用串口时可以使用printf函数。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
默认宏
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
设置USE_STDPERIPH_DRIVER,STM32F40XX这两个宏之后,在编译程序时会根据宏添加所需要的文件。
设置Debug,选择要使用的调试器,如STLINK等
在这里插入图片描述
设置调试器选项
在这里插入图片描述
在这里插入图片描述

3、编译项目,看有无错误

在这里插入图片描述
根据错误添加头文件路径或头文件
在这里插入图片描述
在这里插入图片描述
再次编译,出现错误,f407没该外设,项目中删除该外设的文件
在这里插入图片描述
再次编译,报错
在这里插入图片描述
TimingDelay_Decrement();函数在系统SysTick的中断服务函数中调用,但是并没有实现此函数,所以报错,该函数应该提供的内容可以是操作全局变量计时。先在还没有定义此函数,注释即可。再次编译。
在这里插入图片描述
未定义SystemInit函数,该函数在启动文件中被引用,但是并没有实现,可以在其他地方实现该函数,后者在启动文件中删除SystemInit函数相关语句。在使stm32f4xx_it.c中实现该函数。再次编译。
在这里插入图片描述
使用MDK5.XX以后的版本,用户不需要写上面的预定义,因为在选择相应器件以后,编译器已经将相应的头文件加入了。取消默认宏,再次编译。
在这里插入图片描述
在这里插入图片描述
无错误,无告警。下载程序至开发板成功
在这里插入图片描述
至此,新建项目完成。

3、GPIO寄存器分析和使用

1、GPIO寄存器

参考手册中又详细内容
1)端口模式寄存器 GPIOx_MODER:配置端口模式,有四种:输入、输出、复用模拟
2) 端口输出类型寄存器 GPIOx_OTYPER:输出模式时需要配置,推挽或开漏
开漏输出,通过一个NMOS管和上拉电阻实现
在这里插入图片描述
推挽输出,通过两个mos管实现
在这里插入图片描述
3)GPIO 端口输出速度寄存器 GPIOx_OSPEEDR:配置端口电平转换速度,即IO口输出速度
4) 端口上拉/下拉寄存器 GPIOx_PUPDR:无上拉下拉、上拉、下拉、保留。
当GPIO处于output模式,一般选择no pull,引脚能够正确地输出输出高电平低电平信号
当GPIO处于input模式,需要根据默认的输入值来确定配置模式,如果默认输入的值为1时,最好配置为pull up,默认值为0,则选择下拉。
所以上下拉就是选择在默认情况下gpio端口的电平高低。
5)端口输入数据寄存器 GPIOx_IDR:端口输入的数据,即电平高低,该寄存器只能读,低16位有效。
6)端口输出数据寄存器 GPIOx_ODR:端口输出寄存器,低16位有效,可读可写,用以获取或设置端口的输出电平。
7) 端口置位/复位寄存器 GPIOx_BSRR:只能写,高16位BRy(复位),这些位置1,则对应端口复位。低16位BSy(置位),这些位置1,则对应端口置位。复位时,复位位复位值,置位值与复位值相反。对ODR操作。同时对BSx和BRx操作,BSx优先级更高,在对BSSR写后会自动清零。
8)端口配置锁定寄存器 GPIOx_LCKR:可读可写,低17位有效。由于锁定某GPIO端口的配置,每一位锁定某个寄存器的配置。锁定后在复位之前无法更改该端口位的值。
LCKR[16] = 0,未锁定,可以对LCKR[15:0]操作;
LCKR[15:0]:对应一个GPIO端口位,对应位置1,则锁定配置。
9)复用功能低位寄存器 GPIOx_AFRL:四位一组,确定一个端口的复用功能(0~7位端口)
10)复用功能高位寄存器 GPIOx_AFRL:四位一组,确定一个端口的复用功能(8~15位端口)

2、 使用GPIO点亮LED灯

1)确定LED的端口和连接方式
在这里插入图片描述
共阳极连接,GPIO默认输出高电平,则灯灭,控制使出低电平则灯亮,连接端口位PF6、7、8(红、蓝、绿)
2)配置GPIOF6、7、8位上拉、推挽、高速模式(对于LED并不重要)
3)写头文件和C文件
问题记录:

问题1:写好后,LED无反应
原因:再新建工程时编译报错未定义SystemInit函数,所以自己在stm32f4xx_it.c中自己写了一个空函数,实际上该函数在system_stm32f4xx.c中,但新建文件时并没有将该文件加入工程,SystemInit函数中设置了时钟等系统资源,将此函数变为空函数则系统时钟等系统资源未初始化,所以代码无法执行。
解决:将system_stm32f4xx.c文件加入项目,删除自己写的空函数

问题2:初始化GPIO后,LED点亮.
原因:ODR复位值为0,LED为共阳极连接,所以导致电压一侧高,GPIO端口处电压低,导致电流流过LED。
解决:初始化GPIO后将将端口置位。
代码

#include "bsp_led.h"



void BSP_LEDInit(void)
{
	RCC_AHB1PeriphClockCmd(LED_RAD_CLK,ENABLE);
	RCC_AHB1PeriphClockCmd(LED_BLUE_CLK,ENABLE);
	RCC_AHB1PeriphClockCmd(LED_GREE_CLK,ENABLE);
	
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin   =   LED_RAD_PIN; 	    
    GPIO_InitStruct.GPIO_Mode  =   LED_RAD_Mode;                           
    GPIO_InitStruct.GPIO_Speed =   LED_RAD_Speed;	                             
    GPIO_InitStruct.GPIO_OType =   LED_RAD_OType;	            
    GPIO_InitStruct.GPIO_PuPd  =   LED_BLUE_PuPd;
	GPIO_Init(LED_RAD_PORT,&GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Pin   =   LED_GREE_PIN; 	    
    GPIO_InitStruct.GPIO_Mode  =   LED_GREE_Mode;                           
    GPIO_InitStruct.GPIO_Speed =   LED_GREE_Speed;	                             
    GPIO_InitStruct.GPIO_OType =   LED_GREE_OType;	            
    GPIO_InitStruct.GPIO_PuPd  =   LED_BLUE_PuPd;
	GPIO_Init(LED_GREE_PORT,&GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Pin   =   LED_BLUE_PIN; 	    
    GPIO_InitStruct.GPIO_Mode  =   LED_BLUE_Mode;                           
    GPIO_InitStruct.GPIO_Speed =   LED_BLUE_Speed;	                             
    GPIO_InitStruct.GPIO_OType =   LED_BLUE_OType;	            
    GPIO_InitStruct.GPIO_PuPd  =   LED_BLUE_PuPd;
	GPIO_Init(LED_BLUE_PORT,&GPIO_InitStruct);
	
	
	LED_SetSatus(LED_RAD,DISABLE);
	LED_SetSatus(LED_GREE,DISABLE);
	LED_SetSatus(LED_BLUE,DISABLE);
	
}


void LED_SetSatus(LEDx led,FunctionalState status)
{
	if(status)
	{
		GPIO_ResetBits(GPIOF,(uint32_t)(0x01<<led));
		
	}
	else{
		GPIO_SetBits(GPIOF,(uint32_t)(0x01<<led));
	}
}

头文件

#ifndef  __BSP_LED_H
#define  __BSP_LED_H

#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"

#define LED_RAD_PORT	GPIOF
#define LED_RAD_PIN 	GPIO_Pin_6
#define LED_RAD_Mode	GPIO_Mode_OUT
#define LED_RAD_Speed	GPIO_Low_Speed
#define LED_RAD_OType	GPIO_OType_PP
#define LED_RAD_PuPd	GPIO_PuPd_NOPULL 
#define LED_RAD_CLK		RCC_AHB1Periph_GPIOF

#define LED_GREE_PORT	GPIOF
#define LED_GREE_PIN 	GPIO_Pin_7
#define LED_GREE_Mode	GPIO_Mode_OUT
#define LED_GREE_Speed	GPIO_Low_Speed
#define LED_GREE_OType	GPIO_OType_PP
#define LED_GREE_PuPd	GPIO_PuPd_UP 
#define LED_GREE_CLK	RCC_AHB1Periph_GPIOF

#define LED_BLUE_PORT	GPIOF
#define LED_BLUE_PIN 	GPIO_Pin_8
#define LED_BLUE_Mode	GPIO_Mode_OUT
#define LED_BLUE_Speed	GPIO_Low_Speed
#define LED_BLUE_OType	GPIO_OType_PP
#define LED_BLUE_PuPd	GPIO_PuPd_UP //猜想:设置为下拉,初始化后LED亮
#define LED_BLUE_CLK	RCC_AHB1Periph_GPIOF

typedef enum
{
	LED_RAD  = 6,
	LED_GREE = 7,
	LED_BLUE = 8
}LEDx;





void BSP_LEDInit(void);
void LED_SetSatus(LEDx led,FunctionalState status);





#endif /*__BSP_LED_H*/

在头文件中将端口参数重定义是为了以后移植方便

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/873298.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何部署Vue+Springboot项目

很多同学在项目上线的部署遇到困难&#xff0c;不懂得怎么部署项目&#xff0c;本文将会带大家手把手从前端部署、java部署来教会大家。 如果项目涉及到了docker相关中间件的环境配置&#xff0c;请参看&#xff1a;https://blog.csdn.net/weixin_73195042/article/details/13…

C#发送正文带图片带附件的邮件

1&#xff0c;开启服务&#xff0c;获取授权码。以QQ邮箱为例&#xff1a; 点击管理服务&#xff0c;进入账号与安全页面 2&#xff0c;相关设置参数&#xff0c;以QQ邮箱为例&#xff1a; 登录时&#xff0c;请在第三方客户端的密码输入框里面填入授权码进行验证。&#xff0…

解决 Ant Design Vue Upload 组件在苹果手机上只能拍照无法选择相册的问题

最近上线发现了这个问题&#xff0c;看别的文档改了很多属性也不行&#xff0c;发现element组件就可以&#xff0c;对比之后就知道问题所在。 原因&#xff1a; 默认情况下&#xff0c;iOS 设备会将 <input type"file"> 的 capture 属性设置为 true&#xff0…

[数据集][目标检测]电动车头盔佩戴检测数据集VOC+YOLO格式4235张5类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4235 标注数量(xml文件个数)&#xff1a;4235 标注数量(txt文件个数)&#xff1a;4235 标注…

python 正则表达式“.*”和“.*? ”的区别

“.*”和“.*? ”的区别 点号表示任意非换行符的字符&#xff0c;星号表示匹配它前面的字符0次或者任意多次。所以“.*”表示匹配一串任意长度的字符串任意次。这个时候必须在“.*”的前后加其他的符号来限定范围&#xff0c;否则得到的结果就是原来的整个字符串。 “.*? &…

基于SpringBoot校园快递代取系统

基于springbootvue实现的校园快递代取系统&#xff08;源码L文ppt&#xff09;4-049 3系统设计 3.1.1系统结构图 系统结构图可以把杂乱无章的模块按照设计者的思维方式进行调整排序&#xff0c;可以让设计者在之后的添加&#xff0c;修改程序内容…

基于SpringBoot框架和Flask的图片差异检测与展示系统

目录 1. 项目目标 2. 功能需求 &#xff08;1&#xff09;图片上传功能 &#xff08;2&#xff09;差异检测算法 &#xff08;3&#xff09;后端服务 &#xff08;4&#xff09;前端展示 &#xff08;5&#xff09;阿里云服务器存储 &#xff08;6&#xff09;数据库记…

Java:正则表达式 matches

文章目录 正则表达式作用基本用法小结代码 案例&#xff1a;校验用户输入的电话&#xff0c;邮箱&#xff0c;是否合法\\.是什么意思 黑马学习笔记 正则表达式 由一些特定的字符组成&#xff0c;代表的是一个规则 作用 用来校验数据格式是否合法在一段文本中查找满足要求的内…

Elasticsearch:无状态世界中的数据安全

作者&#xff1a;来自 Elastic Henning Andersen 在最近的博客文章中&#xff0c;我们宣布了支持 Elastic Cloud Serverless 产品的无状态架构。通过将持久性保证和复制卸载到对象存储&#xff08;例如 Amazon S3&#xff09;&#xff0c;我们获得了许多优势和简化。 从历史上…

Web3D 技术发展瓶颈在哪里?

Web3D 技术的发展瓶颈主要集中在以下几个方面&#xff1a; 1、性能和优化&#xff1a;尽管现代浏览器和硬件逐步提高了性能&#xff0c;但高质量的3D渲染仍可能导致性能瓶颈。特别是在移动设备上&#xff0c;图形渲染和计算可能会受到限制。建议合理控制好项目资源量&#xff…

实验记录 | 点云处理 | K-NN算法3种实现的性能比较

引言 K近邻&#xff08;K-Nearest Neighbors, KNN&#xff09;算法作为一种经典的无监督学习算法&#xff0c;在点云处理中的应用尤为广泛。它通过计算点与点之间的距离来寻找数据点的邻居&#xff0c;从而有效进行点云分类、聚类和特征提取。本菜在复现点云文章过程&#xff…

详解React setState调用原理和批量更新的过程

1. React setState 调用的原理 setState目录 1. React setState 调用的原理2. React setState 调用之后发生了什么&#xff1f;是同步还是异步&#xff1f;3. React中的setState批量更新的过程是什么&#xff1f; 具体的执行过程如下&#xff08;源码级解析&#xff09;&#x…

基于SpringBoot+Vue+MySQL的宿舍维修管理系统

系统展示 前台界面 管理员界面 维修员界面 学生界面 系统背景 在当今高校后勤管理的日益精细化与智能化背景下&#xff0c;宿舍维修管理系统作为提升校园生活品质、优化资源配置的关键环节&#xff0c;其重要性日益凸显。随着学生规模的扩大及住宿条件的不断提升&#xff0c;宿…

人机交互系统中的人脸讲话生成系统调研

《Human-Computer Interaction System: A Survey of Talking-Head Generation》 图片源&#xff1a;https://github.com/Yazdi9/Talking_Face_Avatar 目录 前言摘要一、背景介绍二、人机交互系统体系结构2.1. 语音模块2.2. 对话系统模块2.3. 人脸说话动作生成 三 人脸动作生成…

来啦| LVMH路威酩轩25届校招智鼎高潜人才思维能力测验高分攻略

路威酩轩香水化妆品(上海)有限公司是LVMH集团于2000年成立&#xff0c;负责集团旗下的部分香水化妆品品牌在中国的销售包括迪奥、娇兰、纪梵希、贝玲妃、玫珂菲、凯卓、帕尔马之水以及馥蕾诗等。作为目前全球最大的奢侈品集团LVMH 集团秉承悠久的历史&#xff0c;不断打破常规&…

【微处理器系统原理和应用设计第六讲】片上微处理器系统系统架构

一、概念辨析 首先来厘清以下概念&#xff1a;微处理器&#xff0c;微控制器&#xff0c;单片机&#xff0c;片上微处理器系统 &#xff08;1&#xff09;微处理器&#xff1a;即MPU&#xff08;Microprocessor Unit&#xff09;&#xff0c;微处理器是一种计算机的中央处理单…

如何打造个性化大学生聊天室?Java SpringBoot Vue实战,2025最新设计指南

✍✍计算机毕业编程指导师** ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java…

【深度学习】向量化

1. 什么是向量化 向量化通常是消除代码中显示for循环语句的技巧&#xff0c;在深度学习实际应用中&#xff0c;可能会遇到大量的训练数据&#xff0c;因为深度学习算法往往在这种情况下表现更好&#xff0c;所以代码的运行速度非常重要&#xff0c;否则如果它运行在一个大的数据…

【Linux】翻山越岭——进程地址空间_c语言父子进程地址空间

文章目录 一、是什么 写时拷贝 二、为什么三、怎么做 区域划分和调整 一、是什么 回顾我们学习C/C时的地址空间&#xff1a; 有了这个基本框架&#xff0c;我们对于语言的学习更加易于理解&#xff0c;但是地址空间究竟是什么❓我们对其并不了解&#xff0c;是不是内存呢&…

海外云服务器安装 MariaDB10.6.X (Ubuntu 18.04 记录篇二)

本文首发于 秋码记录 MariaDB 的由来&#xff08;历史&#xff09; 谈起新秀MariaDB&#xff0c;或许很多人都会感到陌生吧&#xff0c;但若聊起享誉开源界、业界知名的关系型数据库——Mysql&#xff0c;想必混迹于互联网的人们&#xff08;coder&#xff09;无不知晓。 其…