单片机快速入门

参考连接:

  • 安装MinGW-64(在win10上搭建C/C++开发环境)https://zhuanlan.zhihu.com/p/85429160
  • MinGW-64; 链接:https://pan.baidu.com/s/1oE1FmjyK7aJPnDC8vASmCg?pwd=y1mz 提取码:y1mz --来自百度网盘超级会员V7的分享
  • C语言菜鸟教程 https://www.runoob.com/cprogramming/c-tutorial.html
  • C语言复习8-10,分别对应数组;指针;字符串;https://blog.csdn.net/qq_43369406/article/details/125154550https://blog.csdn.net/qq_43369406/article/details/125163465https://blog.csdn.net/qq_43369406/article/details/125164029
  • 野火F407开发板-霸天虎视频-【入门篇】 https://www.bilibili.com/video/BV1Vt411X7PK/
  • 野火霸天虎教程https://doc.embedfire.com/products/link/zh/latest/mcu/stm32/ebf_stm32f407_batianhu_v1_v2/download/stm32f407_batianhu_v1_v2.html
  • 【单片机】野火STM32F103教学视频 (配套霸道/指南者/MINI)【全】(刘火良老师出品) (无字幕) https://www.bilibili.com/video/BV1yW411Y7Gw/?vd_source=39f3289ad7c2358aaf9772ccb7ff98bf

使用硬件:

  • stm32 407

使用软件:

  • MinGW
  • VSCode
  • Keil5

使用系统(以下皆可):

  • win10/11
  • Linux
  • Mac OS

目录:

  • x.1 C语言基础知识
  • x.2 单片机基础知识
  • 单片机GPIO介绍

x.1 C语言基础知识

如果有C语言基础可以直接跳过。

x.1.1 C语言背景知识

C语言是为了Unix系统而诞生的语言。C 语言是一种通用的、面向过程式的计算机程序设计语言。1972 年,为了移植与开发 UNIX 操作系统,丹尼斯·里奇在贝尔电话实验室设计开发了 C 语言。

x.1.2 C语言的安装

可以通过访问 MinGW 的主页 mingw-w64.org;知乎上文章- 安装MinGW-64(在win10上搭建C/C++开发环境)https://zhuanlan.zhihu.com/p/85429160 ;MinGW-64; 链接:https://pan.baidu.com/s/1oE1FmjyK7aJPnDC8vASmCg?pwd=y1mz 提取码:y1mz --来自百度网盘超级会员V7的分享来下载安装。

当安装 MinGW 时,您至少要安装 gcc-core、gcc-g++、binutils 和 MinGW runtime,但是一般情况下都会安装更多其他的项。

添加您安装的 MinGW 的 bin 子目录到您的 PATH 环境变量中,这样您就可以在命令行中通过简单的名称来指定这些工具。

x.1.3 C语言运行流程

C语言是一门针对操作系统设计的,强类型,面向过程,运行速度媲美汇编,在运行时先要将内容编译成汇编语言的一门语言。我们使用VSCODE编辑文本,使用GCC汇编成二进制文件,输入如下命令将编辑器写好的.c文件转成.out二进制文件,

$ gcc test1.c test2.c -o main.out
$ ./main.out

输出的.out文件可以直接运行。当然更加细节的操作牵扯到更深的计算机知识,链接库等,但并不需要。

x.1.4 C语言的组成和运行规则

C语言由关键字,标识符,常量,字符串值,符号(分号),注释等组成。

C语言都是从main函数开始运行的,一个C语言的简单例程如下所示,

#include <stdio.h>int main()
{/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0;
}

所有的 C 语言程序都需要包含 main() 函数。 代码从 main() 函数开始执行。

/* … */ 用于注释说明。

printf() 用于格式化输出到屏幕。printf() 函数在 “stdio.h” 头文件中声明。

stdio.h 是一个头文件 (标准输入输出头文件) , #include 是一个预处理命令,用来引入头文件。 当编译器遇到 printf() 函数时,如果没有找到 stdio.h 头文件,会发生编译错误。使用<>来寻找系统环境变量中的问价,使用""先找当前文件中的文件,找不到再去系统环境变量中查找。

return 0; 语句用于表示退出程序。

x.1.5 C语言的变量类型

C语言的基本类型包括整型(int32),布尔型(u8),浮点型(double64),字符型(u8)。我们可以使用sizeof关键字来查看对象或者变量的大小,

#include <stdio.h>
#include <limits.h>int main()
{printf("size of int is: %lu \n", sizeof(int));int i = 0;printf("%p\n", &i);//输出:000000000061FE1C  输出的是i变量的地址return 0;
}

输出结果如下,

在这里插入图片描述

%lu 为 32 位无符号整数,%p为输出指针内存地址,默认以十六位输出。常见的变量类型及其对应的大小如下,

请添加图片描述

我们使用type i的时候是对i变量声明并定义(会在内存开辟空间),使用extern type i的时候只是声明变量(并不会在内存给空间)。

extern int i; //声明,不是定义
int i; //声明,也是定义

x.1.6 C语言的常量

常见的常量有整数常量(如0xFFFFFF,7u等),浮点常量(3.14,3.14f),字符常量(如转义字符\t),还可以使用常见预处理器来定义常量,例如#define和const关键字,如下,

#define PI 3.14
const double PI_2 = 3.14;

推荐使用#define关键字,define是进行简单的文本替换,老外常用。

x.1.7 C作用域和存储类

C语言根据程序中定义的变量所存在的区域来决定变量的作用域,我们需要掌握的作用域就两种,局部变量和全局变量。在函数或块内部的变量称为局部变量,在所有函数外部的称为全局变量。

C语言变量存储类常见有auto,register,static,extern四种,局部变量的默认类型是auto,变量在函数和开始时被创建,在函数结束时被销毁。而register是放在寄存器中的变量,运行速度快,static和extern都是全局变量,在全局都可以调用,

static int count=10;        /* 全局变量 - static 是默认的 */{auto int month; // auto是默认的
}int main(){printf(count);// printf(month); // can'treturn 0;
}

x.1.8 C语言运算符

C语言常见运算符有算数运算符,关系运算符(<,>),逻辑运算符(&&存在短路),位运算符等。

  1. 算数运算符

%是取模,即取余数。

在这里插入图片描述

  1. 关系运算符

关系运算符返回真或假的布尔常量,用于比较大小与相等与否,

在这里插入图片描述

  1. 逻辑运算

逻辑运算符与或非,也返回一个布尔值,但是与或具有短路效应,

在这里插入图片描述

  1. 位运算符(重要)

位运算符在单片机的操作中比较常见且重要,常见的运算符有对位取与,取或,取异或,取非,左移,右移(补码负数高位补1)。

在这里插入图片描述

x.1.8 C语言逻辑

C语言的逻辑由if-else选择判断,和循环组成。

选择判断中有if-else语句,问号语句,switch-case语句(搭配break使用,且switch中变量要为int32),例句如下,

/* ?: */
Exp1 ? Exp2 : Exp3;/* switch - case */
#include <stdio.h>int main()
{int a;printf("input integer number: ");scanf("%d",&a);switch(a){case 1:printf("Monday\n");break;case 2:printf("Tuesday\n");break;case 3:printf("Wednesday\n");break;case 4:printf("Thursday\n");break;case 5:printf("Friday\n");break;case 6:printf("Saturday\n");break;case 7:printf("Sunday\n");break;default:printf("error\n");}
}

循环中有while循环,for循环,do…while循环,搭配break,continue,goto(goto有害),例句如下,

#include <stdio.h>int main ()
{for( ; ; ){printf("该循环会永远执行下去!\n");}return 0;
}

在linux系统中,可以使用ctrl+c终止无限循环的程序(程序中断,释放内存),使用ctrl+z挂起程序(程序暂停,不释放内存)。

PS: 在VIM编辑器中ctrl+c=esc是停止输入。

x.1.9 C语言函数

面向对象语言三大特征:封装继承多态,C语言虽然是面向过程的,但是函数的存在体现着封装的思维。

C语言的函数声明必须要放在main()函数之前。函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。

函数的定义由四部分构成,返回类型,函数名称,参数,函数主体。它的四大部分的作用为:

  1. 返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
  2. 函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
  3. 参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
  4. 函数主体:函数主体包含一组定义函数执行任务的语句。
return_type function_name( parameter list )
{body of the function
}

一个简单的函数定义如下所示:

/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2) 
{/* 局部变量声明 */int result;if (num1 > num2) {result = num1;} else {result = num2;}return result; 
}

我们使用函数名加小括号的形式调用函数。默认情况下,C 使用传值调用来传递参数。一般来说,这意味着函数内的代码不能改变用于调用函数的实际参数。

x.1.10 C语言枚举

枚举变量用于定义一组具有离散值的常量,可以实现变量名到整型的映射关系。枚举变量的定义需要使用enum关键字,案例如下:

// 1. 使用define定义常量
#define MON  1
#define TUE  2
#define WED  3
#define THU  4
#define FRI  5
#define SAT  6
#define SUN  7// 2. 使用enum实现1.中的映射关系
enum DAY
{MON=1, TUE, WED, THU, FRI, SAT, SUN
};// 3. enum更改默认的映射关系
enum season {spring, summer=3, autumn, winter};// 4. 常用的定义枚举变量的方式:定义枚举类型的同时定义枚举变量
enum DAY
{MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;enum DAY day; 	// 先定义枚举类型,再定义枚举变量

x.1.11 C语言指针

x.1.11.1 指针定义

C语言最有特色的地方便在于可以直接使用指针访问内存,我们在C语言中经常使用的数组和字符串便是指针类型变量。

一个简单的指针变量p如下定义,表示变量p就是一个指针变量,*p表示指向数字0,p表示它的值是内存的地址。

int *p = 0;

我们可以使用printf + %X大写十六进制查看指针p的值(即指针指向的地址),可以使用printf + %p + &变量名查看变量在内存中的实际地址。案例如下,

#include <stdio.h>int main()
{// 1. 使用sizeof()输出变量类型和变量大小int i = 0;printf("size of int is: %lu \nsize of i is: %lu\n", sizeof(int), sizeof(i));// 2. 使用指针p指向i的地址,以十六进制输出p的指针和i的地址int *p = &i;printf("i's address is %p\np's address is %X\n", &i, p);return 0;
}

输出结果如下所示,

在这里插入图片描述

x.1.11.2 指针的取地址运算符和解地址运算符

在指针使用中我们经常碰到取地址运算符&和解地址运算符*。顾名思义,取地址运算符为&,符号后面只可跟一个变量,用于寻找该变量的地址;解地址运算符*,用于得到指针变量指向的内存地方存储的值。*和&是相反的作用。如下所示:

请添加图片描述

x.1.11.3 使用传递指针访问内存

指针在C语言中的重要作用之一在于直接访问内存,传递局部变量的值并修改。我们可以将局部变量的值通过指针传到函数中,这样函数中修改的值便可以返回,即函数中的局部变量的值不会在函数结束后销毁。

通过如下四种等价的方式往函数中传递指针,

请添加图片描述

x.1.11.4 指针的类型

指针也是具有类型和大小的。指针类型最大的作用在于在做例如*p++的运算的时候,一次性跳动的字节数不同

#include <stdio.h>int main(){int *p = 0;*p++;printf("%X\n", p);double *q = 0;*q++;printf("%X\n", q);return 0;
}

运行代码,可以看到p一次性跳动四个字节(即int大小),q一次性跳动八个字节(即double大小),运行结果如下所示,

在这里插入图片描述

但我们需要注意的是,不管你的指针是什么类型,你定义的指针在内存中的实际大小都是一个字(例如我的电脑是x86x64,64bit,则大小就是64bit=8Byte,8字节)八字节大小,可以输入如下代码测试,

#include <stdio.h>int main(){void *p = NULL;double *q = NULL;printf("size of pointer p is %X\n", sizeof(p));printf("size of pointer q is %X\n", sizeof(q));return 0;
}

运行结果如下所示,在C语言中,NULL和0是等价的,

在这里插入图片描述

指针变量也和普通变量一样,支持强制类型转换,我们也可以声明一个新的指针变量指向原来的地址,malloc-free关键字一定会用强转,强转代码如下,

int a = 10;
int *p = &a;// 把指向 int 类型的指针强制转换为指向 char 类型的指针
char *q = (char*)p;// 使用 q 进行内存操作,一些平台可能会出现错误
*q = 'A';
x.1.11.5 使用指针动态申请内存

我们使用malloc-free关键字来进行动态内存分配,malloc申请出来的指针默认是void *类型,所以我们一定会进行强制类型转换。

int *a = (int *) malloc ( n*sizeof(int) );

申请后的空间需要归还给系统,使用free(a)。记住要在同一个地方malloc和free。

动态申请内存是为了让系统自动给你开辟新的内存空间供你使用,你不会访问到内存别的地方,清占别的内存空间或者产生乱码。

x.1.11.6 指针和const搭配使用

const和指针混搭会产生两种效果,不用去刻意记忆名字,我们只需要判断const是否是直接修饰的指针,如int * const p = &i; const便是直接修饰的指针,而const int *p = &i const便不是直接修饰的指针。const修饰指针表示指针不能修改,而const不修饰指针则表示通过指针不能修改

  1. 指针不能修改

int * const p = &i;

意思是指针不能修改。一旦该指针得到了某个变量的地址,就不能再指向其他变量了。
常用于:数组。

请添加图片描述

数组本质上便是一个被const修饰的指针,所以不能被直接赋值,int a[] <=> int * const a

  1. 通过指针不能修改

const int *p = &i;

意思是通过指针不能修改变量(并不使得那个变量成为const)。
常用于:字符串;在函数传参时希望用户只有访问权限,无修改权限的时候可以使用。

请添加图片描述

字符串本质上是一个const char *,所以通过指针不能修改。

x.1.12 C语言数组

前面一章节已经说了,数组本质上是一个被const修饰的指针,即int * const p,指针不能修改。

  1. 数组的初始化和赋值

我们使用循环来给数组赋值,数组中每一个单元的数据都是同一个类型,数组的大小在初始化的时候就需要定义好,数组越界会报segmentation fault;数组排序从0开始往后排;

请添加图片描述

// 1. 数组初始化
int array[10];
for ( int i = 0; i<10; i++){array[i] = 0;
}int array_2 = {1, 2, 3};

注意array[0]有时候指代数组array的地址。

  1. 数组大小计算

数组的大小计算使用sizeof关键字,

sizeof(a)/sizeof(a[0]);

x.1.13 C语言字符串和字符数组

在前面已经讲过,C语言的字符串本质上是通过指针不能修改的类型,即char *str <=> const char *str,char *str是字符串类型。

字符串和字符数组存在区别,C语言中字符串的结尾需要加\0,而字符数组就是char类型的const指针,不需要以\0结尾。

  1. 字符数组

字符数组和字符串不同,字符数组就是以char的数组实现的,其结尾不需要加'\0'举例如下:

请添加图片描述

  1. 字符串

字符串的结尾需要加'\0',字符数组的长度增加了一字节,所以字符串的本质就是最后一位是\0的字符数组,如下:

请添加图片描述

在string.h的文件内有很多处理字符串的函数。在这里需要注意的是字符串和字符数组的索引都是从0开始的。

字符串变量的常见书写方法有以下几种:

char *str 	= "1";			// 指针形式,最常见的形式1
char str[] 	= {'1', '\0'};	
char str[2] = "1";// 字符数组
char str[] 	= "1";			// 字符数组 数组形式,最常见的形式2

C中,字符串的是以字符数组的形态存在的,但是仍然存在区别。需要注意的是char *str = "1";是一个const char *str类型,通过指针不能修改,所以如果创建需要修改的字符串,应该创建字符数组char s[] = "1";

与使用%d来输入输出整型不同,字符串的输入输出需要用到%s,如下,

请添加图片描述

  1. 字符串数组

我们有时候需要使用多个字符串,这个时候我们就可以使用字符串数组,

请添加图片描述

我们最经常使用的定义字符串数组方式如下所示:

char  *a[];		// a是一个一维数组,其中每一个a[n]都是一个char *字符串,即通过指针不能更改的字符数组

这在main函数中的argv中也可以见到,

请添加图片描述

x.1.14 C语言结构体

结构体类似于LabVIEW中的簇,可以将不同类型的数据整合在一起形成一个对象,常用的定义结构的方式有以下两种,

// 1. 可以用typedef创建新类型(推荐)
typedef struct
{int a;char b;double c;
} Simple2;
//现在可以用Simple2作为类型声明新的结构体变量
Simple2 u1, u2[20], *u3;// 2. 先定义结构体类型,再定义结构体变量
//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c
//结构体的标签被命名为SIMPLE,没有声明变量
struct SIMPLE
{int a;char b;double c;
};
//用SIMPLE标签的结构体,另外声明了变量t1、t2、t3
struct SIMPLE t1, t2[20], *t3;

typedef关键字在结构体定义的时候经常使用,用于使用它来为类型取一个新的名字。下面的实例为单字节数字定义了一个术语 BYTE:

typedef unsigned char BYTE;

在这个类型定义之后,标识符 BYTE 可作为类型 unsigned char 的缩写,例如:

BYTE  b1, b2;

x.2 单片机基础知识

x.2.1 单片机中的C语言

在已经有C/C++或者X.1的学习后,我们再补充一点单片机中的C语言的知识。单片机中常使用C的指针来操作寄存器,使用预编译宏来定义常量,使用移位操作来控制寄存器等。

x.2.1.1 指针中的取地址,解地址

取地址符号为&,解地址符号为*,使用如下,

int *p = &value;	// 取地址用&
*p = 1;	// 解地址用*
x.2.1.2 宏编译的条件判断

使用预编译宏来取消编译,

#if 0...#endif
x.2.1.3 C语言的位操作

常见的位操作有左移,右移,取反,与,或,异或,这部分参考c语言中文网,

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

x.2.1.4 C语言的置位,清零

第六个位置这个地方设置为1,其他地方不变,使用或操作|= (1<<6)

第六个位置这个地方设置为0,其他地方不变,使用与操作&= ~ (1<<6)

第六五位置设置为0,其他地方不变,&= ~(0x03)<<6;因为0x03是11。

案例如下,孰能生巧,

在这里插入图片描述

x.2.2 DAP仿真器下载程序

DAP仿真器用于将软件下载到单片机上,它遵循ARM公司的CMSIS-DAP标准,支持所有基于Cortex-M内核的点偏激,属于HID设备,无需安装驱动,支持多操作系统。

x.2.3 STM32背景知识

x.2.4 寄存器

x.2.5 GPIO介绍+使用GPIO点亮LED灯

x.2.6 固件库

x.3 案例——使用单片机点亮LED灯案例

x.3.1 51单片机

单片机中最基础的入门级别单片机就是51单片机,51单片机相较于stm32单片机更容易上手,因为51单片机内部已经实现了寄存器映射,所以在这里可以直接使用寄存器别名来进行访问。

电流方向永远是从正极流向负极,从高压流向低压(因为存在电势差),电子流动方向和电流流向相反。我们可以很快速地用51单片机来点亮LED灯,如果LED灯的电路图如下,则只需要控制P0,0端口将数值设置为0便可以将电路点亮,

在这里插入图片描述

则代码如下便可实现LED灯的开关,

在这里插入图片描述

x.3.2 stm32f103

寄存器映射指给寄存器地址映射一个别名,这个功能可以通过reg52.hstm32f10x.h两个文件来实现。

LED灯对应的接口为PB0,则意味着是GPIOx_ODR寄存器中的GPIOB0_ODR

GPIOx_ODR是指 general purpose intput output x _ Output data register,是通过ODR来控制LED灯开关的。

  1. SOC厂商在已经有ARM芯片基础上设计了三类地址总线,为AHB,APB2,APB1总线。我们先在参考手册中第二章 存储器和总线架构中找到挂载在APB2地址总线下的GPIOB的绝对地址,

在这里插入图片描述

  1. 我们需要ODR来控制LED灯,所以我们需要找到ODR0的绝对地址,我们根据地址偏移来计算,

在这里插入图片描述

  1. 我们使用ODR0来控制PB0的端口,看了电路图我们知道要实现LED中G颜色的开关,我们需要将PB0的端口电压设置为0V,这个时候我们即将PB0设置为0便可,

在这里插入图片描述

  1. 我们需要通过CRL寄存器来告诉MCU, LED中的PB0为输出值,即配置IO口为 输出。

  2. 打开RCC的时钟寄存器。

最终我们的代码书写如下,

在这里插入图片描述

x.3.3 stm32f407

  1. 更改GPIOx_MODER模式寄存器为输出

AHB1下

  1. 更改RCC时钟控制器

AHB1下

  1. 更改GPIOx_ODR数据寄存器

AHB1下

代码如下,stm32f4xx.h文件内容,

在这里插入图片描述

main.c文件内容,

在这里插入图片描述

x.3 单片机GPIO介绍

x.3.1 GPIO简介

在这里插入图片描述

在这里插入图片描述

407有144个引脚,引脚供电大部分是5V,GPIO属于引脚,但并不是所有引脚都属于GPIO;查找每一个GPIO功能通过数据手册查找。

在这里插入图片描述

x.3.2 GPIO 功能框图讲解

GPIO功能框图如下,

在这里插入图片描述

I/O引脚就是芯片和PCB印刷电路板的解除方式,而I/O引脚的左侧则是芯片的内部电路。

BSRR 指的是bit set reset register,其中set是指置位,是低16位,输出高电平置1。reset是指复位,是指高16位,输出低电平置1。

输入输出是相对ARM芯片而言的,如果往芯片写数据叫输入,从芯片往外写数据叫输出。

在输入中TTL使得输入模拟信号,当大于1.8V时为高电平,当低于1.8V时为低电平。

输入的输入较为简单,输出则较为复杂,输出的流程图如下,

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rotate-captcha-crack项目重新训练百度旋转验证码角度预测模型

参考&#xff1a; building-powerful-image-classification-models-using-very-little-data.html https://github.com/Starry-OvO/rotate-captcha-crack &#xff08;主&#xff09;作者思路&#xff1a;https://www.52pojie.cn/thread-1754224-1-1.html 纠正 新版百度、百家…

低成本总线技术——LIN总线协议规范介绍

关注菲益科公众号—>对话窗口发送 “CANoe ”或“INCA”&#xff0c;即可获得canoe入门到精通电子书和INCA软件安装包&#xff08;不带授权码&#xff09;下载地址。 本篇文章主要介绍LIN总线协议规范。 数据帧的结构 LIN的数据帧包括报头&#xff0c;响应两大部分。而报头…

Visual Studio 2013 “即将退休”

新年快乐&#xff01; 这也是向各位开发者提醒 Visual Studio 支持生命周期中即将到来的好时机。 对 Visual Studio 2013 的支持即将在今年(2024年)的4月9日结束。如果你正在使用旧版本的 Visual Studio&#xff0c;我们强烈建议您升级您的开发环境到最新的 Visual Studio 20…

浏览器是如何渲染页面的

浏览器是个极其复杂的程序&#xff0c;这里只是挑几个和前端息息相关的重要内容来说 在学习如何渲染之前需要知道一个浏览器浏览器会有多个进程&#xff0c;其中主要进程有浏览器进程&#xff0c;网络进程&#xff0c;渲染进程这里我们主要学习内容就发生在渲染进程。当渲染进程…

【解决openGauss无法使用gs_check等服务器端命令问题】

【解决openGauss无法使用gs_check等服务器端命令问题】 一、问题描述二、问题原因三、解决方法 一、问题描述 [ommopengauss03 ~]$ gs_check -i CheckCPU Parsing the check items config file successfully [GAUSS-53026]: ERROR: Execute SSH command on host 192.168.56.19…

给出一句话来描述想要的图片,就能从图库中搜出来符合要求的

介绍 地址&#xff1a;https://github.com/mazzzystar/Queryable The open-source code of Queryable, an iOS app, leverages the OpenAIs CLIP model to conduct offline searches in the Photos album. Unlike the category-based search model built into the iOS Photos…

项目使用PowerJob

新一代的定时任务框架——PowerJob 简介 PowerJob是基于java开发的企业级的分布式任务调度平台&#xff0c;与xxl-job一样&#xff0c;基于web页面实现任务调度配置与记录&#xff0c;使用简单&#xff0c;上手快速&#xff0c;其主要功能特性如下&#xff1a; 使用简单&…

如何在 Windows 上从电脑硬盘恢复照片

如今&#xff0c;随着相机设备的普及&#xff0c;您可以轻松地一次拍摄一堆照片&#xff0c;将它们传输到硬盘上&#xff0c;然后再拍摄更多照片。但是&#xff0c;如果您的所有照片意外丢失在驱动器中怎么办&#xff1f;你能恢复它们吗&#xff1f; 在本指南中&#xff0c;我…

EasyRecovery2024永久免费版电脑数据恢复软件

EasyRecovery是一款操作安全、价格便宜、用户自主操作的非破坏性的只读应用程序&#xff0c;它不会往源驱上写任何东西&#xff0c;也不会对源驱做任何改变。它支持从各种各样的存储介质恢复删除或者丢失的文件&#xff0c;其支持的媒体介质包括&#xff1a;硬盘驱动器、光驱、…

postgresql可视化导入csv文件

不需要在命令行copy了&#xff0c;只需简单点几下 1.在数据库下建一个schema 右击选中数据库-new schema 2.双击你创建的schema&#xff0c;出现tables 3.右击tables&#xff0c;选择import wizard 4.选择你想导入的文件格式&#xff0c;之后一直next 5.选择你的文件所在位置…

C语言实用第三方库Melon开箱即用之多线程模型

在之前的文章中&#xff08;开发利器——C 语言必备实用第三方库&#xff09;&#xff0c;笔者介绍了一款Linux/UNIX下C语言库Melon的基本功能&#xff0c;并给出了一个简单的多进程开箱即用的例子。 本文将给大家介绍Melon中多线程的使用方法。 在Melon中有三种多线程模式&a…

Redis 之父锐评 LLM 编程:全知全能 Stupid|一周IT资讯

阿里通义千问上线“科目三”&#xff0c;刘皇叔、奥特曼、马斯克通通没逃过 在刚到的2024年&#xff0c;阿里通义千问 APP 上线图片生成舞蹈功能&#xff0c;用户只需输入一张图片&#xff0c;就能生成爆款舞蹈图片。 不管是“科目三”&#xff0c;还是鬼步舞、兔子舞&#x…

(18)Linux 实现简易版shell

前言&#xff1a;做一个 "会创建&#xff0c;会终止&#xff0c;会等待&#xff0c;会程序替换" 的简易 shell 。 1、显示提示符和获取用户输入 shell 本质就是个死循环&#xff0c;我们不关心获取这些属性的接口&#xff0c;如果要实现 shell&#xff1a; 1&…

015:JS之正则表达式,web乱码和路径问题总结,MVC架构模式

一 JS的正则表达式 1 正则表达式简介 正则表达式是描述字符模式的对象。正则表达式用于对字符串模式匹配及检索替换&#xff0c;是对字符串执行模式匹配的强大工具。 语法 var pattnew RegExp(pattern,modifiers);//正则的格式模版&#xff0c;修饰符或者更简单的方式:var pa…

权威测评首家通过!亚信安慧AntDB通过中国信通院数据库迁移工具专项测试

近日&#xff0c;亚信安慧数据库数据同步平台在中国信通院第17批“可信数据库”数据库迁移工具专项测试中&#xff0c;完全符合《数据库迁移工具能力要求》&#xff0c;成为首家通过标准测试的产品。这一成果标志着湖南亚信安慧科技有限公司&#xff08;简称“亚信安慧”&#…

Pandas透视表及应用

Pandas 透视表概述 数据透视表&#xff08;Pivot Table&#xff09;是一种交互式的表&#xff0c;可以进行某些计算&#xff0c;如求和与计数等。所进行的计算与数据跟数据透视表中的排列有关。 之所以称为数据透视表&#xff0c;是因为可以动态地改变它们的版面布置&#xf…

Git保姆级安装教程

Git保姆级安装教程 一、去哪下载二、安装2.1 具体安装步骤2.2 设置全局用户签名 一、去哪下载 1、官网&#xff08;有最新版本&#xff09;&#xff1a;https://git-for-windows.github.io/ 2、本人学习时安装的版本&#xff0c;链接&#xff1a;https://pan.baidu.com/s/1uAo…

Spark内核解析-数据存储5(六)

1、Spark的数据存储 Spark计算速度远胜于Hadoop的原因之一就在于中间结果是缓存在内存而不是直接写入到disk&#xff0c;本文尝试分析Spark中存储子系统的构成&#xff0c;并以数据写入和数据读取为例&#xff0c;讲述清楚存储子系统中各部件的交互关系。 1.1存储子系统概览 …

LabVIEW开发分布式光纤油气管道泄漏检测及预警系统

LabVIEW开发分布式光纤油气管道泄漏检测及预警系统 随着油气工业的发展&#xff0c;管道泄漏成为一个严峻的安全问题。本文介绍了一种基于LabVIEW的分布式光纤油气管道泄漏检测及预警系统的设计思路和组成结构。系统包括硬件和软件两部分&#xff0c;其中硬件部分详细阐述了分…