山重水复疑无路,柳暗花明又一村 。

一、模块使用

1.DFPlayer Mini MP3音乐播放模块

在这里插入图片描述
接线图,注意*在TX,RX与MP3模块的RX,TX之间连一个1k电阻。因为DFPlayer Mini模块工作电压应该是3.3V,而主控板传入电压为5V,因此需要1K左右电阻分压。*
在这里插入图片描述
内存卡文件配置,非常重要!!!!!!!

注意:文件夹命名需要是mp3,放置在SD卡根目录下,而mp3文件命名需要是4位
数字,例如"0001.mp3",放置在mp3文件夹下。 如需中英文命名,可以添加在
数字后,例如"0001hello.mp3"或者"0001后来.mp3"

例如:
在这里插入图片描述
一定是要有延时要不然播放不完整!!!!!!!!
代码块:
在这里插入图片描述
代码:

/*!
 * MindPlus
 * uno
 *
 */
#include <DFRobot_PlayerMini.h>
#include <SoftwareSerial.h>
// 创建对象
DFRobot_PlayerMini mp3;
SoftwareSerial     softSerialmp3(2, 3);
// 主程序开始
void setup() {
	mp3.begin(&softSerialmp3);
	mp3.volume(100);
	mp3.start();
}
void loop() {
	mp3.playMp3Folder(1);
	delay(5000);
}

2.舵机

在这里插入图片描述
有PWM功能引脚才能用!!!!!!
程序贴在这里了

#include <Servo.h>
 
#define PIN_SERVO 10
Servo myservo;
 
void setup()
{
  myservo.attach(PIN_SERVO);
}
 
void loop()
{
  myservo.write(0);
  delay(1000);
  myservo.write(80);
  delay(1000);
  myservo.write(160);
  delay(1000);
  myservo.write(80);
  delay(1000);
  myservo.write(0);
  delay(1000);
}

3.L298N

1.无调速功能

这个写的很好

但是没有调速功能。小白先实现这个吧。

//LingShun Lab
 
int input1 = 5; // 定义uno的pin 5 向 input1 输出 
int input2 = 6; // 定义uno的pin 6 向 input2 输出
int input3 = 9; // 定义uno的pin 9 向 input3 输出
int input4 = 10; // 定义uno的pin 10 向 input4 输出
 
 
 
void setup() {
//  Serial.begin (9600);
//初始化各IO,模式为OUTPUT 输出模式
pinMode(input1,OUTPUT);
pinMode(input2,OUTPUT);
pinMode(input3,OUTPUT);
pinMode(input4,OUTPUT);
 
}
 
void loop() {
  //forward 向前转
  digitalWrite(input1,HIGH); //给高电平
  digitalWrite(input2,LOW);  //给低电平
  digitalWrite(input3,HIGH); //给高电平
  digitalWrite(input4,LOW);  //给低电平
  delay(1000);   //延时1秒
 
 //stop 停止
 digitalWrite(input1,LOW);
 digitalWrite(input2,LOW);  
 digitalWrite(input3,LOW);
 digitalWrite(input4,LOW);  
 delay(500);  //延时0.5秒
 
  
  //back 向后转
  digitalWrite(input1,LOW);
  digitalWrite(input2,HIGH);  
  digitalWrite(input3,LOW);
  digitalWrite(input4,HIGH);  
  delay(1000);    
 
}

2.加上调速功能

先看这个吧

void setup() {
    Serial.begin(115200);
    //初始化各IO,模式为OUTPUT 输出模式
    pinMode(2,OUTPUT);
    pinMode(3,OUTPUT);
    pinMode(4,OUTPUT);
    pinMode(5,OUTPUT);
    //默认电机停止转动,全部设为低电平
    digitalWrite(2,LOW);
    digitalWrite(3,LOW);
    digitalWrite(4,LOW);
    digitalWrite(5,LOW);
    analogWrite(9,255);//左轮速运行
    analogWrite(10,250);//右轮速运行
}
void loop() {
    if (Serial.available() > 0)  
    {
        Serial.println(char(Serial.read()))
        if(char(Serial.read())=='a'){a1();}
        if(char(Serial.read())=='b'){a2();}
        if(char(Serial.read())=='c'){a3();}
        if(char(Serial.read())=='d'){a4();}
        if(char(Serial.read())=='e'){a5();}
        if(char(Serial.read())=='f'){a6();}
        if(char(Serial.read())=='g'){a7();}
        if(char(Serial.read())=='i'){a8();}
        delay(2);
    }
      //forward 前进

    }
viod a1()//左上
{

}
viod a2()
{
    
}
viod a3()
{
    
}
viod a4()
{
    
}
viod a5()
{
    
}
viod a6()
{
    
}
viod a7()
{
    
}
viod a8()
{
    
}

5.OLED0.96

#include <SPI.h> // 加载SPI库
#include <Wire.h> // 加载Wire库
#include <Adafruit_GFX.h> // 加载Adafruit_GFX库
#include <Adafruit_SSD1306.h> // 加载Adafruit_SSD1306库

// 定义 OLED屏幕的分辨率
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);

void setup() {
  Serial.begin(9600); // 设置串口波特率

  Serial.println("OLED FeatherWing test"); // 串口输出
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 设置OLED的I2C地址

  display.clearDisplay(); // 清空屏幕

  display.setTextSize(1); // 设置字体大小
  display.setTextColor(SSD1306_WHITE); // 设置字体颜色
  display.setCursor(0,0); // 设置开始显示文字的坐标
  display.println("Hello World!"); // 输出的字符
  display.println("   by Lingshunlab.com");
  display.display(); // 使更改的显示生效
}

void loop() {

}

6.SYN6288

https://zhuanlan.zhihu.com/p/66314323/
arduino要转字符类型,GB2312
1.先转码
https://www.107000.com/T-Hex/

char Chinese_1[50] = {0xB2,0xBB,0xD4,0xDA,0xB4,0xF2,0xBF,0xA8,0xCA,0xB1,0xBC,0xE4,0xB7,0xB6,0xCE,0xA7,0x00};//不在打卡时间范围

void setup() {
 // put your setup code here, to run once:
 Serial.begin(9600);
 delay(1000);

 //SYN_FrameInfo(0,Chinese_GB2312);
}
 
void loop() {
 // put your main code here, to run repeatedly:
  Serial.println(Chinese_1);
  delay(4000);
}

7.SU-03T语音模块(串行通讯)

const byte b1[]={0XAA,0X55,0X01,0X01,0X55,0XAA};
const byte b2[]={0XAA,0X55,0X02,0X02,0X55,0XAA};
const byte b3[]={0XAA,0X55,0X03,0X03,0X55,0XAA};
const byte b4[]={0XAA,0X55,0X04,0X04,0X55,0XAA};
const byte b5[]={0XAA,0X55,0X05,0X05,0X55,0XAA};
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
Serial.write(b1,(sizeof(b1) / sizeof(b1[0])))
}

void loop() {
  // put your main code here, to run repeatedly:

}

8.sim800c模块(串行通讯)

void sendMeg()
  {
   
  Serial.println("AT");
  delay(3000);
  Serial.println("AT+CMGF=1");
  delay(4000);
  Serial.println("AT+CMGS=\"18953474779\"");//这里改成你的号码 \"转义
  delay(4000);
  Serial.print("fire");//这里写内容
  delay(4000);
  Serial.write(0x1A);//发送:0x1A,即“CTRL+Z”的键值,用于告诉 Serial,要执行发送操作
                      //发送: 0x1B,即“ESC”的键值,用于告诉 Serial,取消本次操作,不执行发送。 
  }

二、函数,库…

1.字符串操作函数(太牛逼了,强烈推荐,给爷好好学!!!!!!!!)

先贴出来原链接:https://www.cnblogs.com/1996jiwei/p/6666818.html
String.h库函数 贴出来两个比较常用的吧!
1.寻找字符串第几个

str.charAT(n)

描述
获取字符串的第n个字符
参数
n :是一个索引,作为下标
2.截取字符串
描述
用来截取字符串中间的某一位置。另外是决定那里结束
用法:

string1.substring(from); //返回 from 之后的
string1.substring(from,to); //返回 from 和 to 之间的

参数:

string1:原本的字符串
from:要截取的字符串从第几个字开始。
to:要截取后面的第几个字

3.实战

#include "String.h"
String a_1,a_2,S;
void setup()
{
  Serial.begin(9600);//打开串口,设置波特率9600
  a_1 = "hello";
}
void loop()
{
    S = a_1.charAt(3);  //取对象里面的方法charAt
    a_2=a_1.substring(0,3);
    Serial.print(a_2);
    Serial.println();//输出换行符
    delay(200);
}

2、串口接收字符串

String comdata = "";

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    while (Serial.available() > 0)  
    {
        comdata += char(Serial.read());
        delay(2);
    }
    if (comdata.length() > 0)
    {
        Serial.println(comdata);
        comdata = "";
    }
}

2.1接受16进制数

只需要直接int就可以



void setup()
{
    Serial.begin(9600);
}

void loop()
{
    if (Serial.available() > 0)  
    {

        Serial.println(int(Serial.read()));
        delay(2);
    }

}

3.软串口冷知识

除HardwareSerial外,Arduino还提供了SoftwareSerial类库,它可以将你的其他数字引脚通过程序模拟成串口通信引脚。
通常我们将Arduino UNO上自带的串口称为硬件串口,而使用SoftwareSerial类库模拟成的串口,称为软件模拟串口(简称软串口)。
在Arduino UNO上,提供了0(RX)、1(TX)一组硬件串口,可与外围串口设备通信,如果要连接更多的串口设备,可以使用软串口。
软串口是由程序模拟实现的,使用方法类似硬件串口,但有一定局限性:在Arduino UNO MEGA上部分引脚不能被作为软串口接收引脚,且软串口接收引脚波特率建议不要超过57600。

#include <SoftwareSerial.h>
//实例化软串口
SoftwareSerial mySerial(2, 3); // RX, TX

void setup()
{
  Serial.begin(115200);
  while (!Serial) {
  }

  Serial.println("Goodnight moon!");

  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}

void loop()
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

多个软串口怎么用?###很重要

当需要连接多个串口设备时,可以建立多个软串口,但限于软串口的实现原理,Arduino UNO只能同时监听一个软串口,当存在多个软串口设备时,你需要使用listen() 函数指定需要监听的设备。如程序中存在portOne、portTwo两个软串口对象时,你欲监听portOne,便需要使用portOne.listen() 语句,要切换监听port2,便使用portTwo.listen() 语句。
示例程序如下:

/*
Arduino UNO软串口通信
通过listen()切换监听软串口
*/

#include <SoftwareSerial.h>
SoftwareSerial portOne(10, 11);
SoftwareSerial portTwo(8, 9);

void setup() {
  Serial.begin(9600);
  while (!Serial) {
  }

  portOne.begin(9600);
  portTwo.begin(9600);
}

void loop() {
//监听1号软串口
  portOne.listen();

  Serial.println("Data from port one:");
  while (portOne.available() > 0) {
    char inByte = portOne.read();
    Serial.write(inByte);
  }

  Serial.println();
//监听2号软串口
  portTwo.listen();

  Serial.println("Data from port two:");
  while (portTwo.available() > 0) {
    char inByte = portTwo.read();
    Serial.write(inByte);
  }

  Serial.println();
}

4.millis()函数

unsigned long    previousMillis;
int     ledState;
void setup() {
  // put your setup code here, to run once:
pinMode(LED_BUILTIN, OUTPUT);
}
void ledBlink( int ledPin, uint32_t period )
  {
    unsigned long currentMillis = millis();         /* 记录当前时间 */
    if ( currentMillis - previousMillis >= period ) /* 检查 "period"  ms是否通过 */
    {
      ledState  = digitalRead( ledPin );
      previousMillis  = currentMillis;        /* 保存上次闪烁LED时 */
      if ( ledState == LOW )                  /* 如果LED关闭,则打开,反之亦然 */
      {
        ledState = HIGH;
      } else {
        ledState = LOW;
      }
      digitalWrite( ledPin, ledState );       /* LED为ledState状态 */
    }
  }
void loop() {
  // put your main code here, to run repeatedly:
ledBlink(LED_BUILTIN,500);
}
    /* 利用millis()函数做成闪灯效果的函数 */

4.1

unsigned long    previousMillis;
int     ledState;
int a=1;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
}
void ledBlink(uint32_t period )
  {
    unsigned long currentMillis = millis();         /* 记录当前时间 */
    
    if ( currentMillis - previousMillis >= period ) /* 检查 "period"  ms是否通过 */
    {
      a=a*-1;
      if (a==1){Serial.println("1");}
        
      if (a==-1){Serial.println("-1");}
        
      previousMillis  = currentMillis;        /* 保存上次闪烁LED时 */
    }
  }
void loop() {
  // put your main code here, to run repeatedly:
ledBlink(500);
}

5.按键消抖(状态机)

https://blog.csdn.net/hp150119/article/details/114358170

#include <Bounce2.h>

int BUTTON_PIN = 32;//按钮连接的针脚
Bounce2::Button button = Bounce2::Button();//实例化一个抖动对象

int ledState = LOW;

void setup() {


  button.attach( BUTTON_PIN, INPUT_PULLUP);
  button.interval(5);//间隔是5ms

  Serial.begin(9600);//用于串口输出
}

void loop() {
  button.update();//更新

  if ( button.pressed() ) {
    Serial.println("按下了");
  }
}

6、10进制转16进制

long decimalToHex_big(long decimal)
{
  long hex = 0;
  int i = 0;
  char temp_buff[20];
  
  sprintf(temp_buff, "%lX", decimal);//换为字符串的16进制
  //根据字符串长度一直转换
    for( i  =0 ; temp_buff[i] != '\0'; i++ )
  {
    //如果是数字
    if( temp_buff[i] >= '0' && temp_buff[i] <= '9' )
    {
      hex = (hex << 4) | temp_buff[i]-'0';
    }
    else//如果是字母
    {
      switch( temp_buff[i] )
      {   //先左移再转换
        case 'A': hex = (hex << 4) | 0x0A;  break;
        case 'B': hex = (hex << 4) | 0x0B;  break;
        case 'C': hex = (hex << 4) | 0x0C;  break;
        case 'D': hex = (hex << 4) | 0x0D;  break;
        case 'E': hex = (hex << 4) | 0x0E;  break;
        case 'F': hex = (hex << 4) | 0x0F;  break;
      }
    }
  }
  return hex;
}

7、串口接受16进制

          if (Serial2.available() > 31)
  {
    char a = Serial2.read();

    byte Buf[31];
    Serial2.readBytes(Buf, 31);
    distance1 = Buf[5] * 256 + Buf[6];
      Serial.print("Distance2:");
      Serial.println(distance1);
  }

三、ESP8266+BILNKER

1、配置环境

第一:下载arduino:
下载地址:https://www.arduino.cc/en/software
第二步:下载并安装blinker Arduino库
https://diandeng.tech/dev

Windows:将下载好的blinker库解压到
 我的电脑>文档>Arduino>libraries 文件夹中

第三步:下载blinker

Android下载:
点击下载
或 在android应用商店搜索“blinker”下载安装
IOS下载:
点击下载
或 在app store中搜索“blinker”下载

第四步:打开后自己注册后登录

2、添加设备

每一个设备在blinker上都有一个唯一的密钥,blinker设备会使用该密钥认证设备身份,从而使用blinker云平台上的相关服务。
进入blinker App,点击“添加设备”,进行设备添加。
选择独立设备,再选择WiFi接入,即可获取一个唯一的密钥。暂存这个密钥,此后程序中会使用到它。
在这里插入图片描述

在这里插入图片描述
本示例可以将设备端采集的温湿度数据,通过心跳包同步数据的方式,显示到APP上。
通过界面编辑功能,添加两个数据组件,将数据键值分别设为humi和temp,两个组件分别对应温湿度数据。 如图:
在这里插入图片描述

这个组件名要记得,是和arduino交互的!
OK,添加完成

3、arduino程序编写以及上传

先更改自己的信息

char auth[] = "Your Device Secret Key";
char ssid[] = "Your WiFi network SSID or name";
char pswd[] = "Your WiFi network WPA password or WEP key";

复制到arduino ide编辑器

#define BLINKER_WIFI

#include <Blinker.h>


char auth[] = "Your Device Secret Key";
char ssid[] = "Your WiFi network SSID or name";
char pswd[] = "Your WiFi network WPA password or WEP key";
BlinkerNumber HUMI("humi");
BlinkerNumber TEMP("temp");
float humi_read = 0, temp_read = 0;
void heartbeat()
{
    HUMI.print(humi_read);
    TEMP.print(temp_read);
}

void setup()
{
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);
    BLINKER_DEBUG.debugAll();
    Blinker.begin(auth, ssid, pswd);
    Blinker.attachHeartbeat(heartbeat);

}

void loop()
{
    Blinker.run();
    humi_read = 54.3;
    temp_read = 16.5;

    Blinker.delay(2000);
}

在这里插入图片描述
在这里插入图片描述
OK,完成
在这里插入图片描述

4.常用模式

#define BLINKER_WIFI
#define TEXTE_1 "TextKey"
#include <Blinker.h>


char auth[] = "c16512f65b14";
char ssid[] = "ESP8266";
char pswd[] = "12345678";

BlinkerText Text1("TEXTE");
BlinkerText Text2("TEXTE1");
BlinkerText Text3("TEXTE2");
BlinkerText Text4("TEXTE3");
BlinkerText Text5("TEXTE4");

String comdata = "";//声明字符串变量
String aa,bb,cc,dd;
String ee;
int gg=0;
void heartbeat()
{
    Text1.print(aa);
    Text2.print(bb);
    Text3.print(cc);
    Text4.print(dd);
    Text5.print(ee);


}

void setup()
{
    Serial.begin(9600);
    BLINKER_DEBUG.stream(Serial);
    BLINKER_DEBUG.debugAll();
    Blinker.begin(auth, ssid, pswd);
    Blinker.attachHeartbeat(heartbeat);

}

void loop()
{
    Blinker.run();
    while (Serial.available() > 0)  
    {
        comdata+= char(Serial.read());
        delay(2);
    }
    

   if (comdata.length() > 0)
    {  
      gg=comdata.toInt();
       Serial.println(gg);
       if(gg==1)
       {
        aa="已满";
        }
      if(gg==2)
       {
        aa="未满";
        } 
      if(gg==3)
       {
        bb="已满";
        }
      if(gg==4)
       {
        bb="未满";
        }  
      if(gg==5)
       {
        cc="已满";
        }
      if(gg==6)
       {
        cc="未满";
        }  
      if(gg==7)
       {
        dd="已满";
        }
      if(gg==8)
       {
        dd="未满";
        }            
       comdata = "";
    }
    Blinker.delay(500);
}

4.json

/**
 * 编写Json字符串
 * @author 单片机菜鸟
 * @date 2019/06/02
 */
#include <ArduinoJson.h>

void setup() {
  Serial.begin(115200);
  while (!Serial) continue;
  // Json对象对象树的内存工具 静态buffer 
  // 200 是大小 如果这个Json对象更加复杂,那么就需要根据需要去增加这个值.
StaticJsonDocument<256> doc;
JsonObject root = doc.to<JsonObject>();
root["id"] = "123";
root["version"] = "1.0";
JsonObject weather = root.createNestedObject("params");
JsonObject weather1 = weather.createNestedObject("A_4");
weather1["value"] = 1;

root["method"] = "thing.event.property.post";
serializeJsonPretty(root, Serial);
}

void loop() {
  // not used in this example
}
//MN Maker
//Laser Temp Gun
//10.6.19

#include <Wire.h>
#include <Adafruit_MLX90614.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

const int Laser_Pin=5;  //Laser Pin
int buttonState = 0; 
const int buttonPin = 2;     // the number of the pushbutton pin

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

void setup() {
  Serial.begin(9600);
  Serial.println("Adafruit MLX90614 test"); 
  
  pinMode(Laser_Pin,OUTPUT);
  pinMode(buttonPin, INPUT);
  
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  

  display.clearDisplay();
  display.setRotation(2);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 35);
  display.println("Initializing Temp");
  display.display();
  delay(250);
  display.clearDisplay();

  mlx.begin(); 
  
}

void loop() {

  buttonState = digitalRead(buttonPin);
  Serial.println(buttonState);
  
  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC()); 
  Serial.print("*C\tObject = "); Serial.print(mlx.readObjectTempC()); Serial.println("*C");
  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempF()); 
  Serial.print("*F\tObject = "); Serial.print(mlx.readObjectTempF()); Serial.println("*F");
  
  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(Laser_Pin, HIGH);
    
    display.clearDisplay();
    display.setTextSize(2);  //Size 2 means each pixel is 12 width and 16 high
    display.setCursor(25, 10);
    display.print(mlx.readObjectTempC());
    display.setCursor(95, 10);
    display.print("C");
    display.setTextSize(2);
    display.setCursor(25, 36);
    display.print(mlx.readObjectTempF());
    display.setCursor(95, 36);
    display.print("F");
    display.display();
    
    
  } else {
    // turn LED off:
    digitalWrite(Laser_Pin, LOW);
  
    display.clearDisplay();
    display.setTextSize(2);  //Size 2 means each pixel is 12 width and 16 high
    display.setCursor(35, 10);
    display.print("-----");
    display.setCursor(105, 10);
    display.print("");
    display.setTextSize(2);
    display.setCursor(35, 36);
    display.print("-----");
    display.setCursor(105, 36);
    display.print("");
    display.display();
    
    
  }

  Serial.println();
  delay(500);
}

1.UDP接收字符并解析

void UDP(){
    //**********解析Udp数据包
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    // 收到Udp数据包
    //Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
    // 读取Udp数据包
    
    int len = Udp.read(incomingPacket, 255);
    if (len > 0)
    {
      incomingPacket[len] = 0;
    }
    //向串口调试器打印信息
    Serial.printf("UDP packet contents: %s\n", incomingPacket);
    String q_1=incomingPacket;
    if(incomingPacket[0]=='A'){Serial.println("1");shuiwei_max=q_1.substring(1).toInt(); //返回 from 之后的}
    if(incomingPacket[0]=='B'){Serial.println("2");}
    if(incomingPacket[0]=='C'){Serial.println("3");}
    if(incomingPacket[0]=='D'){Serial.println("4");}
    if(incomingPacket[0]=='E'){Serial.println("5");}
    if(incomingPacket[0]=='F'){Serial.println("6");}//灯关
    if(incomingPacket[0]=='G'){Serial.println("7");}//灯
    //往udp 远端发送应答信息

  }
  }
  
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
银行家算法是一种资源分配算法,用于解决进程在系统中请求资源分配可能引发的死锁问题。它的原理是通过安全性检查,确保分配资源不会导致系统陷入死锁状态。 具体来说,银行家算法基于以下几个关键概念:进程、资源、最大需求、分配矩阵和可用资源向量。 - 进程:系统中运行的程序或任务。 - 资源:系统中可供进程使用的资源,如内存、处理器间等。 - 最大需求:进程对每种资源的最大需求量。 - 分配矩阵:记录系统当前已分配给进程的资源数量。 - 可用资源向量:记录系统当前可用的各种资源数量。 在运行过程中,当进程请求资源,银行家算法会检查该请求是否可以满足,而不会导致系统陷入死锁。具体的步骤如下: 1. 进程发出资源请求。 2. 系统检查该请求是否小于等于进程的最大需求量。 3. 系统检查该请求是否小于等于系统当前可用资源数量。 4. 若满足上述两个条件,则系统先分配资源给进程,并更新分配矩阵和可用资源向量。 5. 系统进行安全性检查,判断是否分配资源后系统仍然处于安全状态。 6. 若安全性检查通过,则资源分配成功;否则,系统回滚资源分配。 通过以上步骤,银行家算法可以预防死锁的发生,确保资源分配的安全性和可靠性。 希望这个解答对你有帮助!如果你对银行家算法还有其他问题,可以继续问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值