【STM32】在標準庫中使用DMA

1.MDA簡介

DMA全稱Direct Memory Access,直接存儲區訪問。

DMA傳輸將數據從一個地址空間復制到另一個地址空間。當CPU初始化這個傳輸動作,傳輸動作本身是由DMA控制器來實現和完成的。DMA傳輸方式無需CPU直接控制傳輸,也沒有中斷處理方式那樣保留現場和恢復現場的過程,通過硬件為RAM和IO設備開辟一個直接傳輸數據的通道,使得CPU的效率大大提高。

STM32F4xx系列的DMA支持外設到存儲器傳輸、存儲器到外設傳輸和存儲器到存儲器傳輸三種傳輸模式。 這里的外設一般指外設的數據寄存器,比如ADC、SPI、I2C、DCMI等等外設的數據寄存器,存儲器一般是指片內SRAM、外部存儲器、片內Flash等等。

外設到存儲器傳輸就是把外設數據寄存器內容轉移到指定的內存空間。比如進行ADC采集時我們可以利用DMA傳輸把AD轉換數據轉移到我們定義的存儲區中, 這樣對于多通道采集、采樣頻率高、連續輸出數據的AD采集是非常高效的處理方法。

存儲區到外設傳輸就是把特定存儲區內容轉移至外設的數據寄存器中,這種多用于外設的發送通信。

存儲器到存儲器傳輸就是把一個指定的存儲區內容拷貝到另一個存儲區空間。功能類似于C語言內存拷貝函數memcpy, 利用DMA傳輸可以達到更高的傳輸效率,特別是DMA傳輸是不占用CPU的,可以節省很多CPU資源。

1.1外設通道選擇

STM32F4xx系列資源豐富,具有兩個DMA控制器,同時外設繁多,為實現正常傳輸,DMA需要通道選擇控制。每個DMA控制器具有8個數據流, 每個數據流對應8個外設請求。在實現DMA傳輸之前,DMA控制器會通過DMA數據流x配置寄存器DMA_SxCR(x為0~7,對應8個DMA數據流)的CHSEL[2:0]位選擇對應的通道作為該數據流的目標外設。

外設通道選擇要解決的主要問題是決定哪一個外設作為該數據流的源地址或者目標地址。

DMA1各個通道的請求映像

DMA1各個通道的請求映像

DMA2各個通道的請求映像DMA2各個通道的請求映像每個外設請求都占用一個數據流通道,相同外設請求可以占用不同數據流通道。

1.2仲裁器

一個DMA控制器對應8個數據流,數據流包含要傳輸數據的源地址、目標地址、數據等等信息。如果我們需要同時使用同一個DMA控制器(DMA1或DMA2)多個外設請求時, 那必然需要同時使用多個數據流,那究竟哪一個數據流具有優先傳輸的權利呢?這就需要仲裁器來管理判斷了。

仲裁器管理數據流方法分為兩個階段。第一階段屬于軟件階段,我們在配置數據流時可以通過寄存器設定它的優先級別, 具體配置DMA_SxCR寄存器PL[1:0]位,可以設置為非常高、高、中和低四個級別。第二階段屬于硬件階段,如果兩個或以上數據流軟件設置優先級一樣, 則他們優先級取決于數據流編號,編號越低越具有優先權,比如數據流2優先級高于數據流3。

1.3FIFO

每個數據流都獨立擁有四級32位FIFO(先進先出存儲器緩沖區)。DMA傳輸具有FIFO模式和直接模式。

直接模式在每個外設請求都立即啟動對存儲器傳輸。在直接模式下,如果DMA配置為存儲器到外設傳輸那DMA會見一個數據存放在FIFO內, 如果外設啟動DMA傳輸請求就可以馬上將數據傳輸過去。

FIFO用于在源數據傳輸到目標地址之前臨時存放這些數據。可以通過DMA數據流xFIFO控制寄存器DMA_SxFCR的FTH[1:0]位來控制FIFO的閾值, 分別為1/4、1/2、3/4和滿。如果數據存儲量達到閾值級別時,FIFO內容將傳輸到目標中。

FIFO對于要求源地址和目標地址數據寬度不同時非常有用,比如源數據是源源不斷的字節數據,而目標地址要求輸出字寬度的數據, 即在實現數據傳輸時同時把原來4個8位字節的數據拼湊成一個32位字數據。此時使用FIFO功能先把數據緩存起來,分別根據需要輸出數據。

FIFO另外一個作用使用于突發(burst)傳輸。

2.DMA數據配置

DMA配置可能情況

2.1DMA傳輸模式

DMA2支持全部三種傳輸模式,而DMA1只有外設到存儲器和存儲器到外設兩種模式。模式選擇可以通過DMA_SxCR寄存器的DIR[1:0]位控制, 進而將DMA_SxCR寄存器的EN位置1就可以使能DMA傳輸。

在DMA_SxCR寄存器的PSIZE[1:0]和MSIZE[1:0]位分別指定外設和存儲器數據寬度大小,可以指定為字節(8位)、半字(16位)和字(32位), 我們可以根據實際情況設置。直接模式要求外設和存儲器數據寬度大小一樣,實際上在這種模式下DMA數據流直接使用PSIZE,MSIZE不被使用。

2.2源地址和目標地址

DMA數據流x外設地址DMA_SxPAR(x為0~7)寄存器用來指定外設地址,它是一個32位數據有效寄存器。 DMA數據流x存儲器0地址DMA_SxM0AR(x為0~7) 寄存器和DMA數據流x存儲器1地址DMA_SxM1AR(x為0~7)寄存器用來存放存儲器地址, 其中DMA_SxM1AR只用于雙緩沖模式,DMA_SxM0AR和DMA_SxM1AR都是32位數據有效的。

當選擇外設到存儲器模式時,即設置DMA_SxCR寄存器的DIR[1:0] 位為“00”,DMA_SxPAR寄存器為外設地址,也是傳輸的源地址, DMA_SxM0AR寄存器為存儲器地址,也是傳輸的目標地址。對于存儲器到存儲器傳輸模式,即設置DIR[1:0]位為“10”時, 采用與外設到存儲器模式相同配置。而對于存儲器到外設,即設置DIR[1:0]位為“01”時,DMA_SxM0AR寄存器作為為源地址,DMA_SxPAR寄存器作為目標地址。

2.3流控制器

流控制器主要涉及到一個控制DMA傳輸停止問題。DMA傳輸在DMA_SxCR寄存器的EN位被置1后就進入準備傳輸狀態,如果有外設請求DMA傳輸就可以進行數據傳輸。 很多情況下,我們明確知道傳輸數據的數目,比如要傳1000個或者2000個數據,這樣我們就可以在傳輸之前設置DMA_SxNDTR寄存器為要傳輸數目值, DMA控制器在傳輸完這么多數目數據后就可以控制DMA停止傳輸。

DMA數據流x數據項數DMA_SxNDTR(x為0~7)寄存器用來記錄當前仍需要傳輸數目,它是一個16位數據有效寄存器,即最大值為65535, 這個值在程序設計是非常有用也是需要注意的地方。我們在編程時一般都會明確指定一個傳輸數量,在完成一次數目傳輸后DMA_SxNDTR計數值就會自減,當達到零時就說 明傳輸完成。

如果某些情況下在傳輸之前我們無法確定數據的數目,那DMA就無法自動控制傳輸停止了,此時需要外設通過硬件通信向DMA控制器發送停止傳輸信號。 這里有一個大前提就是外設必須是可以發出這個停止傳輸信號,只有SDIO才有這個功能,其他外設不具備此功能。

2.4循環模式

循環模式相對應于一次模式。一次模式就是傳輸一次就停止傳輸,下一次傳輸需要手動控制,而循環模式在傳輸一次后會自動按照相同配置重新傳輸,周而復始直至被控制停止或傳輸發生錯誤。

通過DMA_SxCR寄存器的CIRC位可以使能循環模式。

2.5傳輸類型

DMA傳輸類型有單次(Single)傳輸和突發(Burst)傳輸。突發傳輸就是用非常短時間結合非常高數據信號率傳輸數據,相對正常傳輸速度, 突發傳輸就是在傳輸階段把速度瞬間提高,實現高速傳輸,在數據傳輸完成后恢復正常速度,有點類似達到數據塊“秒傳”效果。為達到這個效果突發傳輸過程要占用AHB總線, 保證要求每個數據項在傳輸過程不被分割,這樣一次性把數據全部傳輸完才釋放AHB總線;而單次傳輸時必須通過AHB的總線仲裁多次控制才傳輸完成。

2.6直接模式

默認情況下,DMA工作在直接模式,不使能FIFO閾值級別。

直接模式在每個外設請求都立即啟動對存儲器傳輸的單次傳輸。直接模式要求源地址和目標地址的數據寬度必須一致, 所以只有PSIZE控制,而MSIZE值被忽略。突發傳輸是基于FIFO的所以直接模式不被支持。另外直接模式不能用于存儲器到存儲器傳輸。

在直接模式下,如果DMA配置為存儲器到外設傳輸那DMA會見一個數據存放在FIFO內,如果外設啟動DMA傳輸請求就可以馬上將數據傳輸過去。

2.7雙緩沖模式

設置DMA_SxCR寄存器的DBM位為1可啟動雙緩沖傳輸模式,并自動激活循環模式。雙緩沖不應用與存儲器到存儲器的傳輸。雙緩沖模式下, 兩個存儲器地址指針都有效,即DMA_SxM1AR寄存器將被激活使用。開始傳輸使用DMA_SxM0AR寄存器的地址指針所對應的存儲區, 當這個存儲區數據傳輸完DMA控制器會自動切換至DMA_SxM1AR寄存器的地址指針所對應的另一塊存儲區, 如果這一塊也傳輸完成就再切換至DMA_SxM0AR寄存器的地址指針所對應的存儲區,這樣循環調用。

當其中一個存儲區傳輸完成時都會把傳輸完成中斷標志TCIF位置1,如果我們使能了DMA_SxCR寄存器的傳輸完成中斷,則可以產生中斷信號, 這個對我們編程非常有用。另外一個非常有用的信息是DMA_SxCR寄存器的CT位,當DMA控制器是在訪問使用DMA_SxM0AR時CT=0, 此時CPU不能訪問DMA_SxM0AR,但可以向DMA_SxM1AR填充或者讀取數據;當DMA控制器是在訪問使用DMA_SxM1AR時CT=1,此時CPU不能訪問DMA_SxM1AR, 但可以向DMA_SxM0AR填充或者讀取數據。另外在未使能DMA數據流傳輸時,可以直接寫CT位,改變開始傳輸的目標存儲區。

雙緩沖模式應用在需要解碼程序的地方是非常有效的。比如MP3格式音頻解碼播放,MP3是被壓縮的文件格式, 我們需要特定的解碼庫程序來解碼文件才能得到可以播放的PCM信號,解碼需要一定的實際,按照常規方法是讀取一段原始數據到緩沖區, 然后對緩沖區內容進行解碼,解碼后才輸出到音頻播放電路,這種流程對CPU運算速度要求高,很容易出現播放不流暢現象。 如果我們使用DMA雙緩沖模式傳輸數據就可以非常好的解決這個問題,達到解碼和輸出音頻數據到音頻電路同步進行的效果。

2.8DMA中斷

每個DMA數據流可以在發送以下事件時產生中斷:

  1. 達到半傳輸:DMA數據傳輸達到一半時HTIF標志位被置1, 如果使能HTIE中斷控制位將產生達到半傳輸中斷;

  2. 傳輸完成:DMA數據傳輸完成時TCIF標志位被置1, 如果使能TCIE中斷控制位將產生傳輸完成中斷;

  3. 傳輸錯誤:DMA訪問總線發生錯誤或者在雙緩沖模式下試圖訪問“受限”存儲器地址寄存器時TEIF標志位被置1, 如果使能TEIE中斷控制位將產生傳輸錯誤中斷;

  4. FIFO錯誤:發生FIFO下溢或者上溢時FEIF標志位被置1, 如果使能FEIE中斷控制位將產生FIFO錯誤中斷;

  5. 直接模式錯誤:在外設到存儲器的直接模式下,因為存儲器總線沒得到授權,使得先前數據沒有完成被傳輸到存儲器空間上, 此時DMEIF標志位被置1,如果使能DMEIE中斷控制位將產生直接模式錯誤中斷。

3.DMA_InitTypeDef初始化結構體

typedef struct {uint32_t DMA_Channel;             //通道選擇uint32_t DMA_PeripheralBaseAddr;  //外設地址uint32_t DMA_Memory0BaseAddr;     //存儲器0地址uint32_t DMA_DIR;                 //傳輸方向uint32_t DMA_BufferSize;          //數據數目uint32_t DMA_PeripheralInc;       //外設遞增uint32_t DMA_MemoryInc;           //存儲器遞增uint32_t DMA_PeripheralDataSize;  //外設數據寬度uint32_t DMA_MemoryDataSize;      //存儲器數據寬度uint32_t DMA_Mode;                //模式選擇uint32_t DMA_Priority;            //優先級uint32_t DMA_FIFOMode;            //FIFO模式uint32_t DMA_FIFOThreshold;       //FIFO閾值uint32_t DMA_MemoryBurst;         //存儲器突發傳輸uint32_t DMA_PeripheralBurst;     //外設突發傳輸
} DMA_InitTypeDef;
  1. DMA_Channel:DMA請求通道選擇,可選通道0至通道7,每個外設對應固定的通道, 具體設置值需要查表 DMA1各個通道的請求映像 和表 DMA2各個通道的請求映像 ; 它設定DMA_SxCR寄存器的CHSEL[2:0]位的值。例如,我們使用模擬數字轉換器ADC3規則采集4個輸入通道的電壓數據,查表 DMA2各個通道的請求映像 可知使用通道2。

  2. DMA_PeripheralBaseAddr:外設地址,設定DMA_SxPAR寄存器的值;一般設置為外設的數據寄存器地址, 如果是存儲器到存儲器模式則設置為其中一個存儲區地址。ADC3的數據寄存器ADC_DR地址為((uint32_t)ADC3+0x4C)。

  3. DMA_Memory0BaseAddr:存儲器0地址,設定DMA_SxM0AR寄存器值;一般設置為我們自定義存儲區的首地址。 我們程序先自定義一個16位無符號整形數組ADC_ConvertedValue[4]用來存放每個通道的ADC值, 所以把數組首地址(直接使用數組名即可)賦值給DMA_Memory0BaseAddr。

  4. DMA_DIR:傳輸方向選擇,可選外設到存儲器、存儲器到外設以及存儲器到存儲器。 它設定DMA_SxCR寄存器的DIR[1:0]位的值。ADC采集顯然使用外設到存儲器模式。

  5. DMA_BufferSize:設定待傳輸數據數目,初始化設定DMA_SxNDTR寄存器的值。 這里ADC是采集4個通道數據,所以待傳輸數目也就是4。

  6. DMA_PeripheralInc:如果配置為DMA_PeripheralInc_Enable,使能外設地址自動遞增功能,它設定DMA_SxCR寄存器的PINC位的值; 一般外設都是只有一個數據寄存器,所以一般不會使能該位。ADC3的數據寄存器地址是固定并且只有一個所以不使能外設地址遞增。

  7. DMA_MemoryInc:如果配置為DMA_MemoryInc_Enable,使能存儲器地址自動遞增功能,它設定DMA_SxCR寄存器的MINC位的值; 我們自定義的存儲區一般都是存放多個數據的,所以使能存儲器地址自動遞增功能。我們之前已經定義了一個包含4個元素的數字用來存放數據, 使能存儲區地址遞增功能,自動把每個通道數據存放到對應數組元素內。

  8. DMA_PeripheralDataSize:外設數據寬度,可選字節(8位)、半字(16位)和字(32位),它設定DMA_SxCR寄存器的PSIZE[1:0]位的值。 ADC數據寄存器只有低16位數據有效,使用半字數據寬度。

  9. DMA_MemoryDataSize:存儲器數據寬度,可選字節(8位)、半字(16位)和字(32位),它設定DMA_SxCR寄存器的MSIZE[1:0]位的值。 保存ADC轉換數據也要使用半字數據寬度,這跟我們定義的數組是相對應的。

  10. DMA_Mode:DMA傳輸模式選擇,可選一次傳輸或者循環傳輸,它設定DMA_SxCR寄存器的CIRC位的值。 我們希望ADC采集是持續循環進行的,所以使用循環傳輸模式。

  11. DMA_Priority:軟件設置數據流的優先級,有4個可選優先級分別為非常高、高、中和低,它設定DMA_SxCR寄存器的PL[1:0]位的值。 DMA優先級只有在多個DMA數據流同時使用時才有意義,這里我們設置為非常高優先級就可以了。

  12. DMA_FIFOMode:FIFO模式使能,如果設置為DMA_FIFOMode_Enable表示使能FIFO模式功能; 它設定DMA_SxFCR寄存器的DMDIS位。ADC采集傳輸使用直接傳輸模式即可,不需要使用FIFO模式。

  13. DMA_FIFOThreshold:FIFO閾值選擇,可選4種狀態分別為FIFO容量的1/4、1/2、3/4和滿;它設定DMA_SxFCR寄存器的FTH[1:0]位; DMA_FIFOMode設置為DMA_FIFOMode_Disable,那DMA_FIFOThreshold值無效。ADC采集傳輸不使用FIFO模式,設置改值無效。

  14. DMA_MemoryBurst:存儲器突發模式選擇,可選單次模式、4節拍的增量突發模式、8節拍的增量突發模式或16節拍的增量突發模式, 它設定DMA_SxCR寄存器的MBURST[1:0]位的值。ADC采集傳輸是直接模式,要求使用單次模式。

  15. DMA_PeripheralBurst:外設突發模式選擇,可選單次模式、4節拍的增量突發模式、8節拍的增量突發模式或16節拍的增量突發模式, 它設定DMA_SxCR寄存器的PBURST[1:0]位的值。ADC采集傳輸是直接模式,要求使用單次模式。

4.DMA存儲器到存儲器模式實驗

存儲器到存儲器模式可以實現數據在兩個內存的快速拷貝。我們先定義一個靜態的源數據,然后使用DMA傳輸把源數據拷貝到目標地址上,最后對比源數據和目標地址的數據,看看是否傳輸準確。

#ifndef __BSP_DMA_H
#define __BSP_DMA_H#ifdef __cplusplus
extern "C"{#endif#include "stm32f4xx.h"/* 相關宏定義,使用存儲器到存儲器傳輸必須使用DMA2 */
#define DMA_STREAM               DMA2_Stream0
#define DMA_CHANNEL              DMA_Channel_0
#define DMA_STREAM_CLOCK         RCC_AHB1Periph_DMA2
#define DMA_IT_TCIF              DMA_IT_TCIF0
#define DMA_IT_HTIF              DMA_IT_HTIF0
#define DMA_FLAG_TCIF            DMA_FLAG_TCIF0
#define DMA_FLAG_HTIF            DMA_FLAG_HTIF0
#define DMA_STREAM_IRQn          DMA2_Stream0_IRQn
#define DMA_STREAM_IRQHandler    DMA2_Stream0_IRQHandler#define BUFFER_SIZE              32void Init_M2M_DMA(void);
#ifdef __cplusplus
}
#endif#endif
#include "bsp_dma.h"
#include "stdio.h"
#include "string.h"/* 定義aSRC_Const_Buffer數組作為DMA傳輸數據源
const關鍵字將aSRC_Const_Buffer數組變量定義為常量類型 */
const uint32_t aSRC_Const_Buffer[BUFFER_SIZE]= {0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20,0x21222324,0x25262728,0x292A2B2C,0x2D2E2F30,0x31323334,0x35363738,0x393A3B3C,0x3D3E3F40,0x41424344,0x45464748,0x494A4B4C,0x4D4E4F50,0x51525354,0x55565758,0x595A5B5C,0x5D5E5F60,0x61626364,0x65666768,0x696A6B6C,0x6D6E6F70,0x71727374,0x75767778,0x797A7B7C,0x7D7E7F80
};
/* 定義DMA傳輸目標存儲器 */
uint32_t aDST_Buffer[BUFFER_SIZE];void Init_M2M_DMA(void)
{/* 使能DMA時鐘 */RCC_AHB1PeriphClockCmd(DMA_STREAM_CLOCK, ENABLE);/* 復位初始化DMA數據流 */DMA_DeInit(DMA_STREAM);/* 確保DMA數據流復位完成 */while (DMA_GetCmdStatus(DMA_STREAM) != DISABLE) {}DMA_InitTypeDef  DMA_InitStructure;DMA_InitStructure.DMA_BufferSize=BUFFER_SIZE;//一次DMA事務傳輸的數據個數DMA_InitStructure.DMA_Channel=DMA_CHANNEL;DMA_InitStructure.DMA_DIR=DMA_DIR_MemoryToMemory;DMA_InitStructure.DMA_FIFOMode=DMA_FIFOMode_Disable;DMA_InitStructure.DMA_FIFOThreshold=DMA_FIFOThreshold_Full;DMA_InitStructure.DMA_Memory0BaseAddr= (uint32_t)aDST_Buffer;DMA_InitStructure.DMA_MemoryBurst=DMA_MemoryBurst_Single;DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Word;DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)aSRC_Const_Buffer;DMA_InitStructure.DMA_PeripheralBurst=DMA_PeripheralBurst_Single;DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Word;DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Enable;DMA_InitStructure.DMA_Priority=DMA_Priority_Low;DMA_Init(DMA_STREAM,&DMA_InitStructure);//配置中斷控制器并使能中斷NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel=DMA_STREAM_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;NVIC_Init(&NVIC_InitStruct);DMA_ITConfig(DMA_STREAM,DMA_IT_TCIF|DMA_IT_HTIF,ENABLE);DMA_ClearITPendingBit(DMA_STREAM,DMA_IT_TCIF|DMA_IT_HTIF);DMA_Cmd(DMA_STREAM,ENABLE);
}void DMA_STREAM_IRQHandler(void)
{if(SET== DMA_GetFlagStatus(DMA_STREAM,DMA_FLAG_HTIF)){printf("half transfer\r\n");DMA_ClearFlag(DMA_STREAM,DMA_FLAG_HTIF);}else if(SET== DMA_GetFlagStatus(DMA_STREAM,DMA_FLAG_TCIF)){printf("transfer complete\r\n");DMA_ClearFlag(DMA_STREAM,DMA_FLAG_TCIF);}//	if(SET==DMA_GetITStatus(DMA_STREAM,DMA_IT_HTIF))
//	{
//		//half transfer complete
//		printf("half transfer\r\n");
//		DMA_ClearITPendingBit(DMA_STREAM,DMA_IT_HTIF);
//		
//	}
//	else if(SET==DMA_GetITStatus(DMA_STREAM,DMA_IT_TCIF))
//	{
//		//transfer complete
//		
//		if(0== memcmp(aSRC_Const_Buffer,aDST_Buffer,BUFFER_SIZE))
//		{
//			printf("transfer complete\r\n");
//		}
//		DMA_ClearITPendingBit(DMA_STREAM,DMA_IT_TCIF);
//	}
}

編程注意事項:

  1. 對于存儲器到存儲器傳輸模式,源地址和目標地址的設置, 采用與外設到存儲器模式相同配置。也就是源存儲器地址當作外設地址。
  2. 我們在中斷服務函數中檢查ITStatus時發現,沒有檢測到half transfer的IT標志位,但是可以檢測到transfer complete的IT標志位。但是FlagStatus都可以獲取到,也不知道是啥問題。
  3. 如果我換為其他的DMA2_STREAM,比如DMA2_Stream1。甚至transfer complete的IT標志位都沒有檢測到。也不知道是啥原因。
  4. 對于存儲器到存儲器傳輸模式,只能選擇DMA2。

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

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

相關文章

融云上線 HarmonyOS NEXT 版 SDK,全面適配「純血鴻蒙」生態

6 月 21 日,“2024 華為開發者大會”正式發布使用自研內核的原生鴻蒙系統 HarmonyOS NEXT,即 “純血鴻蒙”。 同時,華為宣布開放“鴻蒙生態伙伴 SDK 市場”,甄選各類優質、安全的 SDK 加入聚合平臺,助力各行業開發者輕…

Oracle如何切換temp表空間以及需要注意的點

Oracle如何切換temp表空間以及需要注意的點 昨天有套庫報/u01的磁盤90%使用率報警了,無法通過LVM在原盤基礎上擴容,計劃新增加磁盤并將能在線遷移的相關數據庫文件遷移走。 其中,對于temp表空間的處理,我采取的方法實際和undo差不…

【linux】網絡基礎(3)——tcp協議

文章目錄 TCP協議概括TCP頭部格式TCP連接管理建立連接(三次握手)數據傳輸確認應答機制捎帶應答 滑動窗口丟包問題 擁塞控制延時應達 終止連接(四次揮手) TCP協議概括 TCP是一個面向連接的協議,在傳輸數據之前需要建立連…

醫療器械進銷存軟件 專業合規的醫療公司器械出入庫管理軟件

財務管理:財務檔案統一管理,有利于科學管理企業資金 財務管理:發票關聯業務單據,業財融合,加速財務數字化轉型 財務管理:提供收付款功能,加快企業應收賬款的回收,降低付款的資金浮…

小白輕松使用maven

一、maven 下載 下載地址 maven 下載官方地址 https://maven.apache.org/download.cgi,黃色壓縮包。 2. 下載解壓 cmd 解壓命令 tar -zxvf apache-maven-3.9.8-bin.tar.gz二、maven 配置 settings.xml 文件配置 鏡像配置: 國內鏡像配置用于下載資源…

《操作系統真象還原》學習筆記:第1章 部署工作環境

**提示:**這篇文章是根據學長提供的教程《操作系統真象還原》第一章 部署工作環境來完成的,我按照學長給的教程一步一步做下來,再結合《操作系統真象還原》這本書,對實驗環境進行了配置。以下是我按照教程進行搭建的記錄&#xff…

[Vue3 + TS + Vite] CSS穿透

以 Element-Plus UI 中的 <el-drawer> 為例 方法一 Template中 <el-drawer>CSS中 <style lang"scss" scoped> :deep(.el-drawer__header) {margin: 0px 0px 0px 0px; /*上 右 下 左*/box-sizing: border-box;padding: 0px 0px 0px 0px; /*上 右…

【Ubuntu】詳細說說Parallels DeskTop安裝和使用Ubuntu系統

希望文章能給到你啟發和靈感~ 如果覺得文章對你有幫助的話,點贊 + 關注+ 收藏 支持一下博主吧~ 閱讀指南 開篇說明一、基礎環境說明1.1 硬件環境1.2 軟件環境二、Ubuntu系統的使用2.1 系統的下載2.2 系統的安裝2.3 安裝桌面版(可選)2.3.1 安裝/更新apt2.3.2 安裝桌面版2.3…

【JNDI注入利用工具】JNDIExploit v1.1

# 簡介 JNDIExploit一款用于 JNDI注入 利用的工具&#xff0c;大量參考/引用了 Rogue JNDI 項目的代碼&#xff0c;集成了JDNI注入格式&#xff0c;能夠更加方便的開啟服務端后直接利用&#xff0c;支持反彈Shell、命令執行、直接植入內存shell等&#xff0c;并集成了常見的by…

7.4、空指針和野指針

空指針 #include <iostream> using namespace std;int main() {//空指針//1、空指針用于給變量進行初始化int * p NULL;//2、空指針是不可以進行訪問的//0-255之間的內存編號是系統占用的&#xff0c;因此不可以訪問//cout<<*p<<endl;system("pause&q…

算法訓練 | 圖論Part3 | 101.孤島的總面積、102.沉沒孤島、103.水流問題、104.建造最大島嶼

目錄 101.孤島的總面積 圖論法 102.沉沒孤島 圖論法 103.水流問題 圖論法 104.建造最大島嶼 圖論法 101.孤島的總面積 題目鏈接&#xff1a;101. 孤島的總面積 文章講解&#xff1a;代碼隨想錄 圖論法 代碼一&#xff1a;深搜 #include <iostream> #includ…

在Centos7上安裝PostgreSQL16的詳細步驟

文章目錄 環境一、準備二、postgresql下載方法一&#xff1a;wget下載方法二&#xff1a;下載壓縮包解壓 三、創建用戶組、用戶四、創建數據主目錄五、配置環境變量六、initdb初使化數據庫七、配置服務八、設置開機自啟動九、設置防火墻十、啟動數據庫服務 環境 CPU: 4 核心或以…

Python爬蟲系列-讓爬蟲自己寫爬蟲(半自動化,代替人工寫爬蟲)

現在的PC、手機客戶端等終端設備大量使用了網頁前后端技術&#xff0c;另外主流的網站也會經常會更新&#xff0c;導致以前一個月更新一次爬蟲代碼&#xff0c;變成了天天需要更新代碼&#xff0c;所以自動化爬蟲技術在當前就顯得特別重要&#xff0c;最近我也是在多次更新某個…

養老院生活管理系統

摘要 隨著全球范圍內人口老齡化趨勢的日益加劇&#xff0c;養老院作為老年人生活的重要場所&#xff0c;其生活管理問題也顯得愈發突出和重要。為了滿足養老院在日常生活管理、老人健康監護、服務人員管理等多方面的需求&#xff0c;提高管理效率和服務質量。決定設計并實現了…

用一百場線下講座科普充電樁 能效電氣做到了

在新能源汽車產業蓬勃發展的今天,充電樁作為產業鏈的重要環節,其建設與發展成為推動行業進步的關鍵。在這一背景下,能效電氣憑借其卓越的技術實力和前瞻性的市場布局,成為了新能源充電樁行業的佼佼者。 為了進一步推動新能源產業的發展,普及充電樁知識,能效電氣精心策劃并舉辦…

C語言數據類型和變量(二)

目錄 1.數據類型的取值范圍 2.變量 2.1 變量的創建 2.2 變量的分類 2.3全局變量和局部變量在內存中的存儲?編輯 3. 算術操作符&#xff1a; 、 - 、* 、/ 、% 3.1 和 - 3.2 * 3.3 / 3.4 % 1.數據類型的取值范圍 每一種數據類型有自己的取值范圍&#xff0c;也就是存…

mapper.xml 文件對應的 Dao 接口原理

在 Java 框架如 MyBatis 中&#xff0c;Mapper.xml 文件是用于定義 SQL 查詢的配置文件&#xff0c;而對應的 Dao 接口&#xff08;Mapper 接口&#xff09;則提供了與 XML 文件中的 SQL 查詢相對應的方法。這種設計模式使得 Java 代碼與 SQL 語句解耦&#xff0c;提高了代碼的…

盤點亞馬遜5大實用選品思路(圖文講解+選品案例)

一、7天藍海選品法 市場上很多工具一般都是近30天的跨境商品數據&#xff0c;而店雷達亞馬遜選品&#xff0c;可以篩選出上架近7天的亞馬遜產品&#xff0c;避免在已經市場相對飽和的賽道&#xff0c;中小賣家還要擠破頭去搶蛋糕。我們更應該學會在市場反饋好的新品中找到出單…

Git刪除了文件拉取時失敗

本地刪除了一些文件&#xff0c;遠端的另一個提交修改了被刪除的文件&#xff0c;vs里拉取時提示未處理的提交&#xff0c;無法繼續操作&#xff0c;git gui里顯示很多unstaged change的項 解決辦法&#xff1a; 1、用git bash的git rm --cached filename或 git rm -r --cached…

GBASE8S如何使用dbexport實現單表的還原和實現數據庫的復制

(一) 通過dbexport實現單表數據還原 1. 測試前的信息查看 本次以test庫的表test21為例 [gbasedbtiZ2ze5s78e4tanwe5q2znxZ ~]$ dbaccess test - Your evaluation license will expire on 2025-05-26 00:00:00Database selected.> select * from test21;id name1 a2 b3 c3…