gateway_mcu/CH32V303-FreeRTOS/App/application/Slave/Src/slaveQueueUart.c

431 lines
14 KiB
C
Raw 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 "slaveQueueUart.h"
#include "uart_dev.h"
#include "slaveBusIdleDetection.h"
#include "FM_GPIO.h"
#include "semphr.h"
/* 队列中每个消息的大小 */
#define QUEUE_SIZE 4
/* 485队列的长度 */
#define rs485QueueLength 5
#define mcuUartQueueLength 10
/* 各个通讯口的队列 */
QueueHandle_t J1_485_Queue = NULL;
QueueHandle_t J3_485_Queue = NULL;
QueueHandle_t J5_485_Queue = NULL;
QueueHandle_t J7_485_Queue = NULL;
QueueHandle_t J8_485_Queue = NULL;
QueueHandle_t J9_485_Queue = NULL;
QueueHandle_t mcu_uart_Queue = NULL;
/* 创建二值信号量 */
static SemaphoreHandle_t J1_FreeMemorySemaphore = NULL;
static SemaphoreHandle_t J3_FreeMemorySemaphore = NULL;
static SemaphoreHandle_t J5_FreeMemorySemaphore = NULL;
static SemaphoreHandle_t J7_FreeMemorySemaphore = NULL;
static SemaphoreHandle_t J8_FreeMemorySemaphore = NULL;
static SemaphoreHandle_t J9_FreeMemorySemaphore = NULL;
static SemaphoreHandle_t slaveMcu_uart_FreeMemorySemaphore = NULL;
// 创建队列集
static QueueSetHandle_t slaveBinarySemaphoreSet = NULL;
/* 创建二值信号量 */
static SemaphoreHandle_t J1_sendOverSemaphore = NULL;
static SemaphoreHandle_t J3_sendOverSemaphore = NULL;
static SemaphoreHandle_t J5_sendOverSemaphore = NULL;
static SemaphoreHandle_t J7_sendOverSemaphore = NULL;
static SemaphoreHandle_t J8_sendOverSemaphore = NULL;
static SemaphoreHandle_t J9_sendOverSemaphore = NULL;
static SemaphoreHandle_t slaveMcu_uart_sendOverSemaphore = NULL;
/* 通过该结构体接收对应的数据用来发送,结束后通过该结构体,释放数据的内存 */
typedef struct _slaveQueueSendDataInfo {
slaveQueueUartSendInfo *J1_485_data;
slaveQueueUartSendInfo *J3_485_data;
slaveQueueUartSendInfo *J5_485_data;
slaveQueueUartSendInfo *J7_485_data;
slaveQueueUartSendInfo *J8_485_data;
slaveQueueUartSendInfo *J9_485_data;
slaveQueueUartSendInfo *mcu_uart_data;
} slaveQueueSendDataInfo;
static slaveQueueSendDataInfo slaveQueueSendData;
/**
* @brief 初始化串口发送使用到的队列和释放内存所使用的信号量
* @param
* @retval
*/
void slaveUartSendInit(void)
{
/* 初始化队列 */
J1_485_Queue = xQueueCreate(rs485QueueLength, QUEUE_SIZE);
J3_485_Queue = xQueueCreate(rs485QueueLength, QUEUE_SIZE);
J5_485_Queue = xQueueCreate(rs485QueueLength, QUEUE_SIZE);
J7_485_Queue = xQueueCreate(rs485QueueLength, QUEUE_SIZE);
J8_485_Queue = xQueueCreate(rs485QueueLength, QUEUE_SIZE);
J9_485_Queue = xQueueCreate(rs485QueueLength, QUEUE_SIZE);
mcu_uart_Queue = xQueueCreate(mcuUartQueueLength, QUEUE_SIZE);
/* 初始化释放内存二值变量 */
J1_FreeMemorySemaphore = xSemaphoreCreateBinary();
J3_FreeMemorySemaphore = xSemaphoreCreateBinary();
J5_FreeMemorySemaphore = xSemaphoreCreateBinary();
J7_FreeMemorySemaphore = xSemaphoreCreateBinary();
J8_FreeMemorySemaphore = xSemaphoreCreateBinary();
J9_FreeMemorySemaphore = xSemaphoreCreateBinary();
slaveMcu_uart_FreeMemorySemaphore = xSemaphoreCreateBinary();
// 初始化队列集
slaveBinarySemaphoreSet = xQueueCreateSet(7);
// 将二值信号量添加到队列集中
xQueueAddToSet(J1_FreeMemorySemaphore, slaveBinarySemaphoreSet);
xQueueAddToSet(J3_FreeMemorySemaphore, slaveBinarySemaphoreSet);
xQueueAddToSet(J5_FreeMemorySemaphore, slaveBinarySemaphoreSet);
xQueueAddToSet(J7_FreeMemorySemaphore, slaveBinarySemaphoreSet);
xQueueAddToSet(J8_FreeMemorySemaphore, slaveBinarySemaphoreSet);
xQueueAddToSet(J9_FreeMemorySemaphore, slaveBinarySemaphoreSet);
xQueueAddToSet(slaveMcu_uart_FreeMemorySemaphore, slaveBinarySemaphoreSet);
/* 发送完成信号量 */
J1_sendOverSemaphore = xSemaphoreCreateBinary();
xSemaphoreGive(J1_sendOverSemaphore);
J3_sendOverSemaphore = xSemaphoreCreateBinary();
xSemaphoreGive(J3_sendOverSemaphore);
J5_sendOverSemaphore = xSemaphoreCreateBinary();
xSemaphoreGive(J5_sendOverSemaphore);
J7_sendOverSemaphore = xSemaphoreCreateBinary();
xSemaphoreGive(J7_sendOverSemaphore);
J8_sendOverSemaphore = xSemaphoreCreateBinary();
xSemaphoreGive(J8_sendOverSemaphore);
J9_sendOverSemaphore = xSemaphoreCreateBinary();
xSemaphoreGive(J9_sendOverSemaphore);
slaveMcu_uart_sendOverSemaphore = xSemaphoreCreateBinary();
xSemaphoreGive(slaveMcu_uart_sendOverSemaphore);
}
/**
* @brief 从J1队列中取出数据并完成发送无数据或不满足发送条件时处于阻塞状态
* @param
* @retval
*/
void J1QueueSend(void)
{
/* 有数据需要发送 */
if (xQueueReceive(J1_485_Queue, slaveQueueSendData.J1_485_data, portMAX_DELAY) != pdTRUE) {
return;
}
/* 上次数据发送完成 */
if (xSemaphoreTake(J1_sendOverSemaphore, portMAX_DELAY) != pdTRUE) {
return;
}
/* 总线空闲 */
if (xSemaphoreTake(J1_IDLESemaphore, portMAX_DELAY) == pdTRUE) {
return;
}
slaveUartInterruptSend(g_J1_handle, slaveQueueSendData.J1_485_data->data
, slaveQueueSendData.J1_485_data->length);
}
/**
* @brief 从J3队列中取出数据并完成发送无数据或不满足发送条件时处于阻塞状态
* @param
* @retval
*/
void J3QueueSend(void)
{
/* 有数据需要发送 */
if (xQueueReceive(J3_485_Queue, slaveQueueSendData.J3_485_data, portMAX_DELAY) != pdTRUE) {
return;
}
/* 上次数据发送完成 */
if (xSemaphoreTake(J3_sendOverSemaphore, portMAX_DELAY) != pdTRUE) {
return;
}
/* 总线空闲 */
if (xSemaphoreTake(J3_IDLESemaphore, portMAX_DELAY) == pdTRUE) {
return;
}
slaveUartInterruptSend(g_J3_handle, slaveQueueSendData.J3_485_data->data
, slaveQueueSendData.J3_485_data->length);
}
/**
* @brief 从J5队列中取出数据并完成发送无数据或不满足发送条件时处于阻塞状态
* @param
* @retval
*/
void J5QueueSend(void)
{
/* 有数据需要发送 */
if (xQueueReceive(J5_485_Queue, slaveQueueSendData.J5_485_data, portMAX_DELAY) != pdTRUE) {
return;
}
/* 上次数据发送完成 */
if (xSemaphoreTake(J5_sendOverSemaphore, portMAX_DELAY) != pdTRUE) {
return;
}
/* 总线空闲 */
if (xSemaphoreTake(J5_IDLESemaphore, portMAX_DELAY) == pdTRUE) {
return;
}
slaveUartInterruptSend(g_J5_handle, slaveQueueSendData.J5_485_data->data
, slaveQueueSendData.J5_485_data->length);
}
/**
* @brief 从J7队列中取出数据并完成发送无数据或不满足发送条件时处于阻塞状态
* @param
* @retval
*/
void J7QueueSend(void)
{
/* 有数据需要发送 */
if (xQueueReceive(J7_485_Queue, slaveQueueSendData.J7_485_data, portMAX_DELAY) != pdTRUE) {
return;
}
/* 上次数据发送完成 */
if (xSemaphoreTake(J7_sendOverSemaphore, portMAX_DELAY) != pdTRUE) {
return;
}
/* 总线空闲 */
if (xSemaphoreTake(J7_IDLESemaphore, portMAX_DELAY) == pdTRUE) {
return;
}
slaveUartInterruptSend(g_J7_handle, slaveQueueSendData.J7_485_data->data
, slaveQueueSendData.J7_485_data->length);
}
/**
* @brief 从J8队列中取出数据并完成发送无数据或不满足发送条件时处于阻塞状态
* @param
* @retval
*/
void J8QueueSend(void)
{
/* 有数据需要发送 */
if (xQueueReceive(J8_485_Queue, slaveQueueSendData.J8_485_data, portMAX_DELAY) != pdTRUE) {
return;
}
/* 上次数据发送完成 */
if (xSemaphoreTake(J8_sendOverSemaphore, portMAX_DELAY) != pdTRUE) {
return;
}
/* 总线空闲 */
if (xSemaphoreTake(J8_IDLESemaphore, portMAX_DELAY) == pdTRUE) {
return;
}
slaveUartInterruptSend(g_J8_handle, slaveQueueSendData.J8_485_data->data
, slaveQueueSendData.J8_485_data->length);
}
/**
* @brief 从J9队列中取出数据并完成发送无数据或不满足发送条件时处于阻塞状态
* @param
* @retval
*/
void J9QueueSend(void)
{
/* 有数据需要发送 */
if (xQueueReceive(J9_485_Queue, slaveQueueSendData.J9_485_data, portMAX_DELAY) != pdTRUE) {
return;
}
/* 上次数据发送完成 */
if (xSemaphoreTake(J9_sendOverSemaphore, portMAX_DELAY) != pdTRUE) {
return;
}
/* 总线空闲 */
if (xSemaphoreTake(J9_IDLESemaphore, portMAX_DELAY) == pdTRUE) {
return;
}
slaveUartInterruptSend(g_J9_handle, slaveQueueSendData.J9_485_data->data
, slaveQueueSendData.J9_485_data->length);
}
/**
* @brief 从slaveMcu队列中取出数据并完成发送无数据或不满足发送条件时处于阻塞状态
* @param
* @retval
*/
void slaveMcuQueueSend(void)
{
/* 有数据需要发送 */
if (xQueueReceive(mcu_uart_Queue, slaveQueueSendData.mcu_uart_data, portMAX_DELAY) != pdTRUE) {
return;
}
/* 上次数据发送完成 */
if (xSemaphoreTake(slaveMcu_uart_sendOverSemaphore, portMAX_DELAY) != pdTRUE) {
return;
}
slaveUartInterruptSend(g_Mcu_handle, slaveQueueSendData.mcu_uart_data->data
, slaveQueueSendData.mcu_uart_data->length);
}
/**
* @brief 数据发送完成后用于清除内存
* @param
* @retval
*/
void J1_485_IN_TXE(void)
{
xSemaphoreGiveFromISR(J1_FreeMemorySemaphore, 0);
}
void J3_485_IN_TXE(void)
{
xSemaphoreGiveFromISR(J3_FreeMemorySemaphore, 0);
}
void J5_485_IN_TXE(void)
{
xSemaphoreGiveFromISR(J5_FreeMemorySemaphore, 0);
}
void J7_485_IN_TXE(void)
{
xSemaphoreGiveFromISR(J7_FreeMemorySemaphore, 0);
}
void J8_485_IN_TXE(void)
{
xSemaphoreGiveFromISR(J8_FreeMemorySemaphore, 0);
}
void J9_485_IN_TXE(void)
{
xSemaphoreGiveFromISR(J9_FreeMemorySemaphore, 0);
}
void slaveMcu_uart_IN_TXE(void)
{
xSemaphoreGiveFromISR(slaveMcu_uart_FreeMemorySemaphore, 0);
}
/**
* @brief 通过二值信号量释放中断发送数据的内存
* @param
* @retval
*/
void binarySemaphoreFreeMemory(void)
{
// 等待队列集中的事件
QueueSetMemberHandle_t xActivatedMember = xQueueSelectFromSet(slaveBinarySemaphoreSet, portMAX_DELAY);
if (xActivatedMember == J1_FreeMemorySemaphore) {
vPortFree(slaveQueueSendData.J1_485_data);
vTaskDelay(1);
readJ1_485;
// 处理二值信号量事件
xSemaphoreTake(J1_FreeMemorySemaphore, 0);
xSemaphoreGive(J1_sendOverSemaphore);
}
else if (xActivatedMember == J3_FreeMemorySemaphore) {
vPortFree(slaveQueueSendData.J3_485_data);
vTaskDelay(1);
readJ3_485;
xSemaphoreTake(J3_FreeMemorySemaphore, 0);
xSemaphoreGive(J3_sendOverSemaphore);
}
else if (xActivatedMember == J5_FreeMemorySemaphore) {
vPortFree(slaveQueueSendData.J5_485_data);
vTaskDelay(1);
readJ5_485;
xSemaphoreTake(J5_FreeMemorySemaphore, 0);
xSemaphoreGive(J5_sendOverSemaphore);
}
else if (xActivatedMember == J7_FreeMemorySemaphore) {
vPortFree(slaveQueueSendData.J7_485_data);
vTaskDelay(1);
readJ7_485;
xSemaphoreTake(J7_FreeMemorySemaphore, 0);
xSemaphoreGive(J7_sendOverSemaphore);
}
else if (xActivatedMember == J8_FreeMemorySemaphore) {
vPortFree(slaveQueueSendData.J8_485_data);
vTaskDelay(1);
readJ8_485;
xSemaphoreTake(J8_FreeMemorySemaphore, 0);
xSemaphoreGive(J8_sendOverSemaphore);
}
else if (xActivatedMember == J9_FreeMemorySemaphore) {
vPortFree(slaveQueueSendData.J9_485_data);
vTaskDelay(1);
readJ9_485;
xSemaphoreTake(J9_FreeMemorySemaphore, 0);
xSemaphoreGive(J9_sendOverSemaphore);
}
else if (xActivatedMember == slaveMcu_uart_FreeMemorySemaphore) {
vPortFree(slaveQueueSendData.mcu_uart_data);
xSemaphoreTake(slaveMcu_uart_FreeMemorySemaphore, 0);
xSemaphoreGive(slaveMcu_uart_sendOverSemaphore);
}
}
/**
* @brief 通过中断发送
* @param device 设备
data 指向数据的指针
len 数据长度
* @retval 0成功
1上次数据还未发送完成
0xFF错误
*/
uint8_t slaveUartInterruptSend(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_J1_handle) {
xSemaphoreTake(J1_sendOverSemaphore, 0);
writeJ1_485;
USART_ITConfig(J1_USART, USART_IT_TXE, ENABLE);
USART_SendData(J1_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
}
else if (device == g_J3_handle) {
xSemaphoreTake(J3_sendOverSemaphore, 0);
writeJ3_485;
USART_ITConfig(J3_USART, USART_IT_TXE, ENABLE);
USART_SendData(J3_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
}
else if (device == g_J5_handle) {
xSemaphoreTake(J5_sendOverSemaphore, 0);
writeJ5_485;
USART_ITConfig(J5_USART, USART_IT_TXE, ENABLE);
USART_SendData(J5_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
}
else if (device == g_J7_handle) {
xSemaphoreTake(J7_sendOverSemaphore, 0);
writeJ7_485;
USART_ITConfig(J7_USART, USART_IT_TXE, ENABLE);
USART_SendData(J7_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
}
else if (device == g_J8_handle) {
xSemaphoreTake(J8_sendOverSemaphore, 0);
writeJ8_485;
USART_ITConfig(J8_USART, USART_IT_TXE, ENABLE);
USART_SendData(J8_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
}
else if (device == g_J9_handle) {
xSemaphoreTake(J9_sendOverSemaphore, 0);
writeJ9_485;
USART_ITConfig(J9_USART, USART_IT_TXE, ENABLE);
USART_SendData(J9_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
}
else if (device == g_Mcu_handle) {
xSemaphoreTake(slaveMcu_uart_sendOverSemaphore, 0);
USART_ITConfig(Mcu_USART, USART_IT_TXE, ENABLE);
USART_SendData(Mcu_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
}
return 0;
}