【STM32L4】FreeRTOS消息队列三串口接收发送

2023-05-16

环境

  • STM32L476G-DISCO 开发板
  • STM32CubeIDE 1.1.0
  • STM32CubeMX 5.4.0

STM32CubeIDE配置

移植FreeRTOS,选择CMSIS_V2。
FreeRTOSConfigure
FreeRTOS的所有配置的选择默认,后面手动修改FreeRTOSConfig.h文件修改配置。如果想直接在IDE中修改配置也可以直接修改。

开启三个串口,异步模式。
UartConfigure
由于接收采用空闲中断接收,所以要打开DMA接收和串口总中断。

重要文件

  • FreeRTOSConfigure.h FreeRTOS的配置文件。修改一些关于FreeRTOS的配置信息。
  • freertos.c FreeRTOS任务主文件,可以在void MX_FREERTOS_Init(void)函数中定义任务。

默认STM32CubeIDE在生成代码的时候是会在MA_FREERTOS_Init函数创建一个默认任务。该任务的功能仅仅做一个延时。

代码

FreeRTOSConfigure.h

#define configTOTAL_HEAP_SIZE       ((size_t)1024 * 24)
//修改Total Heap Size,该参数决定内存池的总大小,当FreeRTOS任务启动后总是进入HardFault_Handler中断程序时,可以考虑Debug看一下任务句柄地址的分配,很可能是因为内存池资源用完,没有空间分配导致的硬件异常中断。

main.h

/* USER CODE BEGIN Private defines */
#define UARTRXBUFFERSIZE 512     //串口接收的缓存区大小
#define UARTQUEUENUM  3          //消息队列的数量
#define UARTQUEUESIZE (uint32_t)UARTRXBUFFERSIZE * UARTQUEUENUM

typedef struct {
	uint8_t uartRxTemp[UARTRXBUFFERSIZE];
	uint8_t uartRxName[7];
} UARTMessageQueue_TypeDef;
/* USER CODE END Private defines */
//自己定义了一些宏和结构体

stm32l4xx_it.c

/* USER CODE BEGIN EV */
//在main.c文件中定义的串口接收缓存区,大小为UARTRXBUFFERSIZE
extern uint8_t uart1RxBuffer[UARTRXBUFFERSIZE];
extern uint8_t uart2RxBuffer[UARTRXBUFFERSIZE];
extern uint8_t uart4RxBuffer[UARTRXBUFFERSIZE];

//在freertos.c文件中定义的消息队列句柄
extern osMessageQueueId_t osQueueUart1;
extern osMessageQueueId_t osQueueUart2;
extern osMessageQueueId_t osQueueUart4;
/* USER CODE END EV */

/**
 * @brief This function handles USART1 global interrupt.
 */
void USART1_IRQHandler(void) {
	/* USER CODE BEGIN USART1_IRQn 0 */
	uint8_t temp;
	UARTMessageQueue_TypeDef msg;
	uint8_t str[7] = "USART1";
	if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET) {
		//空闲中断
		//temp = huart4.Instance->ISR;
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);
		temp = huart1.Instance->RDR;
		temp = temp;
		HAL_UART_DMAStop(&huart1);
        //进入串口空闲中断之后,确定串口数据缓存区有数据,将串口数据存入结构体的数据存储数组,结构体的uartRxName成员存放消息来源的串口名称。
        //osMessageQueuePut将结构体推入osQueueUart1消息队列中。
        //其实可以将三个串口放入一个消息队列,用结构体中uartRxName成员区分来源。这里为了简单明了,没有做更多的优化。有兴趣可以自行修改。
		if (strlen(uart1RxBuffer) != 0) {
			memset(msg.uartRxTemp, 0x00, sizeof(msg.uartRxTemp));
			memcpy(msg.uartRxTemp, uart1RxBuffer, strlen(uart1RxBuffer));
			memcpy(msg.uartRxName, str, strlen(str));
			memset(uart1RxBuffer, 0x00, strlen(uart1RxBuffer));
			osMessageQueuePut(osQueueUart1, &msg, 0, 0);
		}

		__HAL_UART_CLEAR_IDLEFLAG(&huart1);
		__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
		HAL_UART_Receive_DMA(&huart1, uart1RxBuffer, UARTRXBUFFERSIZE);
	}
	/* USER CODE END USART1_IRQn 0 */
	HAL_UART_IRQHandler(&huart1);
	/* USER CODE BEGIN USART1_IRQn 1 */

	/* USER CODE END USART1_IRQn 1 */
}

/**
 * @brief This function handles USART2 global interrupt.
 */
void USART2_IRQHandler(void) {
	/* USER CODE BEGIN USART2_IRQn 0 */
	uint8_t temp;
	UARTMessageQueue_TypeDef msg;
	uint8_t str[7] = "USART2";
	if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE) != RESET) {
		//空闲中断
		//temp = huart4.Instance->ISR;
		__HAL_UART_CLEAR_IDLEFLAG(&huart2);
		temp = huart2.Instance->RDR;
		temp = temp;
		HAL_UART_DMAStop(&huart2);

		if (strlen(uart2RxBuffer) != 0) {
			memset(msg.uartRxTemp, 0x00, sizeof(msg.uartRxTemp));
			memcpy(msg.uartRxTemp, uart2RxBuffer, strlen(uart2RxBuffer));
			memcpy(msg.uartRxName, str, strlen(str));
			memset(uart2RxBuffer, 0x00, strlen(uart2RxBuffer));
			osMessageQueuePut(osQueueUart2, &msg, 0, 0);
		}

		__HAL_UART_CLEAR_IDLEFLAG(&huart2);
		__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
		HAL_UART_Receive_DMA(&huart2, uart2RxBuffer, UARTRXBUFFERSIZE);
	}
	/* USER CODE END USART2_IRQn 0 */
	HAL_UART_IRQHandler(&huart2);
	/* USER CODE BEGIN USART2_IRQn 1 */

	/* USER CODE END USART2_IRQn 1 */
}

/**
 * @brief This function handles UART4 global interrupt.
 */
void UART4_IRQHandler(void) {
	/* USER CODE BEGIN UART4_IRQn 0 */
	uint8_t temp;
	UARTMessageQueue_TypeDef msg;
	uint8_t str[7] = "UART4";
	if (__HAL_UART_GET_FLAG(&huart4, UART_FLAG_IDLE) != RESET) {
		//空闲中断
		//temp = huart4.Instance->ISR;
		__HAL_UART_CLEAR_IDLEFLAG(&huart4);
		temp = huart4.Instance->RDR;
		temp = temp;
		HAL_UART_DMAStop(&huart4);

		if (strlen(uart4RxBuffer) != 0) {
			memset(msg.uartRxTemp, 0x00, sizeof(msg.uartRxTemp));
			memcpy(msg.uartRxTemp, uart4RxBuffer, strlen(uart4RxBuffer));
			memcpy(msg.uartRxName, str, strlen(str));
			memset(uart4RxBuffer, 0x00, strlen(uart4RxBuffer));
			osMessageQueuePut(osQueueUart4, &msg, 0, 0);
		}

		__HAL_UART_CLEAR_IDLEFLAG(&huart4);
		__HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE);
		HAL_UART_Receive_DMA(&huart4, uart4RxBuffer, UARTRXBUFFERSIZE);
	}
	/* USER CODE END UART4_IRQn 0 */
	HAL_UART_IRQHandler(&huart4);
	/* USER CODE BEGIN UART4_IRQn 1 */

	/* USER CODE END UART4_IRQn 1 */
}

main.c

/* USER CODE BEGIN PV */
uint8_t uart1RxBuffer[UARTRXBUFFERSIZE] = { 0 };
uint8_t uart2RxBuffer[UARTRXBUFFERSIZE] = { 0 };
uint8_t uart4RxBuffer[UARTRXBUFFERSIZE] = { 0 };

/* USER CODE END PV */
//定义串口数据的缓存区,DMA将串口接收的数据搬运到这个缓存区中。

/* USER CODE BEGIN 4 */
/* 开启IDLE空闲中断、错误中断和DMA接收。
 *
 */
void uartEnableIDLE(void) {
	__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
	__HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);
	HAL_UART_Receive_DMA(&huart1, uart1RxBuffer, UARTRXBUFFERSIZE);
	__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
	__HAL_UART_ENABLE_IT(&huart2, UART_IT_ERR);
	HAL_UART_Receive_DMA(&huart2, uart2RxBuffer, UARTRXBUFFERSIZE);
	__HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE);
	__HAL_UART_ENABLE_IT(&huart4, UART_IT_ERR);
	HAL_UART_Receive_DMA(&huart4, uart4RxBuffer, UARTRXBUFFERSIZE);
}

/**
 * @brief  UART error callback.
 * @param  huart UART handle.
 * @retval None
 */
 //错误接收中断回调函数,用于处理ORE溢出中断。其他错误中断也可以在这个函数中处理。
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
	/* Prevent unused argument(s) compilation warning */
	UNUSED(huart);
	uint8_t temp;
	/* NOTE : This function should not be modified, when the callback is needed,
	 the HAL_UART_ErrorCallback can be implemented in the user file.
	 */
	if (huart->Instance == USART1) {
		if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE) != RESET) {
			temp = huart1.Instance->RDR;
			temp = temp;
			__HAL_UART_CLEAR_OREFLAG(&huart1);
			HAL_UART_Receive_DMA(&huart1, uart1RxBuffer, UARTRXBUFFERSIZE);
		}
	} else if (huart->Instance == USART2) {
		if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_ORE) != RESET) {
			temp = huart2.Instance->RDR;
			temp = temp;
			__HAL_UART_CLEAR_OREFLAG(&huart2);
			HAL_UART_Receive_DMA(&huart2, uart2RxBuffer, UARTRXBUFFERSIZE);
		}
	} else if (huart->Instance == UART4) {
		if (__HAL_UART_GET_FLAG(&huart4, UART_FLAG_ORE) != RESET) {
			temp = huart4.Instance->RDR;
			temp = temp;
			__HAL_UART_CLEAR_OREFLAG(&huart4);
			HAL_UART_Receive_DMA(&huart4, uart4RxBuffer, UARTRXBUFFERSIZE);
		}
	}
}
/* USER CODE END 4 */

freertos.c

/* USER CODE BEGIN Variables */
osMessageQueueId_t osQueueUart1;
osMessageQueueId_t osQueueUart2;
osMessageQueueId_t osQueueUart4;

osThreadId_t uart1TaskHandle;
osThreadId_t uart2TaskHandle;
osThreadId_t uart4TaskHandle;
/* USER CODE END Variables */
//定义三个消息队列句柄,三个任务句柄

/* USER CODE BEGIN FunctionPrototypes */
void uart1RxTask(void *argument);
void uart2RxTask(void *argument);
void uart4RxTask(void *argument);
/* USER CODE END FunctionPrototypes */
//声明任务函数

/**
 * @brief  FreeRTOS initialization
 * @param  None
 * @retval None
 */
void MX_FREERTOS_Init(void) {
	/* USER CODE BEGIN Init */

	/* USER CODE END Init */
	osKernelInitialize();

	/* USER CODE BEGIN RTOS_MUTEX */
	/* add mutexes, ... */
	/* USER CODE END RTOS_MUTEX */

	/* USER CODE BEGIN RTOS_SEMAPHORES */
	/* add semaphores, ... */
	/* USER CODE END RTOS_SEMAPHORES */

	/* USER CODE BEGIN RTOS_TIMERS */
	/* start timers, add new ones, ... */
	/* USER CODE END RTOS_TIMERS */

	/* USER CODE BEGIN RTOS_QUEUES */
	/* add queues, ... */
    //新建队列
    //osMessageQueueNew参数分别为队列中消息数量,消息的大小,队列的参数配置 
	osQueueUart1 = osMessageQueueNew(UARTQUEUENUM, sizeof(UARTMessageQueue_TypeDef), NULL);
	osQueueUart2 = osMessageQueueNew(UARTQUEUENUM, sizeof(UARTMessageQueue_TypeDef), NULL);
	osQueueUart4 = osMessageQueueNew(UARTQUEUENUM, sizeof(UARTMessageQueue_TypeDef), NULL);
	/* USER CODE END RTOS_QUEUES */

	/* Create the thread(s) */
	/* definition and creation of defaultTask */
	//const osThreadAttr_t defaultTask_attributes = { .name = "defaultTask",
	//		.priority = (osPriority_t) osPriorityNormal, .stack_size = 128 };
	//defaultTaskHandle = osThreadNew(StartDefaultTask, NULL,
	//		&defaultTask_attributes);

    //osThreadAttr_t 任务线程的结构体
    //.name 任务的名字
    //.priority 任务的优先级
    //.stack_size 任务堆栈的大小

	const osThreadAttr_t uart1RxTask_attributes = { .name = "uart1RxTask",
			.priority = (osPriority_t) osPriorityNormal, .stack_size = 1024 };
    //osThreadNew 创建任务函数,参数分别为任务处理函数,需要传入任务的参数,任务的参数属性
	uart1TaskHandle = osThreadNew(uart1RxTask, NULL, &uart1RxTask_attributes);
	const osThreadAttr_t uart2RxTask_attributes = { .name = "uart2RxTask",
			.priority = (osPriority_t) osPriorityNormal, .stack_size = 1024 };
	uart2TaskHandle = osThreadNew(uart2RxTask, NULL, &uart2RxTask_attributes);
	const osThreadAttr_t uart4RxTask_attributes = { .name = "uart4RxTask",
			.priority = (osPriority_t) osPriorityNormal, .stack_size = 1024 };
	uart4TaskHandle = osThreadNew(uart4RxTask, NULL, &uart4RxTask_attributes);
	/* USER CODE BEGIN RTOS_THREADS */
	/* add threads, ... */
	/* USER CODE END RTOS_THREADS */

}

/* USER CODE BEGIN Application */
void uart1RxTask(void *argument) {
	UARTMessageQueue_TypeDef msg;
	osStatus_t status;
	while (1) {
        //不断的请求消息队列
		status = osMessageQueueGet(osQueueUart1, &msg, NULL, 0);
        //请求到消息队列,将消息中的数据转发出去。
		if (status == osOK) {
			HAL_UART_Transmit(&huart1, msg.uartRxTemp, strlen(msg.uartRxTemp),
					1000);
			memset(msg.uartRxTemp, 0x00, strlen(msg.uartRxTemp));
		}
		osThreadYield();
	}
}

void uart2RxTask(void *argument) {
	UARTMessageQueue_TypeDef msg;
	osStatus_t status;
	while (1) {
		status = osMessageQueueGet(osQueueUart2, &msg, NULL, 0);

		if (status == osOK) {
			HAL_UART_Transmit(&huart2, msg.uartRxTemp, strlen(msg.uartRxTemp),
					1000);
			memset(msg.uartRxTemp, 0x00, strlen(msg.uartRxTemp));
		}
		osThreadYield();
	}
}

void uart4RxTask(void *argument) {
	UARTMessageQueue_TypeDef msg;
	osStatus_t status;
	while (1) {
		status = osMessageQueueGet(osQueueUart4, &msg, NULL, 0);

		if (status == osOK) {
			HAL_UART_Transmit(&huart4, msg.uartRxTemp, strlen(msg.uartRxTemp),
					1000);
			memset(msg.uartRxTemp, 0x00, strlen(msg.uartRxTemp));
		}
		osThreadYield();
	}
}
/* USER CODE END Application */

工程代码

如果愿意支持一下可以选择在CSDN下载,下载地址:
//download.csdn.net/download/JoelYang1997/12013095
同时如果没有下载币提供GIthub地址:
https://github.com/joelyang97/32L4_FreeRTOSandUART

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32L4】FreeRTOS消息队列三串口接收发送 的相关文章

  • 【FreeRTOS 信号量】互斥信号量

    互斥信号量与二值信号量类似 但是互斥信号量可以解决二值信号量出现的优先级翻转问题 解决办法就是优先级继承 普通互斥信号量创建及运行 参阅安富莱电子demo 互斥信号量句柄 static SemaphoreHandle t xMutex NU
  • FreeRTOS软件定时器创建、复位、开始和停止(备忘)

    目录 一 简介 1 1 开发环境 1 2 摘要 二 STM32CubeIDE配置 三 创建定时器 3 1 头文件声明 3 2 工程文件定义 3 3 创建定时器 3 4 开启 复位 和关闭定时器 四 定时器回调函数 一 简介 1 1 开发环境
  • FreeRTOS简述和移植文档

    FreeRTOS简述和移植文档 文章目录 FreeRTOS简述和移植文档 1 前言 2 FreeRTOS简述 1 概述 2 实现 3 主要特色 4 支持平台 3 移植FreeRTOS 4 最后 1 前言 目前由于IOT的飞速发展 针对单片机
  • FreeRTOS学习笔记 6 - 互斥量

    目录 1 创建 2 获取 3 释放 4 测试 FreeRTOS不支持调度方式的设置 所以下面2个宏定义可以随意设置值 define RTOS IPC FLAG FIFO 0x00 define RTOS IPC FLAG PRIO 0x01
  • FreeRTOS系列

    本文主要介绍如何在任务或中断中向队列发送消息或者从队列中接收消息 使用STM32CubeMX将FreeRTOS移植到工程中 创建两个任务以及两个消息队列 并开启两个中断 两个任务 Keyscan Task 读取按键的键值 并将键值发送到队列
  • FreeRTOS学习笔记<中断>

    中断概念 Cortex M的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽中断 NMI 1个Systick 滴答定时器 定时器中断和多个系统异常 Cortex M处理器有多个用于管中断和异常的可编程寄存器 这些寄存器大多数都在 NV
  • 【FreeRTOS(三)】任务状态

    文章目录 任务状态 任务挂起 vTaskSuspend 取消任务挂起 vTaskResume 挂起任务调度器 vTaskSuspendAll 取消挂起任务调度器 xTaskResumeAll 代码示例 任务挂起 取消任务挂起 代码示例 挂起
  • FreeRTOS临界段和开关中断

    http blog sina com cn s blog 98ee3a930102wg5u html 本章教程为大家讲解两个重要的概念 FreeRTOS的临界段和开关中断 本章教程配套的例子含Cortex M3内核的STM32F103和Co
  • FreeRTOS笔记(一)简介

    这个笔记主要依据韦东山freertos快速入门系列记录 感谢韦东山老师的总结 什么是实时操作系统 操作系统是一个控制程序 负责协调分配计算资源和内存资源给不同的应用程序使用 并防止系统出现故障 操作系统通过一个调度算法和内存管理算法尽可能把
  • 啊哈C的简单使用

    打开啊哈C 新建一个程序输出hello world include
  • FreeRTOS学习笔记(8)---- 软件定时器

    使用FreeRTOS软件定时器需要在文件FreeRTOSConfig h先做如下配置 1 configUSE TIMERS 使能软件定时器 2 configTIMER TASK PRIORITY 定时器任务优先级 3 configTIMER
  • [FreeRTOS入门学习笔记]定时器

    定时器的使用步骤 1 定义一个handle xTimerCreate创建 2 启动定时器 在Task1中调用 通过队列通知守护任务来执行定时器任务 要再config头文件中定义守护任务相关配置 虽然定时器是在task1中启动 但是定时器的任
  • RT-Thread记录(五、RT-Thread 临界区保护与FreeRTOS的比较)

    本文聊聊临界区 以及RT Thread对临界区的处理 通过源码分析一下 RT Thread 对临界区保护的实现以及与 FreeRTOS 处理的不同 目录 前言 一 临界区 1 1 什么是临界区 1 2 RTOS中的临界区 二 RT Thre
  • FreeRTOS实时操作系统(三)任务挂起与恢复

    系列文章 FreeRTOS实时操作系统 一 RTOS的基本概念 FreeRTOS实时操作系统 二 任务创建与任务删除 HAL库 FreeRTOS实时操作系统 三 任务挂起与恢复 FreeRTOS实时操作系统 四 中断任务管理 FreeRTO
  • 使用 GCC 编译器的 ARM 内核的堆栈回溯(当存在 MSP 到 PSP 切换时)

    核心 ARM Cortex M4 编译器 GCC 5 3 0 ARM EABI 操作系统 免费 RTOS 我正在使用 gcc 库函数 Unwind Reason Code Unwind Backtrace Unwind Trace Fn v
  • 如何更改 FreeRTOS 中任务的最大可用堆大小?

    我通过以下方式在任务中创建元素列表 l dllist pvPortMalloc sizeof dllist dlllist 有 32 字节大 我的嵌入式系统有 60kB SRAM 所以我希望系统可以轻松处理我的 200 个元素列表 我发现在
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect
  • FreeRTOS 匈牙利表示法 [重复]

    这个问题在这里已经有答案了 我是 RTOS 和 C 编程的新手 而且我仍在习惯 C 的良好实践 因此 我打开了一个使用 FreeRTOS 的项目 我注意到操作系统文件使用匈牙利表示法 我知道一点符号 但面临一些新的 标准 FreeRTOS
  • 有可用的 FreeRTOS 解释语言库吗?

    我在一家公司工作 该公司使用 FreeRTOS 为多个设备创建固件 最近 我们对新功能的要求已经超出了我们固件工程师的工作能力 但我们现在也无力雇用任何新人 即使进行微小的更改 也需要固件人员在非常低的级别上进行修改 我一直在为 FreeR
  • 有关 CMake 错误的问题:没有为目标提供源

    我正在尝试使用 cmake 和 eclipse 将 FreeRtos 添加到我的项目中 但出现错误 我运行的是 debian 10 我的 cmake 版本是 3 13 4 cmake 的文件可以在以下位置找到这个 git 仓库 https

随机推荐

  • Dubbo之旅--集群容错和负载均衡

    当我们的系统中用到 Dubbo 的集群环境 因为各种原因在集群调用失败时 xff0c Dubbo提供了多种容错方案 xff0c 缺省为failover重试 Dubbo 的集群容错在这里想说说他是因为我们实际的项目中出现了此类的问题 因为依赖
  • 我和敏捷开发的故事--敏捷角色-SM

    通过上篇文章我们已经知道了敏捷角色中 PO 的角色内容 接下来的一个敏捷角色在敏捷开发中非常关键 但是往往很多项目实践中都没有很好的把控好这个角色 让他或多或少的没有起到相应的作用 这个角色就是 ScrumMaster Scrum Mast
  • backup

    backup
  • backup

    backup
  • backup

    xfeff xfeff backup
  • 工程硕士考试复习小结

    工程硕士考试复习到现在已经接近尾声 后天就要奔赴省城石家庄赶考了 整个工程硕士的复习过程从十月初开始到现在将近一个月的时间 对所需要进行考试的科目进行整体复习 复习的形式前阶段主要是视频讲解中间阶段是看相应的文档和知识点 最后就是进行专项练
  • 我的2011----再见2011!你好2012!

    今天本来是 特别平常的一天 但是因为位置排在了 2011 年的最后 平常也就变得不平常了 一年就在这么转眼即逝中度过了 虽说一年比较短暂 但是回头在看看自己所拥有的这一年 留下的很多 在 2011 我把 ShortBrain 英语进行着 英
  • 中国的教育我们每个人都有责任

    这篇文章将我带入了深深的思考之中 给将要进入大学的你们 xff1a 一个已毕业两年的学长的人生感慨 xff01 面对中国的教育现状 很多的学生 老师 甚至校长 采取的态度是接受 所做的行动是适应和顺从 非常钦佩作者有着自己独立的思想 思想者
  • Eclipse下启动tomcat报错:/bin/bootstrap.jar which is referenced by the classpath, does not exist.

    1 错误 xff1a 在 Eclipse 下启动 tomcat 的时候 xff0c 报错为 xff1a Eclipse 下启动 tomcat 报错 xff1a The archive C Program Files x86 Java jdk
  • Java文件名及其他命名规则

    http bbs csdn net topics 70157841 关于JAVA 源文件命名的问题 Java文件命名 xff1a java程序是由类组成的 xff1b java应用程序必须有一个包含main方法的public类 xff0c
  • (转) 变分自编码器(Variational Autoencoder, VAE)通俗教程

    变分自编码器 xff08 Variational Autoencoder VAE xff09 通俗教程 转载自 http www dengfanxin cn p 61 334 amp sukey 61 72885186ae5c357d85d
  • docker 镜像导入导出 删除 改名

    镜像的导入与导出 假如有2台主机 xff0c 我们在主机1上做了一个镜像 xff0c 主机2想用这个镜像怎么办呢 xff1f 我们可以在主机1上push镜像到镜像仓库中 xff0c 然后在主机2上pull把镜像拉下来使用 xff0c 这种方
  • 面试后HR让你等通知的真相

    面试后 xff0c 被HR告知 回去等通知 是大多数求职者会遇到的情况 前程无忧论坛曾经有过的调查显示 xff0c 在众多面试答复中 xff0c 求职者最痛恨的就是这个答复 求职者心声 xff1a 要还是不要 xff0c 给个痛快 xff0
  • 女程序员过三奔四,你的名字是迷茫???/孩子是我幸福的源泉

    Leo 博客 周一 周五固定更新 我的邮箱 xff1a Careerdesign 64 foxmail com 上次讲的是我的博客点击过百万 xff0c 写了 假如生活欺骗了你 今天说说 xff0c 过三奔四的女程序员的职业规划 Leo 您
  • QT 开发---QGroundControl地面站V2.6--环境搭建(详解)

    QT 开发 QGroundControl 地面站 环境搭建 xff08 文档更新日期 xff1a 2018 05 10 xff09 1 镜像下载 QT5 4 0 首先找到中国科学技术大学镜像网址 xff1a http mirrors ust
  • 基于STM32的FreeRTOS实时操作系统1

    本开发是基于STM32CUBEIDE1 4 0 与STM32CUBEMX相同FreeRTOS的组件在 xff1a 在Interface中选择CMSIS V1 选择这个界面适合STM32的开发 xff0c 接下来选择合适的任务进行设置 对与这
  • 免费方案:Kibana 监控 windows server 服务器系统资源,内网穿透

    kibana 监控服务器 目录预览 1 需求说明 1 1 工具选择 2 metricbeat工具介绍 3 安装部署 3 1 下载 3 2 配置 3 3 安装 3 4 启动 4 验证 5 性能 6 维护 7 Troubleshooting 一
  • MAC OS X10.9.5下成功驱动独立显卡"影驰Nvidia GeForce GTX 760大将(4GB)--非公版"

    我的机器是台式机 自己组装的 xff0c 硬件参数如下 xff1a 操作系统 Windows 7 旗舰版 64位 SP1 DirectX 11 处理器 英特尔 Core i7 4770K 64 3 50GHz 四核 主板 华硕 Z87 PR
  • 结构体继承自结构体

    C 43 43 Code 功能 xff1a 结构体继承自结构体 结论 xff1a 1 结构体可以继承自结构体 2 结构体同样有构造函数和析构函数 include lt iostream gt using namespace std stru
  • 【STM32L4】FreeRTOS消息队列三串口接收发送

    环境 STM32L476G DISCO 开发板STM32CubeIDE 1 1 0STM32CubeMX 5 4 0 STM32CubeIDE配置 移植FreeRTOS xff0c 选择CMSIS V2 FreeRTOS的所有配置的选择默认