小华HC32F448串口使用

news2024/11/26 4:52:26

目录

1. 串口GPIO配置

2. 串口波特率配置

3. 串口接收超时配置

4. 串口中断注册

5. 串口初始化

6. 串口数据接收处理

7. DMA接收配置和处理


1. 串口GPIO配置

端口号和Pin脚号跟STM32没什么区别。

串口复用功能跟STM32大不一样。

如下图,选自HC32F448 表 2-1 引脚功能表。

1)每个管脚都有对应的管脚名称、中断号,以及功能号

2)调试口默认为TRACE/JTAG功能号,若要使能普通GPIO功能则要关闭调试功能

3)非调试口默认功能号为Func0,即普通GPIO功能。Func2到Func11为定时器或时钟功能,Func12为EXMC/TIMA功能

4)Func32~63为通用复用功能-分为两组,对于同一组的IO,可以配置为UART/I2C/SPI/CAN 4组功能,且Rx/Tx可以互换。而不是像STM32那样,每个IO的复用功能是固定的,对应通讯线必须一一选对。

如下,硬件选择了PB0和PA7作为串口通讯脚,可以在FG1任意选择一个可用串口使用。

#define USART_RX_PORT                   (GPIO_PORT_B)   /* PB0: USART2_RX */
#define USART_RX_PIN                    (GPIO_PIN_00)
#define USART_RX_GPIO_FUNC              (GPIO_FUNC_37)
#define USART_TX_PORT                   (GPIO_PORT_A)   /* PA7: USART2_TX */
#define USART_TX_PIN                    (GPIO_PIN_07)
#define USART_TX_GPIO_FUNC              (GPIO_FUNC_36)

static void UartGpioConfig(void)
{
	GPIO_SetFunc(USART_RX_PORT, USART_RX_PIN, USART_RX_GPIO_FUNC);
    GPIO_SetFunc(USART_TX_PORT, USART_TX_PIN, USART_TX_GPIO_FUNC);
}

2. 串口波特率配置

static void UartBaudConfig(void)
{
	USART_FCG_ENABLE();
	stc_usart_uart_init_t stcUartInit;
	(void)USART_UART_StructInit(&stcUartInit);
    stcUartInit.u32ClockDiv = USART_CLK_DIV64;
    stcUartInit.u32CKOutput = USART_CK_OUTPUT_ENABLE;
    stcUartInit.u32Baudrate = USART_BAUDRATE;
    stcUartInit.u32OverSampleBit = USART_OVER_SAMPLE_8BIT;
    USART_UART_Init(USART_UNIT, &stcUartInit, NULL);
}

3. 串口接收超时配置

小华HC32F4串口支持的中断与STM32大有不同:

1)HC32 接收数据寄存器满中断,在收到1个字节时就会触发。等同于STM32的RXNE。名字不同

2)HC32 TIMEOUT中断,等同于STM32的空闲中断 IDLE 。HC32通过关联定时器直接配置超时时间,比STM32更加简便。

定时器Timer0被专门用来做串口的计时器,板子用的串口2,所以定时器要配置Timer0_1 B 。

//串口接收超时设置·关联定时器
#define USART_TIMEOUT_BITS              (5000U)
#define TMR0_UNIT                       (CM_TMR0_1)
#define TMR0_CH                         (TMR0_CH_B)
#define TMR0_FCG_ENABLE()               (FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR0_1, ENABLE))

/*
 * TMR0_Config()
 * 配置串口接收超时
*/
static void TMR0_Config(void)
{
    uint16_t u16Div;
    uint16_t u16Delay;
    uint16_t u16CompareValue;
    stc_tmr0_init_t stcTmr0Init;

    TMR0_FCG_ENABLE();

    /* Initialize TMR0 base function. */
    stcTmr0Init.u32ClockSrc = TMR0_CLK_SRC_XTAL32;
    stcTmr0Init.u32ClockDiv = TMR0_CLK_DIV8;
    stcTmr0Init.u32Func     = TMR0_FUNC_CMP;
    if (TMR0_CLK_DIV1 == stcTmr0Init.u32ClockDiv) {
        u16Delay = 7U;
    } else if (TMR0_CLK_DIV2 == stcTmr0Init.u32ClockDiv) {
        u16Delay = 5U;
    } else if ((TMR0_CLK_DIV4 == stcTmr0Init.u32ClockDiv) || \
               (TMR0_CLK_DIV8 == stcTmr0Init.u32ClockDiv) || \
               (TMR0_CLK_DIV16 == stcTmr0Init.u32ClockDiv)) {
        u16Delay = 3U;
    } else {
        u16Delay = 2U;
    }

    u16Div = (uint16_t)1U << (stcTmr0Init.u32ClockDiv >> TMR0_BCONR_CKDIVA_POS);
    u16CompareValue = ((USART_TIMEOUT_BITS + u16Div - 1U) / u16Div) - u16Delay;
    stcTmr0Init.u16CompareValue = u16CompareValue;
    (void)TMR0_Init(TMR0_UNIT, TMR0_CH, &stcTmr0Init);

    TMR0_HWStartCondCmd(TMR0_UNIT, TMR0_CH, ENABLE);
    TMR0_HWClearCondCmd(TMR0_UNIT, TMR0_CH, ENABLE);
}

4. 串口中断注册

#define USART_RX_ERR_IRQn               (INT005_IRQn)
#define USART_RX_ERR_INT_SRC            (INT_SRC_USART2_EI)
#define USART_RX_FULL_IRQn              (INT006_IRQn)
#define USART_RX_FULL_INT_SRC           (INT_SRC_USART2_RI)
#define USART1_RX_TIMEOUT_IRQn          (INT007_IRQn)
#define USART1_RX_TIMEOUT_INT_SRC       (INT_SRC_USART2_RTO)

static void USART_RxFull_IrqCallback(void);
static void USART_RxError_IrqCallback(void);
static void USART_RxTimeout_IrqCallback(void);

static void RegisterIrq(void)
{
	stc_irq_signin_config_t stcIrqSigninConfig;
	
	/* Register RX full IRQ handler. */
    stcIrqSigninConfig.enIRQn = USART_RX_FULL_IRQn;
    stcIrqSigninConfig.enIntSrc = USART_RX_FULL_INT_SRC;
    stcIrqSigninConfig.pfnCallback = &USART_RxFull_IrqCallback;
    (void)INTC_IrqSignIn(&stcIrqSigninConfig);
    NVIC_ClearPendingIRQ(stcIrqSigninConfig.enIRQn);
    NVIC_SetPriority(stcIrqSigninConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);
    NVIC_EnableIRQ(stcIrqSigninConfig.enIRQn);

    /* Register RX error IRQ handler. */
    stcIrqSigninConfig.enIRQn = USART_RX_ERR_IRQn;
    stcIrqSigninConfig.enIntSrc = USART_RX_ERR_INT_SRC;
    stcIrqSigninConfig.pfnCallback = &USART_RxError_IrqCallback;
    (void)INTC_IrqSignIn(&stcIrqSigninConfig);
    NVIC_ClearPendingIRQ(stcIrqSigninConfig.enIRQn);
    NVIC_SetPriority(stcIrqSigninConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);
    NVIC_EnableIRQ(stcIrqSigninConfig.enIRQn);
	
	/* Register RX timeout IRQ handler. */
    stcIrqSigninConfig.enIRQn = USART1_RX_TIMEOUT_IRQn;
    stcIrqSigninConfig.enIntSrc = USART1_RX_TIMEOUT_INT_SRC;
    stcIrqSigninConfig.pfnCallback = &USART_RxTimeout_IrqCallback;
    (void)INTC_IrqSignIn(&stcIrqSigninConfig);
    NVIC_ClearPendingIRQ(stcIrqSigninConfig.enIRQn);
    NVIC_SetPriority(stcIrqSigninConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);
    NVIC_EnableIRQ(stcIrqSigninConfig.enIRQn);
}

5. 串口初始化

LL_PERIPH_WE() 为打开相应寄存器的写使能

LL_PERIPH_WP() 为关闭相应寄存器的写使能

void UART_Init(void)
{
    LL_PERIPH_WE(LL_PERIPH_ALL);
	
	UartGpioConfig();
	
	UartBaudConfig();
	
	TMR0_Config();
	
	RegisterIrq();
	
    LL_PERIPH_WP(LL_PERIPH_ALL);
	
	USART_FuncCmd(USART_UNIT, ( USART_TX | USART_RX | USART_INT_RX | USART_RX_TIMEOUT | USART_INT_RX_TIMEOUT), ENABLE);
}

6. 串口数据接收处理

USART_RxFull_IrqCallback 中断 只负责接收和缓存单字节数据,以及递增数据长度 (通过读数据清除标志位)

USART_RxTimeout_IrqCallback 中断 处理超时中断(超时中断触发后必须要关闭定时器,和清除标志位)

USART_RxError_IrqCallback 中断 处理异常错误

static void USART_RxFull_IrqCallback(void)
{
	uint8_t u8Data = (uint8_t)USART_ReadData(USART_UNIT);
	if(gps_len < RX_FRAME_LEN_MAX)
		gps_buf[gps_len++] = u8Data;
}

static void USART_RxError_IrqCallback(void)
{
	(void)USART_ReadData(USART_UNIT);

    USART_ClearStatus(USART_UNIT, (USART_FLAG_PARITY_ERR | USART_FLAG_FRAME_ERR | USART_FLAG_OVERRUN));
}

static void USART_RxTimeout_IrqCallback(void)
{
	TMR0_Stop(TMR0_UNIT, TMR0_CH);

    USART_ClearStatus(USART_UNIT, USART_FLAG_RX_TIMEOUT);
	
	GpsRxCallBack(gps_buf, gps_len);
	gps_len = 0;
}

对于GPS、Wifi这类不频繁的数据交互,用到超时中断和接收寄存器满就可以处理数据了。

对于4G/蓝牙等有持续大量数据交互的模块,就需要用到DMA了。

7. 串口数据发送

static int32_t UartSendByte(CM_USART_TypeDef *UART, uint8_t ch)
{
	uint32_t u32TxEmpty = 0UL;
    __IO uint32_t u32TmpCount = 0UL;
	uint32_t u32Timeout = HCLK_VALUE/USART_BAUDRATE;
	int32_t i32Ret = LL_ERR_INVD_PARAM;
	
	/* Wait TX data register empty */
	while ((u32TmpCount <= u32Timeout) && (0UL == u32TxEmpty)) {
		u32TxEmpty = READ_REG32_BIT(UART->SR, USART_SR_TXE);
		u32TmpCount++;
	}

	if (0UL != u32TxEmpty) {
		WRITE_REG16(UART->TDR, ch);
		i32Ret = LL_OK;
	} else {
		i32Ret = LL_ERR_TIMEOUT;
	}
		
	return i32Ret;
}

8. DMA接收配置和处理

DMA配置方式与STM32基本相同:

1)设置DMA源地址和源地址增长类型,设置目的地址和目的地址增长类型

DMA接收属于串口数据寄存器到内存,即源地址固定,目的地址递增

DMA发送属于内存到串口数据寄存器,即源地址递增,目的地址固定

2)设置位宽、传输大小、传输块数


所不同的是,HC32有一个可配置的自动运行系统AOS。

可以配置AOS源和AOS目标.

AOS源可以是DMA传输完成、UART接收数据、定时器上溢和下溢、event电平变化等等。

AOS目标可以是DMA传输、定时器计数、ADC模数转换、event事件等等

如下是DMA初始化配置的参考代码,配置了串口DMA接收和串口DMA发送:

//DMA单元
#define RX_DMA_UNIT                     (CM_DMA1)
//DMA通道号·通道号越小优先级越高
#define RX_DMA_CH                       (DMA_CH0)
//DMA单元时钟
#define RX_DMA_FCG_ENABLE()             (FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_DMA1, ENABLE))
//AOS系统的目标·触发DMA1通道0传输
#define RX_DMA_TRIG_SEL                 (AOS_DMA1_0)
//AOS系统的触发源·接收数据寄存器满中断
#define RX_DMA_TRIG_EVT_SRC             (EVT_SRC_USART1_RI)
//AOS系统的目标·DMA完成中断
#define RX_DMA_RECONF_TRIG_SEL          (AOS_DMA_RC)
//AOS系统的触发源·AOS_STRG中断源
#define RX_DMA_RECONF_TRIG_EVT_SRC      (EVT_SRC_AOS_STRG)
//DMA传输完成中断·通道号1
#define RX_DMA_TC_INT                   (DMA_INT_TC_CH0)
//DMA传输完成标志·通道号2
#define RX_DMA_TC_FLAG                  (DMA_FLAG_TC_CH0)
//DMA传输完成中断号
#define RX_DMA_TC_IRQn                  (INT000_IRQn)
//DMA传输完成中断源
#define RX_DMA_TC_INT_SRC               (INT_SRC_DMA1_TC0)

//串口DMA发送配置
#define TX_DMA_UNIT                     (CM_DMA2)
#define TX_DMA_CH                       (DMA_CH0)
#define TX_DMA_FCG_ENABLE()             (FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_DMA2, ENABLE))
#define TX_DMA_TRIG_SEL                 (AOS_DMA2_0)
#define TX_DMA_TRIG_EVT_SRC             (EVT_SRC_USART1_TI)
#define TX_DMA_TC_INT                   (DMA_INT_TC_CH0)
#define TX_DMA_TC_FLAG                  (DMA_FLAG_TC_CH0)
#define TX_DMA_TC_IRQn                  (INT001_IRQn)
#define TX_DMA_TC_INT_SRC               (INT_SRC_DMA2_TC0)

/*******************************************************************************
 * Local variable definitions ('static')
 ******************************************************************************/
static __IO en_flag_status_t m_enTxEnd = SET;
static uint8_t m_4gRxBuf[RX_FRAME_LEN_MAX];
static uint8_t *m_auTxBuf = NULL;

/*******************************************************************************
 * Local function definitions ('static')
 ******************************************************************************/
static void RX_DMA_TC_IrqCallback(void);
static void TX_DMA_TC_IrqCallback(void);

/*
 * DMA_Config()
 * 配置串口DMA接收和DMA发送
*/
static int32_t DMA_Config(void)
{
    int32_t i32Ret;
    stc_dma_init_t stcDmaInit;
    stc_dma_llp_init_t stcDmaLlpInit;
    stc_irq_signin_config_t stcIrqSignConfig;
    static stc_dma_llp_descriptor_t stcLlpDesc;

    //使能DMA和FCG时钟
    RX_DMA_FCG_ENABLE();
    TX_DMA_FCG_ENABLE();
    FCG_Fcg0PeriphClockCmd(FCG0_PERIPH_AOS, ENABLE);

    /* USART_RX_DMA */
    (void)DMA_StructInit(&stcDmaInit);
    stcDmaInit.u32IntEn = DMA_INT_ENABLE;//DMA interrupt enable
    stcDmaInit.u32BlockSize = 1UL;//DMA block size
    stcDmaInit.u32TransCount = ARRAY_SZ(m_4gRxBuf);//DMAbuf大小
    stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT;//DMAbuf位宽
    stcDmaInit.u32DestAddr = (uint32_t)m_4gRxBuf;//DMAbuf地址
    stcDmaInit.u32SrcAddr = (uint32_t)(&USART_UNIT->RDR);//由外设到内存的 外设地址 -> 串口数据寄存器
    stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_FIX;//由外设到内存的 源地址模式 固定
    stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_INC;//由外设到内存的 目标地址模式 自动递增
    i32Ret = DMA_Init(RX_DMA_UNIT, RX_DMA_CH, &stcDmaInit);
    if (LL_OK == i32Ret) 
	{
        (void)DMA_LlpStructInit(&stcDmaLlpInit);
        stcDmaLlpInit.u32State = DMA_LLP_ENABLE;
        stcDmaLlpInit.u32Mode  = DMA_LLP_WAIT;
        stcDmaLlpInit.u32Addr  = (uint32_t)&stcLlpDesc;
        (void)DMA_LlpInit(RX_DMA_UNIT, RX_DMA_CH, &stcDmaLlpInit);//初始化DMA链表指针

        stcLlpDesc.SARx   = stcDmaInit.u32SrcAddr;
        stcLlpDesc.DARx   = stcDmaInit.u32DestAddr;
        stcLlpDesc.DTCTLx = (stcDmaInit.u32TransCount << DMA_DTCTL_CNT_POS) | (stcDmaInit.u32BlockSize << DMA_DTCTL_BLKSIZE_POS);;
        stcLlpDesc.LLPx   = (uint32_t)&stcLlpDesc;
        stcLlpDesc.CHCTLx = stcDmaInit.u32SrcAddrInc | stcDmaInit.u32DestAddrInc | stcDmaInit.u32DataWidth |  \
                            stcDmaInit.u32IntEn      | stcDmaLlpInit.u32State    | stcDmaLlpInit.u32Mode;

        DMA_ReconfigLlpCmd(RX_DMA_UNIT, RX_DMA_CH, ENABLE);
        DMA_ReconfigCmd(RX_DMA_UNIT, ENABLE);
        AOS_SetTriggerEventSrc(RX_DMA_RECONF_TRIG_SEL, RX_DMA_RECONF_TRIG_EVT_SRC);

        stcIrqSignConfig.enIntSrc = RX_DMA_TC_INT_SRC;
        stcIrqSignConfig.enIRQn  = RX_DMA_TC_IRQn;
        stcIrqSignConfig.pfnCallback = &RX_DMA_TC_IrqCallback;
        (void)INTC_IrqSignIn(&stcIrqSignConfig);
        NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn);
        NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);
        NVIC_EnableIRQ(stcIrqSignConfig.enIRQn);

        AOS_SetTriggerEventSrc(RX_DMA_TRIG_SEL, RX_DMA_TRIG_EVT_SRC);

        DMA_Cmd(RX_DMA_UNIT, ENABLE);
        DMA_TransCompleteIntCmd(RX_DMA_UNIT, RX_DMA_TC_INT, ENABLE);
        (void)DMA_ChCmd(RX_DMA_UNIT, RX_DMA_CH, ENABLE);
    }
	
    (void)DMA_StructInit(&stcDmaInit);
    stcDmaInit.u32IntEn = DMA_INT_ENABLE;
    stcDmaInit.u32BlockSize = 1UL;
    stcDmaInit.u32TransCount = ARRAY_SZ(m_4gRxBuf);
    stcDmaInit.u32DataWidth = DMA_DATAWIDTH_8BIT;
    stcDmaInit.u32DestAddr = (uint32_t)(&USART_UNIT->TDR);
    stcDmaInit.u32SrcAddr = (uint32_t)m_4gRxBuf;
    stcDmaInit.u32SrcAddrInc = DMA_SRC_ADDR_INC;
    stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_FIX;
    i32Ret = DMA_Init(TX_DMA_UNIT, TX_DMA_CH, &stcDmaInit);
    if (LL_OK == i32Ret)
	{
        stcIrqSignConfig.enIntSrc = TX_DMA_TC_INT_SRC;
        stcIrqSignConfig.enIRQn  = TX_DMA_TC_IRQn;
        stcIrqSignConfig.pfnCallback = &TX_DMA_TC_IrqCallback;
        (void)INTC_IrqSignIn(&stcIrqSignConfig);
        NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn);
        NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);
        NVIC_EnableIRQ(stcIrqSignConfig.enIRQn);

        AOS_SetTriggerEventSrc(TX_DMA_TRIG_SEL, TX_DMA_TRIG_EVT_SRC);

        DMA_Cmd(TX_DMA_UNIT, ENABLE);
        DMA_TransCompleteIntCmd(TX_DMA_UNIT, TX_DMA_TC_INT, ENABLE);
    }
	
    return i32Ret;
}

如下是DMA接收处理代码:

1)USART_RxTimeout_IrqCallback

重启AOS系统

关闭串口超时定时器,清除串口超时标志位。

处理DMA接收数据。

2)RX_DMA_TC_IrqCallback

即接收完成中断

硬件上需要清除中断标志位

3)USART_TxComplete_IrqCallback

即串口发送完成中断

硬件上需要清除标志位,一般要失能发送中断

//串口接收超时中断
static void USART_RxTimeout_IrqCallback(void)
{
    uint16_t unLen = RX_FRAME_LEN_MAX - (uint16_t)DMA_GetTransCount(RX_DMA_UNIT, RX_DMA_CH);
	
    AOS_SW_Trigger();

    TMR0_Stop(TMR0_UNIT, TMR0_CH);

    USART_ClearStatus(USART_UNIT, USART_FLAG_RX_TIMEOUT);
	
	if(unLen != 0 && unLen != RX_FRAME_LEN_MAX)
		DtuRxCallBack(m_4gRxBuf, unLen);
}

//串口DMA接收·传输完成中断
static void RX_DMA_TC_IrqCallback(void)
{
	DtuRxCallBack(m_4gRxBuf, RX_FRAME_LEN_MAX);
	
    DMA_ClearTransCompleteStatus(RX_DMA_UNIT, RX_DMA_TC_FLAG);
}

//串口发送完成中断
static void USART_TxComplete_IrqCallback(void)
{
	m_enTxEnd = SET;
	DtuTxCallBack(m_auTxBuf);
	
	USART_FuncCmd(USART_UNIT, (USART_TX | USART_INT_TX_CPLT), DISABLE);
	
    USART_ClearStatus(USART_UNIT, USART_FLAG_TX_CPLT);
}

//串口接收错误中断
static void USART_RxError_IrqCallback(void)
{
    (void)USART_ReadData(USART_UNIT);

    USART_ClearStatus(USART_UNIT, (USART_FLAG_PARITY_ERR | USART_FLAG_FRAME_ERR | USART_FLAG_OVERRUN));
}

//串口DMA发送·传输完成中断
static void TX_DMA_TC_IrqCallback(void)
{
    USART_FuncCmd(USART_UNIT, USART_INT_TX_CPLT, ENABLE);

    DMA_ClearTransCompleteStatus(TX_DMA_UNIT, TX_DMA_TC_FLAG);
}

9. DMA发送

//串口DMA发送
void DtuDMASend(uint8_t *pBuf, uint16_t u16TxLen)
{
#if 0 //串口发送数据打印
	printf("Tx: ");
	for(uint16_t i = 0; i < u16TxLen; i++)
	{
		printf("%02X",pBuf[i]);
	}
	printf("\r\n");
#endif
	
	//等待上一包发完
	while(m_enTxEnd == RESET);
	m_enTxEnd = RESET;
	m_auTxBuf = pBuf;
	
	//启动DMA传输
	DMA_SetSrcAddr(TX_DMA_UNIT, TX_DMA_CH, (uint32_t)pBuf);
	DMA_SetTransCount(TX_DMA_UNIT, TX_DMA_CH, u16TxLen);
	(void)DMA_ChCmd(TX_DMA_UNIT, TX_DMA_CH, ENABLE);
	USART_FuncCmd(USART_UNIT, USART_TX, ENABLE);
}

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

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

相关文章

AI 律助 Alpha GPT 线上实操发布会,重磅发布!

数字化时代,随着人工智能的迅猛发展,各行各业都在积极探索通过智能化工具实现工作效率翻升的可能性。“ ChatGPT 类产品”是未来办公应用软件发展的重要趋势之一,但如何将 ChatGPT 真正应用于法律人的工作,赋能效率提升?法律行业同样面临着新的挑战和机遇。 破局的关键是实现技…

mysql面试题50:500台数据库,如何在最快时间之内重启

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:500台db,如何在最快时间之内重启呢? 如果需要在最快时间内重启500台数据库,可以考虑采用并行化和自动化的方法来提高效率。比如: 编写自动化脚…

ubuntu中查看进程并结束进程以查看资源占用命令

ps命令&#xff1a;可以列出正在运行的进程。ps -e ps -aux 查看所有进程&#xff0c;每行一个程序&#xff08;常用&#xff09;ps -A 查看当前系统所有的进程。&#xff08;常用&#xff09;ps -A | grep chrome 命令去搜索某个指定进程。&#xff08;常用&#xff09;ps -A…

SQL sever中的索引

目录 一、索引定义 二、索引结构 2.1. B-树索引结构&#xff1a; 2.2. 哈希索引结构&#xff1a; 三、索引作用 四、索引与约束区别 五、索引级别 六、索引分类 6.1. 聚集索引&#xff08;Clustered Index&#xff09;&#xff1a; 6.2. 非聚集索引&#xff08;Noncl…

2023年中国石油测井设备市场格局及存在问题分析[图]

油气勘探就是利用各种勘探手段寻找和查明油气资源、确定油气聚集有利地区、找到储油气的圈闭、探明油气田面积和油气层情况并预测产出能力的过程&#xff1b;油气开发是在油田最终投产前的必要环节。 随着石油测井行业的不断发展&#xff0c;使用测井仪器的测井服务单位对仪器无…

华为云云耀云服务器L实例评测|华为云耀云服务器L实例docker部署及应用(七)

八、华为云耀云服务器L实例docker、docker-compose安装及部署MySQL、Redis应用&#xff1a; 随着云原生、容器化、微服务、K8S等技术的发展&#xff0c;容器 docker 也逐渐在企业团队实践中大量的使用。它可以提供了一套标准化的解决方案&#xff0c;极大地提升了部署、发布、运…

生成Android证书

前提&#xff1a;确保本机安装好了java1.8 第一步 打开CMD keytool -genkey -alias AAAA -keyalg RSA -keysize 2048 -validity 36500 -keystore D:\mygitee\keyStore\szxApp.jksD:\mygitee\keyStore\szxApp.jks是证书要生成的位置 szxApp.jks 是证书名称 D:\mygitee\keySto…

八大排序算法(含时间复杂度、空间复杂度、算法稳定性)

文章目录 八大排序算法(含时间复杂度、空间复杂度、算法稳定性)1、&#xff08;直接&#xff09;插入排序1.1、算法思想1.2、排序过程图解1.3、排序代码 2、希尔排序3、冒泡排序3.1、算法思想3.2、排序过程图解3.3、排序代码 4、&#xff08;简单&#xff09;选择排序4.1、算法…

Web应用防火墙的性能优化技术

Web应用防火墙&#xff08;WAF&#xff09;是企业网络安全的重要屏障&#xff0c;其性能直接影响到网络服务的质量和安全。本文详细探讨了WAF性能优化的几种技术&#xff0c;旨在为网络安全专业人员提供实用的参考。 规则优化 1.1 精简规则集 规则评估&#xff1a;定期评估规…

深入了解Spring Boot Actuator

文章目录 引言什么是ActuatorActuator的底层技术和原理端点自动配置端点请求处理端点数据提供端点数据暴露 如何使用Actuator添加依赖访问端点自定义端点 实例演示结论 引言 Spring Boot Actuator是一个非常强大且广泛使用的模块&#xff0c;它为Spring Boot应用程序提供了一套…

数据库:Hive转Presto(五)

此篇将所有代码都补充完了&#xff0c;之前发现有的代码写错了&#xff0c;以这篇为准&#xff0c;以下为完整代码&#xff0c;如果发现我有什么考虑不周的地方&#xff0c;可以评论提建议&#xff0c;感谢。代码是想哪写哪&#xff0c;可能比较繁琐&#xff0c;还需要优化。 …

Kafka SASL认证授权(五)ACL源码解析

Kafka SASL认证授权(五)ACL源码解析。 官网地址:https://kafka.apache.org/ 一、ACL检查流程解析 一起看一下kafka server的启动与监听流程: Kafka -> KafkaServer -> SocketServer、KafkaRequestHandler 其中KafkaServer做相关的初始化,包括SocketServer 与 han…

实体解析实施的复杂性

实体的艺术表现斯特凡伯克纳 一、说明 实体解析是确定数据集中的两条或多条记录是否引用同一现实世界实体&#xff08;通常是个人或公司&#xff09;的过程。乍一看&#xff0c;实体分辨率可能看起来像一个相对简单的任务&#xff1a;例如&#xff0c;给定一张人物的两张照片&a…

AOMEI PXE Boot Free

两台电脑网线直连&#xff0c;不用设置固定IP&#xff0c;该软件包含DHCP。 名称: 3H3AOMEIPXEBootFree.rar 大小: 13068734 字节 (12 MiB) SHA1: 1e606c8c1ee3badf8af9a87f61fdf2e332b773e6 名称: PXEBoot.exe 大小: 13124928 字节 (12 MiB) SHA1: 95286ac18e9b81c2a68412c40…

尿检设备“智能之眼”:维视智造推出MV-MC 系列医疗专用相机

​ 尿液分析是临床检验的基础常规项目&#xff0c;随着医疗设备的不断发展&#xff0c;尿液分析相关仪器的国产化和自动化程度也进一步提升。2022 年国内尿液分析市场的规模约为 28 亿元&#xff0c;激烈的竞争推动了尿检仪器自动化、智能化升级&#xff0c;在仪器中加入机器视…

布朗大学发现GPT-4存在新问题,可通过非常见语言绕过限制

&#x1f989; AI新闻 &#x1f680; 布朗大学发现GPT-4存在新漏洞&#xff0c;可通过非常见语言绕过限制 摘要&#xff1a;布朗大学计算机科学研究人员发现了OpenAI的GPT-4存在新漏洞&#xff0c;利用不太常见的语言如祖鲁语和盖尔语可以绕过各种限制。研究人员测试了GPT-4对…

如何做好数据分析中的数据可视化?

数据可视化在数据分析中扮演着重要的角色&#xff0c;它帮助我们更好地理解和传达数据的特征、趋势和规律。以下是关于如何做好数据分析中的数据可视化的详细介绍。 一、准备工作 1. 理解数据 在进行数据可视化之前&#xff0c;首先要对数据有一个清晰的理解。了解数据的来源…

【大数据】Hadoop MapReduce与Hadoop YARN(学习笔记)

一、Hadoop MapReduce介绍 1、设计构思 1&#xff09;如何对付大数据处理场景 对相互间不具有计算依赖关系的大数据计算任务&#xff0c;实现并行最自然的办法就是采取MapReduce分而治之的策略。 不可拆分的计算任务或相互间有依赖关系的数据无法进行并行计算&#xff01; …

LiveMedia视频中间件如何与第三方系统实现事件录像关联

一、平台简介 LiveMedia视频中间件是支持部署到本地服务器或者云服务器的纯软件服务&#xff0c;也提供服务器、GPU一体机全包服务&#xff0c;提供视频设备管理、无插件、跨平台的实时视频、历史回放、语音对讲、设备控制等基础功能&#xff0c;支持视频协议有海康、大华私有协…

Qt事件系统 day7

Qt事件系统 day7 事件系统 在Qt中&#xff0c;事件是派生自抽象QEvent类的对象&#xff0c;它表示应用程序内发生的事情或应用程序需要知道的外部活动的结果。事件可以由QObject子类的任何实例接收和处理&#xff0c;但它们与小部件尤其相关。Qt程序需要在main()函数创建一个…