STM32 中斷編程入門

目錄

一、中斷系統

1、中斷的原理

2、中斷類型

外部中斷

定時器中斷

DMA中斷

3、中斷處理函數

中斷標志位清除

中斷服務程序退出?

二、實際應用

中斷控制LED?

任務要求

代碼示例

中斷控制串口通信

任務要求1

代碼示例

任務要求2

代碼示例

總結


學習目標:

學習stm32中斷原理和開發編程方法,實現中斷點亮LED燈;中斷發送消息。

一、中斷系統

STM32微控制器的中斷系統是其功能強大和靈活性的重要組成部分。中斷允許微控制器在執行主程序的同時,及時響應外部事件或內部條件的變化,從而實現高效的實時控制和數據處理。核心的中斷控制器是NVIC(Nested Vectored Interrupt Controller),負責管理和分發所有的中斷請求,并支持優先級分組,使開發人員能夠為不同的中斷源設置不同的優先級。STM32支持多種類型的中斷,包括外部中斷、定時器中斷、串口中斷和DMA中斷。每種中斷類型都有特定的配置方式和中斷服務程序編寫規范,以確保及時和有效地處理相應的事件。中斷使能和中斷優先級設置是配置中斷系統的關鍵步驟,同時需要編寫高效的中斷服務程序,以便快速響應并盡快恢復主程序的執行。這些特性使得STM32在廣泛的嵌入式應用中表現出色,為實時控制和數據處理提供了強大支持。

1、中斷的原理

下面通過一個生活中的例子,幫助更好的去理解中斷:

可以看到圖中,由最開始的看書,轉到最后的去衛生間,這個過程中,看書就受到了中斷。我們將看書看作主程序,快遞電話、肚子疼視為中斷源,取快遞和去衛生間視為中斷服務程序?,但是通過箭頭可以看到,最后還是返回到了看書的 “主程序” ,所以,中斷還存在返回,我們叫做中斷返回。

在計算機中,執行程序過程中,當出現異常情況(斷電等)或特殊請求(數據傳輸等)時,計算機暫停現行程序的運行,轉向對這些異常情況或特殊請求進行處理,處理完畢后再返回到現行程序的中斷處,繼續執行原程序,這就是“中斷”。

中斷的主要處理流程為:中斷請求——>中斷響應——>中斷服務——>中斷返回

中斷請求:中斷請求是中斷源向CPU發出中斷請求信號,此時中斷控制系統的中斷請求寄存器被置位,向CPU請求中斷

中斷響應:CPU的中斷系統判斷中斷源的中斷請求是否符合中斷響應條件,如果符合條件,則暫時中斷當前程序并控制程序跳轉到中斷服務程序

中斷服務:為處理中斷而編寫的程序稱為中斷服務程序,是由開發人員針對具體中斷所要實現的功能進行設計和編寫的,需要由開發人員來實現

中斷返回:CPU退出中斷服務程序,返回到中斷請求響應之前被中止的位置繼續執行主程序。這部分操作同樣由硬件來實現,不需要開發人員進行處理

?當發生了異常或中斷,內核要想響應這些異常或中斷,就需要知道這些異常或中斷的服務程序的入口地址,再由入口地址找到相應的中斷服務程序,由中斷入口地址組成的表稱作中斷向量表(如下圖)。

STM32中斷系統的結構和工作原理如下:

中斷請求來源:STM32的中斷請求可以來自外部和內部兩個方面。外部中斷是由GPIO口引腳的電平或邊沿信號變化觸發,而內部中斷通常是由硬件模塊(如定時器、ADC)或軟件產生的。

NVIC控制器:在STM32中,所有中斷請求都由NVIC(Nested Vectored Interrupt Controller)控制器進行管理和調度。NVIC是一個基于向量表的中斷控制器,通過優先級和向量表來實現對中斷請求的管理。

中斷分組:STM32將中斷分為多個組別,每個組別包含一組中斷請求。不同組別的中斷請求可以具有不同的優先級,并且可以使用優先級搶占和屏蔽機制來確保系統的實時性和可靠性。STM32中斷分組方式可選為0~4個前綴,用于設定中斷優先級組和亞組。

中斷服務程序:當中斷事件發生后,CPU會暫停當前任務并跳轉到相應的中斷服務程序,處理該事件。中斷服務程序通常包括以下幾個步驟:保存CPU寄存器的值(包括堆棧指針、程序計數器等)處理中斷請求(根據外部或內部中斷的類型進行相應的處理,如清除標志位、讀取數據等操作)執行用戶自定義代碼(根據實際需求執行用戶自定義的代碼段)恢復CPU寄存器的值(將保存在堆棧中的寄存器值恢復到其原始狀態,以便CPU繼續執行之前的任務)

中斷優先級:STM32中,所有中斷請求都具有唯一的編號(IRQn),并且可以根據編號和中斷分組方式確定其優先級。優先級高的中斷可以打斷正在執行的低優先級中斷,從而確保系統的實時性和可靠性。如果多個中斷請求的優先級相同,則可以使用優先級搶占機制來確定響應順序

2、中斷類型

外部中斷

EXTI(外部中斷/事件控制器)支持19個外部中斷/事件請求,每個中斷/事件都有獨立的觸發和屏蔽設置,具有中斷模式和事件模式兩種設置模式。

其是一種通過配置GPIO引腳并使用EXTI線路實現的事件處理機制。在初始化GPIO引腳為輸入并設置相應的中斷觸發方式后,可以通過編寫中斷服務程序來響應外部事件。例如,配置GPIO引腳為上升沿觸發,當引腳接收到上升沿信號時,會觸發預先定義的中斷服務程序,以便快速處理事件。這種機制使得STM32能夠高效地監聽和響應外部觸發事件,廣泛應用于各種應用場景中。

  • 輸入線:EXTI有19個中斷/事件輸入線,這些輸入線可以通過寄存器設置為任意一個GPIO,也可以是一些外設事件。
  • 邊沿檢測電路:它會根據上升沿觸發選擇寄存器(EXTI_RTSR)和下降沿出發選擇器(EXTI_FTSR)對應的設置來控制信號觸發。

上升沿觸發選擇寄存器:要配置STM32微控制器的外部中斷以在上升沿觸發時響應,首先需通過GPIO的配置寄存器(如GPIOxCRH或GPIOxCRL)將相應引腳設置為輸入模式。接著,在EXTIx_RTSR寄存器中設置相應的位來使能對應的外部中斷線x的上升沿觸發。最后,在NVIC中使能對應外部中斷的中斷處理。這些步驟確保了當引腳接收到上升沿信號時,系統能夠及時調用預定義的中斷服務程序來處理事件。

下降沿觸發選擇寄存器:要配置STM32微控制器的外部中斷以在下降沿觸發時響應,首先需通過GPIO的配置寄存器(如GPIOx_CRH或GPIOx_CRL)將相應引腳設置為輸入模式。接著,在EXTIx_FTSR寄存器中設置相應的位來使能對應的外部中斷線x的下降沿觸發。最后,在NVIC中使能對應外部中斷的中斷處理。這些步驟確保了當引腳接收到下降沿信號時,系統能夠及時調用預定義的中斷服務程序來處理事件。

GPIO的中斷是以組為單位的,同組的外部中斷公用一條外部中斷線。 ? ?

例如:PA0、PB0、PC0、PD0、PE0、PF0、PG0這些為一組,如果使用PA0作為外部中斷源,那么PB0、PC0、PD0、PE0、PF0、PG0就不能同時再作為外部中斷使用了,在此情況下,只能使用類似于PB1、PC2這種末端序號不同的外部中斷源。

GPIO引腳和外部中斷線的映射關系圖如下:

定時器中斷

STM32微控制器的定時器是關鍵的外設,用于生成精確的時間延遲和周期性任務。通過選擇合適的定時器類型(如通用定時器TIM或基本定時器TIM6/TIM7),配置工作模式和中斷觸發條件,可以實現定時器中斷功能。配置過程包括設置時鐘源、計數器初值和自動重裝載寄存器,以及使能中斷并編寫相應的中斷服務程序。這些步驟確保了定時器可以在達到預設計數值時產生中斷請求,從而實現精確的時間控制和周期性任務執行,適用于實時操作系統、通信協議和其他時間敏感應用。

要配置STM32微控制器的定時器中斷,首先選擇適合需求的定時器(如TIM1、TIM2等),配置其工作模式時鐘源計數周期。通過使能定時器中斷控制寄存器中的更新中斷位(UIE),允許定時器溢出時產生中斷請求。

  • 時鐘和預分頻設置:選擇適當的時鐘源和預分頻器,以確定定時器的計數頻率。
  • 計數器設置:設置定時器的計數器初值和自動重裝載寄存器(ARR),確定定時器的計數周期。
  • 中斷使能:通過使能定時器中斷使能寄存器中的相應中斷使能位(如UIE),允許定時器溢出時產生中斷請求。

然后編寫中斷服務程序來處理定時器中斷事件,包括清除中斷標志執行特定的定時任務重新配置定時器。最后,確保在主程序中使能全局中斷,以確保定時器中斷能夠正常觸發和處理。這些步驟能夠有效配置和利用STM32定時器中斷功能,用于實現各種時間相關的應用和功能需求。

DMA中斷

?在STM32微控制器中,DMA(直接存儲器訪問)提供了高效的數據傳輸機制,允許外設和內存之間直接交換數據,無需CPU的干預,從而提升系統效率和響應速度。DMA傳輸完成時可觸發中斷通知CPU,通過使能DMA中斷并配置中斷服務程序,可以實現在數據傳輸完成時執行額外操作或啟動后續任務,適用于實時數據處理、高速數據采集和圖形顯示等應用場景,有效優化系統性能和數據處理效率。

3、中斷處理函數

中斷標志位清除

void EXTI0_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line0) != RESET){EXTI_ClearITPendingBit(EXTI_Line0);// 接中斷服務程序代碼}
}

中斷服務程序退出?

void EXTI0_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line0) != RESET){EXTI_ClearITPendingBit(EXTI_Line0);// 接中斷服務程序代碼}NVIC_ClearPendingIRQ(EXTI0_IRQn);

二、實際應用

中斷控制LED?

任務要求

用stm32F103核心板的GPIOA端一管腳接一個LED,GPIOB端口一引腳接一個開關(用杜邦線模擬代替)。采用中斷模式編程,當開關接高電平時,LED亮燈;接低電平時,LED滅燈。如果完成后,嘗試在main函數while循環中加入一個串口每隔1s 發送一次字符的代碼片段,觀察按鍵中斷對串口發送是否會帶來干擾或延遲。

代碼示例

LED.c

#include "stm32f10x.h"                  // Device header/*** 函    數:LED初始化* 參    數:無* 返 回 值:無*/
void LED_Init(void)
{/*開啟時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);		//開啟GPIOA的時鐘/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);		GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}

?exti_key.c

#include "exti_key.h"
#include "misc.h"void EXTI_Key_Init(void)
{   GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // 使用 B 口的引腳 1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB, &GPIO_InitStructure);NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; // 使用與 GPIOB 引腳 1 相關的外部中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure); EXTI_InitTypeDef EXTI_InitStructure;EXTI_ClearITPendingBit(EXTI_Line1);  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1); // 將 GPIOB 和引腳 1 配置為外部中斷EXTI_InitStructure.EXTI_Line = EXTI_Line1;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);
}

main.c

#include "stm32f10x.h"                  // Device header
#include "LED.h"
#include "exti_key.h"int main(void)
{LED_Init();GPIO_ResetBits(GPIOA,GPIO_Pin_0);EXTI_Key_Init();while (1){}
}
//void EXTI1_IRQHandler(void)
//{
//    if(EXTI_GetITStatus(EXTI_Line1) != RESET)
//    {
//        GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0))));
//        EXTI_ClearITPendingBit(EXTI_Line1);
//    }
//}
//兩種方法
uint8_t led = 1;void EXTI1_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line1) != RESET){led = ~led; //狀態翻轉//如果等于1,則PB1復位點亮,否則置1熄滅if(led == 1)GPIO_ResetBits(GPIOA,GPIO_Pin_0);elseGPIO_SetBits(GPIOA,GPIO_Pin_0);    }EXTI_ClearITPendingBit(EXTI_Line1); //清除EXTI1的中斷標志位
}

即可實現中斷控制LED燈亮滅。

中斷控制串口通信

任務要求1

當stm32接收到1個字符“s”時,停止持續發送“hello windows!”; 當接收到1個字符“t”時,持續發送“hello windows!”

代碼示例

#include "stm32f10x.h"
#include "misc.h"
#include <string.h>volatile uint8_t send_enabled = 0;  // 全局變量,控制發送行為void USART_Configuration(void) {USART_InitTypeDef USART_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;// 打開 GPIO 與 USART 端口的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);// 配置 USART1 Tx (PA.09) 為復用推挽輸出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置 USART1 Rx (PA.10) 為浮空輸入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置 USART 參數USART_InitStructure.USART_BaudRate = 9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);// 使能 USARTUSART_Cmd(USART1, ENABLE);// 使能接收中斷USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// 配置 NVICNVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}void USART1_IRQHandler(void) {if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {char data = USART_ReceiveData(USART1);if(data == 's') {  // 接收到 's' 停止發送send_enabled = 0;} else if (data == 't') {  // 接收到 't' 開始發送send_enabled = 1;}USART_ClearITPendingBit(USART1, USART_IT_RXNE);}
}void Delay(__IO uint32_t nCount) {for(; nCount != 0; nCount--);
}int main(void) {SystemInit();USART_Configuration();char *str = "hello windows!\r\n";while(1) {if(send_enabled) {for(uint32_t i = 0; i < strlen(str); i++) {while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);USART_SendData(USART1, str[i]);}}Delay(5000000);}
}

任務要求2

當stm32接收到字符“stop stm32!”時,停止持續發送“hello windows!”; 當接收到字符“go stm32!”時,持續發送“hello windows!”(提示:要將接收到的連續字符保存到一個字符數組里,進行判別匹配。寫一個接收字符串的函數。)

代碼示例

NVIC.c

#include "stm32f10x.h"                  // Device headervoid NVIC_Configuration(void) {NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}

Serial.c

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>/*** 函    數:串口初始化* 參    數:無* 返 回 值:無*/
void Serial_Init(void)
{/*開啟時鐘*/USART_InitTypeDef USART_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);// USART Tx (PA.09) 配置為復用推挽輸出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// USART Rx (PA.10) 配置為浮空輸入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);USART_InitStructure.USART_BaudRate = 9600;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 開啟接收中斷USART_Cmd(USART1, ENABLE);
}

main.c

#include "stm32f10x.h"
#include "misc.h"
#include <string.h>
#include "Delay.h"
#include "Serial.h"
#include "NVIC.h"#define BUFFER_SIZE 100
volatile char buffer[BUFFER_SIZE];
volatile int buffer_index = 0;
volatile int send_enabled = 0;void USART1_IRQHandler(void) {if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {char data = (char)USART_ReceiveData(USART1);if (buffer_index < BUFFER_SIZE - 1) {buffer[buffer_index++] = data;buffer[buffer_index] = '\0';  // 保持字符串結尾char* temp_buffer = (char*)buffer; // 創建一個非 volatile 指針if (strstr(temp_buffer, "stop stm32!") != NULL) {send_enabled = 0;buffer_index = 0;  // 清空緩沖區} else if (strstr(temp_buffer, "go stm32!") != NULL) {send_enabled = 1;buffer_index = 0;  // 清空緩沖區}}}
}int main(void) {SystemInit();Serial_Init();NVIC_Configuration();char *str = "hello windows!\r\n";while (1) {if (send_enabled) {for (uint32_t i = 0; i < strlen(str); i++) {while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);USART_SendData(USART1, str[i]);}}Delay_ms(500);}
}

最后使用串口助手即可(野火以及其他串口助手均可)。

總結

本章內容理解上不存在太多有問題的地方,對于中斷的理解更像是正51單片機的另一個翻版,對于實踐過程中的問題,遠遠多于理論理解,關于軟件的操作,環境的配置,串口的調試運行,都是之前學習的逐漸累積,在學習上,沒有一蹴而就,要腳踏實地,做好每一步,才可以更好更快,更高效率完成任務。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39078.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39078.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39078.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ROS學習筆記(17):建圖與定位(1)

目錄 0.前言 1.定位和建圖 1.里程計&#xff08;Odometry&#xff09; 2.掃描匹配&#xff08;Scan Matching&#xff09; 3.結尾 0.前言 好久不見各位&#xff0c;前段時間忙著考試&#xff08;6級和一些專業課&#xff09;和擺爛斷更了近30天&#xff0c;現在哥們回來更…

計算機畢業設計Python+Spark股票基金推薦與預測系統 股票基金可視化 股票基金推薦系統 股票基金可視化系統 股票基金數據分析 股票基金爬蟲大數據

目 錄 摘 要 Abstract 第1章 前 言 1.1 項目的背景和意義 1.2 研究現狀 1.3 項目的目標和范圍 1.4 論文結構簡介 第2章 技術與原理 2.1 開發原理 2.2 開發工具 2.3 關鍵技術 第3章 需求建模 3.1 系統可行性分析 3.2 功能需求分析 3.3 非功能性…

C++Primer Plus 第十四章代碼重用:編程練習,第一題

CPrimer Plus 第十四章代碼重用&#xff1a;編程練習,第一題 提示&#xff1a;這里可以添加系列文章的所有文章的目錄&#xff0c;目錄需要自己手動添加 CPrimer Plus 第十四章代碼重用&#xff1a;編程練習,第一題 提示&#xff1a;寫完文章后&#xff0c;目錄可以自動生成&am…

高職人工智能專業實訓課之“生成對抗網絡(GAN)”

一、前言 生成對抗網絡&#xff08;GAN&#xff09;作為人工智能領域的一項重要技術&#xff0c;已經在圖像生成、風格遷移、數據增強等多個領域展現出巨大的潛力和應用價值。為了滿足高職院校對GAN專業實訓課程的需求&#xff0c;唯眾人工智能教學實訓憑借其前沿的教育技術平…

mst[講課留檔]

最小生成樹(Minimum Spanning Tree) (1)概念 我們知道&#xff0c;樹是有 n n n個結點&#xff0c; n ? 1 n-1 n?1條邊的無向無環的連通圖。 一個連通圖的生成樹是一個極小的連通子圖&#xff0c;它包含圖中全部的 n n n個頂點&#xff0c;但只有構成一棵樹的 n ? 1 n-1 …

內容營銷專家劉鑫煒:越是賺不到錢,越要加大推廣力度

這兩天&#xff0c;一位跟我們有長期合作關系的小微企業主老蘇問我。 “現在錢這么不好賺&#xff0c;品牌推廣應該怎么做&#xff1f;” 我說&#xff1a;“這是好機會&#xff0c;加大投放力度&#xff01;” 老蘇很是不解&#xff0c;這時候不開源節流&#xff0c;還要加…

使用Git從Github上克隆倉庫,修改并提交修改

前言 本次任務主要是進行github提交修改的操作練習實踐&#xff0c;本文章是對實踐過程以及遇到的問題進行的一個記錄。 在此之前&#xff0c;我已經簡單使用過github&#xff0c;Git之前已經下好了&#xff0c;所以就省略一些步驟。 步驟記錄 注冊github賬號&#xff0c;gi…

【C++】C++指針在線程中調用與受保護內存空間讀取方法

引言 在C的多線程編程中&#xff0c;正確地管理內存和同步訪問是確保程序穩定性和安全性的關鍵。特別是當涉及到指針在線程中的調用時&#xff0c;對受保護內存空間的訪問必須謹慎處理&#xff0c;以防止數據競爭、死鎖和內存損壞等問題。本文將詳細探討C指針在線程中調用時如何…

理解 React 的嚴格模式

文章目錄 有什么優劣優點&#xff1a;缺點&#xff1a; 使用場景如何使用為整個應用啟用嚴格模式一部分代碼啟用嚴格模式 React 的 Strict Mode&#xff08;嚴格模式&#xff09;是一種用于檢測應用中潛在問題的開發工具。它不會渲染任何可見的 UI 元素&#xff0c;而是通過激活…

element-ui如何做表單驗證

Element UI 使用表單驗證通常涉及兩個主要組件&#xff1a;el-form 和 el-form-item。 el-form 負責管理表單數據和驗證規則&#xff0c;而 el-form-item 用于定義需要驗證的表單項。 <template><el-form :model"form" :rules"rules" ref"fo…

易校網校園綜合跑腿小程序源碼修復運營版

簡介&#xff1a; 易校網校園綜合跑腿小程序源碼修復運營版&#xff0c;帶服務端客戶端前端文檔說明。 源碼安裝方法&#xff1a; 需要準備小程序服務號 服務器 備案域名 校園網跑腿小程序源碼需要準備 1.小程序 2.服務器&#xff08;推薦配置2h4g3m&#xff09; 3.域名…

使用JMeter+Grafana+Influxdb搭建可視化性能測試監控平臺

【背景說明】 使用jmeter進行性能測試時&#xff0c;工具自帶的查看結果方式往往不夠直觀和明了&#xff0c;所以我們需要搭建一個可視化監控平臺來完成結果監控&#xff0c;這里我們采用三種JMeterGrafanaInfluxdb的方法來完成平臺搭建 【實現原理】 通過influxdb數據庫存儲…

開源模型應用落地-FastAPI-助力模型交互-WebSocket篇(五)

一、前言 使用 FastAPI 可以幫助我們更簡單高效地部署 AI 交互業務。FastAPI 提供了快速構建 API 的能力,開發者可以輕松地定義模型需要的輸入和輸出格式,并編寫好相應的業務邏輯。 FastAPI 的異步高性能架構,可以有效支持大量并發的預測請求,為用戶提供流暢的交互體驗。此外,F…

【圖論】樹鏈剖分

樹鏈剖分詳解 - 自為風月馬前卒 - 博客園 (cnblogs.com) P3384 【模板】重鏈剖分/樹鏈剖分 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) #include<iostream> using namespace std;void dfs1(int u,int father){ fa[u]father; dep[u]dep[father]1; sz[u]1;for(int ih…

SpringBoot中整合ONLYOFFICE在線編輯

SpringBoot整合OnlyOffice SpringBoot整合OnlyOffice實現在線編輯1. 搭建私有的OnlyOffice的服務2. SpringBoot進行交互2.1 環境2.2 我們的流程2.3 接口規劃2.3.1 獲取編輯器配置的接口2.3.2 文件下載地址2.3.3 文件下載地址 3. 總結4. 注意4.1 你的項目的地址一定一定要和only…

Java中的單元測試與集成測試最佳實踐

Java中的單元測試與集成測試最佳實踐 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將深入探討Java中的單元測試與集成測試最佳實踐。在軟件開發中&am…

三層交換基礎

一、什么是三層交換 三層交換是一種在OSI模型第三層&#xff0c;即網絡層上工作的網絡設備技術&#xff0c;它整合了二層交換機的功能和路由器的部分功能&#xff0c;以實現更高效的網絡數據轉發和路由選擇。三層交換技術的核心在于結合了二層交換技術和三層轉發技術&#xff…

【RabbitMQ實戰】Springboot 整合RabbitMQ組件,多種編碼示例,帶你實踐 看完這一篇就夠了

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、對RabbitMQ管理界面深入了解1、在這個界面里面我們可以做些什么&#xff1f; 二、編碼練習&#xff08;1&#xff09;使用direct exchange(直連型交換機)&a…

2024 年的 13 個 AI 趨勢

2024 年的 13 個 AI 趨勢 人工智能對環境的影響和平人工智能人工智能支持的問題解決和決策針對人工智能公司的訴訟2024 年美國總統大選與人工智能威脅人工智能、網絡犯罪和社會工程威脅人工智能治療孤獨與對人工智能的情感依賴人工智能影響者中國爭奪人工智能霸主地位人工智能…

Java中的機器學習模型集成與訓練

Java中的機器學習模型集成與訓練 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將探討在Java中如何進行機器學習模型的集成與訓練。隨著人工智能和機器…