gateway_mcu/CH32V303-FreeRTOS/App/application/Host/Src/hostQueueUart.c

417 lines
13 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "hostQueueUart.h"
#include "hostBusIdleDetection.h"
#include "FM_GPIO.h"
#include "semphr.h"
/* 队列中每个消息的大小 */
#define QUEUE_SIZE 4
/* 485队列的长度 */
#define rs485QueueLength 5
#define mcuUartQueueLength 10
#define loraQueueLength 5
#define su806QueueLength 10
/* 各个通讯口的队列 */
QueueHandle_t J0_485_Queue = NULL;
QueueHandle_t J2_485_Queue = NULL;
QueueHandle_t J4_485_Queue = NULL;
QueueHandle_t J6_485_Queue = NULL;
QueueHandle_t lora_uart_Queue = NULL;
QueueHandle_t su806_uart_Queue = NULL;
QueueHandle_t hostMcu_uart_Queue = NULL;
/* 创建二值信号量 */
static SemaphoreHandle_t J0_FreeMemorySemaphore = NULL;
static SemaphoreHandle_t J2_FreeMemorySemaphore = NULL;
static SemaphoreHandle_t J4_FreeMemorySemaphore = NULL;
static SemaphoreHandle_t J6_FreeMemorySemaphore = NULL;
static SemaphoreHandle_t lora_FreeMemorySemaphore = NULL;
static SemaphoreHandle_t su806_FreeMemorySemaphore = NULL;
static SemaphoreHandle_t hostMcu_FreeMemorySemaphore = NULL;
// 创建队列集
static QueueSetHandle_t hostBinarySemaphoreSet = NULL;
/* 创建二值信号量 */
static SemaphoreHandle_t J0_sendOverSemaphore = NULL;
static SemaphoreHandle_t J2_sendOverSemaphore = NULL;
static SemaphoreHandle_t J4_sendOverSemaphore = NULL;
static SemaphoreHandle_t J6_sendOverSemaphore = NULL;
static SemaphoreHandle_t lora_sendOverSemaphore = NULL;
static SemaphoreHandle_t su806_sendOverSemaphore = NULL;
static SemaphoreHandle_t hostMcu_sendOverSemaphore = NULL;
/* 通过该结构体接收对应的数据用来发送,结束后通过该结构体,释放数据的内存 */
typedef struct _hostQueueSendDataInfo {
hostQueueUartSendInfo *J0_485_data;
hostQueueUartSendInfo *J2_485_data;
hostQueueUartSendInfo *J4_485_data;
hostQueueUartSendInfo *J6_485_data;
hostQueueUartSendInfo *lora_uart_data;
hostQueueUartSendInfo *su806_uart_data;
hostQueueUartSendInfo *hostMcu_uart_data;
} hostQueueSendDataInfo;
static hostQueueSendDataInfo hostQueueSendData;
/**
* @brief 初始化串口发送使用到的队列和释放内存所使用的信号量
* @param
* @retval
*/
void hostUartSendInit(void)
{
/* 初始化队列 */
J0_485_Queue = xQueueCreate(rs485QueueLength, QUEUE_SIZE);
J2_485_Queue = xQueueCreate(rs485QueueLength, QUEUE_SIZE);
J4_485_Queue = xQueueCreate(rs485QueueLength, QUEUE_SIZE);
J6_485_Queue = xQueueCreate(rs485QueueLength, QUEUE_SIZE);
lora_uart_Queue = xQueueCreate(rs485QueueLength, QUEUE_SIZE);
su806_uart_Queue = xQueueCreate(rs485QueueLength, QUEUE_SIZE);
hostMcu_uart_Queue = xQueueCreate(rs485QueueLength, QUEUE_SIZE);
/* 初始化释放内存二值变量 */
J0_FreeMemorySemaphore = xSemaphoreCreateBinary();
J2_FreeMemorySemaphore = xSemaphoreCreateBinary();
J4_FreeMemorySemaphore = xSemaphoreCreateBinary();
J6_FreeMemorySemaphore = xSemaphoreCreateBinary();
lora_FreeMemorySemaphore = xSemaphoreCreateBinary();
su806_FreeMemorySemaphore = xSemaphoreCreateBinary();
hostMcu_FreeMemorySemaphore = xSemaphoreCreateBinary();
// 初始化队列集
hostBinarySemaphoreSet = xQueueCreateSet(7);
// 将二值信号量添加到队列集中
xQueueAddToSet(J0_FreeMemorySemaphore, hostBinarySemaphoreSet);
xQueueAddToSet(J2_FreeMemorySemaphore, hostBinarySemaphoreSet);
xQueueAddToSet(J4_FreeMemorySemaphore, hostBinarySemaphoreSet);
xQueueAddToSet(J6_FreeMemorySemaphore, hostBinarySemaphoreSet);
xQueueAddToSet(lora_FreeMemorySemaphore, hostBinarySemaphoreSet);
xQueueAddToSet(su806_FreeMemorySemaphore, hostBinarySemaphoreSet);
xQueueAddToSet(hostMcu_FreeMemorySemaphore, hostBinarySemaphoreSet);
/* 发送完成信号量 */
J0_sendOverSemaphore = xSemaphoreCreateBinary();
xSemaphoreGive(J0_sendOverSemaphore);
J2_sendOverSemaphore = xSemaphoreCreateBinary();
xSemaphoreGive(J2_sendOverSemaphore);
J4_sendOverSemaphore = xSemaphoreCreateBinary();
xSemaphoreGive(J4_sendOverSemaphore);
J6_sendOverSemaphore = xSemaphoreCreateBinary();
xSemaphoreGive(J6_sendOverSemaphore);
lora_sendOverSemaphore = xSemaphoreCreateBinary();
xSemaphoreGive(lora_sendOverSemaphore);
su806_sendOverSemaphore = xSemaphoreCreateBinary();
xSemaphoreGive(su806_sendOverSemaphore);
hostMcu_sendOverSemaphore = xSemaphoreCreateBinary();
xSemaphoreGive(hostMcu_sendOverSemaphore);
}
/**
* @brief 从J0队列中取出数据并完成发送无数据或不满足发送条件时处于阻塞状态
* @param
* @retval
*/
void J0QueueSend(void)
{
/* 有数据需要发送 */
if (xQueueReceive(J0_485_Queue, hostQueueSendData.J0_485_data, portMAX_DELAY) != pdTRUE) {
return;
}
/* 上次数据发送完成 */
if (xSemaphoreTake(J0_sendOverSemaphore, portMAX_DELAY) != pdTRUE) {
return;
}
/* 总线空闲 */
if (xSemaphoreTake(J0_IDLESemaphore, portMAX_DELAY) == pdTRUE) {
return;
}
hostUartInterruptSend(g_J1_handle, hostQueueSendData.J0_485_data->data
, hostQueueSendData.J0_485_data->length);
}
/**
* @brief 从J2队列中取出数据并完成发送无数据或不满足发送条件时处于阻塞状态
* @param
* @retval
*/
void J2QueueSend(void)
{
/* 有数据需要发送 */
if (xQueueReceive(J2_485_Queue, hostQueueSendData.J2_485_data, portMAX_DELAY) != pdTRUE) {
return;
}
/* 上次数据发送完成 */
if (xSemaphoreTake(J2_sendOverSemaphore, portMAX_DELAY) != pdTRUE) {
return;
}
/* 总线空闲 */
if (xSemaphoreTake(J2_IDLESemaphore, portMAX_DELAY) == pdTRUE) {
return;
}
hostUartInterruptSend(g_J2_handle, hostQueueSendData.J2_485_data->data
, hostQueueSendData.J2_485_data->length);
}
/**
* @brief 从J4队列中取出数据并完成发送无数据或不满足发送条件时处于阻塞状态
* @param
* @retval
*/
void J4QueueSend(void)
{
/* 有数据需要发送 */
if (xQueueReceive(J4_485_Queue, hostQueueSendData.J4_485_data, portMAX_DELAY) != pdTRUE) {
return;
}
/* 上次数据发送完成 */
if (xSemaphoreTake(J4_sendOverSemaphore, portMAX_DELAY) != pdTRUE) {
return;
}
/* 总线空闲 */
if (xSemaphoreTake(J4_IDLESemaphore, portMAX_DELAY) == pdTRUE) {
return;
}
hostUartInterruptSend(g_J4_handle, hostQueueSendData.J2_485_data->data
, hostQueueSendData.J4_485_data->length);
}
/**
* @brief 从J6队列中取出数据并完成发送无数据或不满足发送条件时处于阻塞状态
* @param
* @retval
*/
void J6QueueSend(void)
{
/* 有数据需要发送 */
if (xQueueReceive(J6_485_Queue, hostQueueSendData.J6_485_data, portMAX_DELAY) != pdTRUE) {
return;
}
/* 上次数据发送完成 */
if (xSemaphoreTake(J6_sendOverSemaphore, portMAX_DELAY) != pdTRUE) {
return;
}
/* 总线空闲 */
if (xSemaphoreTake(J6_IDLESemaphore, portMAX_DELAY) == pdTRUE) {
return;
}
hostUartInterruptSend(g_J6_handle, hostQueueSendData.J6_485_data->data
, hostQueueSendData.J6_485_data->length);
}
/**
* @brief 从lora队列中取出数据并完成发送无数据或不满足发送条件时处于阻塞状态
* @param
* @retval
*/
void LoraQueueSend(void)
{
/* 有数据需要发送 */
if (xQueueReceive(lora_uart_Queue, hostQueueSendData.lora_uart_data, portMAX_DELAY) != pdTRUE) {
return;
}
/* 上次数据发送完成 */
if (xSemaphoreTake(lora_sendOverSemaphore, portMAX_DELAY) != pdTRUE) {
return;
}
hostUartInterruptSend(g_Lora_handle, hostQueueSendData.lora_uart_data->data
, hostQueueSendData.lora_uart_data->length);
}
/**
* @brief 从su806队列中取出数据并完成发送无数据或不满足发送条件时处于阻塞状态
* @param
* @retval
*/
void Su806QueueSend(void)
{
/* 有数据需要发送 */
if (xQueueReceive(su806_uart_Queue, hostQueueSendData.su806_uart_data, portMAX_DELAY) != pdTRUE) {
return;
}
/* 上次数据发送完成 */
if (xSemaphoreTake(su806_sendOverSemaphore, portMAX_DELAY) != pdTRUE) {
return;
}
hostUartInterruptSend(g_Su806_handle, hostQueueSendData.su806_uart_data->data
, hostQueueSendData.su806_uart_data->length);
}
/**
* @brief 从hostMcu队列中取出数据并完成发送无数据或不满足发送条件时处于阻塞状态
* @param
* @retval
*/
void HostMcuQueueSend(void)
{
/* 有数据需要发送 */
if (xQueueReceive(hostMcu_uart_Queue, hostQueueSendData.hostMcu_uart_data, portMAX_DELAY) != pdTRUE) {
return;
}
/* 上次数据发送完成 */
if (xSemaphoreTake(hostMcu_sendOverSemaphore, portMAX_DELAY) != pdTRUE) {
return;
}
hostUartInterruptSend(g_Mcu_handle, hostQueueSendData.hostMcu_uart_data->data
, hostQueueSendData.hostMcu_uart_data->length);
}
/**
* @brief 通过二值信号量释放中断发送数据的内存
* @param
* @retval
*/
void hostBinarySemaphoreFreeMemory(void)
{
// 等待队列集中的事件
QueueSetMemberHandle_t xActivatedMember = xQueueSelectFromSet(hostBinarySemaphoreSet, portMAX_DELAY);
if (xActivatedMember == J0_FreeMemorySemaphore) {
vPortFree(hostQueueSendData.J0_485_data);
vTaskDelay(1);
readJ0_485;
// 处理二值信号量事件
xSemaphoreTake(J0_FreeMemorySemaphore, 0);
xSemaphoreGive(J0_sendOverSemaphore);
}
else if (xActivatedMember == J2_FreeMemorySemaphore) {
vPortFree(hostQueueSendData.J2_485_data);
vTaskDelay(1);
readJ2_485;
xSemaphoreTake(J2_FreeMemorySemaphore, 0);
xSemaphoreGive(J2_sendOverSemaphore);
}
else if (xActivatedMember == J4_FreeMemorySemaphore) {
vPortFree(hostQueueSendData.J4_485_data);
vTaskDelay(1);
readJ4_485;
xSemaphoreTake(J4_FreeMemorySemaphore, 0);
xSemaphoreGive(J4_sendOverSemaphore);
}
else if (xActivatedMember == J6_FreeMemorySemaphore) {
vPortFree(hostQueueSendData.J6_485_data);
vTaskDelay(1);
readJ6_485;
xSemaphoreTake(J6_FreeMemorySemaphore, 0);
xSemaphoreGive(J6_sendOverSemaphore);
}
else if (xActivatedMember == lora_FreeMemorySemaphore) {
vPortFree(hostQueueSendData.lora_uart_data);
xSemaphoreTake(lora_FreeMemorySemaphore, 0);
xSemaphoreGive(lora_sendOverSemaphore);
}
else if (xActivatedMember == su806_FreeMemorySemaphore) {
vPortFree(hostQueueSendData.su806_uart_data);
xSemaphoreTake(su806_FreeMemorySemaphore, 0);
xSemaphoreGive(su806_sendOverSemaphore);
}
else if (xActivatedMember == hostMcu_FreeMemorySemaphore) {
vPortFree(hostQueueSendData.hostMcu_uart_data);
xSemaphoreTake(hostMcu_FreeMemorySemaphore, 0);
xSemaphoreGive(hostMcu_sendOverSemaphore);
}
}
/**
* @brief 通过中断发送
* @param device 设备
data 指向数据的指针
len 数据长度
* @retval 0成功
*/
uint8_t hostUartInterruptSend(device_handle device, uint8_t *data, uint16_t len)
{
/* 指向数据 */
uart_device_info *dev = (uart_device_info *)device;
dev->uart_send_data.data = data;
dev->uart_send_data.count = 0;
dev->uart_send_data.len = len;
/* 开始发送 */
if (device == g_J0_handle) {
xSemaphoreTake(J0_sendOverSemaphore, 0);
writeJ0_485;
USART_ITConfig(J0_USART, USART_IT_TXE, ENABLE);
USART_SendData(J0_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
}
else if (device == g_J2_handle) {
xSemaphoreTake(J2_sendOverSemaphore, 0);
writeJ2_485;
USART_ITConfig(J2_USART, USART_IT_TXE, ENABLE);
USART_SendData(J2_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
}
else if (device == g_J4_handle) {
xSemaphoreTake(J4_sendOverSemaphore, 0);
writeJ4_485;
USART_ITConfig(J4_USART, USART_IT_TXE, ENABLE);
USART_SendData(J4_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
}
else if (device == g_J6_handle) {
xSemaphoreTake(J6_sendOverSemaphore, 0);
writeJ6_485;
USART_ITConfig(J6_USART, USART_IT_TXE, ENABLE);
USART_SendData(J6_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
}
else if (device == g_Mcu_handle) {
xSemaphoreTake(hostMcu_sendOverSemaphore, 0);
USART_ITConfig(Mcu_USART, USART_IT_TXE, ENABLE);
USART_SendData(Mcu_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
}
else if (device == g_Lora_handle) {
xSemaphoreTake(lora_sendOverSemaphore, 0);
USART_ITConfig(Lora_USART, USART_IT_TXE, ENABLE);
USART_SendData(Lora_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
}
else if (device == g_Su806_handle) {
xSemaphoreTake(su806_sendOverSemaphore, 0);
USART_ITConfig(Su806_USART, USART_IT_TXE, ENABLE);
USART_SendData(Su806_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
}
return 0;
}
/**
* @brief 数据发送完成后用于清除内存
* @param
* @retval
*/
void J0_485_IN_TXE(void)
{
xSemaphoreGiveFromISR(J0_FreeMemorySemaphore, 0);
}
void J2_485_IN_TXE(void)
{
xSemaphoreGiveFromISR(J2_FreeMemorySemaphore, 0);
}
void J4_485_IN_TXE(void)
{
xSemaphoreGiveFromISR(J4_FreeMemorySemaphore, 0);
}
void J6_485_IN_TXE(void)
{
xSemaphoreGiveFromISR(J6_FreeMemorySemaphore, 0);
}
void Lora_uart_IN_TXE(void)
{
xSemaphoreGiveFromISR(lora_FreeMemorySemaphore, 0);
}
void Su806_uart_IN_TXE(void)
{
xSemaphoreGiveFromISR(su806_FreeMemorySemaphore, 0);
}
void hostMcu_uart_IN_TXE(void)
{
xSemaphoreGiveFromISR(hostMcu_FreeMemorySemaphore, 0);
}