diff --git a/CH32V303-FreeRTOS/.cproject b/CH32V303-FreeRTOS/.cproject
index e691e15..bed5c29 100644
--- a/CH32V303-FreeRTOS/.cproject
+++ b/CH32V303-FreeRTOS/.cproject
@@ -142,7 +142,8 @@
-
+
+
diff --git a/CH32V303-FreeRTOS/.project b/CH32V303-FreeRTOS/.project
index 1ace493..76668cd 100644
--- a/CH32V303-FreeRTOS/.project
+++ b/CH32V303-FreeRTOS/.project
@@ -30,5 +30,21 @@
1.0-name-matches-false-false-*.wvproj
+
+ App/application/Host/Inc
+ 6
+
+ org.eclipse.ui.ide.multiFilter
+ 1.0-name-matches-false-false-slaveFreerotsTask.h
+
+
+
+ App/application/Host/Src
+ 6
+
+ org.eclipse.ui.ide.multiFilter
+ 1.0-name-matches-false-false-slaveFreerotsTask.c
+
+
\ No newline at end of file
diff --git a/CH32V303-FreeRTOS/App/application/Host/Inc/hostBusIdleDetection.h b/CH32V303-FreeRTOS/App/application/Host/Inc/hostBusIdleDetection.h
new file mode 100644
index 0000000..52fd168
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Host/Inc/hostBusIdleDetection.h
@@ -0,0 +1,27 @@
+#ifndef _APP_HOST_BUS_IDLE_DETECTION_H_
+#define _APP_HOST_BUS_IDLE_DETECTION_H_
+
+#include "uart_dev.h"
+
+#include "FreeRTOS.h"
+#include "event_groups.h"
+#include "semphr.h"
+
+extern SemaphoreHandle_t J0_IDLESemaphore;
+extern SemaphoreHandle_t J2_IDLESemaphore;
+extern SemaphoreHandle_t J4_IDLESemaphore;
+extern SemaphoreHandle_t J6_IDLESemaphore;
+
+void hostIdleInit(void);
+
+void J0_485_IN_IDLE(void);
+void J2_485_IN_IDLE(void);
+void J4_485_IN_IDLE(void);
+void J6_485_IN_IDLE(void);
+
+void J0_485_IN_RXNE(void);
+void J2_485_IN_RXNE(void);
+void J4_485_IN_RXNE(void);
+void J6_485_IN_RXNE(void);
+
+#endif
diff --git a/CH32V303-FreeRTOS/App/application/Host/Inc/hostFreerotsTask.h b/CH32V303-FreeRTOS/App/application/Host/Inc/hostFreerotsTask.h
new file mode 100644
index 0000000..a90a3ab
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Host/Inc/hostFreerotsTask.h
@@ -0,0 +1,11 @@
+#ifndef APP_HOST_FREERTOS_TASK_H_
+#define APP_HOST_FREERTOS_TASK_H_
+
+#include "pDebug.h"
+#include "FreeRTOS.h"
+#include "task.h"
+
+void hostStartApp(void);
+
+
+#endif
diff --git a/CH32V303-FreeRTOS/App/application/Host/Inc/hostMcuComm.h b/CH32V303-FreeRTOS/App/application/Host/Inc/hostMcuComm.h
new file mode 100644
index 0000000..a8a191a
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Host/Inc/hostMcuComm.h
@@ -0,0 +1,9 @@
+#ifndef _APP_HOST_MCU_COMM_H_
+#define _APP_HOST_MCU_COMM_H_
+
+#include "stdio.h"
+
+void hostFrameDataAnalyze(uint8_t *buff, uint8_t dataLen);
+
+
+#endif
diff --git a/CH32V303-FreeRTOS/App/application/Host/Inc/hostMcuDataParse.h b/CH32V303-FreeRTOS/App/application/Host/Inc/hostMcuDataParse.h
new file mode 100644
index 0000000..5292f35
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Host/Inc/hostMcuDataParse.h
@@ -0,0 +1,15 @@
+#ifndef _APP_HOST_MCU_DATA_PARSE_H_
+#define _APP_HOST_MCU_DATA_PARSE_H_
+
+#include "stdio.h"
+
+#include "FreeRTOS.h"
+#include "task.h"
+
+#include "mcu_common.h"
+
+#include "hostQueueUart.h"
+
+void hostMcuUartDataAnalysis(device_handle device);
+
+#endif
diff --git a/CH32V303-FreeRTOS/App/application/Host/Inc/hostParameter.h b/CH32V303-FreeRTOS/App/application/Host/Inc/hostParameter.h
new file mode 100644
index 0000000..a11f6ad
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Host/Inc/hostParameter.h
@@ -0,0 +1,40 @@
+#ifndef APP_HOST_PARAMETER_H_
+#define APP_HOST_PARAMETER_H_
+
+#include "stdio.h"
+
+//通过该格式存入flash中
+typedef struct _configInfo {
+ uint32_t J1_485_Baud; //与J1_485通信波特率
+ uint32_t J3_485_Baud; //与J3_485通信波特率
+ uint32_t J5_485_Baud; //与J5_485通信波特率
+ uint32_t J7_485_Baud; //与J7_485通信波特率
+ uint32_t J8_485_Baud; //与J8_485通信波特率
+ uint32_t J9_485_Baud; //与J9_485通信波特率
+
+ uint16_t crc; //crc校验
+} hostConfigInfo;
+
+void readHostConfigParameter(void);
+// void writeConfigParameter(configInfo inConfigInfo);
+
+float getPwrOnVoltage(void);
+void setPwrOnVoltage(float Voltage);
+float getWorkCurrent(void);
+void setWorkCurrent(float Curr);
+float getWorkVoltage(void);
+void setWorkVoltage(float Voltage);
+float getBoardTemperature(void);
+void setBoardTemperature(float Temperature);
+uint32_t getJ0_485_Baud(void);
+void setJ0_485_Baud(uint32_t Baud);
+uint32_t getJ2_485_Baud(void);
+void setJ2_485_Baud(uint32_t Baud);
+uint32_t getJ4_485_Baud(void);
+void setJ4_485_Baud(uint32_t Baud);
+uint32_t getJ6_485_Baud(void);
+void setJ6_485_Baud(uint32_t Baud);
+uint32_t getLora_Uart_Baud(void);
+void setLora_Uart_Baud(uint32_t Baud);
+
+#endif
diff --git a/CH32V303-FreeRTOS/App/application/Host/Inc/hostQueueUart.h b/CH32V303-FreeRTOS/App/application/Host/Inc/hostQueueUart.h
new file mode 100644
index 0000000..58f7e1f
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Host/Inc/hostQueueUart.h
@@ -0,0 +1,48 @@
+
+#ifndef _APP_HOST_QUEUE_UART_H_
+#define _APP_HOST_QUEUE_UART_H_
+
+#include "pDebug.h"
+#include "FreeRTOS.h"
+#include "queue.h"
+#include "uart_dev.h"
+
+/* 存入队列中的数据格式 */
+typedef struct _hostQueueUartSendInfo{
+ uint32_t length; //数据长度
+ uint8_t *data; //数据
+} hostQueueUartSendInfo;
+#define hostQueueUartSendInfoSize sizeof(hostQueueUartSendInfo)
+
+extern QueueHandle_t J0_485_Queue;
+extern QueueHandle_t J2_485_Queue;
+extern QueueHandle_t J4_485_Queue;
+extern QueueHandle_t J6_485_Queue;
+extern QueueHandle_t lora_uart_Queue;
+extern QueueHandle_t su806_uart_Queue;
+extern QueueHandle_t hostMcu_uart_Queue;
+
+uint8_t hostUartInterruptSend(device_handle device, uint8_t *data, uint16_t len);
+
+void hostUartSendInit(void);
+
+void hostBinarySemaphoreFreeMemory(void);
+
+void J0QueueSend(void);
+void J2QueueSend(void);
+void J4QueueSend(void);
+void J6QueueSend(void);
+void LoraQueueSend(void);
+void Su806QueueSend(void);
+void HostMcuQueueSend(void);
+
+void J0_485_IN_TXE(void);
+void J2_485_IN_TXE(void);
+void J4_485_IN_TXE(void);
+void J6_485_IN_TXE(void);
+void Lora_uart_IN_TXE(void);
+void Su806_uart_IN_TXE(void);
+void hostMcu_uart_IN_TXE(void);
+
+
+#endif
diff --git a/CH32V303-FreeRTOS/App/application/Host/Inc/hostRecvSlaveDataParse.h b/CH32V303-FreeRTOS/App/application/Host/Inc/hostRecvSlaveDataParse.h
new file mode 100644
index 0000000..0b400ab
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Host/Inc/hostRecvSlaveDataParse.h
@@ -0,0 +1,9 @@
+#ifndef _APP_HOST_RECV_SLAVE_DATA_PARSE_H_
+#define _APP_HOST_RECV_SLAVE_DATA_PARSE_H_
+
+#include "uart_dev.h"
+
+void hostRecvSlaveDataParse(device_handle device);
+
+
+#endif
diff --git a/CH32V303-FreeRTOS/App/application/Host/Inc/hostSensorDataParse.h b/CH32V303-FreeRTOS/App/application/Host/Inc/hostSensorDataParse.h
new file mode 100644
index 0000000..ac3e521
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Host/Inc/hostSensorDataParse.h
@@ -0,0 +1,13 @@
+#ifndef _APP_HOST_SENSOR_DATA_PARSE_H_
+#define _APP_HOST_SENSOR_DATA_PARSE_H_
+
+#include "uart_dev.h"
+
+void J0_SensorDataAnalysis(void);
+void J2_SensorDataAnalysis(void);
+void J4_SensorDataAnalysis(void);
+void J6_SensorDataAnalysis(void);
+void Lora_SensorDataAnalysis(void);
+
+
+#endif
diff --git a/CH32V303-FreeRTOS/App/application/Inc/freerotsTask.h b/CH32V303-FreeRTOS/App/application/Host/Inc/slaveFreerotsTask.h
similarity index 83%
rename from CH32V303-FreeRTOS/App/application/Inc/freerotsTask.h
rename to CH32V303-FreeRTOS/App/application/Host/Inc/slaveFreerotsTask.h
index 1c41881..1ff4b78 100644
--- a/CH32V303-FreeRTOS/App/application/Inc/freerotsTask.h
+++ b/CH32V303-FreeRTOS/App/application/Host/Inc/slaveFreerotsTask.h
@@ -5,7 +5,7 @@
#include "FreeRTOS.h"
#include "task.h"
-void startApp(void);
+void slaveStartApp(void);
#endif
diff --git a/CH32V303-FreeRTOS/App/application/Host/Src/hostBusIdleDetection.c b/CH32V303-FreeRTOS/App/application/Host/Src/hostBusIdleDetection.c
new file mode 100644
index 0000000..563be29
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Host/Src/hostBusIdleDetection.c
@@ -0,0 +1,124 @@
+
+#include "hostBusIdleDetection.h"
+
+static TimerHandle_t J0_485_Swtmr = NULL;
+static TimerHandle_t J2_485_Swtmr = NULL;
+static TimerHandle_t J4_485_Swtmr = NULL;
+static TimerHandle_t J6_485_Swtmr = NULL;
+
+static void J0_485_tmrCallback(void* parameter);
+static void J2_485_tmrCallback(void* parameter);
+static void J4_485_tmrCallback(void* parameter);
+static void J6_485_tmrCallback(void* parameter);
+
+// 创建二值信号量
+SemaphoreHandle_t J0_IDLESemaphore = NULL;
+SemaphoreHandle_t J2_IDLESemaphore = NULL;
+SemaphoreHandle_t J4_IDLESemaphore = NULL;
+SemaphoreHandle_t J6_IDLESemaphore = NULL;
+
+#define softwareDelay (30 / (1000 / configTICK_RATE_HZ))
+
+void hostIdleInit(void)
+{
+ J0_485_Swtmr = xTimerCreate((const char*)"J0Timer",
+ softwareDelay, //延时
+ (UBaseType_t )pdFALSE, //单次模式
+ (void *)1, //为每个计时器分配一个索引的唯一ID
+ (TimerCallbackFunction_t)J0_485_tmrCallback); //回调函数
+
+ J2_485_Swtmr = xTimerCreate((const char*)"J2Timer",
+ softwareDelay,
+ (UBaseType_t )pdFALSE,
+ (void *)2,
+ (TimerCallbackFunction_t)J2_485_tmrCallback);
+
+ J4_485_Swtmr = xTimerCreate((const char*)"J4Timer",
+ softwareDelay,
+ (UBaseType_t )pdFALSE,
+ (void *)2,
+ (TimerCallbackFunction_t)J4_485_tmrCallback);
+
+ J6_485_Swtmr = xTimerCreate((const char*)"J6Timer",
+ softwareDelay,
+ (UBaseType_t )pdFALSE,
+ (void *)2,
+ (TimerCallbackFunction_t)J6_485_tmrCallback);
+
+ J0_IDLESemaphore = xSemaphoreCreateBinary();
+ xSemaphoreGive(J0_IDLESemaphore);
+ J2_IDLESemaphore = xSemaphoreCreateBinary();
+ xSemaphoreGive(J2_IDLESemaphore);
+ J4_IDLESemaphore = xSemaphoreCreateBinary();
+ xSemaphoreGive(J4_IDLESemaphore);
+ J6_IDLESemaphore = xSemaphoreCreateBinary();
+ xSemaphoreGive(J6_IDLESemaphore);
+}
+
+void J0_485_tmrCallback(void* parameter)
+{
+ xSemaphoreGiveFromISR(J0_IDLESemaphore, 0);
+}
+void J2_485_tmrCallback(void* parameter)
+{
+ xSemaphoreGiveFromISR(J2_IDLESemaphore, 0);
+}
+void J4_485_tmrCallback(void* parameter)
+{
+ xSemaphoreGiveFromISR(J4_IDLESemaphore, 0);
+}
+void J6_485_tmrCallback(void* parameter)
+{
+ xSemaphoreGiveFromISR(J6_IDLESemaphore, 0);
+}
+
+/*
+ * @brief 空闲中断内容
+ * @param
+ * @retval
+ *
+ */
+void J0_485_IN_IDLE(void)
+{
+ xTimerStartFromISR(J0_485_Swtmr, 0);
+}
+void J2_485_IN_IDLE(void)
+{
+ xTimerStartFromISR(J2_485_Swtmr, 0);
+}
+void J4_485_IN_IDLE(void)
+{
+ xTimerStartFromISR(J4_485_Swtmr, 0);
+}
+void J6_485_IN_IDLE(void)
+{
+ xTimerStartFromISR(J6_485_Swtmr, 0);
+}
+
+/*
+ * @brief 空闲中断后,第一次进入接收中断内容
+ * @param
+ * @retval
+ *
+ */
+void J0_485_IN_RXNE(void)
+{
+ xTimerStopFromISR(J0_485_Swtmr, 0);
+ xSemaphoreTakeFromISR(J0_IDLESemaphore, 0);
+}
+void J2_485_IN_RXNE(void)
+{
+ xTimerStopFromISR(J2_485_Swtmr, 0);
+ xSemaphoreTakeFromISR(J2_IDLESemaphore, 0);
+}
+void J4_485_IN_RXNE(void)
+{
+ xTimerStopFromISR(J4_485_Swtmr, 0);
+ xSemaphoreTakeFromISR(J4_IDLESemaphore, 0);
+}
+void J6_485_IN_RXNE(void)
+{
+ xTimerStopFromISR(J6_485_Swtmr, 0);
+ xSemaphoreTakeFromISR(J6_IDLESemaphore, 0);
+}
+
diff --git a/CH32V303-FreeRTOS/App/application/Host/Src/hostFreerotsTask.c b/CH32V303-FreeRTOS/App/application/Host/Src/hostFreerotsTask.c
new file mode 100644
index 0000000..cc3ff95
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Host/Src/hostFreerotsTask.c
@@ -0,0 +1,337 @@
+
+#include "stdio.h"
+
+#include "FM_ADC.h"
+#include "FM_GPIO.h"
+#include "uart_dev.h"
+
+#include "hostFreerotsTask.h"
+#include "hostBusIdleDetection.h"
+#include "hostMcuComm.h"
+#include "hostMcuDataParse.h"
+#include "hostRecvSlaveDataParse.h"
+#include "hostSensorDataParse.h"
+#include "hostQueueUart.h"
+#include "hostParameter.h"
+
+/* 发送任务 */
+#define J0_Transmit_TASK_PRIO 7
+#define J0_Transmit_STK_SIZE 64
+static TaskHandle_t J0_TransmitTask_Handler;
+static void J0_transmit_Task(void *pvParameters);
+#define J2_Transmit_TASK_PRIO 7
+#define J2_Transmit_STK_SIZE 64
+static TaskHandle_t J2_TransmitTask_Handler;
+static void J2_transmit_Task(void *pvParameters);
+#define J4_Transmit_TASK_PRIO 7
+#define J4_Transmit_STK_SIZE 64
+static TaskHandle_t J4_TransmitTask_Handler;
+static void J4_transmit_Task(void *pvParameters);
+#define J6_Transmit_TASK_PRIO 7
+#define J6_Transmit_STK_SIZE 64
+static TaskHandle_t J6_TransmitTask_Handler;
+static void J6_transmit_Task(void *pvParameters);
+#define Lora_Transmit_TASK_PRIO 7
+#define Lora_Transmit_STK_SIZE 64
+static TaskHandle_t Lora_TransmitTask_Handler;
+static void Lora_transmit_Task(void *pvParameters);
+#define Su806_Transmit_TASK_PRIO 7
+#define Su806_Transmit_STK_SIZE 64
+static TaskHandle_t Su806_TransmitTask_Handler;
+static void Su806_transmit_Task(void *pvParameters);
+#define HostMcu_Transmit_TASK_PRIO 7
+#define HostMcu_Transmit_STK_SIZE 64
+static TaskHandle_t HostMcu_TransmitTask_Handler;
+static void HostMcu_transmit_Task(void *pvParameters);
+
+/* 释放内存任务 */
+#define hostFreeMemory_TASK_PRIO 8
+#define hostFreeMemory_STK_SIZE 64
+static TaskHandle_t hostFreeMemory_Handler;
+static void hostFreeMemory_Task(void *pvParameters);
+
+/* 解析任务 */
+#define hostMcuDataParse_TASK_PRIO 5
+#define hostMcuDataParse_STK_SIZE 512
+static TaskHandle_t hostMcuDataParse_Handler;
+static void hostMcuDataParse_Task(void *pvParameters);
+
+#define hostSensorDataParse_TASK_PRIO 5
+#define hostSensorDataParse_STK_SIZE 512
+static TaskHandle_t hostSensorDataParse_Handler;
+static void hostSensorDataParse_Task(void *pvParameters);
+
+#define hostRecvSlaveDataParse_TASK_PRIO 5
+#define hostRecvSlaveDataParse_STK_SIZE 512
+static TaskHandle_t hostRecvSlaveDataParse_Handler;
+static void hostRecvSlaveDataParse_Task(void *pvParameters);
+
+/* 数据采集任务 */
+#define dataCollection_TASK_PRIO 4
+#define dataCollection_STK_SIZE 128
+static TaskHandle_t dataCollection_Handler;
+static void dataCollection_Task(void *pvParameters);
+
+/* 其他任务 */
+#define hostOther_TASK_PRIO 2
+#define hostOther_STK_SIZE 128
+static TaskHandle_t hostOther_Handler;
+static void hostOther_Task(void *pvParameters);
+
+
+/**
+ * @brief 将数据发送
+ * @param
+ * @retval
+ */
+void J0_transmit_Task(void *pvParameters)
+{
+ while (1) {
+ J0QueueSend();
+ }
+}
+void J2_transmit_Task(void *pvParameters)
+{
+ while (1) {
+ J2QueueSend();
+ }
+}
+void J4_transmit_Task(void *pvParameters)
+{
+ while (1) {
+ J4QueueSend();
+ }
+}
+void J6_transmit_Task(void *pvParameters)
+{
+ while (1) {
+ J6QueueSend();
+ }
+}
+void Lora_transmit_Task(void *pvParameters)
+{
+ while (1) {
+ LoraQueueSend();
+ }
+}
+void Su806_transmit_Task(void *pvParameters)
+{
+ while (1) {
+ Su806QueueSend();
+ }
+}
+void HostMcu_transmit_Task(void *pvParameters)
+{
+ while (1) {
+ HostMcuQueueSend();
+ }
+}
+
+/**
+ * @brief 释放内存任务
+ * @param
+ * @retval
+ */
+void hostFreeMemory_Task(void *pvParameters)
+{
+ while (1) {
+ hostBinarySemaphoreFreeMemory();
+ }
+}
+
+/**
+ * @brief 解析su806传来的数据
+ * @param
+ * @retval
+ */
+void hostMcuDataParse_Task(void *pvParameters)
+{
+ while (1) {
+ hostMcuUartDataAnalysis(g_Su806_handle);
+ vTaskDelay(10);
+ }
+}
+
+/**
+ * @brief 解析传感器传来的数据
+ * @param
+ * @retval
+ */
+void hostSensorDataParse_Task(void *pvParameters)
+{
+ while (1) {
+ J0_SensorDataAnalysis();
+ J2_SensorDataAnalysis();
+ J4_SensorDataAnalysis();
+ J6_SensorDataAnalysis();
+ Lora_SensorDataAnalysis();
+ vTaskDelay(5);
+ }
+}
+
+/**
+ * @brief 解析从mcu传来的数据
+ * @param
+ * @retval
+ */
+void hostRecvSlaveDataParse_Task(void *pvParameters)
+{
+ while (1) {
+ hostRecvSlaveDataParse(g_Mcu_handle);
+ vTaskDelay(10);
+ }
+}
+
+/**
+ * @brief 数据采集任务
+ * @param
+ * @retval
+ */
+void dataCollection_Task(void *pvParameters)
+{
+ while (1) {
+ setBoardTemperature(getTemperature());
+ setWorkVoltage(getInVoltage());
+ setWorkCurrent(getInCurrent());
+ setPwrOnVoltage(getSOCPwrOnVoltage());
+ vTaskDelay(500);
+ }
+}
+
+/**
+ * @brief 其他任务
+ * @param
+ * @retval
+ */
+void hostOther_Task(void *pvParameters)
+{
+ while (1) {
+ log_info("xPortGetFreeHeapSize : %d",xPortGetFreeHeapSize());
+ vTaskDelay(1000);
+ }
+}
+
+
+
+
+/**
+ * @brief 启动
+ * @param
+ * @retval
+ */
+void hostStartApp(void)
+{
+ HostMcu_GPIO_Init();
+ readHostConfigParameter();
+ HostMcu_uartBuf_Init(256, 256, 256, 1024);
+ Init_J0_485(getJ0_485_Baud());
+ Init_J2_485(getJ2_485_Baud());
+ Init_J4_485(getJ4_485_Baud());
+ Init_J6_485(getJ6_485_Baud());
+ Init_Lora_Uart(getLora_Uart_Baud());
+ Init_Mcu_Uart(115200);
+ Init_Su806_Uart(115200);
+
+ FM_ADC_Init();
+ proportionalInt();
+
+ applyDataBuffer();
+ hostUartSendInit();
+ hostIdleInit();
+ HostMcu_485DE_Read();
+
+ /* create task */
+ xTaskCreate((TaskFunction_t )J0_transmit_Task,
+ (const char* )"J0TransmitTask",
+ (uint16_t )J0_Transmit_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )J0_Transmit_TASK_PRIO,
+ (TaskHandle_t* )&J0_TransmitTask_Handler);
+
+ xTaskCreate((TaskFunction_t )J2_transmit_Task,
+ (const char* )"J2TransmitTask",
+ (uint16_t )J2_Transmit_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )J2_Transmit_TASK_PRIO,
+ (TaskHandle_t* )&J2_TransmitTask_Handler);
+
+ xTaskCreate((TaskFunction_t )J4_transmit_Task,
+ (const char* )"J4TransmitTask",
+ (uint16_t )J4_Transmit_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )J4_Transmit_TASK_PRIO,
+ (TaskHandle_t* )&J4_TransmitTask_Handler);
+
+ xTaskCreate((TaskFunction_t )J6_transmit_Task,
+ (const char* )"J6TransmitTask",
+ (uint16_t )J6_Transmit_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )J6_Transmit_TASK_PRIO,
+ (TaskHandle_t* )&J6_TransmitTask_Handler);
+
+ xTaskCreate((TaskFunction_t )Lora_transmit_Task,
+ (const char* )"LoraTransmitTask",
+ (uint16_t )Lora_Transmit_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )Lora_Transmit_TASK_PRIO,
+ (TaskHandle_t* )&Lora_TransmitTask_Handler);
+
+ xTaskCreate((TaskFunction_t )Su806_transmit_Task,
+ (const char* )"Su806TransmitTask",
+ (uint16_t )Su806_Transmit_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )Su806_Transmit_TASK_PRIO,
+ (TaskHandle_t* )&Su806_TransmitTask_Handler);
+
+ xTaskCreate((TaskFunction_t )HostMcu_transmit_Task,
+ (const char* )"HostMcuTransmitTask",
+ (uint16_t )HostMcu_Transmit_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )HostMcu_Transmit_TASK_PRIO,
+ (TaskHandle_t* )&HostMcu_TransmitTask_Handler);
+
+ xTaskCreate((TaskFunction_t )hostFreeMemory_Task,
+ (const char* )"hostFreeMemoryTask",
+ (uint16_t )hostFreeMemory_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )hostFreeMemory_TASK_PRIO,
+ (TaskHandle_t* )&hostFreeMemory_Handler);
+
+ xTaskCreate((TaskFunction_t )hostMcuDataParse_Task,
+ (const char* )"hostMcuDataTask",
+ (uint16_t )hostMcuDataParse_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )hostMcuDataParse_TASK_PRIO,
+ (TaskHandle_t* )&hostMcuDataParse_Handler);
+
+ xTaskCreate((TaskFunction_t )hostSensorDataParse_Task,
+ (const char* )"hostSensorDataTask",
+ (uint16_t )hostSensorDataParse_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )hostSensorDataParse_TASK_PRIO,
+ (TaskHandle_t* )&hostSensorDataParse_Handler);
+
+ xTaskCreate((TaskFunction_t )hostRecvSlaveDataParse_Task,
+ (const char* )"hostRecvSlaveDataTask",
+ (uint16_t )hostRecvSlaveDataParse_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )hostRecvSlaveDataParse_TASK_PRIO,
+ (TaskHandle_t* )&hostRecvSlaveDataParse_Handler);
+
+ xTaskCreate((TaskFunction_t )dataCollection_Task,
+ (const char* )"dataCollectionTask",
+ (uint16_t )dataCollection_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )dataCollection_TASK_PRIO,
+ (TaskHandle_t* )&dataCollection_Handler);
+
+ xTaskCreate((TaskFunction_t )hostOther_Task,
+ (const char* )"hostOtherTask",
+ (uint16_t )hostOther_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )hostOther_TASK_PRIO,
+ (TaskHandle_t* )&hostOther_Handler);
+
+ vTaskStartScheduler();
+}
+
diff --git a/CH32V303-FreeRTOS/App/application/Host/Src/hostMcuComm.c b/CH32V303-FreeRTOS/App/application/Host/Src/hostMcuComm.c
new file mode 100644
index 0000000..5d874cb
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Host/Src/hostMcuComm.c
@@ -0,0 +1,581 @@
+
+#include "hostMcuComm.h"
+#include "hostQueueUart.h"
+#include "hostParameter.h"
+
+#include "uart_dev.h"
+#include "FM_GPIO.h"
+
+#include "FreeRTOS.h"
+#include "task.h"
+
+#include "mcu_common.h"
+
+/* 配置文件数据类型表 */
+enum {
+ workCurrent = 0x0000,
+ workVoltage = 0x0001,
+ workTemperature = 0x0002,
+ J1_Power = 0x0003,
+ J2_Power = 0x0004,
+ J3_Power = 0x0005,
+ J4_Power = 0x0006,
+ J5_Power = 0x0007,
+ J6_Power = 0x0008,
+ J7_Power = 0x0009,
+ J8_Power = 0x000A,
+ J9_Power = 0x000B,
+ /* (1字节)对智能模块通信波特率(00H:不使用该串口, 01H:4800;02H:9600;03H:19200;04H:38400;05H:57600;06H:115200) */
+ J0_485_Communication_Baud_Rate = 0x000C,
+ J2_485_Communication_Baud_Rate = 0x000D,
+ J4_485_Communication_Baud_Rate = 0x000E,
+ J6_485_Communication_Baud_Rate = 0x000F,
+ Lora_uart_Communication_Baud_Rate = 0x0010,
+};
+
+
+/* 寄存器解析 */
+static uint16_t ReadRegisterWorkCurrent(void *pMsg);
+static uint16_t ReadRegisterWorkVoltage(void *pMsg);
+static uint16_t ReadRegisterWorkTemperature(void *pMsg);
+static uint16_t ReadRegisterJ1_Power(void *pMsg);
+static uint16_t ReadRegisterJ2_Power(void *pMsg);
+static uint16_t ReadRegisterJ3_Power(void *pMsg);
+static uint16_t ReadRegisterJ4_Power(void *pMsg);
+static uint16_t ReadRegisterJ5_Power(void *pMsg);
+static uint16_t ReadRegisterJ6_Power(void *pMsg);
+static uint16_t ReadRegisterJ7_Power(void *pMsg);
+static uint16_t ReadRegisterJ8_Power(void *pMsg);
+static uint16_t ReadRegisterJ9_Power(void *pMsg);
+static uint16_t ReadRegisterJ0Baud(void *pMsg);
+static uint16_t ReadRegisterJ2Baud(void *pMsg);
+static uint16_t ReadRegisterJ4Baud(void *pMsg);
+static uint16_t ReadRegisterJ6Baud(void *pMsg);
+static uint16_t ReadRegisterLoraBaud(void *pMsg);
+
+static uint16_t WriteRegisterJ1_Power(void *pMsg);
+static uint16_t WriteRegisterJ2_Power(void *pMsg);
+static uint16_t WriteRegisterJ3_Power(void *pMsg);
+static uint16_t WriteRegisterJ4_Power(void *pMsg);
+static uint16_t WriteRegisterJ5_Power(void *pMsg);
+static uint16_t WriteRegisterJ6_Power(void *pMsg);
+static uint16_t WriteRegisterJ7_Power(void *pMsg);
+static uint16_t WriteRegisterJ8_Power(void *pMsg);
+static uint16_t WriteRegisterJ9_Power(void *pMsg);
+static uint16_t WriteRegisterJ0Baud(void *pMsg);
+static uint16_t WriteRegisterJ2Baud(void *pMsg);
+static uint16_t WriteRegisterJ4Baud(void *pMsg);
+static uint16_t WriteRegisterJ6Baud(void *pMsg);
+static uint16_t WriteRegisterLoraBaud(void *pMsg);
+
+/* 寄存器处理表 */
+typedef uint16_t (*RegProcFunc)(void*);
+typedef struct _SL_RegProcTable{
+ uint32_t regId;
+ RegProcFunc pRegProc;
+}SL_RegProcTable;
+
+/* 读取寄存器处理表 */
+SL_RegProcTable m_host_RegTblR[] =
+{
+ {workCurrent, ReadRegisterWorkCurrent},
+ {workVoltage, ReadRegisterWorkVoltage},
+ {workTemperature, ReadRegisterWorkTemperature},
+ {J1_Power, ReadRegisterJ1_Power},
+ {J2_Power, ReadRegisterJ2_Power},
+ {J3_Power, ReadRegisterJ3_Power},
+ {J4_Power, ReadRegisterJ4_Power},
+ {J5_Power, ReadRegisterJ5_Power},
+ {J6_Power, ReadRegisterJ6_Power},
+ {J7_Power, ReadRegisterJ7_Power},
+ {J8_Power, ReadRegisterJ8_Power},
+ {J9_Power, ReadRegisterJ9_Power},
+ {J0_485_Communication_Baud_Rate, ReadRegisterJ0Baud},
+ {J2_485_Communication_Baud_Rate, ReadRegisterJ2Baud},
+ {J4_485_Communication_Baud_Rate, ReadRegisterJ4Baud},
+ {J6_485_Communication_Baud_Rate, ReadRegisterJ6Baud},
+ {Lora_uart_Communication_Baud_Rate, ReadRegisterLoraBaud},
+};
+
+/* 写入寄存器处理表 */
+SL_RegProcTable m_host_RegTblW[] =
+{
+ {J1_Power, WriteRegisterJ1_Power},
+ {J2_Power, WriteRegisterJ2_Power},
+ {J3_Power, WriteRegisterJ3_Power},
+ {J4_Power, WriteRegisterJ4_Power},
+ {J5_Power, WriteRegisterJ5_Power},
+ {J6_Power, WriteRegisterJ6_Power},
+ {J7_Power, WriteRegisterJ7_Power},
+ {J8_Power, WriteRegisterJ8_Power},
+ {J9_Power, WriteRegisterJ9_Power},
+ {J0_485_Communication_Baud_Rate, WriteRegisterJ0Baud},
+ {J2_485_Communication_Baud_Rate, WriteRegisterJ2Baud},
+ {J4_485_Communication_Baud_Rate, WriteRegisterJ4Baud},
+ {J6_485_Communication_Baud_Rate, WriteRegisterJ6Baud},
+ {Lora_uart_Communication_Baud_Rate, WriteRegisterLoraBaud},
+};
+
+/**
+ * @brief 读取工作电流
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterWorkCurrent(void *pMsg)
+{
+ return (uint16_t)(getWorkCurrent() * 10);
+}
+
+/**
+ * @brief 读取工作电压
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterWorkVoltage(void *pMsg)
+{
+ return (uint16_t)(getWorkVoltage() * 10);
+}
+
+/**
+ * @brief 读取工作温度
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterWorkTemperature(void *pMsg)
+{
+ return (uint16_t)(getBoardTemperature() * 10);
+}
+
+/**
+ * @brief 读取J1电源开关状态
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ1_Power(void *pMsg)
+{
+ return readPwrCtrlState(J1_PwrCtrl);
+}
+
+/**
+ * @brief 读取J2电源开关状态
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ2_Power(void *pMsg)
+{
+ return readPwrCtrlState(J2_PwrCtrl);
+}
+
+/**
+ * @brief 读取J3电源开关状态
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ3_Power(void *pMsg)
+{
+ return readPwrCtrlState(J3_PwrCtrl);
+}
+
+/**
+ * @brief 读取J4电源开关状态
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ4_Power(void *pMsg)
+{
+ return readPwrCtrlState(J4_PwrCtrl);
+}
+
+/**
+ * @brief 读取J5电源开关状态
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ5_Power(void *pMsg)
+{
+ return readPwrCtrlState(J5_PwrCtrl);
+}
+
+/**
+ * @brief 读取J6电源开关状态
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ6_Power(void *pMsg)
+{
+ return readPwrCtrlState(J6_PwrCtrl);
+}
+
+/**
+ * @brief 读取J7电源开关状态
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ7_Power(void *pMsg)
+{
+ return readPwrCtrlState(J7_PwrCtrl);
+}
+
+/**
+ * @brief 读取J8电源开关状态
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ8_Power(void *pMsg)
+{
+ return readPwrCtrlState(J8_PwrCtrl);
+}
+
+/**
+ * @brief 读取J9电源开关状态
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ9_Power(void *pMsg)
+{
+ return readPwrCtrlState(J9_PwrCtrl);
+}
+
+/**
+ * @brief 读取J0通信波特率
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ0Baud(void *pMsg)
+{
+ return baudConversionConfig(getJ0_485_Baud());
+}
+
+/**
+ * @brief 读取J2通信波特率
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ2Baud(void *pMsg)
+{
+ return baudConversionConfig(getJ2_485_Baud());
+}
+
+/**
+ * @brief 读取J4通信波特率
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ4Baud(void *pMsg)
+{
+ return baudConversionConfig(getJ4_485_Baud());
+}
+
+/**
+ * @brief 读取J6通信波特率
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ6Baud(void *pMsg)
+{
+ return baudConversionConfig(getJ6_485_Baud());
+}
+
+/**
+ * @brief 读取J6通信波特率
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterLoraBaud(void *pMsg)
+{
+ return baudConversionConfig(getLora_Uart_Baud());
+}
+
+/**
+ * @brief 设置J1电源开关状态
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ1_Power(void *pMsg)
+{
+ writePwrCtrlState(J1_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg));
+ return 0;
+}
+
+/**
+ * @brief 设置J2电源开关状态
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ2_Power(void *pMsg)
+{
+ writePwrCtrlState(J2_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg));
+ return 0;
+}
+
+/**
+ * @brief 设置J3电源开关状态
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ3_Power(void *pMsg)
+{
+ writePwrCtrlState(J3_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg));
+ return 0;
+}
+
+/**
+ * @brief 设置J4电源开关状态
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ4_Power(void *pMsg)
+{
+ writePwrCtrlState(J4_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg));
+ return 0;
+}
+
+/**
+ * @brief 设置J5电源开关状态
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ5_Power(void *pMsg)
+{
+ writePwrCtrlState(J5_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg));
+ return 0;
+}
+
+/**
+ * @brief 设置J6电源开关状态
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ6_Power(void *pMsg)
+{
+ writePwrCtrlState(J6_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg));
+ return 0;
+}
+
+/**
+ * @brief 设置J7电源开关状态
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ7_Power(void *pMsg)
+{
+ writePwrCtrlState(J7_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg));
+ return 0;
+}
+
+/**
+ * @brief 设置J8电源开关状态
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ8_Power(void *pMsg)
+{
+ writePwrCtrlState(J8_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg));
+ return 0;
+}
+
+/**
+ * @brief 设置J9电源开关状态
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ9_Power(void *pMsg)
+{
+ writePwrCtrlState(J9_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg));
+ return 0;
+}
+
+/**
+ * @brief 设置J0通信波特率
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ0Baud(void *pMsg)
+{
+ setJ0_485_Baud(configConversionBaud(*(uint16_t *)pMsg));
+ Init_J0_485(getJ0_485_Baud());
+ return 0;
+}
+
+/**
+ * @brief 设置J2通信波特率
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ2Baud(void *pMsg)
+{
+ setJ2_485_Baud(configConversionBaud(*(uint16_t *)pMsg));
+ Init_J2_485(getJ2_485_Baud());
+ return 0;
+}
+
+/**
+ * @brief 设置J4通信波特率
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ4Baud(void *pMsg)
+{
+ setJ4_485_Baud(configConversionBaud(*(uint16_t *)pMsg));
+ Init_J4_485(getJ4_485_Baud());
+ return 0;
+}
+
+/**
+ * @brief 设置J6通信波特率
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ6Baud(void *pMsg)
+{
+ setJ6_485_Baud(configConversionBaud(*(uint16_t *)pMsg));
+ Init_J6_485(getJ6_485_Baud());
+ return 0;
+}
+
+/**
+ * @brief 设置J6通信波特率
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterLoraBaud(void *pMsg)
+{
+ setLora_Uart_Baud(configConversionBaud(*(uint16_t *)pMsg));
+ Init_J6_485(getLora_Uart_Baud());
+ return 0;
+}
+
+/**
+ * @brief 读取一帧数据
+ * @param
+ * @retval
+ */
+static void hostMcuReadRegister(uint8_t *buff, uint8_t dataLen)
+{
+ uint16_t Register_Start_Address = (buff[6] << 8) | buff[7];
+ uint16_t Register_Number = (buff[8] << 8) | buff[9];
+
+ /* 初始化发送内存 */
+ //系统内存不足,丢去当前包
+ uint32_t tempLen = 13 + 2 * Register_Number + hostQueueUartSendInfoSize;
+ if (xPortGetFreeHeapSize() < tempLen + 1024) {
+ return;
+ }
+
+ uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
+ hostQueueUartSendInfo *sendBuff = (hostQueueUartSendInfo *)Buff;
+ sendBuff->length = 13 + 2 * Register_Number;
+ sendBuff->data = Buff + hostQueueUartSendInfoSize;
+
+ uint8_t *replay_pack = sendBuff->data;
+ /* 起始标志 */
+ *(replay_pack) = 'S';
+ *(replay_pack + 1) = 'L';
+
+ /* 端口号 */
+ replay_pack += 2;
+ *(replay_pack) = HostMcu;
+
+ /* 回复字节长度 */
+ replay_pack += 1;
+ *(replay_pack) = (uint8_t)((sendBuff->length - 6) >> 8);
+ *(replay_pack + 1) = (uint8_t)(sendBuff->length - 6);
+
+ /* 功能码 */
+ replay_pack += 2;
+ *(replay_pack) = SL_Function_Code_Read_Register;
+
+ /* 读取寄存器起始地址 */
+ replay_pack += 1;
+ *(replay_pack) = buff[6];
+ *(replay_pack + 1) = buff[7];
+
+ /* 回复字节长度 */
+ replay_pack += 2;
+ *(replay_pack) = (uint8_t)((sendBuff->length - 13) >> 8);
+ *(replay_pack + 1) = (uint8_t)(sendBuff->length - 13);
+
+ /* 回复数据内容 */
+ /* 读取数据 */
+ for ( uint16_t pos = 0; pos < Register_Number; pos++) {
+ for (uint16_t var = 0; var < sizeof(m_host_RegTblR) / sizeof(SL_RegProcTable); var++) {
+ if (m_host_RegTblR[var].regId == (Register_Start_Address + pos)) {
+ uint16_t temp = m_host_RegTblR[var].pRegProc(NULL);
+ replay_pack += 2;
+ *(replay_pack) = (uint8_t)(temp >> 8);
+ *(replay_pack + 1) = (uint8_t)(temp);
+ }
+ }
+ }
+
+ /* 校验位 */
+ replay_pack += 2;
+ uint16_t crc_temp = modebusCrc(sendBuff->data, sendBuff->length - 3);
+ *replay_pack = (uint8_t)(crc_temp >> 8);
+ replay_pack += 1;
+ *replay_pack = (uint8_t)crc_temp;
+
+ /* 结束标志 */
+ replay_pack += 1;
+ *replay_pack = 0x17;
+
+ /* 队列中有空间,则将发送数据 */
+ if (uxQueueSpacesAvailable(hostMcu_uart_Queue)) {
+ xQueueSend(hostMcu_uart_Queue, &Buff, 10);
+ }
+ else {
+ vPortFree(Buff);
+ }
+}
+
+/**
+ * @brief 写入一帧数据
+ * @param
+ * @retval
+ */
+static void hostMcuWriteRegister(uint8_t *buff, uint8_t dataLen)
+{
+ uint16_t Register_Start_Address = (buff[6] << 8) | buff[7];
+ uint16_t Register_Number = (buff[8] << 8) | buff[9];
+
+ /* 将数据写入到寄存器中 */
+ for ( uint16_t pos = 0; pos < Register_Number; pos++) {
+ for (uint16_t i = 0; i < sizeof(m_host_RegTblW) / sizeof(SL_RegProcTable); i++) {
+ if (m_host_RegTblW[i].regId == (Register_Start_Address + pos)) {
+ uint16_t data = buff[10 + 2 * pos] << 8 | buff[10 + 2 * pos + 1];
+ m_host_RegTblW[i].pRegProc(&data);
+ }
+ }
+ }
+
+ /* 后续将数据存入配置文件中 */
+
+
+
+}
+
+/**
+ * @brief
+ * @param
+ * @retval
+ */
+void hostFrameDataAnalyze(uint8_t *buff, uint8_t dataLen)
+{
+ uint16_t crc = (buff[dataLen - 4] << 8) | buff[dataLen - 3];
+ if (crc != modebusCrc(buff, dataLen - 3)) {
+ return;
+ }
+
+ if (buff[5] == SL_Function_Code_Read_Register) {
+ hostMcuReadRegister(buff, dataLen);
+ }
+ else if (buff[5] == SL_Function_Code_Write_Register) {
+ hostMcuWriteRegister(buff, dataLen);
+ }
+}
+
+
+
+
+
+
diff --git a/CH32V303-FreeRTOS/App/application/Host/Src/hostMcuDataParse.c b/CH32V303-FreeRTOS/App/application/Host/Src/hostMcuDataParse.c
new file mode 100644
index 0000000..7f28cae
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Host/Src/hostMcuDataParse.c
@@ -0,0 +1,298 @@
+
+#include "hostMcuDataParse.h"
+#include "hostMcuComm.h"
+
+
+static void stateMachine(void);
+
+/* 状态机函数 */
+static uint8_t analysisWait(void);
+static uint8_t analysisStartFlagSL(void);
+static uint8_t analysisPortSL(void);
+static uint8_t analysisLengthSL(void);
+static uint8_t analysisEndFlagSL(void);
+
+/**
+ * @brief 状态机函数
+ * @param
+ * @retval
+ */
+void stateMachine(void)
+{
+ if (state == wait) {
+ if (analysisWait() == TRUE) {
+ su806UartRxTime = xTaskGetTickCount();
+ }
+ }
+
+ else if (state == startFlagSL) {
+ analysisStartFlagSL();
+ }
+
+ else if (state == portSL) {
+ analysisPortSL();
+ }
+
+ else if (state == lengthSL) {
+ analysisLengthSL();
+ }
+
+ else if (state == endFlagSL) {
+ analysisEndFlagSL();
+ }
+}
+
+/**
+ * @brief 状态 wait
+ * @param
+ * @retval 0:解析失败
+ 1:解析成功
+ */
+#define waitMaxLen 2
+uint8_t analysisWait(void)
+{
+ if (su806RxBufferIndex >= 2) {
+ /* 透传数据帧包头 */
+ if (su806RxBuffer[0] == 'S' && su806RxBuffer[1] == 'L') {
+ // log_info("startFlagSL\n");
+ state = startFlagSL;
+ return TRUE;
+ }
+ }
+
+ if (su806RxBufferIndex < waitMaxLen) {
+ return FALSE;
+ }
+
+ state = wait;
+ su806RxBufferIndex--;
+ memcpy(su806RxBuffer, su806RxBuffer + 1, su806RxBufferIndex);
+
+ return FALSE;
+}
+
+/**
+ * @brief 状态 startFlagSL
+ * @param
+ * @retval 0:解析失败
+ 1:解析成功
+ */
+uint8_t analysisStartFlagSL(void)
+{
+ /* 校验端口号 */
+ if (su806RxBuffer[2] < 13) {
+ // log_info("portSL\n");
+ state = portSL;
+ return TRUE;
+ }
+
+ // log_error("portSL %d \n", gw485RxBuffer[2]);
+ state = wait;
+ su806RxBufferIndex--;
+ memcpy(su806RxBuffer, su806RxBuffer + 1, su806RxBufferIndex);
+ return FALSE;
+}
+
+/**
+ * @brief 状态 portSL
+ * @param
+ * @retval 0:解析失败
+ 1:解析成功
+ */
+#define PortSLMaxLen 5
+uint8_t analysisPortSL(void)
+{
+ /* 解析数据包的度 */
+ if (su806RxBufferIndex >= PortSLMaxLen) {
+ uint32_t tempLen = 0;
+ tempLen = (su806RxBuffer[3] << 8) | su806RxBuffer[4];
+
+ if (tempLen <= 1024) {
+ // log_info("lengthSL\n");
+ state = lengthSL;
+ frameLength = 6 + tempLen;
+ return TRUE;
+ }
+ }
+
+ if (su806RxBufferIndex < PortSLMaxLen) {
+ return FALSE;
+ }
+
+ // log_error("lengthSL %d \n", (gw485RxBuffer[3] << 8) | gw485RxBuffer[4]);
+
+ state = wait;
+ su806RxBufferIndex--;
+ memcpy(su806RxBuffer, su806RxBuffer + 1, su806RxBufferIndex);
+ return FALSE;
+}
+
+/**
+ * @brief 状态 lengthSL
+ * @param
+ * @retval 0:解析失败
+ 1:解析成功
+ */
+#define LengthSLMaxLen frameLength
+uint8_t analysisLengthSL(void)
+{
+ /* 解析帧尾 */
+ if (su806RxBufferIndex >= LengthSLMaxLen) {
+ if (su806RxBuffer[LengthSLMaxLen - 1] == 0x17) {
+ // log_info("endFlagSL\n");
+ state = endFlagSL;
+ return TRUE;
+ }
+ }
+
+ if (su806RxBufferIndex < LengthSLMaxLen) {
+ return FALSE;
+ }
+ // log_info("endFlagSL %d\n", gw485RxBuffer[LengthSLMaxLen - 1]);
+
+ state = wait;
+ su806RxBufferIndex--;
+ memcpy(su806RxBuffer, su806RxBuffer + 1, su806RxBufferIndex);
+ return FALSE;
+}
+
+
+/**
+ * @brief 状态 endFlagSL
+ * @param
+ * @retval 0:解析失败
+ 1:解析成功
+ */
+uint8_t analysisEndFlagSL(void)
+{
+ uint32_t tempLen = 0;
+ tempLen = (su806RxBuffer[3] << 8) | su806RxBuffer[4];
+
+ if (su806RxBuffer[2] == HostMcu) {
+ hostFrameDataAnalyze(su806RxBuffer, su806RxBufferIndex);
+ su806RxBufferIndex = 0;
+ state = wait;
+ return 1;
+ }
+
+ //系统内存不足,丢去当前包
+ if (xPortGetFreeHeapSize() < tempLen + 1024) {
+ goto err;
+ }
+ uint8_t *Buff;
+
+ /* 对于从mcu处理的数据,原封不动的发送到从mcu上 */
+ if (su806RxBuffer[2] == J1
+ || su806RxBuffer[2] == J3
+ || su806RxBuffer[2] == J5
+ || su806RxBuffer[2] == J7
+ || su806RxBuffer[2] == J8
+ || su806RxBuffer[2] == J9
+ || su806RxBuffer[2] == SlaveMcu) {
+
+ Buff = (uint8_t *)pvPortMalloc(tempLen + hostQueueUartSendInfoSize + 6);
+ hostQueueUartSendInfo *sendBuff = (hostQueueUartSendInfo *)Buff;
+ sendBuff->length = tempLen + 6;
+ sendBuff->data = Buff + hostQueueUartSendInfoSize;
+ memcpy((char *)sendBuff->data, (char *)su806RxBuffer, tempLen + 6);
+
+ if (uxQueueSpacesAvailable(hostMcu_uart_Queue)) {
+ xQueueSend(hostMcu_uart_Queue, &Buff, 10);
+ }
+ /* 队列中无空间,释放内存,退出 */
+ else {
+ vPortFree(Buff);
+ }
+ }
+
+ Buff = (uint8_t *)pvPortMalloc(tempLen + hostQueueUartSendInfoSize);
+ hostQueueUartSendInfo *sendBuff = (hostQueueUartSendInfo *)Buff;
+ sendBuff->length = tempLen;
+ sendBuff->data = Buff + hostQueueUartSendInfoSize;
+ memcpy((char *)sendBuff->data, (char *)&su806RxBuffer[5], tempLen);
+
+
+ /* 通过不同的端口将数据发送到不同的地方 */
+ if (su806RxBuffer[2] == J0) {
+ if (uxQueueSpacesAvailable(J0_485_Queue)) {
+ xQueueSend(J0_485_Queue, &Buff, 10);
+ }
+ /* 队列中无空间,释放内存,退出 */
+ else {
+ vPortFree(Buff);
+ }
+ }
+ else if (su806RxBuffer[2] == J2) {
+ if (uxQueueSpacesAvailable(J2_485_Queue)) {
+ xQueueSend(J2_485_Queue, &Buff, 10);
+ }
+ /* 队列中无空间,释放内存,退出 */
+ else {
+ vPortFree(Buff);
+ }
+ }
+ else if (su806RxBuffer[2] == J4) {
+ if (uxQueueSpacesAvailable(J4_485_Queue)) {
+ xQueueSend(J4_485_Queue, &Buff, 10);
+ }
+ /* 队列中无空间,释放内存,退出 */
+ else {
+ vPortFree(Buff);
+ }
+ }
+ else if (su806RxBuffer[2] == J6) {
+ if (uxQueueSpacesAvailable(J6_485_Queue)) {
+ xQueueSend(J6_485_Queue, &Buff, 10);
+ }
+ /* 队列中无空间,释放内存,退出 */
+ else {
+ vPortFree(Buff);
+ }
+ }
+ else if (su806RxBuffer[2] == Lora) {
+ if (uxQueueSpacesAvailable(lora_uart_Queue)) {
+ xQueueSend(lora_uart_Queue, &Buff, 10);
+ }
+ /* 队列中无空间,释放内存,退出 */
+ else {
+ vPortFree(Buff);
+ }
+ }
+
+err:
+ //清零buff
+ state = wait;
+ su806RxBufferIndex = 0;
+ return 1;
+}
+
+
+/**
+ * @brief 解析智能模块发送来的数据
+ * @param device 用于接收智能模块发送来的数据的串口设备
+ * @retval
+ */
+void hostMcuUartDataAnalysis(device_handle device)
+{
+ /* 每次函数最多执行10ms */
+ static uint32_t tickstart = 0U;
+ tickstart = xTaskGetTickCount();
+
+ /* 2S未解析出来一帧数据,将数据清零 */
+ if (getTickDiff(su806UartRxTime) >= tick_2S) {
+ su806UartRxTime = xTaskGetTickCount();
+ su806RxBufferIndex = 0;
+ state = wait;
+ }
+
+ while (uart_dev_char_present(device) == 1 && ((xTaskGetTickCount() - tickstart) < 5)) {
+ su806RxBuffer[su806RxBufferIndex++] = uart_dev_in_char(device);
+ stateMachine();
+ }
+
+ if (uart_dev_char_present(device) != 1 && state != wait) {
+ stateMachine();
+ }
+}
+
+
diff --git a/CH32V303-FreeRTOS/App/application/Host/Src/hostParameter.c b/CH32V303-FreeRTOS/App/application/Host/Src/hostParameter.c
new file mode 100644
index 0000000..47227d1
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Host/Src/hostParameter.c
@@ -0,0 +1,215 @@
+#include "slaveParameter.h"
+
+typedef struct _parameterInfo {
+ float pwrOnVoltage; //安卓模块工作电压
+ float WorkCurrent; //工作电流
+ float WorkVoltage; //工作电压
+ float Temperature; //温度
+
+ uint32_t J0_485_Baud; //与J0_485通信波特率
+ uint32_t J2_485_Baud; //与J2_485通信波特率
+ uint32_t J4_485_Baud; //与J4_485通信波特率
+ uint32_t J6_485_Baud; //与J6_485通信波特率
+ uint32_t Lora_Uart_Baud; //与lora通信波特率
+}hostParameterInfo;
+
+static hostParameterInfo hostParameter = {0};
+
+#define configSize (sizeof(configInfo))
+
+/**
+ * @brief 读取配置文件参数
+ * @param
+ * @retval
+ */
+void readHostConfigParameter(void)
+{
+ /* 使用默认参数 */
+ hostParameter.J0_485_Baud = 9600;
+ hostParameter.J2_485_Baud = 9600;
+ hostParameter.J4_485_Baud = 9600;
+ hostParameter.J6_485_Baud = 9600;
+ hostParameter.Lora_Uart_Baud = 9600;
+}
+
+/**
+ * @brief 得到pwrOn电压
+ * @param
+ * @retval
+ */
+float getPwrOnVoltage(void)
+{
+ return hostParameter.pwrOnVoltage;
+}
+
+/**
+ * @brief 设置工作电流
+ * @param
+ * @retval
+ */
+void setPwrOnVoltage(float Voltage)
+{
+ hostParameter.pwrOnVoltage = Voltage;
+}
+
+/**
+ * @brief 得到工作电流
+ * @param
+ * @retval
+ */
+float getWorkCurrent(void)
+{
+ return hostParameter.WorkCurrent;
+}
+
+/**
+ * @brief 设置工作电流
+ * @param
+ * @retval
+ */
+void setWorkCurrent(float Curr)
+{
+ hostParameter.WorkCurrent = Curr;
+}
+
+/**
+ * @brief 得到工作电压
+ * @param
+ * @retval
+ */
+float getWorkVoltage(void)
+{
+ return hostParameter.WorkVoltage;
+}
+
+/**
+ * @brief 设置工作电压
+ * @param
+ * @retval
+ */
+void setWorkVoltage(float Voltage)
+{
+ hostParameter.WorkVoltage = Voltage;
+}
+
+/**
+ * @brief 得到温度
+ * @param
+ * @retval
+ */
+float getBoardTemperature(void)
+{
+ return hostParameter.Temperature;
+}
+
+/**
+ * @brief 设置温度
+ * @param
+ * @retval
+ */
+void setBoardTemperature(float Temperature)
+{
+ hostParameter.Temperature = Temperature;
+}
+
+/**
+ * @brief 得到对J0通信波特率
+ * @param
+ * @retval
+ */
+uint32_t getJ0_485_Baud(void)
+{
+ return hostParameter.J0_485_Baud;
+}
+
+/**
+ * @brief 设置J0通信波特率
+ * @param
+ * @retval
+ */
+void setJ0_485_Baud(uint32_t Baud)
+{
+ hostParameter.J0_485_Baud = Baud;
+}
+
+/**
+ * @brief 得到对J2通信波特率
+ * @param
+ * @retval
+ */
+uint32_t getJ2_485_Baud(void)
+{
+ return hostParameter.J2_485_Baud;
+}
+
+/**
+ * @brief 设置J2通信波特率
+ * @param
+ * @retval
+ */
+void setJ2_485_Baud(uint32_t Baud)
+{
+ hostParameter.J2_485_Baud = Baud;
+}
+
+/**
+ * @brief 得到对J4通信波特率
+ * @param
+ * @retval
+ */
+uint32_t getJ4_485_Baud(void)
+{
+ return hostParameter.J4_485_Baud;
+}
+
+/**
+ * @brief 设置J4通信波特率
+ * @param
+ * @retval
+ */
+void setJ4_485_Baud(uint32_t Baud)
+{
+ hostParameter.J4_485_Baud = Baud;
+}
+
+/**
+ * @brief 得到对J6通信波特率
+ * @param
+ * @retval
+ */
+uint32_t getJ6_485_Baud(void)
+{
+ return hostParameter.J6_485_Baud;
+}
+
+/**
+ * @brief 设置J4通信波特率
+ * @param
+ * @retval
+ */
+void setJ6_485_Baud(uint32_t Baud)
+{
+ hostParameter.J6_485_Baud = Baud;
+}
+
+/**
+ * @brief 得到对Lora通信波特率
+ * @param
+ * @retval
+ */
+uint32_t getLora_Uart_Baud(void)
+{
+ return hostParameter.Lora_Uart_Baud;
+}
+
+/**
+ * @brief 设置Lora通信波特率
+ * @param
+ * @retval
+ */
+void setLora_Uart_Baud(uint32_t Baud)
+{
+ hostParameter.Lora_Uart_Baud = Baud;
+}
+
+
diff --git a/CH32V303-FreeRTOS/App/application/Host/Src/hostQueueUart.c b/CH32V303-FreeRTOS/App/application/Host/Src/hostQueueUart.c
new file mode 100644
index 0000000..1bb2ff1
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Host/Src/hostQueueUart.c
@@ -0,0 +1,416 @@
+
+#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);
+}
+
diff --git a/CH32V303-FreeRTOS/App/application/Host/Src/hostRecvSlaveDataParse.c b/CH32V303-FreeRTOS/App/application/Host/Src/hostRecvSlaveDataParse.c
new file mode 100644
index 0000000..b3d3bcf
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Host/Src/hostRecvSlaveDataParse.c
@@ -0,0 +1,225 @@
+
+#include "stdio.h"
+#include
+
+#include "hostRecvSlaveDataParse.h"
+#include "hostQueueUart.h"
+
+#include "mcu_common.h"
+
+static void slaveStateMachine(void);
+
+/* 状态机函数 */
+static uint8_t slaveAnalysisWait(void);
+static uint8_t slaveAnalysisStartFlagSL(void);
+static uint8_t slaveAnalysisPortSL(void);
+static uint8_t slaveAnalysisLengthSL(void);
+static uint8_t slaveAnalysisEndFlagSL(void);
+
+
+/* 状态机状态机变量 */
+uartStateMachine slaveState = wait;
+
+/**
+ * @brief 状态机函数
+ * @param
+ * @retval
+ */
+void slaveStateMachine(void)
+{
+ if (slaveState == wait) {
+ if (slaveAnalysisWait() == TRUE) {
+ mcuUartRxTime = xTaskGetTickCount();
+ }
+ }
+
+ else if (slaveState == startFlagSL) {
+ slaveAnalysisStartFlagSL();
+ }
+
+ else if (slaveState == portSL) {
+ slaveAnalysisPortSL();
+ }
+
+ else if (slaveState == lengthSL) {
+ slaveAnalysisLengthSL();
+ }
+
+ else if (slaveState == endFlagSL) {
+ slaveAnalysisEndFlagSL();
+ }
+}
+
+/**
+ * @brief 状态 wait
+ * @param
+ * @retval 0:解析失败
+ 1:解析成功
+ */
+#define waitMaxLen 2
+uint8_t slaveAnalysisWait(void)
+{
+ if (mcuUartRxBufferIndex >= 2) {
+ /* 透传数据帧包头 */
+ if (mcuUartRxBuffer[0] == 'S' && mcuUartRxBuffer[1] == 'L') {
+ // log_info("startFlagSL\n");
+ state = startFlagSL;
+ return TRUE;
+ }
+ }
+
+ if (mcuUartRxBufferIndex < waitMaxLen) {
+ return FALSE;
+ }
+
+ state = wait;
+ mcuUartRxBufferIndex--;
+ memcpy(mcuUartRxBuffer, mcuUartRxBuffer + 1, mcuUartRxBufferIndex);
+
+ return FALSE;
+}
+
+/**
+ * @brief 状态 startFlagSL
+ * @param
+ * @retval 0:解析失败
+ 1:解析成功
+ */
+uint8_t slaveAnalysisStartFlagSL(void)
+{
+ /* 校验端口号 */
+ if (mcuUartRxBuffer[2] < 13) {
+ // log_info("portSL\n");
+ state = portSL;
+ return TRUE;
+ }
+
+ // log_error("portSL %d \n", gw485RxBuffer[2]);
+ state = wait;
+ mcuUartRxBufferIndex--;
+ memcpy(mcuUartRxBuffer, mcuUartRxBuffer + 1, mcuUartRxBufferIndex);
+ return FALSE;
+}
+
+/**
+ * @brief 状态 portSL
+ * @param
+ * @retval 0:解析失败
+ 1:解析成功
+ */
+#define PortSLMaxLen 5
+uint8_t slaveAnalysisPortSL(void)
+{
+ /* 解析数据包的度 */
+ if (mcuUartRxBufferIndex >= PortSLMaxLen) {
+ uint32_t tempLen = 0;
+ tempLen = (mcuUartRxBuffer[3] << 8) | mcuUartRxBuffer[4];
+
+ if (tempLen <= 1024) {
+ // log_info("lengthSL\n");
+ state = lengthSL;
+ frameLength = 6 + tempLen;
+ return TRUE;
+ }
+ }
+
+ if (mcuUartRxBufferIndex < PortSLMaxLen) {
+ return FALSE;
+ }
+
+ // log_error("lengthSL %d \n", (gw485RxBuffer[3] << 8) | gw485RxBuffer[4]);
+
+ state = wait;
+ mcuUartRxBufferIndex--;
+ memcpy(mcuUartRxBuffer, mcuUartRxBuffer + 1, mcuUartRxBufferIndex);
+ return FALSE;
+}
+
+/**
+ * @brief 状态 lengthSL
+ * @param
+ * @retval 0:解析失败
+ 1:解析成功
+ */
+#define LengthSLMaxLen frameLength
+uint8_t slaveAnalysisLengthSL(void)
+{
+ /* 解析帧尾 */
+ if (mcuUartRxBufferIndex >= LengthSLMaxLen) {
+ if (mcuUartRxBuffer[LengthSLMaxLen - 1] == 0x17) {
+ // log_info("endFlagSL\n");
+ state = endFlagSL;
+ return TRUE;
+ }
+ }
+
+ if (mcuUartRxBufferIndex < LengthSLMaxLen) {
+ return FALSE;
+ }
+ // log_info("endFlagSL %d\n", gw485RxBuffer[LengthSLMaxLen - 1]);
+
+ state = wait;
+ mcuUartRxBufferIndex--;
+ memcpy(mcuUartRxBuffer, mcuUartRxBuffer + 1, mcuUartRxBufferIndex);
+ return FALSE;
+}
+
+/**
+ * @brief 状态 endFlagSL
+ * @param
+ * @retval 0:解析失败
+ 1:解析成功
+ */
+uint8_t slaveAnalysisEndFlagSL(void)
+{
+ uint16_t tempLen = ((mcuUartRxBuffer[3] << 8) | mcuUartRxBuffer[4]) + 6;
+
+ //系统内存不足,丢去当前包
+ if (xPortGetFreeHeapSize() < tempLen + 1024) {
+ //清零buff
+ state = wait;
+ su806RxBufferIndex = 0;
+ return 1;
+ }
+
+ uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen + hostQueueUartSendInfoSize);
+ hostQueueUartSendInfo *sendBuff = (hostQueueUartSendInfo *)Buff;
+ sendBuff->length = tempLen;
+ sendBuff->data = Buff + hostQueueUartSendInfoSize;
+ memcpy((char *)sendBuff->data, (char *)su806RxBuffer, tempLen);
+
+
+ if (uxQueueSpacesAvailable(su806_uart_Queue)) {
+ xQueueSend(su806_uart_Queue, &Buff, 10);
+ }
+ /* 队列中无空间,释放内存,退出 */
+ else {
+ vPortFree(Buff);
+ }
+
+ return 0;
+}
+
+void hostRecvSlaveDataParse(device_handle device)
+{
+ /* 每次函数最多执行10ms */
+ static uint32_t tickstart = 0U;
+ tickstart = xTaskGetTickCount();
+
+ /* 2S未解析出来一帧数据,将数据清零 */
+ if (getTickDiff(mcuUartRxTime) >= tick_2S) {
+ mcuUartRxTime = xTaskGetTickCount();
+ mcuUartRxBufferIndex = 0;
+ state = wait;
+ }
+
+ while (uart_dev_char_present(device) == 1 && ((xTaskGetTickCount() - tickstart) < 5)) {
+ mcuUartRxBuffer[mcuUartRxBufferIndex++] = uart_dev_in_char(device);
+ slaveStateMachine();
+ }
+
+ if (uart_dev_char_present(device) != 1 && state != wait) {
+ slaveStateMachine();
+ }
+}
+
diff --git a/CH32V303-FreeRTOS/App/application/Host/Src/hostSensorDataParse.c b/CH32V303-FreeRTOS/App/application/Host/Src/hostSensorDataParse.c
new file mode 100644
index 0000000..6bae7db
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Host/Src/hostSensorDataParse.c
@@ -0,0 +1,361 @@
+
+#include "hostSensorDataParse.h"
+#include "hostQueueUart.h"
+
+#include "mcu_common.h"
+
+
+/**
+ * @brief 接收J0口传来的数据
+ * @param
+ * @retval
+ */
+void J0_SensorDataAnalysis(void)
+{
+ static uint32_t tick;
+
+ if (J0_485RxBufferIndex == 0) {
+ tick = xTaskGetTickCount();
+ }
+
+ /* 单次进入最多6ms(3个时钟周期),串口中有数据 */
+ uint32_t nowTick = xTaskGetTickCount();
+ while ((getTickDiff(nowTick) < 3)
+ && (uart_dev_char_present(g_J0_handle) == 1)
+ && (maxdataLen > J0_485RxBufferIndex)) {
+ J0_485RxBuffer[J0_485RxBufferIndex++] = uart_dev_in_char(g_J0_handle);
+ }
+
+ /* 当时间到达或者数据量到达,就打包发送给智能模块 */
+ if ((J0_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
+ uint32_t tempLen = 6 + J0_485RxBufferIndex + hostQueueUartSendInfoSize;
+ if (xPortGetFreeHeapSize() < tempLen + 1024) {
+ J0_485RxBufferIndex = 0;
+ return;
+ }
+
+ uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
+ hostQueueUartSendInfo *sendBuff = (hostQueueUartSendInfo *)Buff;
+ sendBuff->length = 6 + J0_485RxBufferIndex;
+ sendBuff->data = Buff + sizeof(hostQueueUartSendInfo);
+ uint8_t *send = sendBuff->data;
+
+ /* 起始标志 */
+ *send = 'S';
+ *(send + 1) = 'L';
+
+ /* 端口号 */
+ send += 2;
+ *send = J0;
+
+ /* 数据包长度 */
+ send += 1;
+ *send = (uint8_t)(J0_485RxBufferIndex >> 8);
+ *(send + 1) = (uint8_t)(J0_485RxBufferIndex);
+
+ /* 数据包 */
+ send += 2;
+ memcpy((char *)send, (char *)J0_485RxBuffer, J0_485RxBufferIndex);
+
+ /* 结束标志 */
+ send += J0_485RxBufferIndex;
+ *send = 0x17;
+
+ /* 队列中有空间,则将发送数据 */
+ if (uxQueueSpacesAvailable(su806_uart_Queue)) {
+ xQueueSend(su806_uart_Queue, &Buff, 10);
+ }
+ /* 队列无空间,将数据丢弃 */
+ else {
+ vPortFree(Buff);
+ }
+
+ /* 发送完成或遇到问题,将buff中的数据清零 */
+ J0_485RxBufferIndex = 0;
+ }
+}
+
+/**
+ * @brief 接收J2口传来的数据
+ * @param
+ * @retval
+ */
+void J2_SensorDataAnalysis(void)
+{
+ static uint32_t tick;
+
+ if (J2_485RxBufferIndex == 0) {
+ tick = xTaskGetTickCount();
+ }
+
+ /* 单次进入最多6ms(3个时钟周期),串口中有数据 */
+ uint32_t nowTick = xTaskGetTickCount();
+ while ((getTickDiff(nowTick) < 3)
+ && (uart_dev_char_present(g_J2_handle) == 1)
+ && (maxdataLen > J2_485RxBufferIndex)) {
+ J2_485RxBuffer[J2_485RxBufferIndex++] = uart_dev_in_char(g_J2_handle);
+ }
+
+ /* 当时间到达或者数据量到达,就打包发送给智能模块 */
+ if ((J2_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
+ uint32_t tempLen = 6 + J2_485RxBufferIndex + hostQueueUartSendInfoSize;
+ if (xPortGetFreeHeapSize() < tempLen + 1024) {
+ J2_485RxBufferIndex = 0;
+ return;
+ }
+
+ uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
+ hostQueueUartSendInfo *sendBuff = (hostQueueUartSendInfo *)Buff;
+ sendBuff->length = 6 + J2_485RxBufferIndex;
+ sendBuff->data = Buff + sizeof(hostQueueUartSendInfo);
+ uint8_t *send = sendBuff->data;
+
+ /* 起始标志 */
+ *send = 'S';
+ *(send + 1) = 'L';
+
+ /* 端口号 */
+ send += 2;
+ *send = J2;
+
+ /* 数据包长度 */
+ send += 1;
+ *send = (uint8_t)(J2_485RxBufferIndex >> 8);
+ *(send + 1) = (uint8_t)(J2_485RxBufferIndex);
+
+ /* 数据包 */
+ send += 2;
+ memcpy((char *)send, (char *)J2_485RxBuffer, J2_485RxBufferIndex);
+
+ /* 结束标志 */
+ send += J2_485RxBufferIndex;
+ *send = 0x17;
+
+ /* 队列中有空间,则将发送数据 */
+ if (uxQueueSpacesAvailable(su806_uart_Queue)) {
+ xQueueSend(su806_uart_Queue, &Buff, 10);
+ }
+ /* 队列无空间,将数据丢弃 */
+ else {
+ vPortFree(Buff);
+ }
+
+ /* 发送完成或遇到问题,将buff中的数据清零 */
+ J2_485RxBufferIndex = 0;
+ }
+}
+
+/**
+ * @brief 接收J4口传来的数据
+ * @param
+ * @retval
+ */
+void J4_SensorDataAnalysis(void)
+{
+ static uint32_t tick;
+
+ if (J4_485RxBufferIndex == 0) {
+ tick = xTaskGetTickCount();
+ }
+
+ /* 单次进入最多6ms(3个时钟周期),串口中有数据 */
+ uint32_t nowTick = xTaskGetTickCount();
+ while ((getTickDiff(nowTick) < 3)
+ && (uart_dev_char_present(g_J4_handle) == 1)
+ && (maxdataLen > J4_485RxBufferIndex)) {
+ J4_485RxBuffer[J4_485RxBufferIndex++] = uart_dev_in_char(g_J4_handle);
+ }
+
+ /* 当时间到达或者数据量到达,就打包发送给智能模块 */
+ if ((J4_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
+ uint32_t tempLen = 6 + J4_485RxBufferIndex + hostQueueUartSendInfoSize;
+ if (xPortGetFreeHeapSize() < tempLen + 1024) {
+ J4_485RxBufferIndex = 0;
+ return;
+ }
+
+ uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
+ hostQueueUartSendInfo *sendBuff = (hostQueueUartSendInfo *)Buff;
+ sendBuff->length = 6 + J4_485RxBufferIndex;
+ sendBuff->data = Buff + sizeof(hostQueueUartSendInfo);
+ uint8_t *send = sendBuff->data;
+
+ /* 起始标志 */
+ *send = 'S';
+ *(send + 1) = 'L';
+
+ /* 端口号 */
+ send += 2;
+ *send = J4;
+
+ /* 数据包长度 */
+ send += 1;
+ *send = (uint8_t)(J4_485RxBufferIndex >> 8);
+ *(send + 1) = (uint8_t)(J4_485RxBufferIndex);
+
+ /* 数据包 */
+ send += 2;
+ memcpy((char *)send, (char *)J4_485RxBuffer, J4_485RxBufferIndex);
+
+ /* 结束标志 */
+ send += J4_485RxBufferIndex;
+ *send = 0x17;
+
+ /* 队列中有空间,则将发送数据 */
+ if (uxQueueSpacesAvailable(su806_uart_Queue)) {
+ xQueueSend(su806_uart_Queue, &Buff, 10);
+ }
+ /* 队列无空间,将数据丢弃 */
+ else {
+ vPortFree(Buff);
+ }
+
+ /* 发送完成或遇到问题,将buff中的数据清零 */
+ J4_485RxBufferIndex = 0;
+ }
+}
+
+/**
+ * @brief 接收J6口传来的数据
+ * @param
+ * @retval
+ */
+void J6_SensorDataAnalysis(void)
+{
+ static uint32_t tick;
+
+ if (J6_485RxBufferIndex == 0) {
+ tick = xTaskGetTickCount();
+ }
+
+ /* 单次进入最多6ms(3个时钟周期),串口中有数据 */
+ uint32_t nowTick = xTaskGetTickCount();
+ while ((getTickDiff(nowTick) < 3)
+ && (uart_dev_char_present(g_J6_handle) == 1)
+ && (maxdataLen > J6_485RxBufferIndex)) {
+ J6_485RxBuffer[J6_485RxBufferIndex++] = uart_dev_in_char(g_J6_handle);
+ }
+
+ /* 当时间到达或者数据量到达,就打包发送给智能模块 */
+ if ((J6_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
+ uint32_t tempLen = 6 + J6_485RxBufferIndex + hostQueueUartSendInfoSize;
+ if (xPortGetFreeHeapSize() < tempLen + 1024) {
+ J6_485RxBufferIndex = 0;
+ return;
+ }
+
+ uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
+ hostQueueUartSendInfo *sendBuff = (hostQueueUartSendInfo *)Buff;
+ sendBuff->length = 6 + J6_485RxBufferIndex;
+ sendBuff->data = Buff + sizeof(hostQueueUartSendInfo);
+ uint8_t *send = sendBuff->data;
+
+ /* 起始标志 */
+ *send = 'S';
+ *(send + 1) = 'L';
+
+ /* 端口号 */
+ send += 2;
+ *send = J6;
+
+ /* 数据包长度 */
+ send += 1;
+ *send = (uint8_t)(J6_485RxBufferIndex >> 8);
+ *(send + 1) = (uint8_t)(J6_485RxBufferIndex);
+
+ /* 数据包 */
+ send += 2;
+ memcpy((char *)send, (char *)J6_485RxBuffer, J6_485RxBufferIndex);
+
+ /* 结束标志 */
+ send += J6_485RxBufferIndex;
+ *send = 0x17;
+
+ /* 队列中有空间,则将发送数据 */
+ if (uxQueueSpacesAvailable(su806_uart_Queue)) {
+ xQueueSend(su806_uart_Queue, &Buff, 10);
+ }
+ /* 队列无空间,将数据丢弃 */
+ else {
+ vPortFree(Buff);
+ }
+
+ /* 发送完成或遇到问题,将buff中的数据清零 */
+ J6_485RxBufferIndex = 0;
+ }
+}
+
+/**
+ * @brief 接收Lora口传来的数据
+ * @param
+ * @retval
+ */
+void Lora_SensorDataAnalysis(void)
+{
+ static uint32_t tick;
+
+ if (loraRxBufferIndex == 0) {
+ tick = xTaskGetTickCount();
+ }
+
+ /* 单次进入最多6ms(3个时钟周期),串口中有数据 */
+ uint32_t nowTick = xTaskGetTickCount();
+ while ((getTickDiff(nowTick) < 3)
+ && (uart_dev_char_present(g_Lora_handle) == 1)
+ && (maxdataLen > loraRxBufferIndex)) {
+ loraRxBuffer[loraRxBufferIndex++] = uart_dev_in_char(g_Lora_handle);
+ }
+
+ /* 当时间到达或者数据量到达,就打包发送给智能模块 */
+ if ((loraRxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
+ uint32_t tempLen = 6 + loraRxBufferIndex + hostQueueUartSendInfoSize;
+ if (xPortGetFreeHeapSize() < tempLen + 1024) {
+ loraRxBufferIndex = 0;
+ return;
+ }
+
+ uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
+ hostQueueUartSendInfo *sendBuff = (hostQueueUartSendInfo *)Buff;
+ sendBuff->length = 6 + loraRxBufferIndex;
+ sendBuff->data = Buff + sizeof(hostQueueUartSendInfo);
+ uint8_t *send = sendBuff->data;
+
+ /* 起始标志 */
+ *send = 'S';
+ *(send + 1) = 'L';
+
+ /* 端口号 */
+ send += 2;
+ *send = Lora;
+
+ /* 数据包长度 */
+ send += 1;
+ *send = (uint8_t)(loraRxBufferIndex >> 8);
+ *(send + 1) = (uint8_t)(loraRxBufferIndex);
+
+ /* 数据包 */
+ send += 2;
+ memcpy((char *)send, (char *)loraRxBuffer, loraRxBufferIndex);
+
+ /* 结束标志 */
+ send += loraRxBufferIndex;
+ *send = 0x17;
+
+ /* 队列中有空间,则将发送数据 */
+ if (uxQueueSpacesAvailable(su806_uart_Queue)) {
+ xQueueSend(su806_uart_Queue, &Buff, 10);
+ }
+ /* 队列无空间,将数据丢弃 */
+ else {
+ vPortFree(Buff);
+ }
+
+ /* 发送完成或遇到问题,将buff中的数据清零 */
+ loraRxBufferIndex = 0;
+ }
+}
+
+
+
+
+
diff --git a/CH32V303-FreeRTOS/App/application/Host/Src/slaveFreerotsTask.c b/CH32V303-FreeRTOS/App/application/Host/Src/slaveFreerotsTask.c
new file mode 100644
index 0000000..c5456f9
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Host/Src/slaveFreerotsTask.c
@@ -0,0 +1,44 @@
+
+#include "stdio.h"
+
+#include "slaveFreerotsTask.h"
+
+// #include "HD_Flash.h"
+#include "FM_GPIO.h"
+#include "uart_dev.h"
+#include "FM_ADC.h"
+
+#include "parameter.h"
+
+
+
+
+/**
+ * @brief 启动
+ * @param
+ * @retval
+ */
+void slaveStartApp(void)
+{
+ SlaveMcu_GPIO_Init();
+ readConfigParameter();
+ SlaveMcu_uartBuf_Init(256, 1024);
+ Init_J1_485(getJ1_485_Baud());
+ Init_J3_485(getJ1_485_Baud());
+ Init_J5_485(getJ1_485_Baud());
+ Init_J7_485(getJ1_485_Baud());
+ Init_J8_485(getJ1_485_Baud());
+ Init_J9_485(getJ1_485_Baud());
+ Init_Mcu_Uart(115200);
+ proportionalInt();
+ FM_ADC_Init();
+
+ while (1) {
+
+ };
+ vTaskStartScheduler();
+}
+
+
+
+
diff --git a/CH32V303-FreeRTOS/App/application/Inc/busIdleDetection.h b/CH32V303-FreeRTOS/App/application/Inc/busIdleDetection.h
deleted file mode 100644
index b57ab3d..0000000
--- a/CH32V303-FreeRTOS/App/application/Inc/busIdleDetection.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef APP_BUS_IDLE_DETECTION_H_
-#define APP_BUS_IDLE_DETECTION_H_
-
-#include "uart_dev.h"
-
-#include "FreeRTOS.h"
-#include "event_groups.h"
-
-
-
-#ifdef RS485BUSIDLE1
-void softwareTimeInit(void);
-
-void J1_485_IN_IDLE(void);
-void J2_485_IN_IDLE(void);
-void J3_485_IN_IDLE(void);
-void J4_485_IN_IDLE(void);
-void J5_0_485_IN_IDLE(void);
-
-void J1_485_IN_RXNE(void);
-void J2_485_IN_RXNE(void);
-void J3_485_IN_RXNE(void);
-void J4_485_IN_RXNE(void);
-void J5_0_485_IN_RXNE(void);
-#endif
-
-uint8_t getRs485State(device_handle device);
-uint8_t getUartState(device_handle device);
-
-
-#endif
diff --git a/CH32V303-FreeRTOS/App/application/Inc/downUartParse.h b/CH32V303-FreeRTOS/App/application/Inc/downUartParse.h
deleted file mode 100644
index 7b3afef..0000000
--- a/CH32V303-FreeRTOS/App/application/Inc/downUartParse.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef APP_DOWN_UART_PARSE_
-#define APP_DOWN_UART_PARSE_
-
-#include "uart_dev.h"
-
-extern uint16_t checkModebusCrc(uint8_t *arr_buff, uint8_t len);
-
-// void downSensorDataAnalysis(device_handle device);
-
-
-uint32_t getTickDiff(uint32_t lastTick);
-
-void J1_SensorDataAnalysis(void);
-void J2_SensorDataAnalysis(void);
-void J3_SensorDataAnalysis(void);
-void J4_SensorDataAnalysis(void);
-void J5_0_SensorDataAnalysis(void);
-
-
-#endif
\ No newline at end of file
diff --git a/CH32V303-FreeRTOS/App/application/Inc/parameter.h b/CH32V303-FreeRTOS/App/application/Inc/parameter.h
deleted file mode 100644
index 1d3a4ca..0000000
--- a/CH32V303-FreeRTOS/App/application/Inc/parameter.h
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef APP_PARAMETER_H_
-#define APP_PARAMETER_H_
-
-#include "flash.h"
-#include "upUartParse.h"
-
-
-#pragma pack(push, 1)
-
-typedef struct _configInfo {
- uint32_t upWard_Uart_Baud; //与网关通信波特率
- uint32_t J1_485_Baud; //与J1_485通信波特率
- uint32_t J2_485_Baud; //与J2_485通信波特率
- uint32_t J3_485_Baud; //与J3_485通信波特率
- uint32_t J4_485_Baud; //与J4_485通信波特率
- uint32_t J5_0_485_Baud; //与J5_0_485通信波特率
-
- uint16_t crc; //crc校验
-} configInfo;
-
-#pragma pack(pop)
-
-void readConfigParameter(void);
-void writeConfigParameter(configInfo inConfigInfo);
-
-float getWorkCurrent(void);
-void setWorkCurrent(float Curr);
-float getWorkVoltage(void);
-void setWorkVoltage(float Voltage);
-float getTemperature(void);
-void setTemperature(float Temperature);
-uint32_t getUpWard_Uart_Baud(void);
-uint32_t getJ1_485_Baud(void);
-uint32_t getJ2_485_Baud(void);
-uint32_t getJ3_485_Baud(void);
-uint32_t getJ4_485_Baud(void);
-uint32_t getJ5_0_485_Baud(void);
-
-
-
-#endif
\ No newline at end of file
diff --git a/CH32V303-FreeRTOS/App/application/Inc/queueUart.h b/CH32V303-FreeRTOS/App/application/Inc/queueUart.h
deleted file mode 100644
index 6e99aa1..0000000
--- a/CH32V303-FreeRTOS/App/application/Inc/queueUart.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef APP_QUEUE_UART_H_
-#define APP_QUEUE_UART_H_
-
-#include "pDebug.h"
-#include "FreeRTOS.h"
-#include "queue.h"
-
-/* 存入队列中的数据格式 */
-typedef struct _queueUartSendInfo{
- uint32_t length; //数据长度
- uint8_t *data; //数据
-} queueUartSendInfo;
-#define queueUartSendInfoSize sizeof(queueUartSendInfo)
-
-/* 分时复用485存入队列中的数据格式 */
-typedef struct _queueTimeShareSendInfo{
- uint8_t connectPort; //发送的端口
- uint32_t length; //数据长度
- uint8_t *data; //数据
-} queueTimeShareSendInfo;
-#define queueTimeShareSendInfoSize sizeof(queueTimeShareSendInfo)
-
-extern QueueHandle_t J1_485_Queue;
-extern QueueHandle_t J2_485_Queue;
-extern QueueHandle_t J3_485_Queue;
-extern QueueHandle_t J4_485_Queue;
-extern QueueHandle_t J5_0_485_Queue;
-extern QueueHandle_t upward_uart_Queue;
-extern QueueSetHandle_t uart_Queue;
-
-void uartQueueInit(void);
-void uartQueueSend(void);
-void binarySemaphoreInit(void);
-void binarySemaphoreFreeMemory(void);
-
-#endif
diff --git a/CH32V303-FreeRTOS/App/application/Inc/upUartParse.h b/CH32V303-FreeRTOS/App/application/Inc/upUartParse.h
deleted file mode 100644
index 099d242..0000000
--- a/CH32V303-FreeRTOS/App/application/Inc/upUartParse.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef APP_UART_PARSE_
-#define APP_UART_PARSE_
-
-#include "uart_dev.h"
-
-/* 功能码 */
-typedef enum {
- SL_Function_Code_Read_Register = 0x30, /* 读寄存器数据 */
- SL_Function_Code_Write_Register = 0x10, /* 写寄存器数据 */
- SL_Function_Code_Distribution_Profile = 0xD0, /* 配置文件下发 */
- SL_Function_Code_Read_Profile = 0xD1, /* 配置文件读取 */
-}SL_MsgFunctionCode;
-
-/* 寄存器地址 */
-typedef enum {
- GW_Register_WorkCurrent = 0x0000,
- GW_Register_WorkVoltage = 0x0001,
- GW_Register_Temperature = 0x0002,
- GW_Register_Port1_Power = 0x0003,
- GW_Register_Port2_Power = 0x0004,
- GW_Register_Port3_Power = 0x0005,
- GW_Register_Port4_Power = 0x0006,
- GW_Register_Port5_Power = 0x0007,
- GW_Register_Port6_Power = 0x0008,
- GW_Register_Port7_Power = 0x0009,
- GW_Register_Port8_Power = 0x000A,
- GW_Register_Port9_Power = 0x000B,
-}SL_GateWay_MsgRegister;
-
-uint16_t checkModebusCrc(uint8_t *arr_buff, uint8_t len);
-void upwardUartDataAnalysis(device_handle device);
-
-#endif
\ No newline at end of file
diff --git a/CH32V303-FreeRTOS/App/application/Slave/Inc/slave485DataParse.h b/CH32V303-FreeRTOS/App/application/Slave/Inc/slave485DataParse.h
new file mode 100644
index 0000000..6fe2a06
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Slave/Inc/slave485DataParse.h
@@ -0,0 +1,13 @@
+#ifndef _APP_SLAVE_485_DATA_PARSE_H_
+#define _APP_SLAVE_485_DATA_PARSE_H_
+
+#include "uart_dev.h"
+
+void J1_SensorDataAnalysis(void);
+void J3_SensorDataAnalysis(void);
+void J5_SensorDataAnalysis(void);
+void J7_SensorDataAnalysis(void);
+void J8_SensorDataAnalysis(void);
+void J9_SensorDataAnalysis(void);
+
+#endif
diff --git a/CH32V303-FreeRTOS/App/application/Slave/Inc/slaveBusIdleDetection.h b/CH32V303-FreeRTOS/App/application/Slave/Inc/slaveBusIdleDetection.h
new file mode 100644
index 0000000..0705841
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Slave/Inc/slaveBusIdleDetection.h
@@ -0,0 +1,34 @@
+
+#ifndef _APP_SLAVE_BUS_IDLE_DETECTION_H_
+#define _APP_SLAVE_BUS_IDLE_DETECTION_H_
+
+#include "uart_dev.h"
+
+#include "FreeRTOS.h"
+#include "event_groups.h"
+#include "semphr.h"
+
+extern SemaphoreHandle_t J1_IDLESemaphore;
+extern SemaphoreHandle_t J3_IDLESemaphore;
+extern SemaphoreHandle_t J5_IDLESemaphore;
+extern SemaphoreHandle_t J7_IDLESemaphore;
+extern SemaphoreHandle_t J8_IDLESemaphore;
+extern SemaphoreHandle_t J9_IDLESemaphore;
+
+void slaveIdleInit(void);
+
+void J1_485_IN_IDLE(void);
+void J3_485_IN_IDLE(void);
+void J5_485_IN_IDLE(void);
+void J7_485_IN_IDLE(void);
+void J8_485_IN_IDLE(void);
+void J9_485_IN_IDLE(void);
+
+void J1_485_IN_RXNE(void);
+void J3_485_IN_RXNE(void);
+void J5_485_IN_RXNE(void);
+void J7_485_IN_RXNE(void);
+void J8_485_IN_RXNE(void);
+void J9_485_IN_RXNE(void);
+
+#endif
diff --git a/CH32V303-FreeRTOS/App/application/Slave/Inc/slaveFreerotsTask.h b/CH32V303-FreeRTOS/App/application/Slave/Inc/slaveFreerotsTask.h
new file mode 100644
index 0000000..1ff4b78
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Slave/Inc/slaveFreerotsTask.h
@@ -0,0 +1,11 @@
+#ifndef APP_FREERTOS_TASK_H_
+#define APP_FREERTOS_TASK_H_
+
+#include "pDebug.h"
+#include "FreeRTOS.h"
+#include "task.h"
+
+void slaveStartApp(void);
+
+
+#endif
diff --git a/CH32V303-FreeRTOS/App/application/Slave/Inc/slaveMcuComm.h b/CH32V303-FreeRTOS/App/application/Slave/Inc/slaveMcuComm.h
new file mode 100644
index 0000000..902cc1e
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Slave/Inc/slaveMcuComm.h
@@ -0,0 +1,9 @@
+#ifndef _APP_SLAVE_MCU_COMM_H_
+#define _APP_SLAVE_MCU_COMM_H_
+
+#include "stdio.h"
+
+void slaveFrameDataAnalyze(uint8_t *buff, uint8_t dataLen);
+
+
+# endif
diff --git a/CH32V303-FreeRTOS/App/application/Slave/Inc/slaveMcuDataParse.h b/CH32V303-FreeRTOS/App/application/Slave/Inc/slaveMcuDataParse.h
new file mode 100644
index 0000000..60d652e
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Slave/Inc/slaveMcuDataParse.h
@@ -0,0 +1,16 @@
+#ifndef _APP_SLAVE_MCU_DATA_PARSE_H_
+#define _APP_SLAVE_MCU_DATA_PARSE_H_
+
+#include "stdio.h"
+
+#include "FreeRTOS.h"
+#include "task.h"
+
+#include "mcu_common.h"
+
+#include "slaveQueueUart.h"
+
+// void slaveMcuDataParse(void);
+void slaveMcuUartDataAnalysis(device_handle device);
+
+#endif
diff --git a/CH32V303-FreeRTOS/App/application/Slave/Inc/slaveParameter.h b/CH32V303-FreeRTOS/App/application/Slave/Inc/slaveParameter.h
new file mode 100644
index 0000000..2879baa
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Slave/Inc/slaveParameter.h
@@ -0,0 +1,34 @@
+#ifndef APP_SLAVE_PARAMETER_H_
+#define APP_SLAVE_PARAMETER_H_
+
+#include "stdio.h"
+
+//通过该格式存入flash中
+typedef struct _configInfo {
+ uint32_t J1_485_Baud; //与J1_485通信波特率
+ uint32_t J3_485_Baud; //与J3_485通信波特率
+ uint32_t J5_485_Baud; //与J5_485通信波特率
+ uint32_t J7_485_Baud; //与J7_485通信波特率
+ uint32_t J8_485_Baud; //与J8_485通信波特率
+ uint32_t J9_485_Baud; //与J9_485通信波特率
+
+ uint16_t crc; //crc校验
+} slaveConfigInfo;
+
+void readSlaveConfigParameter(void);
+// void writeConfigParameter(configInfo inConfigInfo);
+
+uint32_t getJ1_485_Baud(void);
+void setJ1_485_Baud(uint32_t Baud);
+uint32_t getJ3_485_Baud(void);
+void setJ3_485_Baud(uint32_t Baud);
+uint32_t getJ5_485_Baud(void);
+void setJ5_485_Baud(uint32_t Baud);
+uint32_t getJ7_485_Baud(void);
+void setJ7_485_Baud(uint32_t Baud);
+uint32_t getJ8_485_Baud(void);
+void setJ8_485_Baud(uint32_t Baud);
+uint32_t getJ9_485_Baud(void);
+void setJ9_485_Baud(uint32_t Baud);
+
+#endif
diff --git a/CH32V303-FreeRTOS/App/application/Slave/Inc/slaveQueueUart.h b/CH32V303-FreeRTOS/App/application/Slave/Inc/slaveQueueUart.h
new file mode 100644
index 0000000..8333c93
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Slave/Inc/slaveQueueUart.h
@@ -0,0 +1,47 @@
+
+#ifndef APP_SLAVE_QUEUE_UART_H_
+#define APP_SLAVE_QUEUE_UART_H_
+
+#include "pDebug.h"
+#include "FreeRTOS.h"
+#include "queue.h"
+#include "uart_dev.h"
+
+/* 存入队列中的数据格式 */
+typedef struct _slaveQueueUartSendInfo{
+ uint32_t length; //数据长度
+ uint8_t *data; //数据
+} slaveQueueUartSendInfo;
+#define slaveQueueUartSendInfoSize sizeof(slaveQueueUartSendInfo)
+
+extern QueueHandle_t J1_485_Queue;
+extern QueueHandle_t J3_485_Queue;
+extern QueueHandle_t J5_485_Queue;
+extern QueueHandle_t J7_485_Queue;
+extern QueueHandle_t J8_485_Queue;
+extern QueueHandle_t J9_485_Queue;
+extern QueueHandle_t mcu_uart_Queue;
+
+uint8_t slaveUartInterruptSend(device_handle device, uint8_t *data, uint16_t len);
+
+void slaveUartSendInit(void);
+
+void J1QueueSend(void);
+void J3QueueSend(void);
+void J5QueueSend(void);
+void J7QueueSend(void);
+void J8QueueSend(void);
+void J9QueueSend(void);
+void slaveMcuQueueSend(void);
+
+void binarySemaphoreFreeMemory(void);
+
+void J1_485_IN_TXE(void);
+void J3_485_IN_TXE(void);
+void J5_485_IN_TXE(void);
+void J7_485_IN_TXE(void);
+void J8_485_IN_TXE(void);
+void J9_485_IN_TXE(void);
+void slaveMcu_uart_IN_TXE(void);
+
+#endif
diff --git a/CH32V303-FreeRTOS/App/application/Slave/Src/slave485DataParse.c b/CH32V303-FreeRTOS/App/application/Slave/Src/slave485DataParse.c
new file mode 100644
index 0000000..5236e8d
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Slave/Src/slave485DataParse.c
@@ -0,0 +1,428 @@
+
+#include "slave485DataParse.h"
+#include "slaveQueueUart.h"
+
+#include "mcu_common.h"
+
+/**
+ * @brief 接收J1口传来的数据
+ * @param
+ * @retval
+ */
+void J1_SensorDataAnalysis(void)
+{
+ static uint32_t tick;
+
+ if (J1_485RxBufferIndex == 0) {
+ tick = xTaskGetTickCount();
+ }
+
+ /* 单次进入最多6ms(3个时钟周期),串口中有数据 */
+ uint32_t nowTick = xTaskGetTickCount();
+ while ((getTickDiff(nowTick) < 3)
+ && (uart_dev_char_present(g_J1_handle) == 1)
+ && (maxdataLen > J1_485RxBufferIndex)) {
+ J1_485RxBuffer[J1_485RxBufferIndex++] = uart_dev_in_char(g_J1_handle);
+ }
+
+ /* 当时间到达或者数据量到达,就打包发送给智能模块 */
+ if ((J1_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
+ uint32_t tempLen = 6 + J1_485RxBufferIndex + slaveQueueUartSendInfoSize;
+ if (xPortGetFreeHeapSize() < tempLen + 1024) {
+ J1_485RxBufferIndex = 0;
+ return;
+ }
+
+ uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
+ slaveQueueUartSendInfo *sendBuff = (slaveQueueUartSendInfo *)Buff;
+ sendBuff->length = 6 + J1_485RxBufferIndex;
+ sendBuff->data = Buff + sizeof(slaveQueueUartSendInfo);
+ uint8_t *send = sendBuff->data;
+
+ /* 起始标志 */
+ *send = 'S';
+ *(send + 1) = 'L';
+
+ /* 端口号 */
+ send += 2;
+ *send = J1;
+
+ /* 数据包长度 */
+ send += 1;
+ *send = (uint8_t)(J1_485RxBufferIndex >> 8);
+ *(send + 1) = (uint8_t)(J1_485RxBufferIndex);
+
+ /* 数据包 */
+ send += 2;
+ memcpy((char *)send, (char *)J1_485RxBuffer, J1_485RxBufferIndex);
+
+ /* 结束标志 */
+ send += J1_485RxBufferIndex;
+ *send = 0x17;
+
+ /* 队列中有空间,则将发送数据 */
+ if (uxQueueSpacesAvailable(mcu_uart_Queue)) {
+ xQueueSend(mcu_uart_Queue, &Buff, 10);
+ }
+ /* 队列无空间,将数据丢弃 */
+ else {
+ vPortFree(Buff);
+ }
+
+ /* 发送完成或遇到问题,将buff中的数据清零 */
+ J1_485RxBufferIndex = 0;
+ }
+}
+
+/**
+ * @brief 接收J3口传来的数据
+ * @param
+ * @retval
+ */
+void J3_SensorDataAnalysis(void)
+{
+ static uint32_t tick;
+
+ if (J3_485RxBufferIndex == 0) {
+ tick = xTaskGetTickCount();
+ }
+
+ /* 单次进入最多6ms(3个时钟周期),串口中有数据 */
+ uint32_t nowTick = xTaskGetTickCount();
+ while ((getTickDiff(nowTick) < 3)
+ && (uart_dev_char_present(g_J3_handle) == 1)
+ && (maxdataLen > J3_485RxBufferIndex)) {
+ J3_485RxBuffer[J3_485RxBufferIndex++] = uart_dev_in_char(g_J3_handle);
+ }
+
+ /* 当时间到达或者数据量到达,就打包发送给智能模块 */
+ if ((J3_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
+ uint32_t tempLen = 6 + J3_485RxBufferIndex + slaveQueueUartSendInfoSize;
+ if (xPortGetFreeHeapSize() < tempLen + 1024) {
+ J3_485RxBufferIndex = 0;
+ return;
+ }
+
+ uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
+ slaveQueueUartSendInfo *sendBuff = (slaveQueueUartSendInfo *)Buff;
+ sendBuff->length = 6 + J3_485RxBufferIndex;
+ sendBuff->data = Buff + sizeof(slaveQueueUartSendInfo);
+ uint8_t *send = sendBuff->data;
+
+ /* 起始标志 */
+ *send = 'S';
+ *(send + 1) = 'L';
+
+ /* 端口号 */
+ send += 2;
+ *send = J3;
+
+ /* 数据包长度 */
+ send += 1;
+ *send = (uint8_t)(J3_485RxBufferIndex >> 8);
+ *(send + 1) = (uint8_t)(J3_485RxBufferIndex);
+
+ /* 数据包 */
+ send += 2;
+ memcpy((char *)send, (char *)J3_485RxBuffer, J3_485RxBufferIndex);
+
+ /* 结束标志 */
+ send += J3_485RxBufferIndex;
+ *send = 0x17;
+
+ /* 队列中有空间,则将发送数据 */
+ if (uxQueueSpacesAvailable(mcu_uart_Queue)) {
+ xQueueSend(mcu_uart_Queue, &Buff, 10);
+ }
+ /* 队列无空间,将数据丢弃 */
+ else {
+ vPortFree(Buff);
+ }
+
+ /* 发送完成或遇到问题,将buff中的数据清零 */
+ J3_485RxBufferIndex = 0;
+ }
+}
+
+/**
+ * @brief 接收J5口传来的数据
+ * @param
+ * @retval
+ */
+void J5_SensorDataAnalysis(void)
+{
+ static uint32_t tick;
+
+ if (J5_485RxBufferIndex == 0) {
+ tick = xTaskGetTickCount();
+ }
+
+ /* 单次进入最多6ms(3个时钟周期),串口中有数据 */
+ uint32_t nowTick = xTaskGetTickCount();
+ while ((getTickDiff(nowTick) < 3)
+ && (uart_dev_char_present(g_J5_handle) == 1)
+ && (maxdataLen > J5_485RxBufferIndex)) {
+ J5_485RxBuffer[J5_485RxBufferIndex++] = uart_dev_in_char(g_J5_handle);
+ }
+
+ /* 当时间到达或者数据量到达,就打包发送给智能模块 */
+ if ((J5_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
+ uint32_t tempLen = 6 + J5_485RxBufferIndex + slaveQueueUartSendInfoSize;
+ if (xPortGetFreeHeapSize() < tempLen + 1024) {
+ J5_485RxBufferIndex = 0;
+ return;
+ }
+
+ uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
+ slaveQueueUartSendInfo *sendBuff = (slaveQueueUartSendInfo *)Buff;
+ sendBuff->length = 6 + J5_485RxBufferIndex;
+ sendBuff->data = Buff + sizeof(slaveQueueUartSendInfo);
+ uint8_t *send = sendBuff->data;
+
+ /* 起始标志 */
+ *send = 'S';
+ *(send + 1) = 'L';
+
+ /* 端口号 */
+ send += 2;
+ *send = J5;
+
+ /* 数据包长度 */
+ send += 1;
+ *send = (uint8_t)(J5_485RxBufferIndex >> 8);
+ *(send + 1) = (uint8_t)(J5_485RxBufferIndex);
+
+ /* 数据包 */
+ send += 2;
+ memcpy((char *)send, (char *)J5_485RxBuffer, J5_485RxBufferIndex);
+
+ /* 结束标志 */
+ send += J5_485RxBufferIndex;
+ *send = 0x17;
+
+ /* 队列中有空间,则将发送数据 */
+ if (uxQueueSpacesAvailable(mcu_uart_Queue)) {
+ xQueueSend(mcu_uart_Queue, &Buff, 10);
+ }
+ /* 队列无空间,将数据丢弃 */
+ else {
+ vPortFree(Buff);
+ }
+
+ /* 发送完成或遇到问题,将buff中的数据清零 */
+ J5_485RxBufferIndex = 0;
+ }
+}
+
+/**
+ * @brief 接收J7口传来的数据
+ * @param
+ * @retval
+ */
+void J7_SensorDataAnalysis(void)
+{
+ static uint32_t tick;
+
+ if (J7_485RxBufferIndex == 0) {
+ tick = xTaskGetTickCount();
+ }
+
+ /* 单次进入最多6ms(3个时钟周期),串口中有数据 */
+ uint32_t nowTick = xTaskGetTickCount();
+ while ((getTickDiff(nowTick) < 3)
+ && (uart_dev_char_present(g_J7_handle) == 1)
+ && (maxdataLen > J7_485RxBufferIndex)) {
+ J7_485RxBuffer[J7_485RxBufferIndex++] = uart_dev_in_char(g_J7_handle);
+ }
+
+ /* 当时间到达或者数据量到达,就打包发送给智能模块 */
+ if ((J7_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
+ uint32_t tempLen = 6 + J7_485RxBufferIndex + slaveQueueUartSendInfoSize;
+ if (xPortGetFreeHeapSize() < tempLen + 1024) {
+ J7_485RxBufferIndex = 0;
+ return;
+ }
+
+ uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
+ slaveQueueUartSendInfo *sendBuff = (slaveQueueUartSendInfo *)Buff;
+ sendBuff->length = 6 + J7_485RxBufferIndex;
+ sendBuff->data = Buff + sizeof(slaveQueueUartSendInfo);
+ uint8_t *send = sendBuff->data;
+
+ /* 起始标志 */
+ *send = 'S';
+ *(send + 1) = 'L';
+
+ /* 端口号 */
+ send += 2;
+ *send = J7;
+
+ /* 数据包长度 */
+ send += 1;
+ *send = (uint8_t)(J7_485RxBufferIndex >> 8);
+ *(send + 1) = (uint8_t)(J7_485RxBufferIndex);
+
+ /* 数据包 */
+ send += 2;
+ memcpy((char *)send, (char *)J7_485RxBuffer, J7_485RxBufferIndex);
+
+ /* 结束标志 */
+ send += J7_485RxBufferIndex;
+ *send = 0x17;
+
+ /* 队列中有空间,则将发送数据 */
+ if (uxQueueSpacesAvailable(mcu_uart_Queue)) {
+ xQueueSend(mcu_uart_Queue, &Buff, 10);
+ }
+ /* 队列无空间,将数据丢弃 */
+ else {
+ vPortFree(Buff);
+ }
+
+ /* 发送完成或遇到问题,将buff中的数据清零 */
+ J7_485RxBufferIndex = 0;
+ }
+}
+
+/**
+ * @brief 接收J8口传来的数据
+ * @param
+ * @retval
+ */
+void J8_SensorDataAnalysis(void)
+{
+ static uint32_t tick;
+
+ if (J8_485RxBufferIndex == 0) {
+ tick = xTaskGetTickCount();
+ }
+
+ /* 单次进入最多6ms(3个时钟周期),串口中有数据 */
+ uint32_t nowTick = xTaskGetTickCount();
+ while ((getTickDiff(nowTick) < 3)
+ && (uart_dev_char_present(g_J8_handle) == 1)
+ && (maxdataLen > J8_485RxBufferIndex)) {
+ J8_485RxBuffer[J8_485RxBufferIndex++] = uart_dev_in_char(g_J8_handle);
+ }
+
+ /* 当时间到达或者数据量到达,就打包发送给智能模块 */
+ if ((J8_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
+ uint32_t tempLen = 6 + J8_485RxBufferIndex + slaveQueueUartSendInfoSize;
+ if (xPortGetFreeHeapSize() < tempLen + 1024) {
+ J8_485RxBufferIndex = 0;
+ return;
+ }
+
+ uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
+ slaveQueueUartSendInfo *sendBuff = (slaveQueueUartSendInfo *)Buff;
+ sendBuff->length = 6 + J8_485RxBufferIndex;
+ sendBuff->data = Buff + sizeof(slaveQueueUartSendInfo);
+ uint8_t *send = sendBuff->data;
+
+ /* 起始标志 */
+ *send = 'S';
+ *(send + 1) = 'L';
+
+ /* 端口号 */
+ send += 2;
+ *send = J8;
+
+ /* 数据包长度 */
+ send += 1;
+ *send = (uint8_t)(J8_485RxBufferIndex >> 8);
+ *(send + 1) = (uint8_t)(J8_485RxBufferIndex);
+
+ /* 数据包 */
+ send += 2;
+ memcpy((char *)send, (char *)J8_485RxBuffer, J8_485RxBufferIndex);
+
+ /* 结束标志 */
+ send += J8_485RxBufferIndex;
+ *send = 0x17;
+
+ /* 队列中有空间,则将发送数据 */
+ if (uxQueueSpacesAvailable(mcu_uart_Queue)) {
+ xQueueSend(mcu_uart_Queue, &Buff, 10);
+ }
+ /* 队列无空间,将数据丢弃 */
+ else {
+ vPortFree(Buff);
+ }
+
+ /* 发送完成或遇到问题,将buff中的数据清零 */
+ J8_485RxBufferIndex = 0;
+ }
+}
+
+/**
+ * @brief 接收J9口传来的数据
+ * @param
+ * @retval
+ */
+void J9_SensorDataAnalysis(void)
+{
+ static uint32_t tick;
+
+ if (J9_485RxBufferIndex == 0) {
+ tick = xTaskGetTickCount();
+ }
+
+ /* 单次进入最多6ms(3个时钟周期),串口中有数据 */
+ uint32_t nowTick = xTaskGetTickCount();
+ while ((getTickDiff(nowTick) < 3)
+ && (uart_dev_char_present(g_J9_handle) == 1)
+ && (maxdataLen > J9_485RxBufferIndex)) {
+ J9_485RxBuffer[J9_485RxBufferIndex++] = uart_dev_in_char(g_J9_handle);
+ }
+
+ /* 当时间到达或者数据量到达,就打包发送给智能模块 */
+ if ((J9_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
+ uint32_t tempLen = 6 + J9_485RxBufferIndex + slaveQueueUartSendInfoSize;
+ if (xPortGetFreeHeapSize() < tempLen + 1024) {
+ J9_485RxBufferIndex = 0;
+ return;
+ }
+
+ uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
+ slaveQueueUartSendInfo *sendBuff = (slaveQueueUartSendInfo *)Buff;
+ sendBuff->length = 6 + J9_485RxBufferIndex;
+ sendBuff->data = Buff + sizeof(slaveQueueUartSendInfo);
+ uint8_t *send = sendBuff->data;
+
+ /* 起始标志 */
+ *send = 'S';
+ *(send + 1) = 'L';
+
+ /* 端口号 */
+ send += 2;
+ *send = J9;
+
+ /* 数据包长度 */
+ send += 1;
+ *send = (uint8_t)(J9_485RxBufferIndex >> 8);
+ *(send + 1) = (uint8_t)(J9_485RxBufferIndex);
+
+ /* 数据包 */
+ send += 2;
+ memcpy((char *)send, (char *)J9_485RxBuffer, J9_485RxBufferIndex);
+
+ /* 结束标志 */
+ send += J9_485RxBufferIndex;
+ *send = 0x17;
+
+ /* 队列中有空间,则将发送数据 */
+ if (uxQueueSpacesAvailable(mcu_uart_Queue)) {
+ xQueueSend(mcu_uart_Queue, &Buff, 10);
+ }
+ /* 队列无空间,将数据丢弃 */
+ else {
+ vPortFree(Buff);
+ }
+
+ /* 发送完成或遇到问题,将buff中的数据清零 */
+ J9_485RxBufferIndex = 0;
+ }
+}
+
+
+
diff --git a/CH32V303-FreeRTOS/App/application/Slave/Src/slaveBusIdleDetection.c b/CH32V303-FreeRTOS/App/application/Slave/Src/slaveBusIdleDetection.c
new file mode 100644
index 0000000..372c1c1
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Slave/Src/slaveBusIdleDetection.c
@@ -0,0 +1,186 @@
+
+#include "slaveBusIdleDetection.h"
+#include "semphr.h"
+
+
+static TimerHandle_t J1_485_Swtmr = NULL;
+static TimerHandle_t J3_485_Swtmr = NULL;
+static TimerHandle_t J5_485_Swtmr = NULL;
+static TimerHandle_t J7_485_Swtmr = NULL;
+static TimerHandle_t J8_485_Swtmr = NULL;
+static TimerHandle_t J9_485_Swtmr = NULL;
+
+static void J1_485_tmrCallback(void* parameter);
+static void J3_485_tmrCallback(void* parameter);
+static void J5_485_tmrCallback(void* parameter);
+static void J7_485_tmrCallback(void* parameter);
+static void J8_485_tmrCallback(void* parameter);
+static void J9_485_tmrCallback(void* parameter);
+
+// 创建二值信号量
+SemaphoreHandle_t J1_IDLESemaphore = NULL;
+SemaphoreHandle_t J3_IDLESemaphore = NULL;
+SemaphoreHandle_t J5_IDLESemaphore = NULL;
+SemaphoreHandle_t J7_IDLESemaphore = NULL;
+SemaphoreHandle_t J8_IDLESemaphore = NULL;
+SemaphoreHandle_t J9_IDLESemaphore = NULL;
+
+
+
+/* 设置延时时间为30mS */
+#define softwareDelay (30 / (1000 / configTICK_RATE_HZ))
+
+/*
+ * @brief 初始化所有用于空闲检测的软件定时器和二值变量
+ * @param
+ * @retval
+ *
+ */
+void slaveIdleInit(void)
+{
+ J1_485_Swtmr = xTimerCreate((const char*)"J1Timer",
+ softwareDelay, //延时
+ (UBaseType_t )pdFALSE, //单次模式
+ (void *)1, //为每个计时器分配一个索引的唯一ID
+ (TimerCallbackFunction_t)J1_485_tmrCallback); //回调函数
+
+ J3_485_Swtmr = xTimerCreate((const char*)"J3Timer",
+ softwareDelay,
+ (UBaseType_t )pdFALSE,
+ (void *)2,
+ (TimerCallbackFunction_t)J3_485_tmrCallback);
+
+ J5_485_Swtmr = xTimerCreate((const char*)"J5Timer",
+ softwareDelay,
+ (UBaseType_t )pdFALSE,
+ (void *)2,
+ (TimerCallbackFunction_t)J5_485_tmrCallback);
+
+ J7_485_Swtmr = xTimerCreate((const char*)"J7Timer",
+ softwareDelay,
+ (UBaseType_t )pdFALSE,
+ (void *)2,
+ (TimerCallbackFunction_t)J7_485_tmrCallback);
+
+ J8_485_Swtmr = xTimerCreate((const char*)"J8Timer",
+ softwareDelay,
+ (UBaseType_t )pdFALSE,
+ (void *)2,
+ (TimerCallbackFunction_t)J8_485_tmrCallback);
+
+ J9_485_Swtmr = xTimerCreate((const char*)"J9Timer",
+ softwareDelay,
+ (UBaseType_t )pdFALSE,
+ (void *)2,
+ (TimerCallbackFunction_t)J9_485_tmrCallback);
+
+ J1_IDLESemaphore = xSemaphoreCreateBinary();
+ xSemaphoreGive(J1_IDLESemaphore);
+ J3_IDLESemaphore = xSemaphoreCreateBinary();
+ xSemaphoreGive(J3_IDLESemaphore);
+ J5_IDLESemaphore = xSemaphoreCreateBinary();
+ xSemaphoreGive(J5_IDLESemaphore);
+ J7_IDLESemaphore = xSemaphoreCreateBinary();
+ xSemaphoreGive(J7_IDLESemaphore);
+ J8_IDLESemaphore = xSemaphoreCreateBinary();
+ xSemaphoreGive(J8_IDLESemaphore);
+ J9_IDLESemaphore = xSemaphoreCreateBinary();
+ xSemaphoreGive(J9_IDLESemaphore);
+}
+
+void J1_485_tmrCallback(void* parameter)
+{
+ xSemaphoreGiveFromISR(J1_IDLESemaphore, 0);
+}
+void J3_485_tmrCallback(void* parameter)
+{
+ xSemaphoreGiveFromISR(J3_IDLESemaphore, 0);
+}
+void J5_485_tmrCallback(void* parameter)
+{
+ xSemaphoreGiveFromISR(J5_IDLESemaphore, 0);
+}
+void J7_485_tmrCallback(void* parameter)
+{
+ xSemaphoreGiveFromISR(J7_IDLESemaphore, 0);
+}
+void J8_485_tmrCallback(void* parameter)
+{
+ xSemaphoreGiveFromISR(J8_IDLESemaphore, 0);
+}
+void J9_485_tmrCallback(void* parameter)
+{
+ xSemaphoreGiveFromISR(J9_IDLESemaphore, 0);
+}
+
+
+/*
+ * @brief 空闲中断内容
+ * @param
+ * @retval
+ *
+ */
+void J1_485_IN_IDLE(void)
+{
+ xTimerStartFromISR(J1_485_Swtmr, 0);
+}
+void J3_485_IN_IDLE(void)
+{
+ xTimerStartFromISR(J3_485_Swtmr, 0);
+}
+void J5_485_IN_IDLE(void)
+{
+ xTimerStartFromISR(J5_485_Swtmr, 0);
+}
+void J7_485_IN_IDLE(void)
+{
+ xTimerStartFromISR(J7_485_Swtmr, 0);
+}
+void J8_485_IN_IDLE(void)
+{
+ xTimerStartFromISR(J8_485_Swtmr, 0);
+}
+void J9_485_IN_IDLE(void)
+{
+ xTimerStartFromISR(J9_485_Swtmr, 0);
+}
+
+/*
+ * @brief 空闲中断后,第一次进入接收中断内容
+ * @param
+ * @retval
+ *
+ */
+void J1_485_IN_RXNE(void)
+{
+ xTimerStopFromISR(J1_485_Swtmr, 0);
+ xSemaphoreTakeFromISR(J1_IDLESemaphore, 0);
+}
+void J3_485_IN_RXNE(void)
+{
+ xTimerStopFromISR(J3_485_Swtmr, 0);
+ xSemaphoreTakeFromISR(J3_IDLESemaphore, 0);
+}
+void J5_485_IN_RXNE(void)
+{
+ xTimerStopFromISR(J5_485_Swtmr, 0);
+ xSemaphoreTakeFromISR(J5_IDLESemaphore, 0);
+}
+void J7_485_IN_RXNE(void)
+{
+ xTimerStopFromISR(J7_485_Swtmr, 0);
+ xSemaphoreTakeFromISR(J7_IDLESemaphore, 0);
+}
+void J8_485_IN_RXNE(void)
+{
+ xTimerStopFromISR(J8_485_Swtmr, 0);
+ xSemaphoreTakeFromISR(J8_IDLESemaphore, 0);
+}
+void J9_485_IN_RXNE(void)
+{
+ xTimerStopFromISR(J9_485_Swtmr, 0);
+ xSemaphoreTakeFromISR(J9_IDLESemaphore, 0);
+}
+
+
+
diff --git a/CH32V303-FreeRTOS/App/application/Slave/Src/slaveFreerotsTask.c b/CH32V303-FreeRTOS/App/application/Slave/Src/slaveFreerotsTask.c
new file mode 100644
index 0000000..4803bd5
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Slave/Src/slaveFreerotsTask.c
@@ -0,0 +1,282 @@
+
+#include "stdio.h"
+
+#include "slaveFreerotsTask.h"
+
+// #include "HD_Flash.h"
+#include "FM_GPIO.h"
+#include "uart_dev.h"
+#include "FM_ADC.h"
+
+#include "slaveParameter.h"
+#include "slaveBusIdleDetection.h"
+#include "slaveMcuDataParse.h"
+#include "slaveQueueUart.h"
+#include "slave485DataParse.h"
+
+/* 发送任务 */
+#define J1_Transmit_TASK_PRIO 7
+#define J1_Transmit_STK_SIZE 64
+static TaskHandle_t J1_TransmitTask_Handler;
+static void J1_transmit_Task(void *pvParameters);
+#define J3_Transmit_TASK_PRIO 7
+#define J3_Transmit_STK_SIZE 64
+static TaskHandle_t J3_TransmitTask_Handler;
+static void J3_transmit_Task(void *pvParameters);
+#define J5_Transmit_TASK_PRIO 7
+#define J5_Transmit_STK_SIZE 64
+static TaskHandle_t J5_TransmitTask_Handler;
+static void J5_transmit_Task(void *pvParameters);
+#define J7_Transmit_TASK_PRIO 7
+#define J7_Transmit_STK_SIZE 64
+static TaskHandle_t J7_TransmitTask_Handler;
+static void J7_transmit_Task(void *pvParameters);
+#define J8_Transmit_TASK_PRIO 7
+#define J8_Transmit_STK_SIZE 64
+static TaskHandle_t J8_TransmitTask_Handler;
+static void J8_transmit_Task(void *pvParameters);
+#define J9_Transmit_TASK_PRIO 7
+#define J9_Transmit_STK_SIZE 64
+static TaskHandle_t J9_TransmitTask_Handler;
+static void J9_transmit_Task(void *pvParameters);
+#define slaveMcu_Transmit_TASK_PRIO 7
+#define slaveMcu_Transmit_STK_SIZE 64
+static TaskHandle_t slaveMcu_TransmitTask_Handler;
+static void slaveMcu_transmit_Task(void *pvParameters);
+
+/* 释放内存任务 */
+#define slaveFreeMemory_TASK_PRIO 8
+#define slaveFreeMemory_STK_SIZE 64
+static TaskHandle_t slaveFreeMemory_Handler;
+static void slaveFreeMemory_Task(void *pvParameters);
+
+/* 解析任务 */
+#define slaveMcuDataParse_TASK_PRIO 5
+#define slaveMcuDataParse_STK_SIZE 512
+static TaskHandle_t slaveMcuDataParse_Handler;
+static void slaveMcuDataParse_Task(void *pvParameters);
+
+#define slave485DataParse_TASK_PRIO 5
+#define slave485DataParse_STK_SIZE 512
+static TaskHandle_t slave485DataParse_Handler;
+static void slave485DataParse_Task(void *pvParameters);
+
+/* 其他任务 */
+#define slaveOther_TASK_PRIO 3
+#define slaveOther_STK_SIZE 64
+static TaskHandle_t slaveOther_Handler;
+static void slaveOther_Task(void *pvParameters);
+
+
+/**
+ * @brief 将数据发送
+ * @param
+ * @retval
+ */
+void J1_transmit_Task(void *pvParameters)
+{
+ while (1) {
+ J1QueueSend();
+ }
+}
+void J3_transmit_Task(void *pvParameters)
+{
+ while (1) {
+ J3QueueSend();
+ }
+}
+void J5_transmit_Task(void *pvParameters)
+{
+ while (1) {
+ J5QueueSend();
+ }
+}
+void J7_transmit_Task(void *pvParameters)
+{
+ while (1) {
+ J7QueueSend();
+ }
+}
+void J8_transmit_Task(void *pvParameters)
+{
+ while (1) {
+ J8QueueSend();
+ }
+}
+void J9_transmit_Task(void *pvParameters)
+{
+ while (1) {
+ J9QueueSend();
+ }
+}
+void slaveMcu_transmit_Task(void *pvParameters)
+{
+ while (1) {
+ slaveMcuQueueSend();
+ }
+}
+
+/**
+ * @brief 数据发送完成后,将申请存放数据的内存释放
+ * @param
+ * @retval
+ */
+void slaveFreeMemory_Task(void *pvParameters)
+{
+ while(1) {
+ binarySemaphoreFreeMemory();
+ }
+}
+
+/**
+ * @brief 解析主mcu发送来的数据
+ * @param
+ * @retval
+ */
+void slaveMcuDataParse_Task(void *pvParameters)
+{
+ while (1) {
+ slaveMcuUartDataAnalysis(g_Mcu_handle);
+ vTaskDelay(10);
+ }
+}
+
+/**
+ * @brief 解析传感器发送来的数据
+ * @param
+ * @retval
+ */
+void slave485DataParse_Task(void *pvParameters)
+{
+ while (1) {
+ J1_SensorDataAnalysis();
+ J3_SensorDataAnalysis();
+ J5_SensorDataAnalysis();
+ J7_SensorDataAnalysis();
+ J8_SensorDataAnalysis();
+ J9_SensorDataAnalysis();
+ vTaskDelay(5);
+ }
+}
+
+/**
+ * @brief 其他的一些任务
+ * @param
+ * @retval
+ */
+void slaveOther_Task(void *pvParameters)
+{
+ while (1) {
+ log_info("xPortGetFreeHeapSize : %d",xPortGetFreeHeapSize());
+ vTaskDelay(1000);
+ }
+}
+
+
+/**
+ * @brief 启动
+ * @param
+ * @retval
+ */
+void slaveStartApp(void)
+{
+ SlaveMcu_GPIO_Init();
+ readSlaveConfigParameter();
+ SlaveMcu_uartBuf_Init(256, 1024);
+ Init_J1_485(getJ1_485_Baud());
+ Init_J3_485(getJ3_485_Baud());
+ Init_J5_485(getJ5_485_Baud());
+ Init_J7_485(getJ7_485_Baud());
+ Init_J8_485(getJ8_485_Baud());
+ Init_J9_485(getJ9_485_Baud());
+ Init_Mcu_Uart(115200);
+
+ applyDataBuffer();
+ slaveUartSendInit();
+ slaveIdleInit();
+ SlaveMcu_485DE_Read();
+
+ /* create task */
+ xTaskCreate((TaskFunction_t )J1_transmit_Task,
+ (const char* )"J1TransmitTask",
+ (uint16_t )J1_Transmit_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )J1_Transmit_TASK_PRIO,
+ (TaskHandle_t* )&J1_TransmitTask_Handler);
+
+ xTaskCreate((TaskFunction_t )J3_transmit_Task,
+ (const char* )"J3TransmitTask",
+ (uint16_t )J3_Transmit_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )J3_Transmit_TASK_PRIO,
+ (TaskHandle_t* )&J3_TransmitTask_Handler);
+
+ xTaskCreate((TaskFunction_t )J5_transmit_Task,
+ (const char* )"J5TransmitTask",
+ (uint16_t )J5_Transmit_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )J5_Transmit_TASK_PRIO,
+ (TaskHandle_t* )&J5_TransmitTask_Handler);
+
+ xTaskCreate((TaskFunction_t )J7_transmit_Task,
+ (const char* )"J7TransmitTask",
+ (uint16_t )J7_Transmit_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )J7_Transmit_TASK_PRIO,
+ (TaskHandle_t* )&J7_TransmitTask_Handler);
+
+ xTaskCreate((TaskFunction_t )J8_transmit_Task,
+ (const char* )"J8TransmitTask",
+ (uint16_t )J8_Transmit_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )J8_Transmit_TASK_PRIO,
+ (TaskHandle_t* )&J8_TransmitTask_Handler);
+
+ xTaskCreate((TaskFunction_t )J9_transmit_Task,
+ (const char* )"J9TransmitTask",
+ (uint16_t )J9_Transmit_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )J9_Transmit_TASK_PRIO,
+ (TaskHandle_t* )&J9_TransmitTask_Handler);
+
+ xTaskCreate((TaskFunction_t )slaveMcu_transmit_Task,
+ (const char* )"slaveMcuTransmitTask",
+ (uint16_t )slaveMcu_Transmit_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )slaveMcu_Transmit_TASK_PRIO,
+ (TaskHandle_t* )&slaveMcu_TransmitTask_Handler);
+
+ xTaskCreate((TaskFunction_t )slaveFreeMemory_Task,
+ (const char* )"slaveFreeMemoryTask",
+ (uint16_t )slaveFreeMemory_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )slaveFreeMemory_TASK_PRIO,
+ (TaskHandle_t* )&slaveFreeMemory_Handler);
+
+ xTaskCreate((TaskFunction_t )slaveMcuDataParse_Task,
+ (const char* )"slaveMcuDataParse",
+ (uint16_t )slaveMcuDataParse_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )slaveMcuDataParse_TASK_PRIO,
+ (TaskHandle_t* )&slaveMcuDataParse_Handler);
+
+ xTaskCreate((TaskFunction_t )slave485DataParse_Task,
+ (const char* )"slave485DataParse",
+ (uint16_t )slave485DataParse_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )slave485DataParse_TASK_PRIO,
+ (TaskHandle_t* )&slave485DataParse_Handler);
+
+ xTaskCreate((TaskFunction_t )slaveOther_Task,
+ (const char* )"slaveOtherTask",
+ (uint16_t )slaveOther_STK_SIZE,
+ (void* )NULL,
+ (UBaseType_t )slaveOther_TASK_PRIO,
+ (TaskHandle_t* )&slaveOther_Handler);
+
+ vTaskStartScheduler();
+}
+
+
+
+
diff --git a/CH32V303-FreeRTOS/App/application/Slave/Src/slaveMcuComm.c b/CH32V303-FreeRTOS/App/application/Slave/Src/slaveMcuComm.c
new file mode 100644
index 0000000..595d18e
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Slave/Src/slaveMcuComm.c
@@ -0,0 +1,320 @@
+
+#include "slaveMcuComm.h"
+#include "slaveQueueUart.h"
+#include "slaveParameter.h"
+
+#include "uart_dev.h"
+
+#include "FreeRTOS.h"
+#include "task.h"
+
+#include "mcu_common.h"
+
+/* 配置文件数据类型表 */
+enum {
+ /* (1字节)对智能模块通信波特率(00H:不使用该串口, 01H:4800;02H:9600;03H:19200;04H:38400;05H:57600;06H:115200) */
+ J1_485_Communication_Baud_Rate = 0x0001,
+ J3_485_Communication_Baud_Rate = 0x0002,
+ J5_485_Communication_Baud_Rate = 0x0003,
+ J7_485_Communication_Baud_Rate = 0x0004,
+ J8_485_Communication_Baud_Rate = 0x0005,
+ J9_485_Communication_Baud_Rate = 0x0006,
+};
+
+/* 寄存器解析 */
+static uint16_t ReadRegisterJ1Baud(void *pMsg);
+static uint16_t ReadRegisterJ3Baud(void *pMsg);
+static uint16_t ReadRegisterJ5Baud(void *pMsg);
+static uint16_t ReadRegisterJ7Baud(void *pMsg);
+static uint16_t ReadRegisterJ8Baud(void *pMsg);
+static uint16_t ReadRegisterJ9Baud(void *pMsg);
+static uint16_t WriteRegisterJ1Baud(void *pMsg);
+static uint16_t WriteRegisterJ3Baud(void *pMsg);
+static uint16_t WriteRegisterJ5Baud(void *pMsg);
+static uint16_t WriteRegisterJ7Baud(void *pMsg);
+static uint16_t WriteRegisterJ8Baud(void *pMsg);
+static uint16_t WriteRegisterJ9Baud(void *pMsg);
+
+
+/* 寄存器处理表 */
+typedef uint16_t (*RegProcFunc)(void*);
+typedef struct _SL_RegProcTable{
+ uint32_t regId;
+ RegProcFunc pRegProc;
+}SL_RegProcTable;
+
+/* 读取寄存器处理表 */
+SL_RegProcTable g_RegTblR[] =
+{
+ {J1_485_Communication_Baud_Rate, ReadRegisterJ1Baud},
+ {J3_485_Communication_Baud_Rate, ReadRegisterJ3Baud},
+ {J5_485_Communication_Baud_Rate, ReadRegisterJ5Baud},
+ {J7_485_Communication_Baud_Rate, ReadRegisterJ7Baud},
+ {J8_485_Communication_Baud_Rate, ReadRegisterJ8Baud},
+ {J9_485_Communication_Baud_Rate, ReadRegisterJ9Baud},
+};
+
+/* 写入寄存器处理表 */
+SL_RegProcTable g_RegTblW[] =
+{
+ {J1_485_Communication_Baud_Rate, WriteRegisterJ1Baud},
+ {J3_485_Communication_Baud_Rate, WriteRegisterJ3Baud},
+ {J5_485_Communication_Baud_Rate, WriteRegisterJ5Baud},
+ {J7_485_Communication_Baud_Rate, WriteRegisterJ7Baud},
+ {J8_485_Communication_Baud_Rate, WriteRegisterJ8Baud},
+ {J9_485_Communication_Baud_Rate, WriteRegisterJ9Baud},
+};
+
+static void SlaveMcuReadRegister(uint8_t *buff, uint8_t dataLen)
+{
+ uint16_t Register_Start_Address = (buff[6] << 8) | buff[7];
+ uint16_t Register_Number = (buff[8] << 8) | buff[9];
+
+ /* 初始化发送内存 */
+ //系统内存不足,丢去当前包
+ uint32_t tempLen = 13 + 2 * Register_Number + slaveQueueUartSendInfoSize;
+ if (xPortGetFreeHeapSize() < tempLen + 1024) {
+ return;
+ }
+
+ uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
+ slaveQueueUartSendInfo *sendBuff = (slaveQueueUartSendInfo *)Buff;
+ sendBuff->length = 13 + 2 * Register_Number;
+ sendBuff->data = Buff + slaveQueueUartSendInfoSize;
+
+ uint8_t *replay_pack = sendBuff->data;
+ /* 起始标志 */
+ *(replay_pack) = 'S';
+ *(replay_pack + 1) = 'L';
+
+ /* 端口号 */
+ replay_pack += 2;
+ *(replay_pack) = SlaveMcu;
+
+ /* 回复字节长度 */
+ replay_pack += 1;
+ *(replay_pack) = (uint8_t)((sendBuff->length - 6) >> 8);
+ *(replay_pack + 1) = (uint8_t)(sendBuff->length - 6);
+
+ /* 功能码 */
+ replay_pack += 2;
+ *(replay_pack) = SL_Function_Code_Read_Register;
+
+ /* 读取寄存器起始地址 */
+ replay_pack += 1;
+ *(replay_pack) = buff[6];
+ *(replay_pack + 1) = buff[7];
+
+ /* 回复字节长度 */
+ replay_pack += 2;
+ *(replay_pack) = (uint8_t)((sendBuff->length - 13) >> 8);
+ *(replay_pack + 1) = (uint8_t)(sendBuff->length - 13);
+
+ /* 回复数据内容 */
+ /* 读取数据 */
+ for ( uint16_t pos = 0; pos < Register_Number; pos++) {
+ for (uint16_t var = 0; var < sizeof(g_RegTblR) / sizeof(SL_RegProcTable); var++) {
+ if (g_RegTblR[var].regId == (Register_Start_Address + pos)) {
+ uint16_t temp = g_RegTblR[var].pRegProc(NULL);
+ replay_pack += 2;
+ *(replay_pack) = (uint8_t)(temp >> 8);
+ *(replay_pack + 1) = (uint8_t)(temp);
+ }
+ }
+ }
+
+ /* 校验位 */
+ replay_pack += 2;
+ uint16_t crc_temp = modebusCrc(sendBuff->data, sendBuff->length - 3);
+ *replay_pack = (uint8_t)(crc_temp >> 8);
+ replay_pack += 1;
+ *replay_pack = (uint8_t)crc_temp;
+
+ /* 结束标志 */
+ replay_pack += 1;
+ *replay_pack = 0x17;
+
+ /* 队列中有空间,则将发送数据 */
+ if (uxQueueSpacesAvailable(mcu_uart_Queue)) {
+ xQueueSend(mcu_uart_Queue, &Buff, 10);
+ }
+ else {
+ vPortFree(Buff);
+ }
+}
+
+static void SlaveMcuWriteRegister(uint8_t *buff, uint8_t dataLen)
+{
+ uint16_t Register_Start_Address = (buff[6] << 8) | buff[7];
+ uint16_t Register_Number = (buff[8] << 8) | buff[9];
+
+ /* 将数据写入到寄存器中 */
+ for ( uint16_t pos = 0; pos < Register_Number; pos++) {
+ for (uint16_t i = 0; i < sizeof(g_RegTblW) / sizeof(SL_RegProcTable); i++) {
+ if (g_RegTblW[i].regId == (Register_Start_Address + pos)) {
+ uint16_t data = buff[10 + 2 * pos] << 8 | buff[10 + 2 * pos + 1];
+ g_RegTblW[i].pRegProc(&data);
+ }
+ }
+ }
+
+ /* 后续将数据存入配置文件中 */
+
+
+
+}
+
+void slaveFrameDataAnalyze(uint8_t *buff, uint8_t dataLen)
+{
+ uint16_t crc = (buff[dataLen - 4] << 8) | buff[dataLen - 3];
+ if (crc != modebusCrc(buff, dataLen - 3)) {
+ return;
+ }
+
+ if (buff[5] == SL_Function_Code_Read_Register) {
+ SlaveMcuReadRegister(buff, dataLen);
+ }
+ else if (buff[5] == SL_Function_Code_Write_Register) {
+ SlaveMcuWriteRegister(buff, dataLen);
+ }
+}
+
+/**
+ * @brief 读取J1波特率
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ1Baud(void *pMsg)
+{
+ return baudConversionConfig(getJ1_485_Baud());
+}
+
+/**
+ * @brief 读取J3波特率
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ3Baud(void *pMsg)
+{
+ return baudConversionConfig(getJ3_485_Baud());
+}
+
+/**
+ * @brief 读取J5波特率
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ5Baud(void *pMsg)
+{
+ return baudConversionConfig(getJ5_485_Baud());
+}
+
+/**
+ * @brief 读取J7波特率
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ7Baud(void *pMsg)
+{
+ return baudConversionConfig(getJ7_485_Baud());
+}
+
+/**
+ * @brief 读取J8波特率
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ8Baud(void *pMsg)
+{
+ return baudConversionConfig(getJ8_485_Baud());
+}
+
+/**
+ * @brief 读取J9波特率
+ * @param
+ * @retval
+ */
+uint16_t ReadRegisterJ9Baud(void *pMsg)
+{
+ return baudConversionConfig(getJ9_485_Baud());
+}
+
+
+/**
+ * @brief 设置端口1波特率
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ1Baud(void *pMsg)
+{
+ setJ1_485_Baud(configConversionBaud(*(uint16_t *)pMsg));
+ Init_J1_485(getJ1_485_Baud());
+
+ return 0;
+}
+
+/**
+ * @brief 设置端口3波特率
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ3Baud(void *pMsg)
+{
+ setJ3_485_Baud(configConversionBaud(*(uint16_t *)pMsg));
+ Init_J3_485(getJ3_485_Baud());
+
+ return 0;
+}
+
+
+/**
+ * @brief 设置端口1波特率
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ5Baud(void *pMsg)
+{
+ setJ5_485_Baud(configConversionBaud(*(uint16_t *)pMsg));
+ Init_J5_485(getJ5_485_Baud());
+
+ return 0;
+}
+
+/**
+ * @brief 设置端口7波特率
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ7Baud(void *pMsg)
+{
+ setJ7_485_Baud(configConversionBaud(*(uint16_t *)pMsg));
+ Init_J7_485(getJ7_485_Baud());
+
+ return 0;
+}
+
+/**
+ * @brief 设置端口8波特率
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ8Baud(void *pMsg)
+{
+ setJ8_485_Baud(configConversionBaud(*(uint16_t *)pMsg));
+ Init_J8_485(getJ8_485_Baud());
+
+ return 0;
+}
+
+/**
+ * @brief 设置端口9波特率
+ * @param
+ * @retval
+ */
+uint16_t WriteRegisterJ9Baud(void *pMsg)
+{
+ setJ9_485_Baud(configConversionBaud(*(uint16_t *)pMsg));
+ Init_J9_485(getJ9_485_Baud());
+
+ return 0;
+}
diff --git a/CH32V303-FreeRTOS/App/application/Slave/Src/slaveMcuDataParse.c b/CH32V303-FreeRTOS/App/application/Slave/Src/slaveMcuDataParse.c
new file mode 100644
index 0000000..01a7386
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Slave/Src/slaveMcuDataParse.c
@@ -0,0 +1,286 @@
+
+#include "slaveMcuDataParse.h"
+#include "slaveMcuComm.h"
+
+static void stateMachine(void);
+
+/* 状态机函数 */
+static uint8_t analysisWait(void);
+static uint8_t analysisStartFlagSL(void);
+static uint8_t analysisPortSL(void);
+static uint8_t analysisLengthSL(void);
+static uint8_t analysisEndFlagSL(void);
+
+/**
+ * @brief 状态机函数
+ * @param
+ * @retval
+ */
+void stateMachine(void)
+{
+ if (state == wait) {
+ if (analysisWait() == TRUE) {
+ mcuUartRxTime = xTaskGetTickCount();
+ }
+ }
+
+ else if (state == startFlagSL) {
+ analysisStartFlagSL();
+ }
+
+ else if (state == portSL) {
+ analysisPortSL();
+ }
+
+ else if (state == lengthSL) {
+ analysisLengthSL();
+ }
+
+ else if (state == endFlagSL) {
+ analysisEndFlagSL();
+ }
+}
+
+
+/**
+ * @brief 状态 wait
+ * @param
+ * @retval 0:解析失败
+ 1:解析成功
+ */
+#define waitMaxLen 2
+uint8_t analysisWait(void)
+{
+ if (mcuUartRxBufferIndex >= 2) {
+ /* 透传数据帧包头 */
+ if (mcuUartRxBuffer[0] == 'S' && mcuUartRxBuffer[1] == 'L') {
+ // log_info("startFlagSL\n");
+ state = startFlagSL;
+ return TRUE;
+ }
+ }
+
+ if (mcuUartRxBufferIndex < waitMaxLen) {
+ return FALSE;
+ }
+
+ state = wait;
+ mcuUartRxBufferIndex--;
+ memcpy(mcuUartRxBuffer, mcuUartRxBuffer + 1, mcuUartRxBufferIndex);
+
+ return FALSE;
+}
+
+/**
+ * @brief 状态 startFlagSL
+ * @param
+ * @retval 0:解析失败
+ 1:解析成功
+ */
+uint8_t analysisStartFlagSL(void)
+{
+ /* 校验端口号 */
+ if (mcuUartRxBuffer[2] < 13) {
+ // log_info("portSL\n");
+ state = portSL;
+ return TRUE;
+ }
+
+ // log_error("portSL %d \n", gw485RxBuffer[2]);
+ state = wait;
+ mcuUartRxBufferIndex--;
+ memcpy(mcuUartRxBuffer, mcuUartRxBuffer + 1, mcuUartRxBufferIndex);
+ return FALSE;
+}
+
+/**
+ * @brief 状态 portSL
+ * @param
+ * @retval 0:解析失败
+ 1:解析成功
+ */
+#define PortSLMaxLen 5
+uint8_t analysisPortSL(void)
+{
+ /* 解析数据包的度 */
+ if (mcuUartRxBufferIndex >= PortSLMaxLen) {
+ uint32_t tempLen = 0;
+ tempLen = (mcuUartRxBuffer[3] << 8) | mcuUartRxBuffer[4];
+
+ if (tempLen <= 1024) {
+ // log_info("lengthSL\n");
+ state = lengthSL;
+ frameLength = 6 + tempLen;
+ return TRUE;
+ }
+ }
+
+ if (mcuUartRxBufferIndex < PortSLMaxLen) {
+ return FALSE;
+ }
+
+ // log_error("lengthSL %d \n", (gw485RxBuffer[3] << 8) | gw485RxBuffer[4]);
+
+ state = wait;
+ mcuUartRxBufferIndex--;
+ memcpy(mcuUartRxBuffer, mcuUartRxBuffer + 1, mcuUartRxBufferIndex);
+ return FALSE;
+}
+
+/**
+ * @brief 状态 lengthSL
+ * @param
+ * @retval 0:解析失败
+ 1:解析成功
+ */
+#define LengthSLMaxLen frameLength
+uint8_t analysisLengthSL(void)
+{
+ /* 解析帧尾 */
+ if (mcuUartRxBufferIndex >= LengthSLMaxLen) {
+ if (mcuUartRxBuffer[LengthSLMaxLen - 1] == 0x17) {
+ // log_info("endFlagSL\n");
+ state = endFlagSL;
+ return TRUE;
+ }
+ }
+
+ if (mcuUartRxBufferIndex < LengthSLMaxLen) {
+ return FALSE;
+ }
+ // log_info("endFlagSL %d\n", gw485RxBuffer[LengthSLMaxLen - 1]);
+
+ state = wait;
+ mcuUartRxBufferIndex--;
+ memcpy(mcuUartRxBuffer, mcuUartRxBuffer + 1, mcuUartRxBufferIndex);
+ return FALSE;
+}
+
+/**
+ * @brief 状态 endFlagSL
+ * @param
+ * @retval 0:解析失败
+ 1:解析成功
+ */
+uint8_t analysisEndFlagSL(void)
+{
+ uint32_t tempLen = 0;
+ tempLen = (mcuUartRxBuffer[3] << 8) | mcuUartRxBuffer[4];
+
+ if (mcuUartRxBuffer[2] == SlaveMcu) {
+ slaveFrameDataAnalyze(mcuUartRxBuffer, mcuUartRxBufferIndex);
+ mcuUartRxBufferIndex = 0;
+ state = wait;
+ return 1;
+ }
+
+ //系统内存不足,丢去当前包
+ if (xPortGetFreeHeapSize() < tempLen + 1024) {
+ goto err;
+ }
+
+ /* 对于不同通端口,传输的结构体不同 */
+ uint8_t *Buff;
+
+ Buff = (uint8_t *)pvPortMalloc(tempLen + slaveQueueUartSendInfoSize);
+ slaveQueueUartSendInfo *sendBuff = (slaveQueueUartSendInfo *)Buff;
+ sendBuff->length = tempLen;
+ sendBuff->data = Buff + slaveQueueUartSendInfoSize;
+ memcpy((char *)sendBuff->data, (char *)&mcuUartRxBuffer[5], tempLen);
+
+
+ /* 通过不同的端口将数据发送到不同的地方 */
+ if (mcuUartRxBuffer[2] == J1) {
+ if (uxQueueSpacesAvailable(J1_485_Queue)) {
+ xQueueSend(J1_485_Queue, &Buff, 10);
+ }
+ /* 队列中无空间,释放内存,退出 */
+ else {
+ vPortFree(Buff);
+ }
+ }
+ else if (mcuUartRxBuffer[2] == J3) {
+ if (uxQueueSpacesAvailable(J3_485_Queue)) {
+ xQueueSend(J3_485_Queue, &Buff, 10);
+ }
+ /* 队列中无空间,释放内存,退出 */
+ else {
+ vPortFree(Buff);
+ }
+ }
+ else if (mcuUartRxBuffer[2] == J5) {
+ if (uxQueueSpacesAvailable(J5_485_Queue)) {
+ xQueueSend(J5_485_Queue, &Buff, 10);
+ }
+ /* 队列中无空间,释放内存,退出 */
+ else {
+ vPortFree(Buff);
+ }
+ }
+ else if (mcuUartRxBuffer[2] == J7) {
+ if (uxQueueSpacesAvailable(J7_485_Queue)) {
+ xQueueSend(J7_485_Queue, &Buff, 10);
+ }
+ /* 队列中无空间,释放内存,退出 */
+ else {
+ vPortFree(Buff);
+ }
+ }
+ else if (mcuUartRxBuffer[2] == J8) {
+ if (uxQueueSpacesAvailable(J8_485_Queue)) {
+ xQueueSend(J8_485_Queue, &Buff, 10);
+ }
+ /* 队列中无空间,释放内存,退出 */
+ else {
+ vPortFree(Buff);
+ }
+ }
+ else if (mcuUartRxBuffer[2] == J9) {
+ if (uxQueueSpacesAvailable(J9_485_Queue)) {
+ xQueueSend(J9_485_Queue, &Buff, 10);
+ }
+ /* 队列中无空间,释放内存,退出 */
+ else {
+ vPortFree(Buff);
+ }
+ }
+
+err:
+ //清零buff
+ state = wait;
+ mcuUartRxBufferIndex = 0;
+ return 1;
+}
+
+/**
+ * @brief 解析智能模块发送来的数据
+ * @param device 用于接收智能模块发送来的数据的串口设备
+ * @retval
+ */
+void slaveMcuUartDataAnalysis(device_handle device)
+{
+ /* 每次函数最多执行10ms */
+ static uint32_t tickstart = 0U;
+ tickstart = xTaskGetTickCount();
+
+ /* 2S未解析出来一帧数据,将数据清零 */
+ if (getTickDiff(mcuUartRxTime) >= tick_2S) {
+ mcuUartRxTime = xTaskGetTickCount();
+ mcuUartRxBufferIndex = 0;
+ state = wait;
+ }
+
+ while (uart_dev_char_present(device) == 1 && ((xTaskGetTickCount() - tickstart) < 5)) {
+ mcuUartRxBuffer[mcuUartRxBufferIndex++] = uart_dev_in_char(device);
+ stateMachine();
+ }
+
+ if (uart_dev_char_present(device) != 1 && state != wait) {
+ stateMachine();
+ }
+}
+
+
+
+
+
diff --git a/CH32V303-FreeRTOS/App/application/Slave/Src/slaveParameter.c b/CH32V303-FreeRTOS/App/application/Slave/Src/slaveParameter.c
new file mode 100644
index 0000000..70e3e50
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Slave/Src/slaveParameter.c
@@ -0,0 +1,152 @@
+#include "slaveParameter.h"
+
+typedef struct _parameterInfo {
+ uint32_t J1_485_Baud; //与J1_485通信波特率
+ uint32_t J3_485_Baud; //与J3_485通信波特率
+ uint32_t J5_485_Baud; //与J5_485通信波特率
+ uint32_t J7_485_Baud; //与J7_485通信波特率
+ uint32_t J8_485_Baud; //与J8_485通信波特率
+ uint32_t J9_485_Baud; //与J9_485通信波特率
+} slaveParameterInfo;
+
+static slaveParameterInfo slaveParameter = {0};
+
+#define configSize (sizeof(configInfo))
+
+/**
+ * @brief 读取配置文件参数
+ * @param
+ * @retval
+ */
+void readSlaveConfigParameter(void)
+{
+ /* 使用默认参数 */
+ slaveParameter.J1_485_Baud = 9600;
+ slaveParameter.J3_485_Baud = 9600;
+ slaveParameter.J5_485_Baud = 9600;
+ slaveParameter.J7_485_Baud = 9600;
+ slaveParameter.J8_485_Baud = 9600;
+ slaveParameter.J9_485_Baud = 9600;
+}
+
+/**
+ * @brief 得到对J1通信波特率
+ * @param
+ * @retval
+ */
+uint32_t getJ1_485_Baud(void)
+{
+ return slaveParameter.J1_485_Baud;
+}
+
+/**
+ * @brief 设置J1通信波特率
+ * @param
+ * @retval
+ */
+void setJ1_485_Baud(uint32_t Baud)
+{
+ slaveParameter.J1_485_Baud = Baud;
+}
+
+/**
+ * @brief 得到对J3通信波特率
+ * @param
+ * @retval
+ */
+uint32_t getJ3_485_Baud(void)
+{
+ return slaveParameter.J3_485_Baud;
+}
+
+/**
+ * @brief 设置J3通信波特率
+ * @param
+ * @retval
+ */
+void setJ3_485_Baud(uint32_t Baud)
+{
+ slaveParameter.J3_485_Baud = Baud;
+}
+
+/**
+ * @brief 得到对J5通信波特率
+ * @param
+ * @retval
+ */
+uint32_t getJ5_485_Baud(void)
+{
+ return slaveParameter.J5_485_Baud;
+}
+
+/**
+ * @brief 设置J5通信波特率
+ * @param
+ * @retval
+ */
+void setJ5_485_Baud(uint32_t Baud)
+{
+ slaveParameter.J5_485_Baud = Baud;
+}
+
+/**
+ * @brief 得到对J7通信波特率
+ * @param
+ * @retval
+ */
+uint32_t getJ7_485_Baud(void)
+{
+ return slaveParameter.J7_485_Baud;
+}
+
+/**
+ * @brief 设置J7通信波特率
+ * @param
+ * @retval
+ */
+void setJ7_485_Baud(uint32_t Baud)
+{
+ slaveParameter.J7_485_Baud = Baud;
+}
+
+/**
+ * @brief 得到对J8通信波特率
+ * @param
+ * @retval
+ */
+uint32_t getJ8_485_Baud(void)
+{
+ return slaveParameter.J8_485_Baud;
+}
+
+/**
+ * @brief 设置J8通信波特率
+ * @param
+ * @retval
+ */
+void setJ8_485_Baud(uint32_t Baud)
+{
+ slaveParameter.J8_485_Baud = Baud;
+}
+
+/**
+ * @brief 得到对J9通信波特率
+ * @param
+ * @retval
+ */
+uint32_t getJ9_485_Baud(void)
+{
+ return slaveParameter.J9_485_Baud;
+}
+
+/**
+ * @brief 设置J9通信波特率
+ * @param
+ * @retval
+ */
+void setJ9_485_Baud(uint32_t Baud)
+{
+ slaveParameter.J9_485_Baud = Baud;
+}
+
+
diff --git a/CH32V303-FreeRTOS/App/application/Slave/Src/slaveQueueUart.c b/CH32V303-FreeRTOS/App/application/Slave/Src/slaveQueueUart.c
new file mode 100644
index 0000000..34c7f14
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/application/Slave/Src/slaveQueueUart.c
@@ -0,0 +1,430 @@
+
+#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;
+}
diff --git a/CH32V303-FreeRTOS/App/application/Src/busIdleDetection.c b/CH32V303-FreeRTOS/App/application/Src/busIdleDetection.c
deleted file mode 100644
index 47178d8..0000000
--- a/CH32V303-FreeRTOS/App/application/Src/busIdleDetection.c
+++ /dev/null
@@ -1,220 +0,0 @@
-#include "busIdleDetection.h"
-
-
-#ifdef RS485BUSIDLE1
-#include "uart_dev.h"
-
-/* 通过软件定时器的方式来完成 */
-static TimerHandle_t J1_485_Swtmr = NULL;
-static TimerHandle_t J2_485_Swtmr = NULL;
-static TimerHandle_t J3_485_Swtmr = NULL;
-static TimerHandle_t J4_485_Swtmr = NULL;
-static TimerHandle_t J5_0_485_Swtmr = NULL;
-
-static void J1_485_tmrCallback(void* parameter);
-static void J2_485_tmrCallback(void* parameter);
-static void J3_485_tmrCallback(void* parameter);
-static void J4_485_tmrCallback(void* parameter);
-static void J5_0_485_tmrCallback(void* parameter);
-
-#define softwareDelay (30 / (1000 / configTICK_RATE_HZ))
-
-/*
- * @brief 初始化所有的软件定时器
- * @param
- * @retval
- *
- */
-void softwareTimeInit(void)
-{
- J1_485_Swtmr = xTimerCreate((const char*)"J1Timer",
- softwareDelay, //延时
- (UBaseType_t )pdFALSE, //单次模式
- (void *)1, //为每个计时器分配一个索引的唯一ID
- (TimerCallbackFunction_t)J1_485_tmrCallback); //回调函数
-
- J2_485_Swtmr = xTimerCreate((const char*)"J2Timer",
- softwareDelay,
- (UBaseType_t )pdFALSE,
- (void *)2,
- (TimerCallbackFunction_t)J2_485_tmrCallback);
-
- J3_485_Swtmr = xTimerCreate((const char*)"J3Timer",
- softwareDelay,
- (UBaseType_t )pdFALSE,
- (void *)3,
- (TimerCallbackFunction_t)J3_485_tmrCallback);
-
- J4_485_Swtmr = xTimerCreate((const char*)"J4Timer",
- softwareDelay,
- (UBaseType_t )pdFALSE,
- (void *)4,
- (TimerCallbackFunction_t)J4_485_tmrCallback);
-
- J5_0_485_Swtmr = xTimerCreate((const char*)"J5_0Timer",
- softwareDelay,
- (UBaseType_t )pdFALSE,
- (void *)5,
- (TimerCallbackFunction_t)J5_0_485_tmrCallback);
-}
-
-void J1_485_tmrCallback(void* parameter)
-{
- setBUSIDLEFlag(g_J1_uart6_handle, 0);
-}
-
-void J2_485_tmrCallback(void* parameter)
-{
- setBUSIDLEFlag(g_J2_uart7_handle, 0);
-}
-
-void J3_485_tmrCallback(void* parameter)
-{
- setBUSIDLEFlag(g_J3_usart2_handle, 0);
-}
-
-void J4_485_tmrCallback(void* parameter)
-{
- setBUSIDLEFlag(g_J4_uart8_handle, 0);
-}
-
-void J5_0_485_tmrCallback(void* parameter)
-{
- setBUSIDLEFlag(g_J5_0_usart3_handle, 0);
-}
-
-/*
- * @brief J1_485空闲中断内容
- * @param
- * @retval
- *
- */
-void J1_485_IN_IDLE(void)
-{
- xTimerStartFromISR(J1_485_Swtmr, 0);
-}
-
-/*
- * @brief J2_485空闲中断内容
- * @param
- * @retval
- *
- */
-void J2_485_IN_IDLE(void)
-{
- xTimerStartFromISR(J2_485_Swtmr, 0);
-}
-
-/*
- * @brief J3_485空闲中断内容
- * @param
- * @retval
- *
- */
-void J3_485_IN_IDLE(void)
-{
- xTimerStartFromISR(J3_485_Swtmr, 0);
-}
-
-/*
- * @brief J4_485空闲中断内容
- * @param
- * @retval
- *
- */
-void J4_485_IN_IDLE(void)
-{
- xTimerStartFromISR(J4_485_Swtmr, 0);
-}
-
-/*
- * @brief J5_0_485空闲中断内容
- * @param
- * @retval
- *
- */
-void J5_0_485_IN_IDLE(void)
-{
- xTimerStartFromISR(J5_0_485_Swtmr, 0);
-}
-
-/*
- * @brief J1_485空闲中断后,第一次进入接收中断内容
- * @param
- * @retval
- *
- */
-void J1_485_IN_RXNE(void)
-{
- xTimerStopFromISR(J1_485_Swtmr, 0);
-}
-
-/*
- * @brief J2_485空闲中断后,第一次进入接收中断内容
- * @param
- * @retval
- *
- */
-void J2_485_IN_RXNE(void)
-{
- xTimerStopFromISR(J2_485_Swtmr, 0);
-}
-
-/*
- * @brief J3_485空闲中断后,第一次进入接收中断内容
- * @param
- * @retval
- *
- */
-void J3_485_IN_RXNE(void)
-{
- xTimerStopFromISR(J3_485_Swtmr, 0);
-}
-
-/*
- * @brief J4_485空闲中断后,第一次进入接收中断内容
- * @param
- * @retval
- *
- */
-void J4_485_IN_RXNE(void)
-{
- xTimerStopFromISR(J4_485_Swtmr, 0);
-}
-
-/*
- * @brief J5_0_485空闲中断后,第一次进入接收中断内容
- * @param
- * @retval
- *
- */
-void J5_0_485_IN_RXNE(void)
-{
- xTimerStopFromISR(J5_0_485_Swtmr, 0);
-}
-#endif
-
-/*
- * @brief 得到串口能否发送
- * @param
- * @retval 0 能发送
- 1 不能发送
- 0xFF 错误
- */
-uint8_t getRs485State(device_handle device)
-{
-#ifdef RS485BUSIDLE1
-#ifdef UARTINTERRUPTSEND
- return (getUartSendState(device) || getBUSIDLEFlag(device));
-#endif
-#endif
-}
-
-uint8_t getUartState(device_handle device)
-{
-#ifdef UARTINTERRUPTSEND
- return getUartSendState(device);
-#endif
-}
-
-
diff --git a/CH32V303-FreeRTOS/App/application/Src/downUartParse.c b/CH32V303-FreeRTOS/App/application/Src/downUartParse.c
deleted file mode 100644
index a786d88..0000000
--- a/CH32V303-FreeRTOS/App/application/Src/downUartParse.c
+++ /dev/null
@@ -1,390 +0,0 @@
-#include "FreeRTOS.h"
-#include "task.h"
-
-#include "downUartParse.h"
-#include "upUartParse.h"
-#include "queueUart.h"
-
-// /* 1秒的节拍数 */
-// #define tick_1S configTICK_RATE_HZ
-
-// /* 状态机 */
-// typedef enum {
-// wait = 0, /* 串口状态机初始状态 */
-// startFlag, /* 接收到帧头 */
-// // address, /* 设备地址 */
-// functionCode, /* 接收到功能码 */
-// dataLen, /* 接收到数据长度 */
-// crcCheckBitGW, /* 接收到校验位 */
-// endFlagGW, /* 接收到帧尾 */
-// } uartStateMachine;
-
-
-/* 储存gw485数据 */
-static uint8_t J1_485RxBuffer[128];
-static uint16_t J1_485RxBufferIndex = 0;
-static uint8_t J2_485RxBuffer[128];
-static uint16_t J2_485RxBufferIndex = 0;
-static uint8_t J3_485RxBuffer[128];
-static uint16_t J3_485RxBufferIndex = 0;
-static uint8_t J4_485RxBuffer[128];
-static uint16_t J4_485RxBufferIndex = 0;
-static uint8_t J5_0_485RxBuffer[128];
-static uint16_t J5_0_485RxBufferIndex = 0;
-
-/* 100ms */
-#define delayTick 50
-#define maxdataLen 100
-
-/**
- * @brief 接收J1口传来的数据
- * @param
- * @retval
- */
-void J1_SensorDataAnalysis(void)
-{
- static uint32_t tick;
-
- if (J1_485RxBufferIndex == 0) {
- tick = xTaskGetTickCount();
- }
-
- /* 单次进入最多6ms(3个时钟周期),串口中有数据 */
- uint32_t nowTick = xTaskGetTickCount();
- while ((getTickDiff(nowTick) < 3)
- && (uart_dev_char_present(g_J1_uart6_handle) == 1)
- && (maxdataLen > J1_485RxBufferIndex)) {
- J1_485RxBuffer[J1_485RxBufferIndex++] = uart_dev_in_char(g_J1_uart6_handle);
- }
-
- /* 当时间到达或者数据量到达,就打包发送给智能模块 */
- if ((J1_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
- uint32_t tempLen = 6 + J1_485RxBufferIndex + queueUartSendInfoSize;
- if (xPortGetFreeHeapSize() < tempLen + 1024) {
- J1_485RxBufferIndex = 0;
- return;
- }
-
- uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
- queueUartSendInfo *sendBuff = (queueUartSendInfo *)Buff;
- sendBuff->length = 6 + J1_485RxBufferIndex;
- sendBuff->data = Buff + sizeof(queueUartSendInfo);
- uint8_t *send = sendBuff->data;
-
- /* 起始标志 */
- *send = 'S';
- *(send + 1) = 'L';
-
- /* 端口号 */
- send += 2;
- *send = 1;
-
- /* 数据包长度 */
- send += 1;
- *send = (uint8_t)(J1_485RxBufferIndex >> 8);
- *(send + 1) = (uint8_t)(J1_485RxBufferIndex);
-
- /* 数据包 */
- send += 2;
- memcpy((char *)send, (char *)J1_485RxBuffer, J1_485RxBufferIndex);
-
- /* 结束标志 */
- send += J1_485RxBufferIndex;
- *send = 0x17;
-
- /* 队列中有空间,则将发送数据 */
- if (uxQueueSpacesAvailable(upward_uart_Queue)) {
- xQueueSend(upward_uart_Queue, &Buff, 10);
- }
- /* 队列无空间,将数据丢弃 */
- else {
- vPortFree(Buff);
- }
-
- /* 发送完成或遇到问题,将buff中的数据清零 */
- J1_485RxBufferIndex = 0;
- }
-}
-
-/**
- * @brief 接收J2口传来的数据
- * @param
- * @retval
- */
-void J2_SensorDataAnalysis(void)
-{
- static uint32_t tick;
-
- if (J2_485RxBufferIndex == 0) {
- tick = xTaskGetTickCount();
- }
-
- /* 单次进入最多6ms(3个时钟周期),串口中有数据 */
- uint32_t nowTick = xTaskGetTickCount();
- while ((getTickDiff(nowTick) < 3)
- && (uart_dev_char_present(g_J2_uart7_handle) == 1)
- && (maxdataLen > J2_485RxBufferIndex)) {
- J2_485RxBuffer[J2_485RxBufferIndex++] = uart_dev_in_char(g_J2_uart7_handle);
- }
-
- /* 当时间到达或者数据量到达,就打包发送给智能模块 */
- if ((J2_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
-
- uint32_t tempLen = 6 + J2_485RxBufferIndex + queueUartSendInfoSize;
- if (xPortGetFreeHeapSize() < tempLen + 1024) {
- J2_485RxBufferIndex = 0;
- return;
- }
-
- uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
- queueUartSendInfo *sendBuff = (queueUartSendInfo *)Buff;
- sendBuff->length = 6 + J2_485RxBufferIndex;
- sendBuff->data = Buff + sizeof(queueUartSendInfo);
- uint8_t *send = sendBuff->data;
-
- /* 起始标志 */
- *send = 'S';
- *(send + 1) = 'L';
-
- /* 端口号 */
- send += 2;
- *send = 2;
-
- /* 数据包长度 */
- send += 1;
- *send = (uint8_t)(J2_485RxBufferIndex >> 8);
- *(send + 1) = (uint8_t)(J2_485RxBufferIndex);
-
- /* 数据包 */
- send += 2;
- memcpy((char *)send, (char *)J2_485RxBuffer, J2_485RxBufferIndex);
-
- /* 结束标志 */
- send += J2_485RxBufferIndex;
- *send = 0x17;
-
- /* 队列中有空间,则将发送数据 */
- if (uxQueueSpacesAvailable(upward_uart_Queue)) {
- xQueueSend(upward_uart_Queue, &Buff, 10);
- }
- /* 队列无空间,将数据丢弃 */
- else {
- vPortFree(Buff);
- }
-
- J2_485RxBufferIndex = 0;
- }
-}
-
-/**
- * @brief 接收J3口传来的数据
- * @param
- * @retval
- */
-void J3_SensorDataAnalysis(void)
-{
- static uint32_t tick;
-
- if (J3_485RxBufferIndex == 0) {
- tick = xTaskGetTickCount();
- }
-
- /* 单次进入最多6ms(3个时钟周期),串口中有数据 */
- uint32_t nowTick = xTaskGetTickCount();
- while ((getTickDiff(nowTick) < 3)
- && (uart_dev_char_present(g_J3_usart2_handle) == 1)
- && (maxdataLen > J3_485RxBufferIndex)) {
- J3_485RxBuffer[J3_485RxBufferIndex++] = uart_dev_in_char(g_J3_usart2_handle);
- }
-
- /* 当时间到达或者数据量到达,就打包发送给智能模块 */
- if ((J3_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
-
- uint32_t tempLen = 6 + J3_485RxBufferIndex + queueUartSendInfoSize;
- if (xPortGetFreeHeapSize() < tempLen + 1024) {
- J3_485RxBufferIndex = 0;
- return;
- }
-
- uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
- queueUartSendInfo *sendBuff = (queueUartSendInfo *)Buff;
- sendBuff->length = 6 + J3_485RxBufferIndex;
- sendBuff->data = Buff + sizeof(queueUartSendInfo);
- uint8_t *send = sendBuff->data;
-
- /* 起始标志 */
- *send = 'S';
- *(send + 1) = 'L';
-
- /* 端口号 */
- send += 2;
- *send = 3;
-
- /* 数据包长度 */
- send += 1;
- *send = (uint8_t)(J3_485RxBufferIndex >> 8);
- *(send + 1) = (uint8_t)(J3_485RxBufferIndex);
-
- /* 数据包 */
- send += 2;
- memcpy((char *)send, (char *)J3_485RxBuffer, J3_485RxBufferIndex);
-
- /* 结束标志 */
- send += J3_485RxBufferIndex;
- *send = 0x17;
-
- /* 队列中有空间,则将发送数据 */
- if (uxQueueSpacesAvailable(upward_uart_Queue)) {
- xQueueSend(upward_uart_Queue, &Buff, 10);
- }
- /* 队列无空间,将数据丢弃 */
- else {
- vPortFree(Buff);
- }
-
- J3_485RxBufferIndex = 0;
- }
-}
-
-/**
- * @brief 接收J4口传来的数据
- * @param
- * @retval
- */
-void J4_SensorDataAnalysis(void)
-{
- static uint32_t tick;
-
- if (J4_485RxBufferIndex == 0) {
- tick = xTaskGetTickCount();
- }
-
- /* 单次进入最多6ms(3个时钟周期),串口中有数据 */
- uint32_t nowTick = xTaskGetTickCount();
- while ((getTickDiff(nowTick) < 3)
- && (uart_dev_char_present(g_J4_uart8_handle) == 1)
- && (maxdataLen > J4_485RxBufferIndex)) {
- J4_485RxBuffer[J4_485RxBufferIndex++] = uart_dev_in_char(g_J4_uart8_handle);
- }
-
- /* 当时间到达或者数据量到达,就打包发送给智能模块 */
- if ((J4_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
-
- uint32_t tempLen = 6 + J4_485RxBufferIndex + queueUartSendInfoSize;
- if (xPortGetFreeHeapSize() < tempLen + 1024) {
- J4_485RxBufferIndex = 0;
- return;
- }
-
- uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
- queueUartSendInfo *sendBuff = (queueUartSendInfo *)Buff;
- sendBuff->length = 6 + J4_485RxBufferIndex;
- sendBuff->data = Buff + sizeof(queueUartSendInfo);
- uint8_t *send = sendBuff->data;
-
- /* 起始标志 */
- *send = 'S';
- *(send + 1) = 'L';
-
- /* 端口号 */
- send += 2;
- *send = 4;
-
- /* 数据包长度 */
- send += 1;
- *send = (uint8_t)(J4_485RxBufferIndex >> 8);
- *(send + 1) = (uint8_t)(J4_485RxBufferIndex);
-
- /* 数据包 */
- send += 2;
- memcpy((char *)send, (char *)J4_485RxBuffer, J4_485RxBufferIndex);
-
- /* 结束标志 */
- send += J4_485RxBufferIndex;
- *send = 0x17;
-
- /* 队列中有空间,则将发送数据 */
- if (uxQueueSpacesAvailable(upward_uart_Queue)) {
- xQueueSend(upward_uart_Queue, &Buff, 10);
- }
- /* 队列无空间,将数据丢弃 */
- else {
- vPortFree(Buff);
- }
-
- J4_485RxBufferIndex = 0;
- }
-}
-
-/**
- * @brief 接收J5_0口传来的数据
- * @param
- * @retval
- */
-void J5_0_SensorDataAnalysis(void)
-{
- static uint32_t tick;
-
- if (J5_0_485RxBufferIndex == 0) {
- tick = xTaskGetTickCount();
- }
-
- /* 单次进入最多6ms(3个时钟周期),串口中有数据 */
- uint32_t nowTick = xTaskGetTickCount();
- while ((getTickDiff(nowTick) < 3)
- && (uart_dev_char_present(g_J5_0_usart3_handle) == 1)
- && (maxdataLen > J5_0_485RxBufferIndex)) {
- J5_0_485RxBuffer[J5_0_485RxBufferIndex++] = uart_dev_in_char(g_J5_0_usart3_handle);
- }
-
- /* 当时间到达或者数据量到达,就打包发送给智能模块 */
- if ((J5_0_485RxBufferIndex >= maxdataLen) || (getTickDiff(tick) > delayTick)) {
-
- uint32_t tempLen = 6 + J5_0_485RxBufferIndex + queueUartSendInfoSize;
- if (xPortGetFreeHeapSize() < tempLen + 1024) {
- J5_0_485RxBufferIndex = 0;
- return;
- }
-
- uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
- queueUartSendInfo *sendBuff = (queueUartSendInfo *)Buff;
- sendBuff->length = 6 + J5_0_485RxBufferIndex;
- sendBuff->data = Buff + sizeof(queueUartSendInfo);
- uint8_t *send = sendBuff->data;
-
- /* 起始标志 */
- *send = 'S';
- *(send + 1) = 'L';
-
- /* 端口号 */
- send += 2;
- *send = getConnectPort();
-
- /* 数据包长度 */
- send += 1;
- *send = (uint8_t)(J5_0_485RxBufferIndex >> 8);
- *(send + 1) = (uint8_t)(J5_0_485RxBufferIndex);
-
- /* 数据包 */
- send += 2;
- memcpy((char *)send, (char *)J5_0_485RxBuffer, J5_0_485RxBufferIndex + 1);
-
- /* 结束标志 */
- send += J5_0_485RxBufferIndex;
- *send = 0x17;
-
- /* 队列中有空间,则将发送数据 */
- if (uxQueueSpacesAvailable(upward_uart_Queue)) {
- xQueueSend(upward_uart_Queue, &Buff, 10);
- }
- /* 队列无空间,将数据丢弃 */
- else {
- vPortFree(Buff);
- }
-
- J5_0_485RxBufferIndex = 0;
- }
-}
-
-
-
diff --git a/CH32V303-FreeRTOS/App/application/Src/freerotsTask.c b/CH32V303-FreeRTOS/App/application/Src/freerotsTask.c
deleted file mode 100644
index 322c925..0000000
--- a/CH32V303-FreeRTOS/App/application/Src/freerotsTask.c
+++ /dev/null
@@ -1,256 +0,0 @@
-
-#include "stdio.h"
-
-#include "freerotsTask.h"
-
-#include "uart_dev.h"
-#include "FM_GPIO.h"
-#include "FM_ADC.h"
-#include "queueUart.h"
-#include "upUartParse.h"
-#include "flash.h"
-#include "parameter.h"
-#include "busIdleDetection.h"
-#include "downUartParse.h"
-
-
-#define Common_TASK_PRIO 2
-#define Common_STK_SIZE 512
-
-#define Transmit_TASK_PRIO 7
-#define Transmit_STK_SIZE 256
-
-#define UpReceive_TASK_PRIO 5
-#define UpReceive_STK_SIZE 256
-
-#define DownReceive_TASK_PRIO 4
-#define DownReceive_STK_SIZE 1024
-
-#define FreeMemory_TASK_PRIO 5
-#define FreeMemory_STK_SIZE 256
-
-/* 任务句柄 */
-static TaskHandle_t CommonTask_Handler;
-static TaskHandle_t TransmitTask_Handler;
-static TaskHandle_t UpReceive_Handler;
-static TaskHandle_t DownReceive_Handler;
-static TaskHandle_t FreeMemory_Handler;
-
-
-/**
- * @brief 喂狗等任务在其中进行
- * @param
- * @retval
- */
-static void common_Task(void *pvParameters)
-{
- // writePwrCtrlState(Android_PwrCtrl, PwrCtrlOpen);
- // proportionalInt();
- // while(1) {
- // // printf("task1 entry\r\n");
- // printf_adc_data();
- // USART_ITConfig(UART5, USART_IT_TXE, ENABLE);
- // uartInterruptSend(g_Upward_uart5_handle, data, 12);
- // vTaskDelay(1000);
- // }
-
- uint16_t HeapSizeNum = 0;
- uint16_t LedNum = 0;
-
- /* 用于绝对延时 */
- TickType_t xLastWakeTime;
- const TickType_t xFrequency = 100; // 50 个滴答,即200mS
- // 初始化 xLastWakeTime
- xLastWakeTime = xTaskGetTickCount();
-
-
-
- while (1) {
- // uint8_t *Buff = (uint8_t *)pvPortMalloc(200);
- // if (Buff == NULL) {
- // log_error("Memory allocation failed\n");
- // return;
- // }
-
- // queueUartSendInfo *sendBuff = (queueUartSendInfo *)Buff;
- // sendBuff->length = sizeof("hello world\n");
- // sendBuff->data = Buff + sizeof(queueUartSendInfo);
- // memcpy((char *)sendBuff->data, "hello world\n", sizeof("hello world\n"));
-
- // xQueueSend(upward_uart_Queue, &Buff, 10);
-
-
-
-
- // USARTx_SendStr_Len(USART3, "hello world\n", sizeof("hello world\n"));
-
-
- // uint8_t *Buff = (uint8_t *)pvPortMalloc(200);
- // if (Buff == NULL) {
- // log_error("Memory allocation failed\n");
- // return;
- // }
- // queueTimeShareSendInfo *sendBuff = (queueTimeShareSendInfo *)Buff;
- // sendBuff->length = sizeof("hello world\n");
- // sendBuff->data = Buff + sizeof(queueTimeShareSendInfo);
- // sendBuff->connectPort = connectJ0;
- // memcpy((char *)sendBuff->data, "hello world\n", sizeof("hello world\n"));
-
- // xQueueSend(J5_0_485_Queue, &Buff, 10);
-
-
- /* 每200ms获取一下数据 */
- setWorkCurrent(getInCurrent());
- setWorkVoltage(getInVoltage());
-
- /* 当内存碎片过多时,后续可以在其中处理 */
- if (HeapSizeNum++ == 25) {
- HeapSizeNum = 0;
- log_info("xPortGetFreeHeapSize : %d",xPortGetFreeHeapSize());
- // log_info("getRs485State : %d\n", getRs485State(g_J5_0_usart3_handle));
- // log_info("getUartSendState : %d\n", getUartSendState(g_J5_0_usart3_handle));
- // log_info("getBUSIDLEFlag : %d\n", getBUSIDLEFlag(g_J5_0_usart3_handle));
- }
-
- if (LedNum++ == 3) {
- LedNum = 0;
- ledToggle();
- }
-
- vTaskDelayUntil(&xLastWakeTime, xFrequency);
- // vTaskDelay(200);
- }
-}
-
-/**
- * @brief 将数据发送
- * @param
- * @retval
- */
-static void transmit_Task(void *pvParameters)
-{
- while (1) {
- uartQueueSend();
- }
-}
-
-/**
- * @brief 解析su806发送来的数据
- * @param
- * @retval
- */
-static void UpReceive_Task(void *pvParameters)
-{
- while (1) {
- upwardUartDataAnalysis(g_Upward_uart5_handle);
- vTaskDelay(20);
- }
-}
-
-/**
- * @brief 解析传感器发送来的数据
- * @param
- * @retval
- */
-static void DownReceive_Task(void *pvParameters)
-{
- while (1) {
- J1_SensorDataAnalysis();
- J2_SensorDataAnalysis();
- J3_SensorDataAnalysis();
- J4_SensorDataAnalysis();
- J5_0_SensorDataAnalysis();
- vTaskDelay(5);
- }
-}
-
-/**
- * @brief 通过条件变量通知来释放内存
- * @param
- * @retval
- */
-static void FreeMemory_Task(void *pvParameters)
-{
- while (1) {
- // vTaskDelay(1000);
- binarySemaphoreFreeMemory();
- }
-}
-
-/**
- * @brief 启动
- * @param
- * @retval
- */
-void startApp(void)
-{
- // printf("RCC->RSTSCKR = %08x \r\n", RCC->RSTSCKR);
- // RCC->RSTSCKR |= 1<<24;
-
- /* 初始化flash,读取配置文件 */
- Flash_Init();
- readConfigParameter();
-
- FM_GPIO_Init();
- FM_ADC_Init();
- proportionalInt();
-
- Init_Upward_uart(getUpWard_Uart_Baud());
- Init_J1_485(getJ1_485_Baud());
- Init_J2_485(getJ2_485_Baud());
- Init_J3_485(getJ3_485_Baud());
- Init_J4_485(getJ4_485_Baud());
- Init_J5_0_485(getJ5_0_485_Baud());
-
- uartQueueInit();
- binarySemaphoreInit();
- softwareTimeInit();
-
- Delay_Ms(1000);
- set_485_Read();
-
- writePwrCtrlState(Android_PwrCtrl, GPIO_SET);
- // writePwrCtrlState(J1_PwrCtrl, GPIO_SET);
-
- /* create task */
- xTaskCreate((TaskFunction_t )common_Task,
- (const char* )"commonTask",
- (uint16_t )Common_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )Common_TASK_PRIO,
- (TaskHandle_t* )&CommonTask_Handler);
-
- xTaskCreate((TaskFunction_t )transmit_Task,
- (const char* )"transmitTask",
- (uint16_t )Transmit_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )Transmit_TASK_PRIO,
- (TaskHandle_t* )&TransmitTask_Handler);
-
- xTaskCreate((TaskFunction_t )UpReceive_Task,
- (const char* )"UpReceiveTask",
- (uint16_t )UpReceive_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )UpReceive_TASK_PRIO,
- (TaskHandle_t* )&UpReceive_Handler);
-
- xTaskCreate((TaskFunction_t )DownReceive_Task,
- (const char* )"DownReceiveTask",
- (uint16_t )DownReceive_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )DownReceive_TASK_PRIO,
- (TaskHandle_t* )&DownReceive_Handler);
-
- xTaskCreate((TaskFunction_t )FreeMemory_Task,
- (const char* )"FreeMemoryTask",
- (uint16_t )FreeMemory_STK_SIZE,
- (void* )NULL,
- (UBaseType_t )FreeMemory_TASK_PRIO,
- (TaskHandle_t* )&FreeMemory_Handler);
-
- vTaskStartScheduler();
-}
-
-
-
-
diff --git a/CH32V303-FreeRTOS/App/application/Src/parameter.c b/CH32V303-FreeRTOS/App/application/Src/parameter.c
deleted file mode 100644
index 089b921..0000000
--- a/CH32V303-FreeRTOS/App/application/Src/parameter.c
+++ /dev/null
@@ -1,184 +0,0 @@
-#include "parameter.h"
-
-#pragma pack(push, 1)
-
-typedef struct _parameterInfo {
- float WorkCurrent; //工作电流
- float WorkVoltage; //工作电压
- float Temperature; //温度
-
- uint32_t upWard_Uart_Baud; //与网关通信波特率
- uint32_t J1_485_Baud; //与J1_485通信波特率
- uint32_t J2_485_Baud; //与J2_485通信波特率
- uint32_t J3_485_Baud; //与J3_485通信波特率
- uint32_t J4_485_Baud; //与J4_485通信波特率
- uint32_t J5_0_485_Baud; //与J5_0_485通信波特率
-}parameterInfo;
-
-#pragma pack(pop)
-
-static parameterInfo parameter;
-
-#define startConfigAddr 0x00
-#define configSize (sizeof(configInfo))
-
-/**
- * @brief 读取配置文件参数
- * @param
- * @retval
- */
-void readConfigParameter(void)
-{
- configInfo tempConfig;
- read_Flash((uint8_t *)&tempConfig, startConfigAddr, configSize);
-
- /* 配置文件校验通过 */
- if (tempConfig.crc == checkModebusCrc((uint8_t *)&tempConfig, configSize - 2)) {
- parameter.J1_485_Baud = tempConfig.J1_485_Baud;
- parameter.J2_485_Baud = tempConfig.J2_485_Baud;
- parameter.J3_485_Baud = tempConfig.J3_485_Baud;
- parameter.J4_485_Baud = tempConfig.J4_485_Baud;
- parameter.J5_0_485_Baud = tempConfig.J5_0_485_Baud;
- parameter.upWard_Uart_Baud = tempConfig.upWard_Uart_Baud;
- }
-
- /* 未通过则使用默认参数 */
- else {
- parameter.J1_485_Baud = 9600;
- parameter.J2_485_Baud = 9600;
- parameter.J3_485_Baud = 9600;
- parameter.J4_485_Baud = 9600;
- parameter.J5_0_485_Baud = 115200;
- parameter.upWard_Uart_Baud = 115200;
- }
-}
-
-/**
- * @brief 写入配置文件参数
- * @param inConfigInfo 配置文件
- * @retval
- */
-void writeConfigParameter(configInfo inConfigInfo)
-{
- write_Flash((uint8_t *)&inConfigInfo, startConfigAddr, configSize);
-}
-
-/**
- * @brief 得到工作电流
- * @param
- * @retval
- */
-float getWorkCurrent(void)
-{
- return parameter.WorkCurrent;
-}
-
-/**
- * @brief 设置工作电流
- * @param
- * @retval
- */
-void setWorkCurrent(float Curr)
-{
- parameter.WorkCurrent = Curr;
-}
-
-/**
- * @brief 得到工作电压
- * @param
- * @retval
- */
-float getWorkVoltage(void)
-{
- return parameter.WorkVoltage;
-}
-
-/**
- * @brief 设置工作电压
- * @param
- * @retval
- */
-void setWorkVoltage(float Voltage)
-{
- parameter.WorkVoltage = Voltage;
-}
-
-/**
- * @brief 得到温度
- * @param
- * @retval
- */
-float getTemperature(void)
-{
- return parameter.Temperature;
-}
-
-/**
- * @brief 设置温度
- * @param
- * @retval
- */
-void setTemperature(float Temperature)
-{
- parameter.Temperature = Temperature;
-}
-
-/**
- * @brief 得到对智能模块通信波特率
- * @param
- * @retval
- */
-uint32_t getUpWard_Uart_Baud(void)
-{
- return parameter.upWard_Uart_Baud;
-}
-
-/**
- * @brief 得到对J1通信波特率
- * @param
- * @retval
- */
-uint32_t getJ1_485_Baud(void)
-{
- return parameter.J1_485_Baud;
-}
-
-/**
- * @brief 得到对J2通信波特率
- * @param
- * @retval
- */
-uint32_t getJ2_485_Baud(void)
-{
- return parameter.J2_485_Baud;
-}
-
-/**
- * @brief 得到对J3通信波特率
- * @param
- * @retval
- */
-uint32_t getJ3_485_Baud(void)
-{
- return parameter.J3_485_Baud;
-}
-
-/**
- * @brief 得到对J4通信波特率
- * @param
- * @retval
- */
-uint32_t getJ4_485_Baud(void)
-{
- return parameter.J4_485_Baud;
-}
-
-/**
- * @brief 得到对J5_0通信波特率
- * @param
- * @retval
- */
-uint32_t getJ5_0_485_Baud(void)
-{
- return parameter.J5_0_485_Baud;
-}
\ No newline at end of file
diff --git a/CH32V303-FreeRTOS/App/application/Src/queueUart.c b/CH32V303-FreeRTOS/App/application/Src/queueUart.c
deleted file mode 100644
index a21086e..0000000
--- a/CH32V303-FreeRTOS/App/application/Src/queueUart.c
+++ /dev/null
@@ -1,311 +0,0 @@
-
-#include "queueUart.h"
-#include "uart_dev.h"
-#include "busIdleDetection.h"
-#include "semphr.h"
-
-/* 队列中每个消息的大小 */
-#define QUEUE_SIZE 4
-
-/* 各个通讯口的队列 */
-QueueHandle_t J1_485_Queue = NULL;
-QueueHandle_t J2_485_Queue = NULL;
-QueueHandle_t J3_485_Queue = NULL;
-QueueHandle_t J4_485_Queue = NULL;
-QueueHandle_t J5_0_485_Queue = NULL;
-QueueHandle_t upward_uart_Queue = NULL;
-/* 队列集 */
-QueueSetHandle_t uart_Queue = NULL;
-
-QueueSetMemberHandle_t xActivatedMemberUartQueue;
-
-/* 通过该结构体接收对应的数据用来发送,结束后通过该结构体,释放数据的内存 */
-typedef struct _queueRecvDataInfo {
- queueUartSendInfo *J1_485_data;
- queueUartSendInfo *J2_485_data;
- queueUartSendInfo *J3_485_data;
- queueUartSendInfo *J4_485_data;
- queueUartSendInfo *upward_uart_data;
- queueTimeShareSendInfo *J5_0_485_data;
-} queueRecvDataInfo;
-static queueRecvDataInfo queueRecvData;
-
-/**
- * @brief 初始化串口发送的队列
- * @param
- * @retval
- */
-void uartQueueInit(void)
-{
- /* 初始化队列 */
- J1_485_Queue = xQueueCreate(5, QUEUE_SIZE);
- // if (NULL == J1_485_Queue) {
- // log_error("creat J1_485_Queue error\n");
- // }
-
- J2_485_Queue = xQueueCreate(5, QUEUE_SIZE);
- // if (NULL == J2_485_Queue) {
- // log_error("creat J2_485_Queue error\n");
- // }
-
- J3_485_Queue = xQueueCreate(5, QUEUE_SIZE);
- // if (NULL == J3_485_Queue) {
- // log_error("creat J3_485_Queue error\n");
- // }
-
- J4_485_Queue = xQueueCreate(5, QUEUE_SIZE);
- // if (NULL == J4_485_Queue) {
- // log_error("creat J4_485_Queue error\n");
- // }
-
- J5_0_485_Queue = xQueueCreate(10, QUEUE_SIZE);
- // if (NULL == J5_0_485_Queue) {
- // log_error("creat J5_0_485_Queue error\n");
- // }
-
- upward_uart_Queue = xQueueCreate(10, QUEUE_SIZE);
- // if (NULL == upward_uart_Queue) {
- // log_error("creat upward_uart_Queue error\n");
- // }
-
-
- /* 将队列都放入队列集中 */
- uart_Queue = xQueueCreateSet(6);
- xQueueAddToSet(J1_485_Queue, uart_Queue);
- xQueueAddToSet(J2_485_Queue, uart_Queue);
- xQueueAddToSet(J3_485_Queue, uart_Queue);
- xQueueAddToSet(J4_485_Queue, uart_Queue);
- xQueueAddToSet(J5_0_485_Queue, uart_Queue);
- xQueueAddToSet(upward_uart_Queue, uart_Queue);
-}
-
-/**
- * @brief 从队列中取出数据,发送函数
- * @param
- * @retval
- */
-void uartQueueSend(void)
-{
- /* 用于判定是否延时 */
- static uint8_t flag = 0;
-
- /* 查看队列集中是否有数据 */
- xActivatedMemberUartQueue = xQueueSelectFromSet(uart_Queue, portMAX_DELAY);
-
- /* 查看Upward_uart5中有无数据 */
- if (!getUartState(g_Upward_uart5_handle)) {
- /* 处理接收到的数据 */
- if (xQueueReceive(upward_uart_Queue, &queueRecvData.upward_uart_data, 0) == pdTRUE) {
- uartInterruptSend(g_Upward_uart5_handle, queueRecvData.upward_uart_data->data
- , queueRecvData.upward_uart_data->length);
- flag = 1;
- }
- }
-
- /* 查看J1_485中有无数据 */
- if (!getRs485State(g_J1_uart6_handle)) {
- /* 处理接收到的数据 */
- if (xQueueReceive(J1_485_Queue, &queueRecvData.J1_485_data, 0) == pdTRUE) {
- uartInterruptSend(g_J1_uart6_handle, queueRecvData.J1_485_data->data
- , queueRecvData.J1_485_data->length);
- flag = 1;
- }
- }
-
- /* 查看J2_485中有无数据 */
- if (!getRs485State(g_J2_uart7_handle)) {
- /* 处理接收到的数据 */
- if (xQueueReceive(J2_485_Queue, &queueRecvData.J2_485_data, 0) == pdTRUE) {
- uartInterruptSend(g_J2_uart7_handle, queueRecvData.J2_485_data->data
- , queueRecvData.J2_485_data->length);
- flag = 1;
- }
- }
-
- /* 查看J3_485中有无数据 */
- if (!getRs485State(g_J3_usart2_handle)) {
- /* 处理接收到的数据 */
- if (xQueueReceive(J3_485_Queue, &queueRecvData.J3_485_data, 0) == pdTRUE) {
- uartInterruptSend(g_J3_usart2_handle, queueRecvData.J3_485_data->data
- , queueRecvData.J3_485_data->length);
- flag = 1;
- }
- }
-
- /* 查看J4_485中有无数据 */
- if (!getRs485State(g_J4_uart8_handle)) {
- /* 处理接收到的数据 */
- if (xQueueReceive(J4_485_Queue, &queueRecvData.J4_485_data, 0) == pdTRUE) {
- uartInterruptSend(g_J4_uart8_handle, queueRecvData.J3_485_data->data
- , queueRecvData.J4_485_data->length);
- flag = 1;
- }
- }
-
- /* 查看J5_0_485中有无数据 */
- if (!getRs485State(g_J5_0_usart3_handle)) {
- /* 处理接收到的数据 */
- if (xQueueReceive(J5_0_485_Queue, &queueRecvData.J5_0_485_data, 0) == pdTRUE) {
- setConnectPort(queueRecvData.J5_0_485_data->connectPort);
- // log_info("send J5_0 Data : %s , %d\n", queueRecvData.J5_0_485_data->data, queueRecvData.J5_0_485_data->length);
- uartInterruptSend(g_J5_0_usart3_handle, queueRecvData.J5_0_485_data->data
- , queueRecvData.J5_0_485_data->length);
- flag = 1;
- }
- }
-
- /* 没有数据发送则延时 */
- if (!flag) {
- /* 延时三个系统节拍 */
- vTaskDelay(3);
- log_info("getRs485State : %d\n", getRs485State(g_J5_0_usart3_handle));
- }
- flag = 0;
-}
-
-#ifdef UARTINTERRUPTSEND
-
-
-// 创建队列集
-QueueSetHandle_t BinarySemaphoreSet = NULL;
-// 创建二值信号量
-SemaphoreHandle_t J1_BinarySemaphore = NULL;
-SemaphoreHandle_t J2_BinarySemaphore = NULL;
-SemaphoreHandle_t J3_BinarySemaphore = NULL;
-SemaphoreHandle_t J4_BinarySemaphore = NULL;
-SemaphoreHandle_t J5_0_BinarySemaphore = NULL;
-SemaphoreHandle_t upward_BinarySemaphore = NULL;
-
-/**
- * @brief 二值信号量初始化,用于同步中断发送完成信息,便于任务中释放内存
- * @param
- * @retval
- */
-void binarySemaphoreInit(void)
-{
- // 初始化队列集
- BinarySemaphoreSet = xQueueCreateSet(6);
-
- // 初始化二值信号量
- J1_BinarySemaphore = xSemaphoreCreateBinary();
- J2_BinarySemaphore = xSemaphoreCreateBinary();
- J3_BinarySemaphore = xSemaphoreCreateBinary();
- J4_BinarySemaphore = xSemaphoreCreateBinary();
- J5_0_BinarySemaphore = xSemaphoreCreateBinary();
- upward_BinarySemaphore = xSemaphoreCreateBinary();
-
- // 将二值信号量添加到队列集中
- xQueueAddToSet(J1_BinarySemaphore, BinarySemaphoreSet);
- xQueueAddToSet(J2_BinarySemaphore, BinarySemaphoreSet);
- xQueueAddToSet(J3_BinarySemaphore, BinarySemaphoreSet);
- xQueueAddToSet(J4_BinarySemaphore, BinarySemaphoreSet);
- xQueueAddToSet(J5_0_BinarySemaphore, BinarySemaphoreSet);
- xQueueAddToSet(upward_BinarySemaphore, BinarySemaphoreSet);
-}
-
-/**
- * @brief 通过二值信号量释放中断发送数据的内存
- * @param
- * @retval
- */
-void binarySemaphoreFreeMemory(void)
-{
- // 等待队列集中的事件
- QueueSetMemberHandle_t xActivatedMember = xQueueSelectFromSet(BinarySemaphoreSet, portMAX_DELAY);
-
- if (xActivatedMember == J1_BinarySemaphore) {
- // 执行相关逻辑
- vPortFree(queueRecvData.J1_485_data);
- vTaskDelay(1);
- readJ1_485;
- setJ1_485_SendState(0);
- // 处理二值信号量事件
- xSemaphoreTake(J1_BinarySemaphore, 0);
- }
-
- else if (xActivatedMember == J2_BinarySemaphore) {
- vPortFree(queueRecvData.J2_485_data);
- vTaskDelay(1);
- readJ2_485;
- setJ2_485_SendState(0);
- xSemaphoreTake(J2_BinarySemaphore, 0);
- }
-
- else if (xActivatedMember == J3_BinarySemaphore) {
- vPortFree(queueRecvData.J3_485_data);
- vTaskDelay(1);
- readJ3_485;
- setJ3_485_SendState(0);
- xSemaphoreTake(J3_BinarySemaphore, 0);
- }
-
- else if (xActivatedMember == J4_BinarySemaphore) {
- vPortFree(queueRecvData.J4_485_data);
- vTaskDelay(1);
- readJ4_485;
- setJ4_485_SendState(0);
- xSemaphoreTake(J4_BinarySemaphore, 0);
- }
-
- else if (xActivatedMember == J5_0_BinarySemaphore) {
- vPortFree(queueRecvData.J5_0_485_data);
- vTaskDelay(1);
- readJ5_0_485;
- setJ5_0_485_SendState(0);
- xSemaphoreTake(J5_0_BinarySemaphore, 0);
- }
-
- else if (xActivatedMember == upward_BinarySemaphore) {
- vPortFree(queueRecvData.upward_uart_data);
- setUpward_uart_SendState(0);
- xSemaphoreTake(upward_BinarySemaphore, 0);
- }
-}
-
-/**
- * @brief 数据发送完成后用于清除
- * @param
- * @retval
- */
-void J1_485_IN_TXE(void)
-{
- // vPortFree(queueRecvData.J1_485_data);
- xSemaphoreGiveFromISR(J1_BinarySemaphore, 0);
-}
-
-
-void J2_485_IN_TXE(void)
-{
- // vPortFree(queueRecvData.J2_485_data);
- xSemaphoreGiveFromISR(J2_BinarySemaphore, 0);
-}
-
-
-void J3_485_IN_TXE(void)
-{
- // vPortFree(queueRecvData.J3_485_data);
- xSemaphoreGiveFromISR(J3_BinarySemaphore, 0);
-}
-
-
-void J4_485_IN_TXE(void)
-{
- // vPortFree(queueRecvData.J4_485_data);
- xSemaphoreGiveFromISR(J4_BinarySemaphore, 0);
-}
-
-
-void J5_0_485_IN_TXE(void)
-{
- // vPortFree(queueRecvData.J5_0_485_data);
- xSemaphoreGiveFromISR(J5_0_BinarySemaphore, 0);
-}
-
-
-void Upward_USART_IN_TXE(void)
-{
- // vPortFree(queueRecvData.upward_uart_data);
- xSemaphoreGiveFromISR(upward_BinarySemaphore, 0);
-}
-
-#endif
diff --git a/CH32V303-FreeRTOS/App/application/Src/upUartParse.c b/CH32V303-FreeRTOS/App/application/Src/upUartParse.c
deleted file mode 100644
index f4edda1..0000000
--- a/CH32V303-FreeRTOS/App/application/Src/upUartParse.c
+++ /dev/null
@@ -1,1280 +0,0 @@
-#include
-#include
-
-#include "FreeRTOS.h"
-#include "freerotsTask.h"
-#include "task.h"
-
-#include "pDebug.h"
-#include "upUartParse.h"
-#include "FM_GPIO.h"
-#include "FM_ADC.h"
-#include "queueUart.h"
-#include "parameter.h"
-
-
-
-/* 读取寄存器,最大起始位 */
-#define maxStartReadResAddr 10
-/* 读取寄存器,最大长度 */
-#define maxReadResAddrLen 20
-
-/* 写入寄存器,最大起始位 */
-#define maxStartWriteResAddr 10
-/* 写入寄存器,最大长度 */
-#define maxWriteResAddrLen 20
-
-/* 单次读取配置文件最大个数 */
-#define maxReadCfgLen 80
-
-/* 单次写入配置文件最大字节 */
-#define maxDistributionCfgLen 230
-
-/* 2秒的节拍数 */
-#define tick_2S (configTICK_RATE_HZ * 2)
-/* 1分钟的节拍数 */
-#define tick_1M (configTICK_RATE_HZ * 60)
-
-/* 配置文件数据类型表 */
-typedef enum {
- /* (1字节)对智能模块通信波特率(00H:不使用该串口,01H:4800;02H:9600;03H:19200;04H:38400;05H:57600;06H:115200) */
- Upward_UART_Communication_Baud_Rate = 0x0001,
- J1_485_Communication_Baud_Rate = 0x0002,
- J2_485_Communication_Baud_Rate = 0x0003,
- J3_485_Communication_Baud_Rate = 0x0004,
- J4_485_Communication_Baud_Rate = 0x0005,
- J5_0_485_Communication_Baud_Rate = 0x0006,
-}gateWayCfgFileType;
-
-/* 状态机 */
-typedef enum {
- wait = 0, /* 串口状态机初始状态 */
- startFlagGW, /* 接收到帧头 */
- functionCodeGW, /* 接收到功能码 */
- readRegStartAddressGW, /* 接收到读取寄存器起始地址 */
- readRegStartNumberGW, /* 接收到读取寄存器个数 */
- crcCheckBitGW, /* 接收到校验位 */
- endFlagGW, /* 接收到帧尾 */
- writeRegStartAddressGW, /* 接收到写入寄存器起始地址 */
- writeRegStartNumberGW, /* 接收到写入寄存器个数 */
- cfgFramesNumGW, /* 接收到配置文件帧数 */
- cfgLengthGW, /* 接收到配置文件长度 */
- readCfgLengthGW, /* 接收到读取配置文件长度 */
- startFlagSL, /* 接收到帧头 */
- portSL, /* 接收到端口号 */
- lengthSL, /* 接收到数据包的长度 */
- endFlagSL, /* 接收到帧尾 */
-} uartStateMachine;
-
-
-// /* 计时参数,1min后没解析整个配置文件,丢掉当前数据 */
-// static uint32_t gw485CfgTime = 0;
-
-/* 计时参数,2秒后没解析出一帧数据,丢掉当前数据 */
-static uint32_t gw485RxTime = 0;
-
-/* 储存gw485数据 */
-static uint8_t gw485RxBuffer[1100];
-static uint16_t gw485RxBufferIndex = 0;
-
-/* 状态机状态机变量 */
-static uartStateMachine state = wait;
-/* 帧长度 */
-static uint16_t frameLength = 0;
-
-static void stateMachine(device_handle device);
-
-/* 状态机函数 */
-static uint8_t analysisWait(void);
-static uint8_t analysisStartFlagGW(void);
-static uint8_t analysisFunctionCodeGW(void);
-static uint8_t analysisReadRegStartAddressGW(void);
-static uint8_t analysisReadRegStartNumberGW(void);
-static uint8_t analysisCrcCheckBitGW(void);
-static uint8_t analysisEndFlagGW(device_handle device);
-static uint8_t analysisWriteRegStartAddressGW(void);
-static uint8_t analysisWriteRegStartNumberGW(void);
-static uint8_t analysisCfgFramesNumGW(void);
-static uint8_t analysisCfgLengthGW(void);
-static uint8_t analysisReadCfgLengthGW(void);
-static uint8_t analysisStartFlagSL(void);
-static uint8_t analysisPortSL(void);
-static uint8_t analysisLengthSL(void);
-static uint8_t analysisEndFlagSL(void);
-
-
-
-
-static void GW_MsgProcFunc_Read_Register(device_handle device,uint8_t *buff, uint16_t buffLen);
-static void GW_MsgProcFunc_Write_Register(device_handle device, void *pMsg, uint32_t MsgLen);
-static void GW_MsgProcFunc_Distribution_Profile(device_handle device, void *pMsg, uint32_t MsgLen);
-static void GW_MsgProcFunc_Read_Profile(device_handle device, void *pMsg, uint32_t MsgLen);
-
-
-/* 寄存器处理表 */
-typedef uint16_t (*RegProcFunc)(void*);
-typedef struct _SL_RegProcTable{
- uint32_t regId;
- RegProcFunc pRegProc;
-}SL_RegProcTable;
-
-/* 寄存器解析 */
-static uint16_t ReadRegisterWorkCurrent(void *pMsg);
-static uint16_t ReadRegisterWorkVoltage(void *pMsg);
-static uint16_t ReadRegisterTemperature(void *pMsg);
-static uint16_t ReadRegisterPort1_Power(void *pMsg);
-static uint16_t ReadRegisterPort2_Power(void *pMsg);
-static uint16_t ReadRegisterPort3_Power(void *pMsg);
-static uint16_t ReadRegisterPort4_Power(void *pMsg);
-static uint16_t ReadRegisterPort5_Power(void *pMsg);
-static uint16_t ReadRegisterPort6_Power(void *pMsg);
-static uint16_t ReadRegisterPort7_Power(void *pMsg);
-static uint16_t ReadRegisterPort8_Power(void *pMsg);
-static uint16_t ReadRegisterPort9_Power(void *pMsg);
-static uint16_t WriteRegisterPort1_Power(void *pMsg);
-static uint16_t WriteRegisterPort2_Power(void *pMsg);
-static uint16_t WriteRegisterPort3_Power(void *pMsg);
-static uint16_t WriteRegisterPort4_Power(void *pMsg);
-static uint16_t WriteRegisterPort5_Power(void *pMsg);
-static uint16_t WriteRegisterPort6_Power(void *pMsg);
-static uint16_t WriteRegisterPort7_Power(void *pMsg);
-static uint16_t WriteRegisterPort8_Power(void *pMsg);
-static uint16_t WriteRegisterPort9_Power(void *pMsg);
-
-/* 读取寄存器处理表 */
-SL_RegProcTable g_RegTblR[] =
-{
- {GW_Register_WorkCurrent, ReadRegisterWorkCurrent},
- {GW_Register_WorkVoltage, ReadRegisterWorkVoltage},
- {GW_Register_Temperature, ReadRegisterTemperature},
- {GW_Register_Port1_Power, ReadRegisterPort1_Power},
- {GW_Register_Port2_Power, ReadRegisterPort2_Power},
- {GW_Register_Port3_Power, ReadRegisterPort3_Power},
- {GW_Register_Port4_Power, ReadRegisterPort4_Power},
- {GW_Register_Port5_Power, ReadRegisterPort5_Power},
- {GW_Register_Port6_Power, ReadRegisterPort6_Power},
- {GW_Register_Port7_Power, ReadRegisterPort7_Power},
- {GW_Register_Port8_Power, ReadRegisterPort8_Power},
- {GW_Register_Port9_Power, ReadRegisterPort9_Power},
-};
-
-/* 写入寄存器处理表 */
-SL_RegProcTable g_RegTblW[] =
-{
- {GW_Register_Port1_Power, WriteRegisterPort1_Power},
- {GW_Register_Port2_Power, WriteRegisterPort2_Power},
- {GW_Register_Port3_Power, WriteRegisterPort3_Power},
- {GW_Register_Port4_Power, WriteRegisterPort4_Power},
- {GW_Register_Port5_Power, WriteRegisterPort5_Power},
- {GW_Register_Port6_Power, WriteRegisterPort6_Power},
- {GW_Register_Port7_Power, WriteRegisterPort7_Power},
- {GW_Register_Port8_Power, WriteRegisterPort8_Power},
- {GW_Register_Port9_Power, WriteRegisterPort9_Power},
-};
-
-/**
- * @brief 读取工作电流寄存器
- * @param
- * @retval
- */
-uint16_t ReadRegisterWorkCurrent(void *pMsg)
-{
- return (uint16_t)(getWorkCurrent() * 10);
-}
-
-/**
- * @brief 读取工作电压寄存器
- * @param
- * @retval
- */
-uint16_t ReadRegisterWorkVoltage(void *pMsg)
-{
- return (uint16_t)(getWorkVoltage() * 10);
-}
-
-/**
- * @brief 读取温度寄存器
- * @param
- * @retval
- */
-uint16_t ReadRegisterTemperature(void *pMsg)
-{
- return (uint16_t)(getTemperature() * 10);
-}
-
-/**
- * @brief 读取端口1电源状态
- * @param
- * @retval
- */
-uint16_t ReadRegisterPort1_Power(void *pMsg)
-{
- return readPwrCtrlState(J1_PwrCtrl);
-}
-
-/**
- * @brief 读取端口2电源状态
- * @param
- * @retval
- */
-uint16_t ReadRegisterPort2_Power(void *pMsg)
-{
- return readPwrCtrlState(J2_PwrCtrl);
-}
-
-/**
- * @brief 读取端口3电源状态
- * @param
- * @retval
- */
-uint16_t ReadRegisterPort3_Power(void *pMsg)
-{
- return readPwrCtrlState(J3_PwrCtrl);
-}
-
-/**
- * @brief 读取端口4电源状态
- * @param
- * @retval
- */
-uint16_t ReadRegisterPort4_Power(void *pMsg)
-{
- return readPwrCtrlState(J4_PwrCtrl);
-}
-
-/**
- * @brief 读取端口5电源状态
- * @param
- * @retval
- */
-uint16_t ReadRegisterPort5_Power(void *pMsg)
-{
- return readPwrCtrlState(J5_PwrCtrl);
-}
-
-/**
- * @brief 读取端口6电源状态
- * @param
- * @retval
- */
-uint16_t ReadRegisterPort6_Power(void *pMsg)
-{
- return readPwrCtrlState(J6_PwrCtrl);
-}
-
-/**
- * @brief 读取端口7电源状态
- * @param
- * @retval
- */
-uint16_t ReadRegisterPort7_Power(void *pMsg)
-{
- return readPwrCtrlState(J7_PwrCtrl);
-}
-
-/**
- * @brief 读取端口8电源状态
- * @param
- * @retval
- */
-uint16_t ReadRegisterPort8_Power(void *pMsg)
-{
- return readPwrCtrlState(J8_PwrCtrl);
-}
-
-/**
- * @brief 读取端口9电源状态
- * @param
- * @retval
- */
-uint16_t ReadRegisterPort9_Power(void *pMsg)
-{
- return readPwrCtrlState(J9_PwrCtrl);
-}
-
-/**
- * @brief 设置端口1电源状态
- * @param
- * @retval
- */
-uint16_t WriteRegisterPort1_Power(void *pMsg)
-{
- writePwrCtrlState(J1_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg));
- log_info("state %d\n", (uint8_t)(*(uint16_t *)pMsg));
- return 0;
-}
-
-/**
- * @brief 设置端口2电源状态
- * @param
- * @retval
- */
-uint16_t WriteRegisterPort2_Power(void *pMsg)
-{
- writePwrCtrlState(J2_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg));
- return 0;
-}
-
-/**
- * @brief 设置端口3电源状态
- * @param
- * @retval
- */
-uint16_t WriteRegisterPort3_Power(void *pMsg)
-{
- writePwrCtrlState(J3_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg));
- return 0;
-}
-
-/**
- * @brief 设置端口4电源状态
- * @param
- * @retval
- */
-uint16_t WriteRegisterPort4_Power(void *pMsg)
-{
- writePwrCtrlState(J4_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg));
- return 0;
-}
-
-/**
- * @brief 设置端口5电源状态
- * @param
- * @retval
- */
-uint16_t WriteRegisterPort5_Power(void *pMsg)
-{
- writePwrCtrlState(J5_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg));
- return 0;
-}
-
-/**
- * @brief 设置端口6电源状态
- * @param
- * @retval
- */
-uint16_t WriteRegisterPort6_Power(void *pMsg)
-{
- writePwrCtrlState(J6_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg));
- return 0;
-}
-
-/**
- * @brief 设置端口7电源状态
- * @param
- * @retval
- */
-uint16_t WriteRegisterPort7_Power(void *pMsg)
-{
- writePwrCtrlState(J7_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg));
- return 0;
-}
-
-/**
- * @brief 设置端口8电源状态
- * @param
- * @retval
- */
-uint16_t WriteRegisterPort8_Power(void *pMsg)
-{
- writePwrCtrlState(J8_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg));
- return 0;
-}
-
-/**
- * @brief 设置端口9电源状态
- * @param
- * @retval
- */
-uint16_t WriteRegisterPort9_Power(void *pMsg)
-{
- writePwrCtrlState(J9_PwrCtrl, (uint8_t)(*(uint16_t *)pMsg));
- return 0;
-}
-
-
-/**
- * @brief 状态 wait
- * @param
- * @retval 0:解析失败
- 1:解析成功
- */
-#define waitMaxLen 2
-uint8_t analysisWait(void)
-{
- if (gw485RxBufferIndex >= 2) {
- /* 透传数据帧包头 */
- if (gw485RxBuffer[0] == 'S' && gw485RxBuffer[1] == 'L') {
- // log_info("startFlagSL\n");
- state = startFlagSL;
- return TRUE;
- }
-
- /* 数据帧包头 */
- else if (gw485RxBuffer[0] == 'G' && gw485RxBuffer[1] == 'W') {
- state = startFlagGW;
- return TRUE;
- }
- }
-
- if (gw485RxBufferIndex < waitMaxLen) {
- return FALSE;
- }
- state = wait;
- gw485RxBufferIndex--;
- memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex);
- return FALSE;
-}
-
-/**
- * @brief 状态 startFlagGW
- * @param
- * @retval 0:解析失败
- 1:解析成功
- */
-uint8_t analysisStartFlagGW(void)
-{
- if (gw485RxBuffer[2] == SL_Function_Code_Read_Register
- || gw485RxBuffer[2] == SL_Function_Code_Write_Register
- || gw485RxBuffer[2] == SL_Function_Code_Distribution_Profile
- || gw485RxBuffer[2] == SL_Function_Code_Read_Profile) {
- state = functionCodeGW;
- return TRUE;
- }
-
- state = wait;
- gw485RxBufferIndex--;
- memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex);
- return FALSE;
-}
-
-/**
- * @brief 状态 functionCodeGW
- * @param
- * @retval 0:解析失败
- 1:解析成功
- */
-#define functionCodeGWMaxLen 5
-uint8_t analysisFunctionCodeGW(void)
-{
- if (gw485RxBufferIndex >= 5 && gw485RxBuffer[2] == SL_Function_Code_Read_Register) {
- /* 读取寄存器起始地址 */
- uint16_t startResAddr = ((gw485RxBuffer[3] << 8) | gw485RxBuffer[4]);
- if (startResAddr < maxStartReadResAddr) {
- frameLength = 10;
- state = readRegStartAddressGW;
- return TRUE;
- }
- }
-
- if (gw485RxBufferIndex >= 5 && gw485RxBuffer[2] == SL_Function_Code_Write_Register) {
- /* 写入寄存器起始地址 */
- uint16_t startResAddr = ((gw485RxBuffer[3] << 8) | gw485RxBuffer[4]);
- if (startResAddr < maxStartWriteResAddr) {
- state = writeRegStartAddressGW;
- return TRUE;
- }
- }
-
- // if (gw485RxBufferIndex >= 5 && gw485RxBuffer[2] == SL_Function_Code_Write_Register) {
- // /* 写入寄存器起始地址 */
- // uint16_t startResAddr = ((gw485RxBuffer[3] << 8) | gw485RxBuffer[4]);
- // if (startResAddr < maxStartWriteResAddr) {
- // state = writeRegStartAddressGW;
- // return TRUE;
- // }
- // }
-
- /* 解析配置文件下发帧数 */
- if ((gw485RxBufferIndex >= 5) && (gw485RxBuffer[2] == SL_Function_Code_Distribution_Profile)) {
- if (gw485RxBuffer[3] <= gw485RxBuffer[4]) {
- state = cfgFramesNumGW;
- return TRUE;
- }
- }
-
- /* 解析配置文件读取内容的长度 */
- if ((gw485RxBufferIndex >= 5) && (gw485RxBuffer[2] == SL_Function_Code_Read_Profile)) {
- uint32_t tempCfgLen = 0;
- tempCfgLen = (gw485RxBuffer[3] << 8) | gw485RxBuffer[4];
-
- if (tempCfgLen < maxReadCfgLen && tempCfgLen > 0) {
- state = readCfgLengthGW;
- frameLength = 8 + tempCfgLen;
- return TRUE;
- }
- }
-
- if (gw485RxBufferIndex < functionCodeGWMaxLen) {
- return FALSE;
- }
- state = wait;
- gw485RxBufferIndex--;
- memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex);
- return FALSE;
-}
-
-/**
- * @brief 状态 readRegStartAddressGW
- * @param
- * @retval 0:解析失败
- 1:解析成功
- */
-#define ReadRegStartAddressGWMaxLen 7
-uint8_t analysisReadRegStartAddressGW(void)
-{
- if (gw485RxBufferIndex >= ReadRegStartAddressGWMaxLen) {
- /* 读取寄存器起始地址 */
- uint16_t resAddrLen = ((gw485RxBuffer[5] << 8) | gw485RxBuffer[6]);
- if (resAddrLen < maxReadResAddrLen) {
- state = readRegStartNumberGW;
- return TRUE;
- }
- log_error("resAddrLen : %d \n", resAddrLen);
- }
-
- if (gw485RxBufferIndex < ReadRegStartAddressGWMaxLen) {
- return FALSE;
- }
- state = wait;
- gw485RxBufferIndex--;
- memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex);
- return FALSE;
-}
-
-/**
- * @brief 状态 readRegStartNumberGW
- * @param
- * @retval 0:解析失败
- 1:解析成功
- */
-#define ReadRegStartNumberMaxLen 9
-uint8_t analysisReadRegStartNumberGW(void)
-{
- /* crc校验 */
- if (gw485RxBufferIndex >= ReadRegStartNumberMaxLen) {
- uint16_t tempCrc = 0;
- tempCrc = (gw485RxBuffer[frameLength - 3] << 8) | gw485RxBuffer[frameLength - 2];
-
- if (tempCrc == checkModebusCrc(gw485RxBuffer, frameLength - 3)) {
- state = crcCheckBitGW;
- return TRUE;
- }
- }
-
- if (gw485RxBufferIndex < ReadRegStartNumberMaxLen) {
- return FALSE;
- }
- state = wait;
- gw485RxBufferIndex--;
- memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex);
- return FALSE;
-}
-
-/**
- * @brief 状态 crcCheckBitGW
- * @param
- * @retval 0:解析失败
- 1:解析成功
- */
-uint8_t analysisCrcCheckBitGW(void)
-{
- /* 结束标志校验校验 */
- if (gw485RxBufferIndex == frameLength) {
- if (gw485RxBuffer[frameLength - 1] == 0x16) {
- state = endFlagGW;
- return TRUE;
- }
- }
-
- state = wait;
- gw485RxBufferIndex--;
- memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex);
- return FALSE;
-}
-
-/**
- * @brief 状态 endFlagGW
- * @param
- * @retval 0:解析失败
- 1:解析成功
- */
-uint8_t analysisEndFlagGW(device_handle device)
-{
- /* 数据为读取寄存器 */
- if (gw485RxBuffer[2] == SL_Function_Code_Read_Register) {
- GW_MsgProcFunc_Read_Register(device, gw485RxBuffer, frameLength);
- }
-
- /* 数据为写入寄存器 */
- if (gw485RxBuffer[2] == SL_Function_Code_Write_Register) {
- GW_MsgProcFunc_Write_Register(device, gw485RxBuffer, frameLength);
- }
-
- /* 数据为下发配置文件 */
- else if (gw485RxBuffer[9] == SL_Function_Code_Distribution_Profile) {
- GW_MsgProcFunc_Distribution_Profile(device, gw485RxBuffer, frameLength);
- }
-
- /* 数据为读取配置文件 */
- else if (gw485RxBuffer[9] == SL_Function_Code_Read_Profile) {
- GW_MsgProcFunc_Read_Profile(device, gw485RxBuffer, frameLength);
- }
-
- //清零buff
- state = wait;
- gw485RxBufferIndex = 0;
- return 1;
-}
-
-/**
- * @brief 状态 writeRegStartAddressGW
- * @param
- * @retval 0:解析失败
- 1:解析成功
- */
-#define WriteRegStartAddressGWMaxLen 7
-uint8_t analysisWriteRegStartAddressGW(void)
-{
- if (gw485RxBufferIndex >= 7) {
- /* 写入寄存器起始地址 */
- uint16_t resAddrLen = ((gw485RxBuffer[5] << 8) | gw485RxBuffer[6]);
- if (resAddrLen < maxReadResAddrLen) {
- frameLength = 10 + 2 * resAddrLen;
- state = writeRegStartNumberGW;
- return TRUE;
- }
- }
-
- if (gw485RxBufferIndex < WriteRegStartAddressGWMaxLen) {
- return FALSE;
- }
- state = wait;
- gw485RxBufferIndex--;
- memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex);
- return FALSE;
-}
-
-/**
- * @brief 状态 writeRegStartNumberGW
- * @param
- * @retval 0:解析失败
- 1:解析成功
- */
-#define WriteRegStartNumberGWMaxLen (frameLength - 1)
-uint8_t analysisWriteRegStartNumberGW(void)
-{
- /* crc校验 */
- if (gw485RxBufferIndex >= WriteRegStartNumberGWMaxLen) {
- uint16_t tempCrc = 0;
- tempCrc = ((uint16_t)gw485RxBuffer[frameLength - 3] << 8) | (uint16_t)gw485RxBuffer[frameLength - 2];
-
- if (tempCrc == checkModebusCrc(gw485RxBuffer, frameLength - 3)) {
- state = crcCheckBitGW;
- return TRUE;
- }
- // log_error("tempCrc : %x \n", tempCrc);
- // log_error("checkModebusCrc : %x \n", checkModebusCrc(gw485RxBuffer, frameLength - 3));
- }
-
- if (gw485RxBufferIndex < WriteRegStartNumberGWMaxLen) {
- return FALSE;
- }
- state = wait;
- gw485RxBufferIndex--;
- memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex);
- return FALSE;
-}
-
-/**
- * @brief 状态 cfgFramesNumGW
- * @param
- * @retval 0:解析失败
- 1:解析成功
- */
-#define CfgFramesNumGWMaxLen 7
-uint8_t analysisCfgFramesNumGW(void)
-{
- /* 解析下发配置文件数据内容长度 */
- if (gw485RxBufferIndex >= CfgFramesNumGWMaxLen) {
- uint32_t tempLen = 0;
- tempLen = (gw485RxBuffer[12] << 8) | gw485RxBuffer[13];
-
- if (tempLen > 0 && tempLen <= maxDistributionCfgLen) {
- state = cfgLengthGW;
- frameLength = 10 + tempLen;
- // log_error("cfgFramesNumSL error : tempLen = %d \n", tempLen);
- return TRUE;
- }
- }
-
- if (gw485RxBufferIndex < CfgFramesNumGWMaxLen) {
- return FALSE;
- }
- state = wait;
- gw485RxBufferIndex--;
- memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex);
- return FALSE;
-}
-
-/**
- * @brief 状态 cfgLengthGW
- * @param
- * @retval 0:解析失败
- 1:解析成功
- */
-#define CfgLengthGWMaxLen (frameLength - 1)
-uint8_t analysisCfgLengthGW(void)
-{
- /* crc校验 */
- if (gw485RxBufferIndex >= CfgLengthGWMaxLen) {
- uint16_t tempCrc = 0;
- tempCrc = (gw485RxBuffer[frameLength - 3] << 8) | gw485RxBuffer[frameLength - 2];
-
- if (tempCrc == checkModebusCrc(gw485RxBuffer, frameLength - 3)) {
- state = crcCheckBitGW;
- return TRUE;
- }
- }
-
- if (gw485RxBufferIndex < CfgLengthGWMaxLen) {
- return FALSE;
- }
-
- state = wait;
- gw485RxBufferIndex--;
- memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex);
- return FALSE;
-}
-
-/**
- * @brief 状态
- * @param
- * @retval 0:解析失败
- 1:解析成功
- */
-#define ReadCfgLengthGWMaxLen (frameLength - 1)
-uint8_t analysisReadCfgLengthGW(void)
-{
- /* crc校验 */
- if (gw485RxBufferIndex >= ReadCfgLengthGWMaxLen) {
- uint16_t tempCrc = 0;
- tempCrc = (gw485RxBuffer[frameLength - 3] << 8) | gw485RxBuffer[frameLength - 2];
-
- if (tempCrc == checkModebusCrc(gw485RxBuffer, frameLength - 3)) {
- state = crcCheckBitGW;
- return TRUE;
- }
- }
-
- if (gw485RxBufferIndex < ReadCfgLengthGWMaxLen) {
- return FALSE;
- }
-
- state = wait;
- gw485RxBufferIndex--;
- memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex);
- return FALSE;
-}
-
-/**
- * @brief 状态 startFlagSL
- * @param
- * @retval 0:解析失败
- 1:解析成功
- */
-uint8_t analysisStartFlagSL(void)
-{
- /* 校验端口号 */
- if (gw485RxBuffer[2] < 10 && gw485RxBuffer[2] >= 0) {
- // log_info("portSL\n");
- state = portSL;
- return TRUE;
- }
-
- // log_error("portSL %d \n", gw485RxBuffer[2]);
- state = wait;
- gw485RxBufferIndex--;
- memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex);
- return FALSE;
-}
-
-/**
- * @brief 状态 portSL
- * @param
- * @retval 0:解析失败
- 1:解析成功
- */
-#define PortSLMaxLen 5
-uint8_t analysisPortSL(void)
-{
- /* 解析数据包的度 */
- if (gw485RxBufferIndex >= PortSLMaxLen) {
- uint32_t tempLen = 0;
- tempLen = (gw485RxBuffer[3] << 8) | gw485RxBuffer[4];
-
- if (tempLen > 0 && tempLen <= 1024) {
- // log_info("lengthSL\n");
- state = lengthSL;
- frameLength = 6 + tempLen;
- return TRUE;
- }
- }
-
- if (gw485RxBufferIndex < PortSLMaxLen) {
- return FALSE;
- }
-
- // log_error("lengthSL %d \n", (gw485RxBuffer[3] << 8) | gw485RxBuffer[4]);
-
- state = wait;
- gw485RxBufferIndex--;
- memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex);
- return FALSE;
-}
-
-/**
- * @brief 状态 lengthSL
- * @param
- * @retval 0:解析失败
- 1:解析成功
- */
-#define LengthSLMaxLen frameLength
-uint8_t analysisLengthSL(void)
-{
- /* 解析帧尾 */
- if (gw485RxBufferIndex >= LengthSLMaxLen) {
- if (gw485RxBuffer[LengthSLMaxLen - 1] == 0x17) {
- // log_info("endFlagSL\n");
- state = endFlagSL;
- return TRUE;
- }
- }
-
- if (gw485RxBufferIndex < LengthSLMaxLen) {
- return FALSE;
- }
- // log_info("endFlagSL %d\n", gw485RxBuffer[LengthSLMaxLen - 1]);
-
- state = wait;
- gw485RxBufferIndex--;
- memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex);
- return FALSE;
-}
-
-/**
- * @brief 状态 endFlagSL
- * @param
- * @retval 0:解析失败
- 1:解析成功
- */
-uint8_t analysisEndFlagSL(void)
-{
- uint32_t tempLen = 0;
- tempLen = (gw485RxBuffer[3] << 8) | gw485RxBuffer[4];
-
- //系统内存不足,丢去当前包
- if (xPortGetFreeHeapSize() < tempLen + 1024) {
- goto err;
- }
-
- /* 对于不同通端口,传输的结构体不同 */
- uint8_t *Buff;
- if (gw485RxBuffer[2] > 0 && gw485RxBuffer[2] < 5) {
- Buff = (uint8_t *)pvPortMalloc(tempLen + queueUartSendInfoSize);
- queueUartSendInfo *sendBuff = (queueUartSendInfo *)Buff;
- sendBuff->length = tempLen;
- sendBuff->data = Buff + queueUartSendInfoSize;
- memcpy((char *)sendBuff->data, (char *)&gw485RxBuffer[5], tempLen);
- }
- else {
- Buff = (uint8_t *)pvPortMalloc(tempLen + queueTimeShareSendInfoSize);
- queueTimeShareSendInfo *sendBuff = (queueTimeShareSendInfo *)Buff;
- sendBuff->length = tempLen;
- sendBuff->data = Buff + queueTimeShareSendInfoSize;
- memcpy((char *)sendBuff->data, (char *)&gw485RxBuffer[5], tempLen);
- // printf("\n\n\n\n\n%s\n", (char *)gw485RxBuffer);
- // printf("%s\n%d\n\n\n\n\n\n", sendBuff->data, tempLen);
- }
-
- /* 通过不同的端口将数据发送到不同的地方 */
- if (gw485RxBuffer[2] == 1) {
- if (uxQueueSpacesAvailable(J1_485_Queue)) {
- xQueueSend(J1_485_Queue, &Buff, 10);
- }
- /* 队列中无空间,释放内存,退出 */
- else {
- vPortFree(Buff);
- }
- }
- else if (gw485RxBuffer[2] == 2) {
- if (uxQueueSpacesAvailable(J2_485_Queue)) {
- xQueueSend(J2_485_Queue, &Buff, 10);
- }
- /* 队列中无空间,释放内存,退出 */
- else {
- vPortFree(Buff);
- }
- }
- else if (gw485RxBuffer[2] == 3) {
- if (uxQueueSpacesAvailable(J3_485_Queue)) {
- xQueueSend(J3_485_Queue, &Buff, 10);
- }
- /* 队列中无空间,释放内存,退出 */
- else {
- vPortFree(Buff);
- }
- }
- else if (gw485RxBuffer[2] == 4) {
- if (uxQueueSpacesAvailable(J4_485_Queue)) {
- xQueueSend(J4_485_Queue, &Buff, 10);
- }
- /* 队列中无空间,释放内存,退出 */
- else {
- vPortFree(Buff);
- }
- }
- else if (gw485RxBuffer[2] == 5) {
- queueTimeShareSendInfo *sendBuff = (queueTimeShareSendInfo *)Buff;
- sendBuff->connectPort = connectJ5;
- if (uxQueueSpacesAvailable(J5_0_485_Queue)) {
- xQueueSend(J5_0_485_Queue, &Buff, 10);
- }
- /* 队列中无空间,释放内存,退出 */
- else {
- vPortFree(Buff);
- }
- }
- else if (gw485RxBuffer[2] == 6) {
- queueTimeShareSendInfo *sendBuff = (queueTimeShareSendInfo *)Buff;
- sendBuff->connectPort = connectJ6;
- if (uxQueueSpacesAvailable(J5_0_485_Queue)) {
- xQueueSend(J5_0_485_Queue, &Buff, 10);
- }
- /* 队列中无空间,释放内存,退出 */
- else {
- vPortFree(Buff);
- }
- }
- else if (gw485RxBuffer[2] == 7) {
- queueTimeShareSendInfo *sendBuff = (queueTimeShareSendInfo *)Buff;
- sendBuff->connectPort = connectJ7;
- if (uxQueueSpacesAvailable(J5_0_485_Queue)) {
- xQueueSend(J5_0_485_Queue, &Buff, 10);
- }
- /* 队列中无空间,释放内存,退出 */
- else {
- vPortFree(Buff);
- }
- }
- else if (gw485RxBuffer[2] == 8) {
- queueTimeShareSendInfo *sendBuff = (queueTimeShareSendInfo *)Buff;
- sendBuff->connectPort = connectJ8;
- if (uxQueueSpacesAvailable(J5_0_485_Queue)) {
- xQueueSend(J5_0_485_Queue, &Buff, 10);
- }
- /* 队列中无空间,释放内存,退出 */
- else {
- vPortFree(Buff);
- }
- }
- else if (gw485RxBuffer[2] == 9) {
- queueTimeShareSendInfo *sendBuff = (queueTimeShareSendInfo *)Buff;
- sendBuff->connectPort = connectJ9;
- if (uxQueueSpacesAvailable(J5_0_485_Queue)) {
- xQueueSend(J5_0_485_Queue, &Buff, 10);
- }
- /* 队列中无空间,释放内存,退出 */
- else {
- vPortFree(Buff);
- }
- }
- else if (gw485RxBuffer[2] == 0) {
- queueTimeShareSendInfo *sendBuff = (queueTimeShareSendInfo *)Buff;
- sendBuff->connectPort = connectJ0;
- if (uxQueueSpacesAvailable(J5_0_485_Queue)) {
- xQueueSend(J5_0_485_Queue, &Buff, 10);
- }
- /* 队列中无空间,释放内存,退出 */
- else {
- vPortFree(Buff);
- }
- }
-
-err:
- //清零buff
- state = wait;
- gw485RxBufferIndex = 0;
- return 1;
-}
-
-/**
- * @brief 读取寄存器
- * @param
- * @retval
- */
-void GW_MsgProcFunc_Read_Register(device_handle device,uint8_t *buff, uint16_t buffLen)
-{
- uint16_t Start_Address_16 = (gw485RxBuffer[3] << 8) | gw485RxBuffer[4];
- uint16_t Register_Number_16 = (gw485RxBuffer[5] << 8) | gw485RxBuffer[6];
-
- /* 读取数据 */
- uint16_t reply_Data_Content[maxReadResAddrLen] = {0};
- for ( uint16_t pos = 0; pos < Register_Number_16; pos++) {
- for (uint16_t var = 0; var < sizeof(g_RegTblR) / sizeof(SL_RegProcTable); var++) {
- if (g_RegTblR[var].regId == (Start_Address_16 + pos)) {
- reply_Data_Content[pos] = g_RegTblR[var].pRegProc(NULL);
- }
- }
- }
-
- /* 初始化发送内存 */
- //系统内存不足,丢去当前包
- uint32_t tempLen = 8 + 2 * Register_Number_16 + queueUartSendInfoSize;
- if (xPortGetFreeHeapSize() < tempLen + 1024) {
- return;
- }
-
- uint8_t *Buff = (uint8_t *)pvPortMalloc(tempLen);
- queueUartSendInfo *sendBuff = (queueUartSendInfo *)Buff;
- sendBuff->length = 8 + 2 * Register_Number_16;
- sendBuff->data = Buff + sizeof(queueUartSendInfo);
-
- uint8_t *replay_pack = sendBuff->data;
- /* 起始标志 */
- *(replay_pack) = 'G';
- *(replay_pack + 1) = 'W';
-
- /* 功能码 */
- replay_pack += 2;
- *replay_pack = SL_Function_Code_Read_Register;
-
- /* 回复字节数长度 */
- replay_pack += 1;
- *replay_pack = (uint8_t)((Register_Number_16 * 2) >> 8);
- *(replay_pack + 1) = (uint8_t)(Register_Number_16 * 2);
-
- /* 回复数据内容 */
- replay_pack += 2;
- for (uint8_t var = 0; var < Register_Number_16 * 2; var++) {
- if (0 == (var & 0x01)) {
- *(replay_pack + var) = (uint8_t)(reply_Data_Content[var / 2] >> 8);
- } else {
- *(replay_pack + var) = (uint8_t)(reply_Data_Content[var / 2]);
- }
- }
-
- /* 校验位 */
- replay_pack += Register_Number_16 * 2;
- uint16_t packLen = 2 + 1 + 2 + Register_Number_16 * 2 + 3;
- uint16_t crc_temp = checkModebusCrc(sendBuff->data, packLen - 3);
- *replay_pack = (uint8_t)(crc_temp >> 8);
- replay_pack += 1;
- *replay_pack = (uint8_t)crc_temp;
-
- /* 结束标志 */
- replay_pack += 1;
- *replay_pack = 0x16;
-
- /* 队列中有空间,则将发送数据 */
- if (uxQueueSpacesAvailable(upward_uart_Queue)) {
- xQueueSend(upward_uart_Queue, &Buff, 10);
- }
- else {
- vPortFree(Buff);
- }
-}
-
-/**
- * @brief 写入寄存器
- * @param
- * @retval
- */
-void GW_MsgProcFunc_Write_Register(device_handle device, void *pMsg, uint32_t MsgLen)
-{
- uint16_t Register_Start_Address = (gw485RxBuffer[3] << 8) | gw485RxBuffer[4];
- uint16_t Register_Number = (gw485RxBuffer[5] << 8) | gw485RxBuffer[6];
-
- /* 将指令中的数据读取出来 */
- uint16_t content[maxWriteResAddrLen] = {0};
- for (uint16_t var = 0; var < Register_Number; var++) {
- content[var] = gw485RxBuffer[7 + 2 * var] << 8 | gw485RxBuffer[7 + 2 * var + 1];
- }
-
- /* 将数据写入到寄存器中 */
- for ( uint16_t pos = 0; pos < Register_Number; pos++) {
- for (uint16_t i = 0; i < sizeof(g_RegTblW) / sizeof(SL_RegProcTable); i++) {
- // debug_printf("g_RegTblW[i].regId : %x \n", g_RegTblW[i].regId);
- // debug_printf("Register_Start_Address : %x \n", (Register_Start_Address + pos));
- if (g_RegTblW[i].regId == (Register_Start_Address + pos)) {
- g_RegTblW[i].pRegProc(&content[pos]);
- }
- }
- }
-}
-
-/**
- * @brief 下发配置文件
- * @param
- * @retval
- */
-void GW_MsgProcFunc_Distribution_Profile(device_handle device, void *pMsg, uint32_t MsgLen)
-{
- log_info("in GW_MsgProcFunc_Distribution_Profile\n");
-}
-
-/**
- * @brief 读取配置文件
- * @param
- * @retval
- */
-void GW_MsgProcFunc_Read_Profile(device_handle device, void *pMsg, uint32_t MsgLen)
-{
- log_info("in GW_MsgProcFunc_Read_Profile\n");
-}
-
-/**
- * @brief 状态机函数
- * @param
- * @retval
- */
-void stateMachine(device_handle device)
-{
- if (state == wait) {
- if (analysisWait() == TRUE) {
- gw485RxTime = xTaskGetTickCount();
- }
- }
-
- else if (state == startFlagGW) {
- analysisStartFlagGW();
- }
-
- else if (state == functionCodeGW) {
- analysisFunctionCodeGW();
- }
-
- else if (state == readRegStartAddressGW) {
- analysisReadRegStartAddressGW();
- }
-
- else if (state == readRegStartNumberGW) {
- analysisReadRegStartNumberGW();
- }
-
- else if (state == crcCheckBitGW) {
- analysisCrcCheckBitGW();
- }
-
- else if (state == endFlagGW) {
- analysisEndFlagGW(device);
- }
-
- else if (state == writeRegStartAddressGW) {
- analysisWriteRegStartAddressGW();
- }
-
- else if (state == writeRegStartNumberGW) {
- analysisWriteRegStartNumberGW();
- }
-
- else if (state == cfgFramesNumGW) {
- analysisCfgFramesNumGW();
- }
-
- else if (state == cfgLengthGW) {
- analysisCfgLengthGW();
- }
-
- else if (state == readCfgLengthGW) {
- analysisReadCfgLengthGW();
- }
-
- else if (state == startFlagSL) {
- analysisStartFlagSL();
- }
-
- else if (state == portSL) {
- analysisPortSL();
- }
-
- else if (state == lengthSL) {
- analysisLengthSL();
- }
-
- else if (state == endFlagSL) {
- analysisEndFlagSL();
- }
-}
-
-
-/**
- * @brief modbus的crc校验
- * @param *arr_buff 需要校验的数据
- * len 数据长度
- * @retval crc 校验的结果
- */
-uint16_t checkModebusCrc(uint8_t *arr_buff, uint8_t len)
-{
- uint16_t crc = 0xFFFF;
- uint16_t i, j;
- for (j = 0; j < len; ++j) {
- crc = crc ^ (*arr_buff++);
- for (i = 0; i < 8; ++i) {
- if ((crc&0x0001) > 0) {
- crc = crc >> 1;
- crc = crc ^ 0xa001;
- }
- else {
- crc = crc >> 1;
- }
- }
- }
- return crc;
-}
-
-/**
- * @brief 得到两次获取节拍的差值
- * @param lastTick 上次获取的节拍值
- * @retval
- */
-uint32_t getTickDiff(uint32_t lastTick)
-{
- int64_t temp;
- temp = xTaskGetTickCount() - lastTick;
-
- /* 节拍值超过最大值后重新计数 */
- if (temp < 0) {
- temp = portMAX_DELAY - lastTick + xTaskGetTickCount();
- }
-
- return temp;
-}
-
-/**
- * @brief 解析智能模块发送来的数据
- * @param device 用于接收智能模块发送来的数据的串口设备
- * @retval
- */
-void upwardUartDataAnalysis(device_handle device)
-{
- /* 每次函数最多执行10ms */
- static uint32_t tickstart = 0U;
- tickstart = xTaskGetTickCount();
-
- /* 2S未解析出来一帧数据,将数据清零 */
- if (getTickDiff(gw485RxTime) >= tick_2S) {
- gw485RxTime = xTaskGetTickCount();
- gw485RxBufferIndex = 0;
- state = wait;
- }
-
- while (uart_dev_char_present(device) == 1 && ((xTaskGetTickCount() - tickstart) < 5)) {
- gw485RxBuffer[gw485RxBufferIndex++] = uart_dev_in_char(device);
- stateMachine(device);
- }
-
- if (uart_dev_char_present(device) != 1 && state != wait) {
- stateMachine(device);
- }
-}
diff --git a/CH32V303-FreeRTOS/App/functionalModule/Inc/FM_ADC.h b/CH32V303-FreeRTOS/App/functionalModule/Inc/FM_ADC.h
index 0db2bdb..2871c4b 100644
--- a/CH32V303-FreeRTOS/App/functionalModule/Inc/FM_ADC.h
+++ b/CH32V303-FreeRTOS/App/functionalModule/Inc/FM_ADC.h
@@ -4,10 +4,13 @@
#include "HD_ADC.h"
void FM_ADC_Init(void);
-void printf_adc_data(void);
void proportionalInt(void);
float getSOCPwrOnVoltage(void);
float getInCurrent(void);
float getInVoltage(void);
+float getTemperature(void);
+
+void printf_adc_data(void);
+
#endif
\ No newline at end of file
diff --git a/CH32V303-FreeRTOS/App/functionalModule/Inc/FM_GPIO.h b/CH32V303-FreeRTOS/App/functionalModule/Inc/FM_GPIO.h
index 2bb6b86..ce8d451 100644
--- a/CH32V303-FreeRTOS/App/functionalModule/Inc/FM_GPIO.h
+++ b/CH32V303-FreeRTOS/App/functionalModule/Inc/FM_GPIO.h
@@ -22,7 +22,39 @@ typedef enum _pwrCtrlState{
PwrCtrlOpen
}pwrCtrlState;
-void FM_GPIO_Init(void);
+#define readJ0_485 HD_GPIO_Write(J0De_GPIO_PROT, J0De_GPIO_PIN, read);
+#define readJ1_485 HD_GPIO_Write(J1De_GPIO_PROT, J1De_GPIO_PIN, read);
+#define readJ2_485 HD_GPIO_Write(J2De_GPIO_PROT, J2De_GPIO_PIN, read);
+#define readJ3_485 HD_GPIO_Write(J3De_GPIO_PROT, J3De_GPIO_PIN, read);
+#define readJ4_485 HD_GPIO_Write(J4De_GPIO_PROT, J4De_GPIO_PIN, read);
+#define readJ5_485 HD_GPIO_Write(J5De_GPIO_PROT, J5De_GPIO_PIN, read);
+#define readJ6_485 HD_GPIO_Write(J6De_GPIO_PROT, J6De_GPIO_PIN, read);
+#define readJ7_485 HD_GPIO_Write(J7De_GPIO_PROT, J7De_GPIO_PIN, read);
+#define readJ8_485 HD_GPIO_Write(J8De_GPIO_PROT, J8De_GPIO_PIN, read);
+#define readJ9_485 HD_GPIO_Write(J9De_GPIO_PROT, J9De_GPIO_PIN, read);
+
+#define writeJ0_485 HD_GPIO_Write(J0De_GPIO_PROT, J0De_GPIO_PIN, write);
+#define writeJ1_485 HD_GPIO_Write(J1De_GPIO_PROT, J1De_GPIO_PIN, write);
+#define writeJ2_485 HD_GPIO_Write(J2De_GPIO_PROT, J2De_GPIO_PIN, write);
+#define writeJ3_485 HD_GPIO_Write(J3De_GPIO_PROT, J3De_GPIO_PIN, write);
+#define writeJ4_485 HD_GPIO_Write(J4De_GPIO_PROT, J4De_GPIO_PIN, write);
+#define writeJ5_485 HD_GPIO_Write(J5De_GPIO_PROT, J5De_GPIO_PIN, write);
+#define writeJ6_485 HD_GPIO_Write(J6De_GPIO_PROT, J6De_GPIO_PIN, write);
+#define writeJ7_485 HD_GPIO_Write(J7De_GPIO_PROT, J7De_GPIO_PIN, write);
+#define writeJ8_485 HD_GPIO_Write(J8De_GPIO_PROT, J8De_GPIO_PIN, write);
+#define writeJ9_485 HD_GPIO_Write(J9De_GPIO_PROT, J9De_GPIO_PIN, write);
+
+
+
+
+
+
+
+void HostMcu_GPIO_Init(void);
+void HostMcu_485DE_Read(void);
+void SlaveMcu_GPIO_Init(void);
+void SlaveMcu_485DE_Read(void);
+
void feedDog(void);
void writePwrCtrlState(uint8_t type, uint8_t State);
uint8_t readPwrCtrlState(uint8_t type);
@@ -30,4 +62,8 @@ void startResetAndroidModule(void);
void stopResetAndroidModule(void);
void ledToggle(void);
-#endif
\ No newline at end of file
+void FM_MCU_Init(void);
+uint8_t getMCU(void);
+
+
+#endif
diff --git a/CH32V303-FreeRTOS/App/functionalModule/Inc/flash.h b/CH32V303-FreeRTOS/App/functionalModule/Inc/flash.h
deleted file mode 100644
index 5ee758f..0000000
--- a/CH32V303-FreeRTOS/App/functionalModule/Inc/flash.h
+++ /dev/null
@@ -1,16 +0,0 @@
-
-#ifndef FM_FLASH_H_
-#define FM_FLASH_H_
-
-#include "ch32v30x.h"
-#include "HD_Flash.h"
-// #include "w25q256.h"
-
-void Flash_Init(void);
-void read_Flash(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead);
-void write_Flash(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite);
-void erase_Sector_Flash(uint32_t secpos);
-
-
-
-#endif
\ No newline at end of file
diff --git a/CH32V303-FreeRTOS/App/functionalModule/Inc/uart_dev.h b/CH32V303-FreeRTOS/App/functionalModule/Inc/uart_dev.h
index d74fea7..a751325 100644
--- a/CH32V303-FreeRTOS/App/functionalModule/Inc/uart_dev.h
+++ b/CH32V303-FreeRTOS/App/functionalModule/Inc/uart_dev.h
@@ -6,12 +6,6 @@
#include "comm_types.h"
#include "ring_queue.h"
-/* 鏄惁浣跨敤涓柇鍙戦侊紝鍚庢湡鍙兘鏀逛负DMA鍙戦 */
-#define UARTINTERRUPTSEND
-
-/* 鏄惁浣跨敤绌洪棽涓柇锛屽悗鏈熷彲浠ユ敼涓哄叾浠栨柟寮忓垽鏂荤嚎绌洪棽涓柇 */
-#define RS485BUSIDLE1
-
#define ASCII_CHAR_BACKSPACE 0x08 /* '\b' */
#define ASCII_CHAR_CHARACTER_TABULATION 0x09 /* '\t' */
#define ASCII_CHAR_LINE_FEED 0x0A /* '\n' */
@@ -20,21 +14,22 @@
#define ASCII_CHAR_CARRIAGE_RETURN 0x0D /* '\r' */
typedef enum{
- J1_485_INDEX = 6,
- J2_485_INDEX = 7,
- J3_485_INDEX = 2,
- J4_485_INDEX = 8,
- J5_0_485_INDEX = 3,
- Upward_UART_INDEX = 5,
+ J01_485_INDEX = 0,
+ J23_485_INDEX = 1,
+ J45_485_INDEX = 2,
+ J67_485_INDEX = 3,
+ J8_485_INDEX = 4,
+ J9_485_INDEX = 5,
+ Lora_UART_INDEX = 6,
+ Su806_UART_INDEX = 7,
+ MCU_UART_INDEX = 8,
}uartIndex_e;
typedef struct _uartSendInfo {
uint8_t *data; //鎸囧悜鏁版嵁
-#ifdef UARTINTERRUPTSEND
uint16_t count; //宸茬粡鍙戦佹暟鎹瓧鑺備釜鏁
uint16_t len; //鏁版嵁闀垮害
-#endif
-}uartSendInfo;
+} uartSendInfo;
/* UART 椹卞姩鏁版嵁缁撴瀯锛屽搴斾竴涓猽art璁惧 */
typedef struct _uart_device_info{
@@ -43,74 +38,101 @@ typedef struct _uart_device_info{
uint32_t uart_baudrate;
RingQueue uart_ring_queue;
uartSendInfo uart_send_data;
-}uart_device_info;
+} uart_device_info;
typedef uint32_t device_handle;
-extern device_handle g_J1_uart6_handle;
-extern device_handle g_J2_uart7_handle;
-extern device_handle g_J3_usart2_handle;
-extern device_handle g_J4_uart8_handle;
-extern device_handle g_J5_0_usart3_handle;
-extern device_handle g_Upward_uart5_handle;
+extern device_handle g_J0_handle;
+extern device_handle g_J1_handle;
+extern device_handle g_J2_handle;
+extern device_handle g_J3_handle;
+extern device_handle g_J4_handle;
+extern device_handle g_J5_handle;
+extern device_handle g_J6_handle;
+extern device_handle g_J7_handle;
+extern device_handle g_J8_handle;
+extern device_handle g_J9_handle;
+extern device_handle g_Mcu_handle;
+extern device_handle g_Su806_handle;
+extern device_handle g_Lora_handle;
uint8_t uart_dev_in_char(device_handle device);
int uart_dev_char_present(device_handle device);
+
+void HostMcu_uartBuf_Init(int32_t rs485BufLen, int32_t loraBufLen, int32_t mcuBufLen, int32_t su806BufLen);
+void SlaveMcu_uartBuf_Init(int32_t rs485BufLen, int32_t mcuBufLen);
+void Init_J0_485(uint32_t baud);
void Init_J1_485(uint32_t baud);
void Init_J2_485(uint32_t baud);
void Init_J3_485(uint32_t baud);
void Init_J4_485(uint32_t baud);
-void Init_J5_0_485(uint32_t baud);
-void Init_Upward_uart(uint32_t baud);
+void Init_J5_485(uint32_t baud);
+void Init_J6_485(uint32_t baud);
+void Init_J7_485(uint32_t baud);
+void Init_J8_485(uint32_t baud);
+void Init_J9_485(uint32_t baud);
+void Init_Mcu_Uart(uint32_t baud);
+void Init_Su806_Uart(uint32_t baud);
+void Init_Lora_Uart(uint32_t baud);
+void uartIT_Init(void);
+
+void J0_Interrupt();
+void J1_Interrupt();
+void J2_Interrupt();
+void J3_Interrupt();
+void J4_Interrupt();
+void J5_Interrupt();
+void J6_Interrupt();
+void J7_Interrupt();
+void J8_Interrupt();
+void J9_Interrupt();
+// void Host_Interrupt();
+// void Slave_Interrupt();
+void Mcu_Interrupt();
+void Su806_Interrupt();
+void Lora_Interrupt();
+
+/* 0涓轰富mcu锛岄潪0涓轰粠mcu */
+extern uint8_t getMCU(void);
+
uint8_t getUartSendState(device_handle device);
-#ifdef UARTINTERRUPTSEND
+extern void J0_485_IN_TXE(void);
extern void J1_485_IN_TXE(void);
extern void J2_485_IN_TXE(void);
extern void J3_485_IN_TXE(void);
extern void J4_485_IN_TXE(void);
-extern void J5_0_485_IN_TXE(void);
-extern void Upward_USART_IN_TXE(void);
-uint8_t uartInterruptSend(device_handle device, uint8_t *data, uint16_t len);
-#endif
+extern void J5_485_IN_TXE(void);
+extern void J6_485_IN_TXE(void);
+extern void J7_485_IN_TXE(void);
+extern void J8_485_IN_TXE(void);
+extern void J9_485_IN_TXE(void);
+extern void Lora_uart_IN_TXE(void);
+// extern void Mcu_uart_IN_TXE(void);
+extern void hostMcu_uart_IN_TXE(void);
+extern void slaveMcu_uart_IN_TXE(void);
+extern void Su806_uart_IN_TXE(void);
-#ifdef RS485BUSIDLE1
+extern void J0_485_IN_IDLE(void);
extern void J1_485_IN_IDLE(void);
extern void J2_485_IN_IDLE(void);
extern void J3_485_IN_IDLE(void);
extern void J4_485_IN_IDLE(void);
-extern void J5_0_485_IN_IDLE(void);
+extern void J5_485_IN_IDLE(void);
+extern void J6_485_IN_IDLE(void);
+extern void J7_485_IN_IDLE(void);
+extern void J8_485_IN_IDLE(void);
+extern void J9_485_IN_IDLE(void);
+extern void J0_485_IN_RXNE(void);
extern void J1_485_IN_RXNE(void);
extern void J2_485_IN_RXNE(void);
extern void J3_485_IN_RXNE(void);
extern void J4_485_IN_RXNE(void);
-extern void J5_0_485_IN_RXNE(void);
-
-uint8_t getBUSIDLEFlag(device_handle device);
-// uint8_t getSoftwareIDLEFlag(device_handle device);
-void setBUSIDLEFlag(device_handle device, uint8_t state);
-// void setSoftwareIDLEFlag(device_handle device, uint8_t state);
-#endif
-
-void setJ1_485_SendState(uint8_t state);
-void setJ2_485_SendState(uint8_t state);
-void setJ3_485_SendState(uint8_t state);
-void setJ4_485_SendState(uint8_t state);
-void setJ5_0_485_SendState(uint8_t state);
-void setUpward_uart_SendState(uint8_t state);
-
-/* J5_0杩炴帴鍒板摢涓鍙 */
-typedef enum _connectPortEnum {
- connectJ0 = 0,
- connectJ5 = 5,
- connectJ6,
- connectJ7,
- connectJ8,
- connectJ9,
-} connectPortEnum;
-void setConnectPort(uint8_t port);
-uint8_t getConnectPort(void);
-
+extern void J5_485_IN_RXNE(void);
+extern void J6_485_IN_RXNE(void);
+extern void J7_485_IN_RXNE(void);
+extern void J8_485_IN_RXNE(void);
+extern void J9_485_IN_RXNE(void);
#endif
diff --git a/CH32V303-FreeRTOS/App/functionalModule/Src/FM_ADC.c b/CH32V303-FreeRTOS/App/functionalModule/Src/FM_ADC.c
index 51d7ae8..719c679 100644
--- a/CH32V303-FreeRTOS/App/functionalModule/Src/FM_ADC.c
+++ b/CH32V303-FreeRTOS/App/functionalModule/Src/FM_ADC.c
@@ -1,4 +1,3 @@
-
#include "FM_ADC.h"
/* adc采集转换的比例 */
@@ -12,6 +11,7 @@ static float P_In_Current;
/* 参考电压的大小 */
#define referenceVoltage 3.3f
+
/**
* @brief 将采集的adc进行校准
* @param val 采集的adc数据
@@ -26,6 +26,7 @@ static uint16_t Get_ConversionVal(int16_t val)
return (val + Calibrattion_Val);
}
+
/**
* @brief 初始化adc
* @param
@@ -38,19 +39,6 @@ void FM_ADC_Init(void)
startAdcCapture();
}
-/**
- * @brief 打印adc生成的数据
- * @param
- * @retval
- */
-void printf_adc_data(void)
-{
- printf("adc : %d, %d, %d\n", adcData[0], adcData[1], adcData[2]);
- printf("getSOCPwrOnVoltage: %d\n", (int)(getSOCPwrOnVoltage() * 1000.0f));
- printf("getInCurrent: %d\n", (int)(getInCurrent() * 1000.0f));
- printf("getInVoltage: %d\n", (int)(getInVoltage() * 1000.0f));
-}
-
/**
* @brief 初始化转换的比例
* @param
@@ -70,7 +58,7 @@ void proportionalInt(void)
*/
float getSOCPwrOnVoltage(void)
{
- return (Get_ConversionVal(adcData[0]) * P_PwrOn_Voltage);
+ return (Get_ConversionVal(adcData[PwrOnNum]) * P_PwrOn_Voltage);
}
/**
@@ -80,7 +68,7 @@ float getSOCPwrOnVoltage(void)
*/
float getInCurrent(void)
{
- return (Get_ConversionVal(adcData[1]) * P_In_Current);
+ return (Get_ConversionVal(adcData[CurrentNum]) * P_In_Current);
}
/**
@@ -90,5 +78,29 @@ float getInCurrent(void)
*/
float getInVoltage(void)
{
- return (Get_ConversionVal(adcData[2]) * P_In_Voltage);
-}
\ No newline at end of file
+ return (Get_ConversionVal(adcData[VoltageNum]) * P_In_Voltage);
+}
+
+/**
+ * @brief 得到网关盒子中的温度
+ * @param
+ * @retval
+ */
+float getTemperature(void)
+{
+ return (Get_ConversionVal(adcData[TemperatureNum]));
+}
+
+/**
+ * @brief 打印adc生成的数据
+ * @param
+ * @retval
+ */
+void printf_adc_data(void)
+{
+ printf("adc : %d, %d, %d, %d\n", adcData[0], adcData[1], adcData[2], adcData[3]);
+ printf("getSOCPwrOnVoltage: %d\n", (int)(getSOCPwrOnVoltage() * 1000.0f));
+ printf("getInCurrent: %d\n", (int)(getInCurrent() * 1000.0f));
+ printf("getInVoltage: %d\n", (int)(getInVoltage() * 1000.0f));
+ printf("getTemperature: %d\n", (int)(getTemperature() * 1000.0f));
+}
diff --git a/CH32V303-FreeRTOS/App/functionalModule/Src/FM_GPIO.c b/CH32V303-FreeRTOS/App/functionalModule/Src/FM_GPIO.c
index 51e3a7c..fbe6f4f 100644
--- a/CH32V303-FreeRTOS/App/functionalModule/Src/FM_GPIO.c
+++ b/CH32V303-FreeRTOS/App/functionalModule/Src/FM_GPIO.c
@@ -1,20 +1,85 @@
+
#include "FM_GPIO.h"
-
+static uint8_t mcuFlag = 0;
/**
- * @brief 初始化GPIO
- * @param
- * @retval
+ * @brief 初始化判断主从mcu.
+ * @param
+ * @retval
*/
-void FM_GPIO_Init(void)
+void FM_MCU_Init(void)
{
- HD_GPIO_Init();
+ mcuFlag = mcu_GPIO_Init();
}
/**
- * @brief 喂狗
- * @param
- * @retval
+ * @brief 主mcu的io初始化.
+ * @param
+ * @retval
+ */
+uint8_t getMCU(void)
+{
+ return mcuFlag;
+}
+
+/**
+ * @brief 主mcu的io初始化.
+ * @param
+ * @retval
+ */
+void HostMcu_GPIO_Init(void)
+{
+ PwrCtrl_GPIO_Init();
+ Android_GPIO_Init();
+ WDI_GPIO_Init();
+ LED_GPIO_Init();
+ Host485De_GPIO_Init();
+ ctrlSlave_GPIO_Init();
+}
+
+/**
+ * @brief 将主mcu的485读写引脚全部设置为写.
+ * @param
+ * @retval
+ */
+void HostMcu_485DE_Read(void)
+{
+ HD_GPIO_Write(J0De_GPIO_PROT, J0De_GPIO_PIN, read);
+ HD_GPIO_Write(J2De_GPIO_PROT, J2De_GPIO_PIN, read);
+ HD_GPIO_Write(J4De_GPIO_PROT, J4De_GPIO_PIN, read);
+ HD_GPIO_Write(J6De_GPIO_PROT, J6De_GPIO_PIN, read);
+}
+
+/**
+ * @brief 从mcu的io初始化.
+ * @param
+ * @retval
+ */
+void SlaveMcu_GPIO_Init(void)
+{
+ WDI_GPIO_Init();
+ Slave485De_GPIO_Init();
+}
+
+/**
+ * @brief 将从mcu的485读写引脚全部设置为读.
+ * @param
+ * @retval
+ */
+void SlaveMcu_485DE_Read(void)
+{
+ HD_GPIO_Write(J1De_GPIO_PROT, J1De_GPIO_PIN, read);
+ HD_GPIO_Write(J3De_GPIO_PROT, J3De_GPIO_PIN, read);
+ HD_GPIO_Write(J5De_GPIO_PROT, J5De_GPIO_PIN, read);
+ HD_GPIO_Write(J7De_GPIO_PROT, J7De_GPIO_PIN, read);
+ HD_GPIO_Write(J8De_GPIO_PROT, J8De_GPIO_PIN, read);
+ HD_GPIO_Write(J9De_GPIO_PROT, J9De_GPIO_PIN, read);
+}
+
+/**
+ * @brief 喂狗.
+ * @param
+ * @retval
*/
void feedDog(void)
{
@@ -23,10 +88,10 @@ void feedDog(void)
}
/**
- * @brief 电源输出状态设置
+ * @brief 设置电源控制引脚状态.
* @param type 电源输出接口
state 输出状态
- * @retval
+ * @retval
*/
void writePwrCtrlState(uint8_t type, uint8_t State)
{
@@ -54,7 +119,7 @@ void writePwrCtrlState(uint8_t type, uint8_t State)
}
/**
- * @brief 读取电源输出状态
+ * @brief 读取电源控制引脚状态.
* @param type 电源输出接口
* @retval state 输出状态
0xFF 输入类型错误
@@ -117,3 +182,4 @@ void ledToggle(void)
HD_GPIO_Write(LED_GPIO_PROT, LED_GPIO_PIN
, !(HD_OutputGPIO_Read(LED_GPIO_PROT, LED_GPIO_PIN)));
}
+
diff --git a/CH32V303-FreeRTOS/App/functionalModule/Src/flash.c b/CH32V303-FreeRTOS/App/functionalModule/Src/flash.c
deleted file mode 100644
index 9b54d38..0000000
--- a/CH32V303-FreeRTOS/App/functionalModule/Src/flash.c
+++ /dev/null
@@ -1,42 +0,0 @@
-#include "flash.h"
-
-/**
- * @brief flash鍒濆鍖
- * @param
- */
-void Flash_Init(void)
-{
- SPI_Flash_Init();
-}
-
-/**
- * @brief 璇诲彇flash涓殑鏁版嵁
- * @param pBuffer 淇濆瓨璇诲彇鐨勬暟鎹
- * @param ReadAddr 璇诲彇鏁版嵁鐨勪綅缃
- * @param NumByteToRead 璇诲彇鏁版嵁鐨勯暱搴
- */
-void read_Flash(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead)
-{
- SPI_Flash_Read(pBuffer, ReadAddr, NumByteToRead);
-}
-
-/**
- * @brief 灏嗘暟鎹啓鍏ュ埌flash涓
- * @param pBuffer 瑕佸啓鍏ョ殑鏁版嵁
- * @param ReadAddr 瑕佸啓鍏ユ暟鎹殑浣嶇疆
- * @param NumByteToRead 瑕佸啓鍏ユ暟鎹殑闀垮害
- */
-void write_Flash(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)
-{
- SPI_Flash_Write(pBuffer, WriteAddr, NumByteToWrite);
-}
-
-
-/**
- * @brief 娓呴櫎flash涓璼ecpos鎵囧尯鐨勬暟鎹
- *
- */
-void erase_Sector_Flash(uint32_t secpos)
-{
- SPI_Flash_Erase_Sector(secpos);
-}
diff --git a/CH32V303-FreeRTOS/App/functionalModule/Src/uart_dev.c b/CH32V303-FreeRTOS/App/functionalModule/Src/uart_dev.c
index ec4b87a..2533a87 100644
--- a/CH32V303-FreeRTOS/App/functionalModule/Src/uart_dev.c
+++ b/CH32V303-FreeRTOS/App/functionalModule/Src/uart_dev.c
@@ -1,110 +1,89 @@
#include "uart_dev.h"
-#include
-#include
-#include
-#include "pDebug.h"
-
#include "FreeRTOS.h"
-#include "task.h"
-device_handle g_J1_uart6_handle;
-device_handle g_J2_uart7_handle;
-device_handle g_J3_usart2_handle;
-device_handle g_J4_uart8_handle;
-device_handle g_J5_0_usart3_handle;
-device_handle g_Upward_uart5_handle;
+device_handle g_J0_handle;
+device_handle g_J1_handle;
+device_handle g_J2_handle;
+device_handle g_J3_handle;
+device_handle g_J4_handle;
+device_handle g_J5_handle;
+device_handle g_J6_handle;
+device_handle g_J7_handle;
+device_handle g_J8_handle;
+device_handle g_J9_handle;
+device_handle g_Mcu_handle;
+device_handle g_Su806_handle;
+device_handle g_Lora_handle;
-/* 鎺ユ敹缂撳啿鍖烘暟缁 */
-uint8_t J1_Rbuffer[1] = {0x00};
-uint8_t J2_Rbuffer[1] = {0x00};
-uint8_t J3_Rbuffer[1] = {0x00};
-uint8_t J4_Rbuffer[1] = {0x00};
-uint8_t J5_0_Rbuffer[1] = {0x00};
-uint8_t Upward_Rbuffer[1] = {0x00};
+static int32_t rs485BuffLen;
+static int32_t loraBuffLen;
+static int32_t mcuBuffLen;
+static int32_t su806BuffLen;
-/* 鐜舰buff */
-#define J485BuffLen 256
-uint8_t J1_inBuff[J485BuffLen];
-uint8_t J2_inBuff[J485BuffLen];
-uint8_t J3_inBuff[J485BuffLen];
-uint8_t J4_inBuff[J485BuffLen];
-uint8_t J5_0_inBuff[J485BuffLen];
-#define UpwardBuffLen 1024
-uint8_t Upward_inBuff[UpwardBuffLen];
+static uint8_t *J0Buff;
+static uint8_t *J1Buff;
+static uint8_t *J2Buff;
+static uint8_t *J3Buff;
+static uint8_t *J4Buff;
+static uint8_t *J5Buff;
+static uint8_t *J6Buff;
+static uint8_t *J7Buff;
+static uint8_t *J8Buff;
+static uint8_t *J9Buff;
+static uint8_t *LoraBuff;
+static uint8_t *McuBuff;
+static uint8_t *Su806Buff;
-/* 鐢ㄤ簬褰撳仛鍙戦佹椂鐨勬爣蹇椾綅 8涓綅锛屽垎鍒搴斿悇涓覆鍙 */
-#define J1_485_Send 0x01
-#define J2_485_Send 0x02
-#define J3_485_Send 0x04
-#define J4_485_Send 0x08
-#define J5_0_485_Send 0x20
-#define Upward_uart_Send 0x40
-static uint8_t uartInterruptSendFlag = 0;
-
-// // static uint8_t getJ1_485_SendState(void);
-// static void setJ1_485_SendState(uint8_t state);
-// // static uint8_t getJ2_485_SendState(void);
-// static void setJ2_485_SendState(uint8_t state);
-// // static uint8_t getJ3_485_SendState(void);
-// static void setJ3_485_SendState(uint8_t state);
-// // static uint8_t getJ4_485_SendState(void);
-// static void setJ4_485_SendState(uint8_t state);
-// // static uint8_t getJ5_0_485_SendState(void);
-// static void setJ5_0_485_SendState(uint8_t state);
-// // static uint8_t getUpward_uart_SendState(void);
-// static void setUpward_uart_SendState(uint8_t state);
-
-
-#ifdef RS485BUSIDLE1
-/* 鐢ㄤ簬鎬荤嚎绌洪棽鏍囧織浣 */
-//璇ヤ綅涓0鏃惰〃绀烘荤嚎绌洪棽
-#define BUS_IDLE 0x01
-// //璇ヤ綅涓0鏃惰〃绀鸿繘鍏ヤ簡绌洪棽涓柇
-// #define softwareTimeFlag 0x02
-static uint8_t J1_485_IDLE_Flag = 0;
-static uint8_t J2_485_IDLE_Flag = 0;
-static uint8_t J3_485_IDLE_Flag = 0;
-static uint8_t J4_485_IDLE_Flag = 0;
-static uint8_t J5_0_485_IDLE_Flag = 0;
-#endif
-
-/* J5_0_485褰撳墠杩炴帴鍒扮殑绔彛 */
-static uint8_t connectPort = connectJ0;
/**
- * @brief 涓插彛淇℃伅鍒濆鍖栵紝涓插彛鍙峰強娉㈢壒鐜.
- * @param uart_index 瀵瑰簲鐨勭‖浠朵覆鍙e彿
- * @param uart_baudrate 娉㈢壒鐜
+ * @brief 串口信息初始化,串口号及波特率.
+ * @param uart_index 对应的硬件串口号
+ * @param uart_baudrate 波特率
*/
uart_device_info uart_devices[]={
[0] = {
.init = 0,
- .uart_index = J1_485_INDEX,
+ .uart_index = J01_485_INDEX,
.uart_baudrate = 9600,
},
[1] = {
.init = 0,
- .uart_index = J2_485_INDEX,
+ .uart_index = J23_485_INDEX,
.uart_baudrate = 9600,
},
[2] = {
.init = 0,
- .uart_index = J3_485_INDEX,
+ .uart_index = J45_485_INDEX,
.uart_baudrate = 9600,
},
[3] = {
.init = 0,
- .uart_index = J4_485_INDEX,
+ .uart_index = J67_485_INDEX,
.uart_baudrate = 9600,
},
[4] = {
.init = 0,
- .uart_index = J5_0_485_INDEX,
+ .uart_index = J8_485_INDEX,
.uart_baudrate = 9600,
},
[5] = {
.init = 0,
- .uart_index = Upward_UART_INDEX,
+ .uart_index = J9_485_INDEX,
+ .uart_baudrate = 9600,
+ },
+ [6] = {
+ .init = 0,
+ .uart_index = Lora_UART_INDEX,
+ .uart_baudrate = 9600,
+ },
+ [7] = {
+ .init = 0,
+ .uart_index = Su806_UART_INDEX,
+ .uart_baudrate = 115200,
+ },
+ [8] = {
+ .init = 0,
+ .uart_index = MCU_UART_INDEX,
.uart_baudrate = 115200,
},
};
@@ -112,13 +91,12 @@ uart_device_info uart_devices[]={
static device_handle uart_dev_init(uartIndex_e uart_index, uint8_t *buff, int buff_size);
static void uart_init(uartIndex_e uart_index, uint32_t baud);
-
/**
- * @brief 鍒濆鍖栦覆鍙h澶.
- * @param uart_index 鍒濆鍖栦覆鍙e彿
- * @param buff 涓插彛寰幆buff鍦板潃
- * @param buff_size 涓插彛寰幆buff瀵瑰簲澶у皬
- * @retval 涓插彛鍙ユ焺
+ * @brief 初始化串口设备.
+ * @param uart_index 初始化串口号
+ * @param buff 串口循环buff地址
+ * @param buff_size 串口循环buff对应大小
+ * @retval 串口句柄
*/
device_handle uart_dev_init(uartIndex_e uart_index, uint8_t *buff, int buff_size)
{
@@ -127,8 +105,7 @@ device_handle uart_dev_init(uartIndex_e uart_index, uint8_t *buff, int buff_size
if (uart_devices[i].uart_index == uart_index) {
if (!uart_devices[i].init) {
InitRingQueue(&uart_devices[i].uart_ring_queue, buff, buff_size);
- uart_init(uart_index, uart_devices[i].uart_baudrate);
-
+ uart_init(uart_index, uart_devices[i].uart_baudrate);
uart_devices[i].init = 1;
}
return (device_handle)(&uart_devices[i]);
@@ -137,33 +114,48 @@ device_handle uart_dev_init(uartIndex_e uart_index, uint8_t *buff, int buff_size
return 0;
}
+
/**
- * @brief 涓插彛纭欢鍒濆鍖.
- * @param uart_index 涓插彛鍙
- * @param baud 娉㈢壒鐜
+ * @brief 串口硬件初始化.
+ * @param uart_index 串口号
+ * @param baud 波特率
* @retval None
*/
void uart_init(uartIndex_e uart_index, uint32_t baud)
{
- if (uart_index == J1_485_INDEX) {
- J1_485_Init(baud);
- } else if (uart_index == J2_485_INDEX) {
- J2_485_Init(baud);
- } else if (uart_index == J3_485_INDEX) {
- J3_485_Init(baud);
- } else if (uart_index == J4_485_INDEX) {
- J4_485_Init(baud);
- } else if (uart_index == J5_0_485_INDEX) {
- J5_0_485_Init(baud);
- } else if (uart_index == Upward_UART_INDEX) {
- Upward_UART5_Init(baud);
+ if (uart_index == J01_485_INDEX) {
+ uart3Init(baud);
+ }
+ else if (uart_index == J23_485_INDEX) {
+ uart4Init(baud);
+ }
+ else if (uart_index == J45_485_INDEX) {
+ uart5Init(baud);
+ }
+ else if (uart_index == J67_485_INDEX) {
+ uart6Init(baud);
+ }
+ else if (uart_index == J8_485_INDEX) {
+ uart8Init(baud);
+ }
+ else if (uart_index == J9_485_INDEX) {
+ uart7Init(baud);
+ }
+ else if (uart_index == Lora_UART_INDEX) {
+ uart7Init(baud);
+ }
+ else if (uart_index == Su806_UART_INDEX) {
+ uart8Init(baud);
+ }
+ else if (uart_index == MCU_UART_INDEX) {
+ uart2Init(baud);
}
}
/**
- * @brief 浠庝覆鍙h澶囧惊鐜痓uff璇诲彇涓涓暟鎹.
- * @param device 涓插彛鍙ユ焺
- * @retval 璇诲彇鍒扮殑瀛楃
+ * @brief 从串口设备循环buff读取一个数据.
+ * @param device 串口句柄
+ * @retval 读取到的字符
*/
uint8_t uart_dev_in_char(device_handle device)
{
@@ -176,9 +168,9 @@ uint8_t uart_dev_in_char(device_handle device)
}
/**
- * @brief 鍒ゆ柇涓插彛璁惧寰幆buff鏄惁鏈夋暟鎹.
- * @param device 涓插彛鍙ユ焺
- * @retval 0 绌 1鏈夋暟鎹
+ * @brief 判断串口设备循环buff是否有数据.
+ * @param device 串口句柄
+ * @retval 0 空 1有数据
*/
int uart_dev_char_present(device_handle device)
{
@@ -190,744 +182,630 @@ int uart_dev_char_present(device_handle device)
return !RingQueueEmpty(&device_info->uart_ring_queue);
}
-/* 鍒濆鍖 */
+/**
+ * @brief 主mcu初始化串口buff.
+ * @param rs485BufLen 485buff的长度
+ loraBufLen lora通信buff的长度
+ mcuBufLen mcu通信buff的长度
+ su806BufLen su806通信buff的长度
+ * @retval
+ */
+void HostMcu_uartBuf_Init(int32_t rs485BufLen, int32_t loraBufLen, int32_t mcuBufLen, int32_t su806BufLen)
+{
+ rs485BuffLen = rs485BufLen;
+ loraBuffLen = loraBufLen;
+ mcuBuffLen = mcuBufLen;
+ su806BuffLen = su806BufLen;
+
+ J0Buff = (uint8_t *)pvPortMalloc(rs485BuffLen);
+ J2Buff = (uint8_t *)pvPortMalloc(rs485BuffLen);
+ J4Buff = (uint8_t *)pvPortMalloc(rs485BuffLen);
+ J6Buff = (uint8_t *)pvPortMalloc(rs485BuffLen);
+
+ McuBuff = (uint8_t *)pvPortMalloc(mcuBuffLen);
+
+ Su806Buff = (uint8_t *)pvPortMalloc(su806BuffLen);
+
+ LoraBuff = (uint8_t *)pvPortMalloc(loraBuffLen);
+}
+
+/**
+ * @brief 从mcu初始化串口buff.
+ * @param rs485BufLen 485buff的长度
+ mcuBufLen mcu通信buff的长度
+ * @retval
+ */
+void SlaveMcu_uartBuf_Init(int32_t rs485BufLen, int32_t mcuBufLen)
+{
+ rs485BuffLen = rs485BufLen;
+ mcuBuffLen = mcuBufLen;
+
+ J1Buff = (uint8_t *)pvPortMalloc(rs485BuffLen);
+ J3Buff = (uint8_t *)pvPortMalloc(rs485BuffLen);
+ J4Buff = (uint8_t *)pvPortMalloc(rs485BuffLen);
+ J7Buff = (uint8_t *)pvPortMalloc(rs485BuffLen);
+ J8Buff = (uint8_t *)pvPortMalloc(rs485BuffLen);
+ J9Buff = (uint8_t *)pvPortMalloc(rs485BuffLen);
+
+ McuBuff = (uint8_t *)pvPortMalloc(mcuBuffLen);
+}
+
+void Init_J0_485(uint32_t baud)
+{
+ uart_devices[0].uart_baudrate = baud;
+ g_J0_handle = uart_dev_init(J01_485_INDEX, J0Buff, rs485BuffLen);
+}
+
void Init_J1_485(uint32_t baud)
{
uart_devices[0].uart_baudrate = baud;
- g_J1_uart6_handle = uart_dev_init(J1_485_INDEX, J1_inBuff, J485BuffLen);
+ g_J1_handle = uart_dev_init(J01_485_INDEX, J1Buff, rs485BuffLen);
}
void Init_J2_485(uint32_t baud)
{
uart_devices[1].uart_baudrate = baud;
- g_J2_uart7_handle = uart_dev_init(J2_485_INDEX, J2_inBuff, J485BuffLen);
+ g_J2_handle = uart_dev_init(J23_485_INDEX, J2Buff, rs485BuffLen);
}
void Init_J3_485(uint32_t baud)
{
- uart_devices[2].uart_baudrate = baud;
- g_J3_usart2_handle = uart_dev_init(J3_485_INDEX, J3_inBuff, J485BuffLen);
+ uart_devices[1].uart_baudrate = baud;
+ g_J3_handle = uart_dev_init(J23_485_INDEX, J3Buff, rs485BuffLen);
}
void Init_J4_485(uint32_t baud)
{
- uart_devices[3].uart_baudrate = baud;
- g_J4_uart8_handle = uart_dev_init(J4_485_INDEX, J4_inBuff, J485BuffLen);
+ uart_devices[2].uart_baudrate = baud;
+ g_J4_handle = uart_dev_init(J45_485_INDEX, J4Buff, rs485BuffLen);
}
-void Init_J5_0_485(uint32_t baud)
+void Init_J5_485(uint32_t baud)
+{
+ uart_devices[2].uart_baudrate = baud;
+ g_J5_handle = uart_dev_init(J45_485_INDEX, J5Buff, rs485BuffLen);
+}
+
+void Init_J6_485(uint32_t baud)
+{
+ uart_devices[3].uart_baudrate = baud;
+ g_J6_handle = uart_dev_init(J67_485_INDEX, J6Buff, rs485BuffLen);
+}
+
+void Init_J7_485(uint32_t baud)
+{
+ uart_devices[3].uart_baudrate = baud;
+ g_J7_handle = uart_dev_init(J67_485_INDEX, J7Buff, rs485BuffLen);
+}
+
+void Init_J8_485(uint32_t baud)
{
uart_devices[4].uart_baudrate = baud;
- g_J5_0_usart3_handle = uart_dev_init(J5_0_485_INDEX, J5_0_inBuff, J485BuffLen);
+ g_J8_handle = uart_dev_init(J8_485_INDEX, J8Buff, rs485BuffLen);
}
-void Init_Upward_uart(uint32_t baud)
+void Init_J9_485(uint32_t baud)
{
uart_devices[5].uart_baudrate = baud;
- g_Upward_uart5_handle = uart_dev_init(Upward_UART_INDEX, Upward_inBuff, UpwardBuffLen);
+ g_J9_handle = uart_dev_init(J9_485_INDEX, J9Buff, rs485BuffLen);
+}
+
+void Init_Lora_Uart(uint32_t baud)
+{
+ uart_devices[6].uart_baudrate = baud;
+ g_Lora_handle = uart_dev_init(Lora_UART_INDEX, LoraBuff, loraBuffLen);
+}
+
+void Init_Su806_Uart(uint32_t baud)
+{
+ uart_devices[7].uart_baudrate = baud;
+ g_Su806_handle = uart_dev_init(Su806_UART_INDEX, Su806Buff, su806BuffLen);
+}
+
+void Init_Mcu_Uart(uint32_t baud)
+{
+ uart_devices[8].uart_baudrate = baud;
+ g_Mcu_handle = uart_dev_init(MCU_UART_INDEX, McuBuff, mcuBuffLen);
}
/**
- * @brief 寰楀埌涓插彛鐨勫彂閫佺姸鎬
- * @param device 璁惧
- * @retval 0锛氬彂閫佸畬鎴 1锛氬彂閫佷腑 0xFF锛氶敊璇
+ * @brief mcu初始化串口中断.
+ * @retval
*/
-uint8_t getUartSendState(device_handle device)
+void uartIT_Init(void)
{
- if (device == g_J1_uart6_handle) {
- return uartInterruptSendFlag & J1_485_Send;
- }
- else if (device == g_J2_uart7_handle) {
- return uartInterruptSendFlag & J2_485_Send;
- }
- else if (device == g_J3_usart2_handle) {
- return uartInterruptSendFlag & J3_485_Send;
- }
- else if (device == g_J4_uart8_handle) {
- return uartInterruptSendFlag & J4_485_Send;
- }
- else if (device == g_J5_0_usart3_handle) {
- return uartInterruptSendFlag & J5_0_485_Send;
- }
- else if (device == g_Upward_uart5_handle) {
- return uartInterruptSendFlag & Upward_uart_Send;
+ if (getMCU()) {
+ setIDLE(J0_USART, ENABLE);
+ setIDLE(J2_USART, ENABLE);
+ setIDLE(J4_USART, ENABLE);
+ setIDLE(J6_USART, ENABLE);
}
else {
- return 0xFF;
+ setIDLE(J1_USART, ENABLE);
+ setIDLE(J3_USART, ENABLE);
+ setIDLE(J5_USART, ENABLE);
+ setIDLE(J7_USART, ENABLE);
+ setIDLE(J8_USART, ENABLE);
+ setIDLE(J9_USART, ENABLE);
}
}
-// /**
-// * @brief 璁剧疆璁惧鐨勫彂閫佺姸鎬
-// * @param
-// state 0锛氬彂鐢熷畬鎴 1锛氬彂閫佷腑
-// * @retval
-// */
-// void setUartSendState(device_handle device, uint8_t state)
-// {
-// if (device == g_J1_uart6_handle) {
-// if (state == 1) {
-// uartInterruptSendFlag |= J1_485_Send;
-// }
-// else if (state == 0) {
-// uartInterruptSendFlag &= (~J1_485_Send);
-// }
-// }
-// else if (device == g_J2_uart7_handle) {
-// if (state == 1) {
-// uartInterruptSendFlag |= J2_485_Send;
-// }
-// else if (state == 0) {
-// uartInterruptSendFlag &= (~J2_485_Send);
-// }
-// }
-// else if (device == g_J3_usart2_handle) {
-// if (state == 1) {
-// uartInterruptSendFlag |= J3_485_Send;
-// }
-// else if (state == 0) {
-// uartInterruptSendFlag &= (~J3_485_Send);
-// }
-// }
-// else if (device == g_J4_uart8_handle) {
-// if (state == 1) {
-// uartInterruptSendFlag |= J4_485_Send;
-// }
-// else if (state == 0) {
-// uartInterruptSendFlag &= (~J4_485_Send);
-// }
-// }
-// else if (device == g_J5_0_usart3_handle) {
-// if (state == 1) {
-// uartInterruptSendFlag |= J5_0_485_Send;
-// }
-// else if (state == 0) {
-// uartInterruptSendFlag &= (~J5_0_485_Send);
-// }
-// }
-// else if (device == g_Upward_uart5_handle) {
-// if (state == 1) {
-// uartInterruptSendFlag |= Upward_uart_Send;
-// }
-// else if (state == 0) {
-// uartInterruptSendFlag &= (~Upward_uart_Send);
-// }
-// }
-// }
-
-/**
- * @brief 寰楀埌J2_485鐨勫彂閫佺姸鎬
- * @param
- * @retval 0锛氬彂鐢熷畬鎴 1锛氬彂閫佷腑
- */
-uint8_t getJ1_485_SendState(void)
+/* 串口中断处理函数 */
+void J0_Interrupt()
{
- return uartInterruptSendFlag & J1_485_Send;
-}
-
-/**
- * @brief 璁剧疆J2_485鐨勫彂閫佺姸鎬
- * @param 0锛氬彂鐢熷畬鎴 1锛氬彂閫佷腑
- * @retval
- */
-void setJ1_485_SendState(uint8_t state)
-{
- if (state == 1) {
- uartInterruptSendFlag |= J1_485_Send;
+ if (getMCU()) {
+ return;
}
- else if (state == 0) {
- uartInterruptSendFlag &= (~J1_485_Send);
- }
-}
-/**
- * @brief 寰楀埌J2_485鐨勫彂閫佺姸鎬
- * @param
- * @retval 0锛氬彂鐢熷畬鎴 1锛氬彂閫佷腑
- */
-uint8_t getJ2_485_SendState(void)
-{
- return uartInterruptSendFlag & J2_485_Send;
-}
-
-/**
- * @brief 璁剧疆J2_485鐨勫彂閫佺姸鎬
- * @param 0锛氬彂鐢熷畬鎴 1锛氬彂閫佷腑
- * @retval
- */
-void setJ2_485_SendState(uint8_t state)
-{
- if (state == 1) {
- uartInterruptSendFlag |= J2_485_Send;
- }
- else if (state == 0) {
- uartInterruptSendFlag &= (~J2_485_Send);
- }
-}
-
-/**
- * @brief 寰楀埌J3_485鐨勫彂閫佺姸鎬
- * @param
- * @retval 0锛氬彂鐢熷畬鎴 1锛氬彂閫佷腑
- */
-uint8_t getJ3_485_SendState(void)
-{
- return uartInterruptSendFlag & J3_485_Send;
-}
-
-/**
- * @brief 璁剧疆J3_485鐨勫彂閫佺姸鎬
- * @param 0锛氬彂鐢熷畬鎴 1锛氬彂閫佷腑
- * @retval
- */
-void setJ3_485_SendState(uint8_t state)
-{
- if (state == 1) {
- uartInterruptSendFlag |= J3_485_Send;
- }
- else if (state == 0) {
- uartInterruptSendFlag &= (~J3_485_Send);
- }
-}
-
-/**
- * @brief 寰楀埌J4_485鐨勫彂閫佺姸鎬
- * @param
- * @retval 0锛氬彂鐢熷畬鎴 1锛氬彂閫佷腑
- */
-uint8_t getJ4_485_SendState(void)
-{
- return uartInterruptSendFlag & J4_485_Send;
-}
-
-/**
- * @brief 璁剧疆J4_485鐨勫彂閫佺姸鎬
- * @param 0锛氬彂鐢熷畬鎴 1锛氬彂閫佷腑
- * @retval
- */
-void setJ4_485_SendState(uint8_t state)
-{
- if (state == 1) {
- uartInterruptSendFlag |= J4_485_Send;
- }
- else if (state == 0) {
- uartInterruptSendFlag &= (~J4_485_Send);
- }
-}
-
-/**
- * @brief 寰楀埌J5_0_485鐨勫彂閫佺姸鎬
- * @param
- * @retval 0锛氬彂鐢熷畬鎴 1锛氬彂閫佷腑
- */
-uint8_t getJ5_0_485_SendState(void)
-{
- return uartInterruptSendFlag & J5_0_485_Send;
-}
-
-/**
- * @brief 璁剧疆J1_485鐨勫彂閫佺姸鎬
- * @param 0锛氬彂鐢熷畬鎴 1锛氬彂閫佷腑
- * @retval
- */
-void setJ5_0_485_SendState(uint8_t state)
-{
- if (state == 1) {
- uartInterruptSendFlag |= J5_0_485_Send;
- }
- else if (state == 0) {
- uartInterruptSendFlag &= (~J5_0_485_Send);
- }
-}
-
-/**
- * @brief 寰楀埌Upward_uart鐨勫彂閫佺姸鎬
- * @param
- * @retval 0锛氬彂鐢熷畬鎴 1锛氬彂閫佷腑
- */
-uint8_t getUpward_uart_SendState(void)
-{
- return uartInterruptSendFlag & Upward_uart_Send;
-}
-
-/**
- * @brief 璁剧疆Upward_uart鐨勫彂閫佺姸鎬
- * @param 0锛氬彂鐢熷畬鎴 1锛氬彂閫佷腑
- * @retval
- */
-void setUpward_uart_SendState(uint8_t state)
-{
- if (state == 1) {
- uartInterruptSendFlag |= Upward_uart_Send;
- }
- else if (state == 0) {
- uartInterruptSendFlag &= (~Upward_uart_Send);
- }
-}
-
-/* 涓插彛涓柇澶勭悊鍑芥暟 */
-void J3_Interrupt()
-{
- /* 鏁版嵁鎺ユ敹涓柇 */
- if (USART_GetITStatus(J3_USART, USART_IT_RXNE) != RESET) {
- #ifdef RS485BUSIDLE1
- if (J3_485_IDLE_Flag == 0) {
- J3_485_IDLE_Flag = 1;
- J3_485_IN_RXNE();
+ /* 数据接收中断 */
+ static uint8_t flag = 0;
+ static uint8_t c;
+ if (USART_GetITStatus(J0_USART, USART_IT_RXNE) != RESET) {
+ if (flag == 0) {
+ flag = 1;
+ J0_485_IN_RXNE();
}
- #endif
- J3_Rbuffer[0] = USART_ReceiveData(J3_USART); //鎺ユ敹鏁版嵁
- uart_device_info *dev = (uart_device_info *)g_J3_usart2_handle;
+ c = USART_ReceiveData(J0_USART); //接收数据
+ uart_device_info *dev = (uart_device_info *)g_J0_handle;
if(!RingQueueFull(&dev->uart_ring_queue))
- InRingQueue(&dev->uart_ring_queue, J3_Rbuffer[0]);
+ InRingQueue(&dev->uart_ring_queue, c);
}
-
-#ifdef UARTINTERRUPTSEND
- /* 鏁版嵁鍙戦佷腑鏂 */
- if (USART_GetITStatus(J3_USART, USART_IT_TXE) != RESET) {
- uart_device_info *dev = (uart_device_info *)g_J3_usart2_handle;
+
+ /* 数据发送中断 */
+ if (USART_GetITStatus(J0_USART, USART_IT_TXE) != RESET) {
+ uart_device_info *dev = (uart_device_info *)g_J0_handle;
if (dev->uart_send_data.count >= dev->uart_send_data.len) {
- USART_ITConfig(J3_USART, USART_IT_TXE, DISABLE);
- // setJ3_485_SendState(0);
- J3_485_IN_TXE();
- return;
- }
- USART_SendData(J3_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
- }
-#endif
-
-#ifdef RS485BUSIDLE1
- /* 绌洪棽涓柇 */
- if (USART_GetITStatus(J3_USART, USART_IT_IDLE) != RESET) {
- J3_USART->STATR;
- J3_USART->DATAR;
- J3_485_IN_IDLE();
- }
-#endif
-}
-
-void J5_0_Interrupt()
-{
- /* 鏁版嵁鎺ユ敹涓柇 */
- if (USART_GetITStatus(J5_0_USART, USART_IT_RXNE) != RESET) { //涓柇浜х敓
- #ifdef RS485BUSIDLE1
- if (J5_0_485_IDLE_Flag == 0) {
- J5_0_485_IDLE_Flag = 1;
- J5_0_485_IN_RXNE();
- }
- #endif
- J5_0_Rbuffer[0] = USART_ReceiveData(J5_0_USART); //鎺ユ敹鏁版嵁
- uart_device_info *dev = (uart_device_info *)g_J5_0_usart3_handle;
- if(!RingQueueFull(&dev->uart_ring_queue))
- InRingQueue(&dev->uart_ring_queue, J5_0_Rbuffer[0]);
- }
-
-#ifdef UARTINTERRUPTSEND
- /* 鏁版嵁鍙戦佷腑鏂 */
- if (USART_GetITStatus(J5_0_USART, USART_IT_TXE) != RESET) {
- uart_device_info *dev = (uart_device_info *)g_J5_0_usart3_handle;
- if (dev->uart_send_data.count >= dev->uart_send_data.len) {
- USART_ITConfig(J5_0_USART, USART_IT_TXE, DISABLE);
- // setJ5_0_485_SendState(0);
- J5_0_485_IN_TXE();
+ USART_ITConfig(J0_USART, USART_IT_TXE, DISABLE);
+ J0_485_IN_TXE();
return;
}
- USART_SendData(J5_0_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
- }
-#endif
-
-#ifdef RS485BUSIDLE1
- /* 绌洪棽涓柇 */
- if (USART_GetITStatus(J5_0_USART, USART_IT_IDLE) != RESET) {
- J5_0_USART->STATR;
- J5_0_USART->DATAR;
- J5_0_485_IN_IDLE();
- }
-#endif
-}
-
-void Upward_Interrupt()
-{
- /* 鏁版嵁鎺ユ敹涓柇 */
- if (USART_GetITStatus(Upward_USART, USART_IT_RXNE) != RESET) { //涓柇浜х敓
- Upward_Rbuffer[0] = USART_ReceiveData(Upward_USART); //鎺ユ敹鏁版嵁
- uart_device_info *dev = (uart_device_info *)g_Upward_uart5_handle;
- if(!RingQueueFull(&dev->uart_ring_queue))
- InRingQueue(&dev->uart_ring_queue, Upward_Rbuffer[0]);
+ USART_SendData(J0_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
}
-#ifdef UARTINTERRUPTSEND
- /* 鏁版嵁鍙戦佷腑鏂 */
- if (USART_GetITStatus(Upward_USART, USART_IT_TXE) != RESET) {
- uart_device_info *dev = (uart_device_info *)g_Upward_uart5_handle;
- // log_info("%d \n", dev->uart_send_data.count);
- if (dev->uart_send_data.count >= dev->uart_send_data.len) {
- USART_ITConfig(Upward_USART, USART_IT_TXE, DISABLE);
- // setUpward_uart_SendState(0);
- Upward_USART_IN_TXE();
- return;
- }
- USART_SendData(Upward_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
+ /* 空闲中断 */
+ if (USART_GetITStatus(J0_USART, USART_IT_IDLE) != RESET) {
+ J0_USART->STATR;
+ J0_USART->DATAR;
+ J0_485_IN_IDLE();
}
-#endif
}
void J1_Interrupt()
{
- /* 鏁版嵁鎺ユ敹涓柇 */
- if (USART_GetITStatus(J1_USART, USART_IT_RXNE) != RESET) { //涓柇浜х敓
- #ifdef RS485BUSIDLE1
- if (J1_485_IDLE_Flag == 0) {
- J1_485_IDLE_Flag = 1;
- J1_485_IN_RXNE();
- }
- #endif
- J1_Rbuffer[0] = USART_ReceiveData(J1_USART); //鎺ユ敹鏁版嵁
- uart_device_info *dev = (uart_device_info *)g_J1_uart6_handle;
- if(!RingQueueFull(&dev->uart_ring_queue))
- InRingQueue(&dev->uart_ring_queue, J1_Rbuffer[0]);
+ if (!getMCU()) {
+ return;
}
-#ifdef UARTINTERRUPTSEND
- /* 鏁版嵁鍙戦佷腑鏂 */
+ /* 数据接收中断 */
+ static uint8_t flag = 0;
+ static uint8_t c;
+ if (USART_GetITStatus(J1_USART, USART_IT_RXNE) != RESET) {
+ if (flag == 0) {
+ flag = 1;
+ J1_485_IN_RXNE();
+ }
+ c = USART_ReceiveData(J1_USART); //接收数据
+ uart_device_info *dev = (uart_device_info *)g_J1_handle;
+ if(!RingQueueFull(&dev->uart_ring_queue))
+ InRingQueue(&dev->uart_ring_queue, c);
+ }
+
+ /* 数据发送中断 */
if (USART_GetITStatus(J1_USART, USART_IT_TXE) != RESET) {
- uart_device_info *dev = (uart_device_info *)g_J1_uart6_handle;
+ uart_device_info *dev = (uart_device_info *)g_J1_handle;
if (dev->uart_send_data.count >= dev->uart_send_data.len) {
USART_ITConfig(J1_USART, USART_IT_TXE, DISABLE);
- // setJ1_485_SendState(0);
J1_485_IN_TXE();
return;
}
USART_SendData(J1_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
}
-#endif
-#ifdef RS485BUSIDLE1
- /* 绌洪棽涓柇 */
+ /* 空闲中断 */
if (USART_GetITStatus(J1_USART, USART_IT_IDLE) != RESET) {
J1_USART->STATR;
J1_USART->DATAR;
J1_485_IN_IDLE();
}
-#endif
}
void J2_Interrupt()
{
- /* 鏁版嵁鎺ユ敹涓柇 */
- if (USART_GetITStatus(J2_USART, USART_IT_RXNE) != RESET) { //涓柇浜х敓
- #ifdef RS485BUSIDLE1
- if (J2_485_IDLE_Flag == 0) {
- J2_485_IDLE_Flag = 1;
- J2_485_IN_RXNE();
- }
- #endif
- J2_Rbuffer[0] = USART_ReceiveData(J2_USART); //鎺ユ敹鏁版嵁
- uart_device_info *dev = (uart_device_info *)g_J2_uart7_handle;
- if(!RingQueueFull(&dev->uart_ring_queue))
- InRingQueue(&dev->uart_ring_queue, J2_Rbuffer[0]);
+ if (getMCU()) {
+ return;
}
-#ifdef UARTINTERRUPTSEND
- /* 鏁版嵁鍙戦佷腑鏂 */
+ /* 数据接收中断 */
+ static uint8_t flag = 0;
+ static uint8_t c;
+ if (USART_GetITStatus(J2_USART, USART_IT_RXNE) != RESET) {
+ if (flag == 0) {
+ flag = 1;
+ J2_485_IN_RXNE();
+ }
+ c = USART_ReceiveData(J2_USART); //接收数据
+ uart_device_info *dev = (uart_device_info *)g_J2_handle;
+ if(!RingQueueFull(&dev->uart_ring_queue))
+ InRingQueue(&dev->uart_ring_queue, c);
+ }
+
+ /* 数据发送中断 */
if (USART_GetITStatus(J2_USART, USART_IT_TXE) != RESET) {
- uart_device_info *dev = (uart_device_info *)g_J2_uart7_handle;
+ uart_device_info *dev = (uart_device_info *)g_J2_handle;
if (dev->uart_send_data.count >= dev->uart_send_data.len) {
USART_ITConfig(J2_USART, USART_IT_TXE, DISABLE);
- // setJ2_485_SendState(0);
J2_485_IN_TXE();
return;
}
USART_SendData(J2_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
}
-#endif
-#ifdef RS485BUSIDLE1
- /* 绌洪棽涓柇 */
+ /* 空闲中断 */
if (USART_GetITStatus(J2_USART, USART_IT_IDLE) != RESET) {
J2_USART->STATR;
J2_USART->DATAR;
J2_485_IN_IDLE();
}
-#endif
+}
+
+void J3_Interrupt()
+{
+ if (!getMCU()) {
+ return;
+ }
+ /* 数据接收中断 */
+ static uint8_t flag = 0;
+ static uint8_t c;
+ if (USART_GetITStatus(J3_USART, USART_IT_RXNE) != RESET) {
+ if (flag == 0) {
+ flag = 1;
+ J3_485_IN_RXNE();
+ }
+ c = USART_ReceiveData(J3_USART); //接收数据
+ uart_device_info *dev = (uart_device_info *)g_J3_handle;
+ if(!RingQueueFull(&dev->uart_ring_queue))
+ InRingQueue(&dev->uart_ring_queue, c);
+ }
+
+ /* 数据发送中断 */
+ if (USART_GetITStatus(J3_USART, USART_IT_TXE) != RESET) {
+ uart_device_info *dev = (uart_device_info *)g_J3_handle;
+ if (dev->uart_send_data.count >= dev->uart_send_data.len) {
+ USART_ITConfig(J3_USART, USART_IT_TXE, DISABLE);
+ J3_485_IN_TXE();
+ return;
+ }
+ USART_SendData(J3_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
+ }
+
+ /* 空闲中断 */
+ if (USART_GetITStatus(J3_USART, USART_IT_IDLE) != RESET) {
+ J3_USART->STATR;
+ J3_USART->DATAR;
+ J3_485_IN_IDLE();
+ }
}
void J4_Interrupt()
{
- /* 鏁版嵁鎺ユ敹涓柇 */
- if (USART_GetITStatus(J4_USART, USART_IT_RXNE) != RESET) { //涓柇浜х敓
- #ifdef RS485BUSIDLE1
- if (J4_485_IDLE_Flag == 0) {
- J4_485_IDLE_Flag = 1;
+ if (getMCU()) {
+ return;
+ }
+ /* 数据接收中断 */
+ static uint8_t flag = 0;
+ static uint8_t c;
+ if (USART_GetITStatus(J4_USART, USART_IT_RXNE) != RESET) {
+ if (flag == 0) {
+ flag = 1;
J4_485_IN_RXNE();
}
- #endif
- J4_Rbuffer[0] = USART_ReceiveData(J4_USART); //鎺ユ敹鏁版嵁
- uart_device_info *dev = (uart_device_info *)g_J4_uart8_handle;
+ c = USART_ReceiveData(J4_USART); //接收数据
+ uart_device_info *dev = (uart_device_info *)g_J4_handle;
if(!RingQueueFull(&dev->uart_ring_queue))
- InRingQueue(&dev->uart_ring_queue, J4_Rbuffer[0]);
+ InRingQueue(&dev->uart_ring_queue, c);
}
-
-#ifdef UARTINTERRUPTSEND
- /* 鏁版嵁鍙戦佷腑鏂 */
+
+ /* 数据发送中断 */
if (USART_GetITStatus(J4_USART, USART_IT_TXE) != RESET) {
- uart_device_info *dev = (uart_device_info *)g_J4_uart8_handle;
+ uart_device_info *dev = (uart_device_info *)g_J4_handle;
if (dev->uart_send_data.count >= dev->uart_send_data.len) {
USART_ITConfig(J4_USART, USART_IT_TXE, DISABLE);
- // setJ4_485_SendState(0);
J4_485_IN_TXE();
return;
}
USART_SendData(J4_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
}
-#endif
-#ifdef RS485BUSIDLE1
- /* 绌洪棽涓柇 */
+ /* 空闲中断 */
if (USART_GetITStatus(J4_USART, USART_IT_IDLE) != RESET) {
J4_USART->STATR;
J4_USART->DATAR;
J4_485_IN_IDLE();
}
-#endif
+
}
-#ifdef UARTINTERRUPTSEND
-/**
- * @brief 閫氳繃涓柇鍙戦
- * @param device 璁惧
- data 鎸囧悜鏁版嵁鐨勬寚閽
- len 鏁版嵁闀垮害
- * @retval 0锛氭垚鍔
- 1锛氫笂娆℃暟鎹繕鏈彂閫佸畬鎴
- 0xFF锛氶敊璇
- */
-uint8_t uartInterruptSend(device_handle device,uint8_t *data, uint16_t len)
+void J5_Interrupt()
{
- /* 涓婃鏈彂閫佸畬锛屾垨璁惧涓嶅瓨鍦 */
- if (getUartSendState(device)) {
- return getUartSendState(device);
- }
-
- /* 鎸囧悜鏁版嵁 */
- 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_uart6_handle) {
- setJ1_485_SendState(1);
- 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_J2_uart7_handle) {
- setJ2_485_SendState(1);
- 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_J3_usart2_handle) {
- setJ3_485_SendState(1);
- 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_J4_uart8_handle) {
- setJ4_485_SendState(1);
- 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_J5_0_usart3_handle) {
- setJ5_0_485_SendState(1);
- writeJ5_0_485;
- USART_ITConfig(J5_0_USART, USART_IT_TXE, ENABLE);
- USART_SendData(J5_0_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
- }
- else if (device == g_Upward_uart5_handle) {
- setUpward_uart_SendState(1);
- USART_ITConfig(Upward_USART, USART_IT_TXE, ENABLE);
- USART_SendData(Upward_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
- }
-
- return 0;
-}
-#endif
-
-#ifdef RS485BUSIDLE1
-/**
- * @brief 寰楀埌鎬荤嚎鐨勭┖闂茬姸鎬
- * @param device 璁惧
- * @retval 0 绌洪棽
- 1 涓嶇┖闂
- 0xFF 寮傚父
- */
-uint8_t getBUSIDLEFlag(device_handle device)
-{
- if (device == g_J1_uart6_handle) {
- return (J1_485_IDLE_Flag & BUS_IDLE);
- } else if (device == g_J2_uart7_handle) {
- return (J2_485_IDLE_Flag & BUS_IDLE);
- } else if (device == g_J3_usart2_handle) {
- return (J3_485_IDLE_Flag & BUS_IDLE);
- } else if (device == g_J4_uart8_handle) {
- return (J4_485_IDLE_Flag & BUS_IDLE);
- } else if (device == g_J5_0_usart3_handle) {
- return (J5_0_485_IDLE_Flag & BUS_IDLE);
- }
- return 0xFF;
-}
-
-// /**
-// * @brief 寰楀埌鎬荤嚎鐨勭┖闂茬姸鎬
-// * @param device 璁惧
-// * @retval 0 绌洪棽
-// 1 涓嶇┖闂
-// 0xFF 寮傚父
-// */
-// uint8_t getSoftwareIDLEFlag(device_handle device)
-// {
-// if (device == g_J1_uart6_handle) {
-// return (J1_485_IDLE_Flag & softwareTimeFlag);
-// } else if (device == g_J2_uart7_handle) {
-// return (J2_485_IDLE_Flag & softwareTimeFlag);
-// } else if (device == g_J3_usart2_handle) {
-// return (J3_485_IDLE_Flag & softwareTimeFlag);
-// } else if (device == g_J4_uart8_handle) {
-// return (J4_485_IDLE_Flag & softwareTimeFlag);
-// } else if (device == g_J5_0_usart3_handle) {
-// return (J5_0_485_IDLE_Flag & softwareTimeFlag);
-// }
-// return 0xFF;
-// }
-
-// /**
-// * @brief 璁剧疆鎬荤嚎瀵瑰簲鐨勪覆鍙h繘鍏ョ┖闂茬姸鎬侊紙绌洪棽涓柇鑾峰緱锛
-// * @param device 璁惧
-// state 鐘舵 0 绌洪棽
-// 1 涓嶇┖闂
-// * @retval
-// */
-// void setSoftwareIDLEFlag(device_handle device, uint8_t state)
-// {
-// if (state == 0) {
-// if (device == g_J1_uart6_handle) {
-// J1_485_IDLE_Flag &= (~softwareTimeFlag);
-// } else if (device == g_J2_uart7_handle) {
-// J2_485_IDLE_Flag &= (~softwareTimeFlag);
-// } else if (device == g_J3_usart2_handle) {
-// J3_485_IDLE_Flag &= (~softwareTimeFlag);
-// } else if (device == g_J4_uart8_handle) {
-// J4_485_IDLE_Flag &= (~softwareTimeFlag);
-// } else if (device == g_J5_0_usart3_handle) {
-// J5_0_485_IDLE_Flag &= (~softwareTimeFlag);
-// }
-// }
-// else if (state == 1) {
-// if (device == g_J1_uart6_handle) {
-// J1_485_IDLE_Flag &= (softwareTimeFlag);
-// } else if (device == g_J2_uart7_handle) {
-// J2_485_IDLE_Flag &= (softwareTimeFlag);
-// } else if (device == g_J3_usart2_handle) {
-// J3_485_IDLE_Flag &= (softwareTimeFlag);
-// } else if (device == g_J4_uart8_handle) {
-// J4_485_IDLE_Flag &= (softwareTimeFlag);
-// } else if (device == g_J5_0_usart3_handle) {
-// J5_0_485_IDLE_Flag &= (softwareTimeFlag);
-// }
-// }
-// }
-
-/**
- * @brief 璁剧疆鎬荤嚎绌洪棽鐘舵
- * @param device 璁惧
- state 鐘舵 0 绌洪棽
- 1 涓嶇┖闂
- * @retval
- */
-void setBUSIDLEFlag(device_handle device, uint8_t state)
-{
- // if (state == 0) {
- // if (device == g_J1_uart6_handle) {
- // J1_485_IDLE_Flag &= (~BUS_IDLE);
- // } else if (device == g_J2_uart7_handle) {
- // J2_485_IDLE_Flag &= (~BUS_IDLE);
- // } else if (device == g_J3_usart2_handle) {
- // J3_485_IDLE_Flag &= (~BUS_IDLE);
- // } else if (device == g_J4_uart8_handle) {
- // J4_485_IDLE_Flag &= (~BUS_IDLE);
- // } else if (device == g_J5_0_usart3_handle) {
- // J5_0_485_IDLE_Flag &= (~BUS_IDLE);
- // }
- // }
- // else if (state == 1) {
- // if (device == g_J1_uart6_handle) {
- // J1_485_IDLE_Flag &= (BUS_IDLE);
- // } else if (device == g_J2_uart7_handle) {
- // J2_485_IDLE_Flag &= (BUS_IDLE);
- // } else if (device == g_J3_usart2_handle) {
- // J3_485_IDLE_Flag &= (BUS_IDLE);
- // } else if (device == g_J4_uart8_handle) {
- // J4_485_IDLE_Flag &= (BUS_IDLE);
- // } else if (device == g_J5_0_usart3_handle) {
- // J5_0_485_IDLE_Flag &= (BUS_IDLE);
- // }
- // }
-
- if (state != 0 && state != 1) {
+ if (!getMCU()) {
return;
}
- if (device == g_J1_uart6_handle) {
- J1_485_IDLE_Flag = state;
- } else if (device == g_J2_uart7_handle) {
- J2_485_IDLE_Flag = state;
- } else if (device == g_J3_usart2_handle) {
- J3_485_IDLE_Flag = state;
- } else if (device == g_J4_uart8_handle) {
- J4_485_IDLE_Flag = state;
- } else if (device == g_J5_0_usart3_handle) {
- J5_0_485_IDLE_Flag = state;
+ /* 数据接收中断 */
+ static uint8_t flag = 0;
+ static uint8_t c;
+ if (USART_GetITStatus(J5_USART, USART_IT_RXNE) != RESET) {
+ if (flag == 0) {
+ flag = 1;
+ J5_485_IN_RXNE();
+ }
+ c = USART_ReceiveData(J5_USART); //接收数据
+ uart_device_info *dev = (uart_device_info *)g_J5_handle;
+ if(!RingQueueFull(&dev->uart_ring_queue))
+ InRingQueue(&dev->uart_ring_queue, c);
+ }
+
+ /* 数据发送中断 */
+ if (USART_GetITStatus(J5_USART, USART_IT_TXE) != RESET) {
+ uart_device_info *dev = (uart_device_info *)g_J5_handle;
+ if (dev->uart_send_data.count >= dev->uart_send_data.len) {
+ USART_ITConfig(J5_USART, USART_IT_TXE, DISABLE);
+ J5_485_IN_TXE();
+ return;
+ }
+ USART_SendData(J5_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
+ }
+
+ /* 空闲中断 */
+ if (USART_GetITStatus(J5_USART, USART_IT_IDLE) != RESET) {
+ J5_USART->STATR;
+ J5_USART->DATAR;
+ J5_485_IN_IDLE();
+ }
+
+}
+
+void J6_Interrupt()
+{
+ if (getMCU()) {
+ return;
+ }
+ /* 数据接收中断 */
+ static uint8_t flag = 0;
+ static uint8_t c;
+ if (USART_GetITStatus(J1_USART, USART_IT_RXNE) != RESET) {
+ if (flag == 0) {
+ flag = 1;
+ J6_485_IN_RXNE();
+ }
+ c = USART_ReceiveData(J6_USART); //接收数据
+ uart_device_info *dev = (uart_device_info *)g_J6_handle;
+ if(!RingQueueFull(&dev->uart_ring_queue))
+ InRingQueue(&dev->uart_ring_queue, c);
+ }
+
+ /* 数据发送中断 */
+ if (USART_GetITStatus(J6_USART, USART_IT_TXE) != RESET) {
+ uart_device_info *dev = (uart_device_info *)g_J6_handle;
+ if (dev->uart_send_data.count >= dev->uart_send_data.len) {
+ USART_ITConfig(J6_USART, USART_IT_TXE, DISABLE);
+ J6_485_IN_TXE();
+ return;
+ }
+ USART_SendData(J6_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
+ }
+
+ /* 空闲中断 */
+ if (USART_GetITStatus(J6_USART, USART_IT_IDLE) != RESET) {
+ J6_USART->STATR;
+ J6_USART->DATAR;
+ J6_485_IN_IDLE();
}
}
-#endif
-/**
- * @brief 璁剧疆鎬荤嚎绌洪棽鐘舵
- * @param port 瑕佽繛鎺ョ殑绔彛
- * @retval
- */
-void setConnectPort(uint8_t port)
+void J7_Interrupt()
{
- if (port == connectJ0) {
- connectPort = connectJ0;
- USART_CONNET_J0();
- } else if (port == connectJ5) {
- connectPort = connectJ5;
- USART_CONNET_J5();
- } else if (port == connectJ6) {
- connectPort = connectJ6;
- USART_CONNET_J6();
- } else if (port == connectJ7) {
- connectPort = connectJ7;
- USART_CONNET_J7();
- } else if (port == connectJ8) {
- connectPort = connectJ8;
- USART_CONNET_J8();
- } else if (port == connectJ9) {
- connectPort = connectJ9;
- USART_CONNET_J9();
- }
+ if (!getMCU()) {
+ return;
+ }
+ /* 数据接收中断 */
+ static uint8_t flag = 0;
+ static uint8_t c;
+ if (USART_GetITStatus(J7_USART, USART_IT_RXNE) != RESET) {
+ if (flag == 0) {
+ flag = 1;
+ J7_485_IN_RXNE();
+ }
+ c = USART_ReceiveData(J7_USART); //接收数据
+ uart_device_info *dev = (uart_device_info *)g_J7_handle;
+ if(!RingQueueFull(&dev->uart_ring_queue))
+ InRingQueue(&dev->uart_ring_queue, c);
+ }
+
+ /* 数据发送中断 */
+ if (USART_GetITStatus(J7_USART, USART_IT_TXE) != RESET) {
+ uart_device_info *dev = (uart_device_info *)g_J7_handle;
+ if (dev->uart_send_data.count >= dev->uart_send_data.len) {
+ USART_ITConfig(J7_USART, USART_IT_TXE, DISABLE);
+ J7_485_IN_TXE();
+ return;
+ }
+ USART_SendData(J7_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
+ }
+
+ /* 空闲中断 */
+ if (USART_GetITStatus(J7_USART, USART_IT_IDLE) != RESET) {
+ J7_USART->STATR;
+ J7_USART->DATAR;
+ J7_485_IN_IDLE();
+ }
+
}
-/**
- * @brief 寰楀埌杩炴帴鐨勭鍙
- * @param
- * @retval 杩炴帴鐨勭鍙
- */
-uint8_t getConnectPort(void)
+void J8_Interrupt()
{
- return connectPort;
+ if (!getMCU()) {
+ return;
+ }
+
+ /* 数据接收中断 */
+ static uint8_t flag = 0;
+ static uint8_t c;
+ if (USART_GetITStatus(J8_USART, USART_IT_RXNE) != RESET) {
+ if (flag == 0) {
+ flag = 1;
+ J8_485_IN_RXNE();
+ }
+ c = USART_ReceiveData(J8_USART); //接收数据
+ uart_device_info *dev = (uart_device_info *)g_J8_handle;
+ if(!RingQueueFull(&dev->uart_ring_queue))
+ InRingQueue(&dev->uart_ring_queue, c);
+ }
+
+ /* 数据发送中断 */
+ if (USART_GetITStatus(J8_USART, USART_IT_TXE) != RESET) {
+ uart_device_info *dev = (uart_device_info *)g_J8_handle;
+ if (dev->uart_send_data.count >= dev->uart_send_data.len) {
+ USART_ITConfig(J8_USART, USART_IT_TXE, DISABLE);
+ J8_485_IN_TXE();
+ return;
+ }
+ USART_SendData(J8_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
+ }
+
+ /* 空闲中断 */
+ if (USART_GetITStatus(J8_USART, USART_IT_IDLE) != RESET) {
+ J8_USART->STATR;
+ J8_USART->DATAR;
+ J8_485_IN_IDLE();
+ }
}
+
+void J9_Interrupt()
+{
+ if (!getMCU()) {
+ return;
+ }
+
+ /* 数据接收中断 */
+ static uint8_t flag = 0;
+ static uint8_t c;
+ if (USART_GetITStatus(J9_USART, USART_IT_RXNE) != RESET) {
+ if (flag == 0) {
+ flag = 1;
+ J9_485_IN_RXNE();
+ }
+ c = USART_ReceiveData(J9_USART); //接收数据
+ uart_device_info *dev = (uart_device_info *)g_J9_handle;
+ if(!RingQueueFull(&dev->uart_ring_queue))
+ InRingQueue(&dev->uart_ring_queue, c);
+ }
+
+ /* 数据发送中断 */
+ if (USART_GetITStatus(J9_USART, USART_IT_TXE) != RESET) {
+ uart_device_info *dev = (uart_device_info *)g_J9_handle;
+ if (dev->uart_send_data.count >= dev->uart_send_data.len) {
+ USART_ITConfig(J9_USART, USART_IT_TXE, DISABLE);
+ J9_485_IN_TXE();
+ return;
+ }
+ USART_SendData(J9_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
+ }
+
+ /* 空闲中断 */
+ if (USART_GetITStatus(J9_USART, USART_IT_IDLE) != RESET) {
+ J9_USART->STATR;
+ J9_USART->DATAR;
+ J9_485_IN_IDLE();
+ }
+}
+
+void Mcu_Interrupt()
+{
+ /* 数据接收中断 */
+ static uint8_t c;
+ if (USART_GetITStatus(Mcu_USART, USART_IT_RXNE) != RESET) {
+ c = USART_ReceiveData(Mcu_USART); //接收数据
+ uart_device_info *dev = (uart_device_info *)g_Mcu_handle;
+ if(!RingQueueFull(&dev->uart_ring_queue))
+ InRingQueue(&dev->uart_ring_queue, c);
+ }
+
+ /* 数据发送中断 */
+ if (USART_GetITStatus(Mcu_USART, USART_IT_TXE) != RESET) {
+ uart_device_info *dev = (uart_device_info *)g_Mcu_handle;
+ if (dev->uart_send_data.count >= dev->uart_send_data.len) {
+ USART_ITConfig(Mcu_USART, USART_IT_TXE, DISABLE);
+ if (getMCU()) {
+ slaveMcu_uart_IN_TXE();
+ }
+ else {
+ hostMcu_uart_IN_TXE();
+ }
+ return;
+ }
+ USART_SendData(Mcu_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
+ }
+}
+
+void Su806_Interrupt()
+{
+ if (getMCU()) {
+ return;
+ }
+
+ /* 数据接收中断 */
+ static uint8_t c;
+ if (USART_GetITStatus(Su806_USART, USART_IT_RXNE) != RESET) {
+ c = USART_ReceiveData(Su806_USART); //接收数据
+ uart_device_info *dev = (uart_device_info *)g_Su806_handle;
+ if(!RingQueueFull(&dev->uart_ring_queue))
+ InRingQueue(&dev->uart_ring_queue, c);
+ }
+
+ /* 数据发送中断 */
+ if (USART_GetITStatus(Su806_USART, USART_IT_TXE) != RESET) {
+ uart_device_info *dev = (uart_device_info *)g_Su806_handle;
+ if (dev->uart_send_data.count >= dev->uart_send_data.len) {
+ USART_ITConfig(Su806_USART, USART_IT_TXE, DISABLE);
+ Su806_uart_IN_TXE();
+ return;
+ }
+ USART_SendData(Su806_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
+ }
+}
+
+void Lora_Interrupt()
+{
+ if (getMCU()) {
+ return;
+ }
+
+ /* 数据接收中断 */
+ static uint8_t c;
+ if (USART_GetITStatus(Lora_USART, USART_IT_RXNE) != RESET) {
+ c = USART_ReceiveData(Lora_USART); //接收数据
+ uart_device_info *dev = (uart_device_info *)g_Lora_handle;
+ if(!RingQueueFull(&dev->uart_ring_queue))
+ InRingQueue(&dev->uart_ring_queue, c);
+ }
+
+ /* 数据发送中断 */
+ if (USART_GetITStatus(Lora_USART, USART_IT_TXE) != RESET) {
+ uart_device_info *dev = (uart_device_info *)g_Lora_handle;
+ if (dev->uart_send_data.count >= dev->uart_send_data.len) {
+ USART_ITConfig(Lora_USART, USART_IT_TXE, DISABLE);
+ Lora_uart_IN_TXE();
+ return;
+ }
+ USART_SendData(Lora_USART, dev->uart_send_data.data[dev->uart_send_data.count++]);
+ }
+}
+
+
+
+
+
+
+
+
diff --git a/CH32V303-FreeRTOS/App/hardwareDriver/Inc/HD_ADC.h b/CH32V303-FreeRTOS/App/hardwareDriver/Inc/HD_ADC.h
index dc3e8e0..29a5c5f 100644
--- a/CH32V303-FreeRTOS/App/hardwareDriver/Inc/HD_ADC.h
+++ b/CH32V303-FreeRTOS/App/hardwareDriver/Inc/HD_ADC.h
@@ -10,6 +10,7 @@ extern int16_t Calibrattion_Val;
#define PwrOnNum 0
#define CurrentNum 1
#define VoltageNum 2
+#define TemperatureNum 3
void HD_ADC_InIt(void);
void ADC_DMA_Init(void);
diff --git a/CH32V303-FreeRTOS/App/hardwareDriver/Inc/HD_Flash.h b/CH32V303-FreeRTOS/App/hardwareDriver/Inc/HD_Flash.h
index 9897169..40afb16 100644
--- a/CH32V303-FreeRTOS/App/hardwareDriver/Inc/HD_Flash.h
+++ b/CH32V303-FreeRTOS/App/hardwareDriver/Inc/HD_Flash.h
@@ -5,94 +5,13 @@
* Author: 34509
*/
-#ifndef HARDWARE_SPI_FLASH_H_
-#define HARDWARE_SPI_FLASH_H_
+#ifndef HARDWARE_FLASH_H_
+#define HARDWARE_FLASH_H_
#include "ch32v30x.h"
+uint8_t readFlash(uint32_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead);
+uint8_t writeFlash(uint32_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite);
-/*****************************************
-
-*@Note
-
- Winbond W25Qxx SPIFLASH
-
-pins:
-
- CS —— PA15(SPI3_NSS)
-
- DO —— PB4(SPI3_MISO)
-
- WP —— 3.3V
-
- DI —— PB5(SPI3_MOSI)
-
- CLK —— PB3(SPI3_SCK)
-
- HOLD —— 3.3V
-
-*******************************************/
-#define RCC_APB2Periph_GPIOX RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB
-#define RCC_APB1Periph_SPIX RCC_APB1Periph_SPI3
-
-#define CS_PIN GPIO_Pin_15
-#define CS_GPIO GPIOA
-
-#define DO_PIN GPIO_Pin_4
-#define DO_GPIO GPIOB
-
-#define DI_PIN GPIO_Pin_5
-#define DI_GPIO GPIOB
-
-#define CLK_PIN GPIO_Pin_3
-#define CLK_GPIO GPIOB
-
-#define SPIX SPI3
-
-/* Winbond SPI Falsh ID */
-#define W25Q80 0XEF13
-#define W25Q16 0XEF14
-#define W25Q32 0XEF15
-#define W25Q64 0XEF16
-#define W25Q128 0XEF17
-
-
-
-/* Winbond SPIFalsh Instruction List 指令表 */
-#define W25X_WriteEnable 0x06
-#define W25X_WriteDisable 0x04
-#define W25X_ReadStatusReg 0x05
-#define W25X_WriteStatusReg 0x01
-#define W25X_ReadData 0x03
-#define W25X_FastReadData 0x0B
-#define W25X_FastReadDual 0x3B
-#define W25X_PageProgram 0x02
-#define W25X_BlockErase 0xD8
-#define W25X_SectorErase 0x20
-#define W25X_ChipErase 0xC7
-#define W25X_PowerDown 0xB9
-#define W25X_ReleasePowerDown 0xAB
-#define W25X_DeviceID 0xAB
-#define W25X_ManufactDeviceID 0x90
-#define W25X_JedecDeviceID 0x9F
-
-void SPI_Flash_Init(void);
-u8 SPI_ReadWriteByte(u8 TxData);
-u8 SPI_Flash_ReadSR(void);
-void SPI_FLASH_Write_SR(u8 sr);
-void SPI_Flash_Wait_Busy(void);
-void SPI_FLASH_Write_Enable(void);
-void SPI_FLASH_Write_Disable(void);
-u16 SPI_Flash_ReadID(void);
-void SPI_Flash_Erase_Sector(u32 Dst_Addr);
-void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 size);
-void SPI_Flash_Write_Page(u8* pBuffer,u32 WriteAddr,u16 size);
-void SPI_Flash_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16 size);
-void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 size);
-void SPI_Flash_Erase_Chip(void);
-void SPI_Flash_PowerDown(void);
-void SPI_Flash_WAKEUP(void);
-
-void SPI_Flash_TEST(void);
#endif /* HARDWARE_SPI_FLASH_H_ */
diff --git a/CH32V303-FreeRTOS/App/hardwareDriver/Inc/HD_GPIO.h b/CH32V303-FreeRTOS/App/hardwareDriver/Inc/HD_GPIO.h
index 061a2ff..bc68d27 100644
--- a/CH32V303-FreeRTOS/App/hardwareDriver/Inc/HD_GPIO.h
+++ b/CH32V303-FreeRTOS/App/hardwareDriver/Inc/HD_GPIO.h
@@ -36,8 +36,35 @@
#define WDI_GPIO_PIN GPIO_Pin_13
/* LED引脚 */
-#define LED_GPIO_PROT GPIOB
-#define LED_GPIO_PIN GPIO_Pin_8
+#define LED_GPIO_PROT GPIOC
+#define LED_GPIO_PIN GPIO_Pin_9
+
+/* 485读写控制引脚 */
+#define J0De_GPIO_PROT GPIOC
+#define J0De_GPIO_PIN GPIO_Pin_8
+#define J1De_GPIO_PROT GPIOC
+#define J1De_GPIO_PIN GPIO_Pin_8
+#define J2De_GPIO_PROT GPIOC
+#define J2De_GPIO_PIN GPIO_Pin_7
+#define J3De_GPIO_PROT GPIOC
+#define J3De_GPIO_PIN GPIO_Pin_7
+#define J4De_GPIO_PROT GPIOC
+#define J4De_GPIO_PIN GPIO_Pin_6
+#define J5De_GPIO_PROT GPIOC
+#define J5De_GPIO_PIN GPIO_Pin_6
+#define J6De_GPIO_PROT GPIOD
+#define J6De_GPIO_PIN GPIO_Pin_15
+#define J7De_GPIO_PROT GPIOD
+#define J7De_GPIO_PIN GPIO_Pin_15
+#define J8De_GPIO_PROT GPIOD
+#define J8De_GPIO_PIN GPIO_Pin_14
+#define J9De_GPIO_PROT GPIOD
+#define J9De_GPIO_PIN GPIO_Pin_13
+
+/* 控制从mcu复位 */
+#define ctrlSlave_GPIO_PROT GPIOD
+#define ctrlSlave_GPIO_PIN GPIO_Pin_0
+
#define GPIOTypeDef GPIO_TypeDef
#define GPIOPin uint16_t
@@ -48,12 +75,21 @@ typedef enum {
GPIO_SET
}BitOperation;
+#define write GPIO_SET
+#define read GPIO_RESET
+uint8_t mcu_GPIO_Init(void);
+
+void PwrCtrl_GPIO_Init(void);
+void Android_GPIO_Init(void);
+void WDI_GPIO_Init(void);
+void LED_GPIO_Init(void);
+void Host485De_GPIO_Init(void);
+void Slave485De_GPIO_Init(void);
+void ctrlSlave_GPIO_Init(void);
-void HD_GPIO_Init(void);
void HD_GPIO_Write(GPIOTypeDef *GPIOx, GPIOPin GPIO_Pin, BitOperation BitVal);
uint8_t HD_InputGPIO_Read(GPIOTypeDef *GPIOx, GPIOPin GPIO_Pin);
uint8_t HD_OutputGPIO_Read(GPIOTypeDef *GPIOx, GPIOPin GPIO_Pin);
-
#endif
diff --git a/CH32V303-FreeRTOS/App/hardwareDriver/Inc/HD_UART.h b/CH32V303-FreeRTOS/App/hardwareDriver/Inc/HD_UART.h
index b44ce9f..01fb8de 100644
--- a/CH32V303-FreeRTOS/App/hardwareDriver/Inc/HD_UART.h
+++ b/CH32V303-FreeRTOS/App/hardwareDriver/Inc/HD_UART.h
@@ -3,104 +3,46 @@
#include "ch32v30x.h"
-// #define uart4_enable
+#define J0_USART USART3
+#define J1_USART USART3
+#define J2_USART UART4
+#define J3_USART UART4
+#define J4_USART UART5
+#define J5_USART UART5
+#define J6_USART UART6
+#define J7_USART UART6
+#define J8_USART UART8
+#define J9_USART UART7
+// #define Host_USART USART2
+// #define Slave_USART USART2
+#define Mcu_USART USART2
+#define Su806_USART UART8
+#define Lora_USART UART7
+void uart2Init(int baud);
+void uart3Init(int baud);
+void uart4Init(int baud);
+void uart5Init(int baud);
+void uart6Init(int baud);
+void uart7Init(int baud);
+void uart8Init(int baud);
-#define J1_USART UART6
-#define J2_USART UART7
-#define J3_USART USART2
-#define J4_USART UART8
-#define J5_0_USART USART3
-#define Upward_USART UART5
+void setIDLE(USART_TypeDef *USARTx, FunctionalState state);
+void setTXE(USART_TypeDef *USARTx, FunctionalState state);
-/* 串口6 PE5 */
-#define J1_DE_PROT GPIOE
-#define J1_DE_PIN GPIO_Pin_5
-
-/* 串口7 PE6 */
-#define J2_DE_PROT GPIOE
-#define J2_DE_PIN GPIO_Pin_6
-
-/* 串口2 PA1 */
-#define J3_DE_PROT GPIOA
-#define J3_DE_PIN GPIO_Pin_1
-
-/* 串口8 PE5 */
-#define J4_DE_PROT GPIOB
-#define J4_DE_PIN GPIO_Pin_0
-
-/* 串口3 分时复用 */
-/*
-| A - B - C - YX |
-| 0 - 0 - 0 - J0 |
-| 0 - 0 - 1 - J5 |
-| 0 - 1 - 0 - J6 |
-| 0 - 1 - 1 - J7 |
-| 1 - 0 - 0 - J8 |
-| 1 - 0 - 1 - J9 |
-*/
-#define J5_0_DE_PROT GPIOD
-#define J5_0_DE_PIN GPIO_Pin_8
-#define J5_0_A_PROT GPIOD
-#define J5_0_A_PIN GPIO_Pin_9
-#define J5_0_B_PROT GPIOD
-#define J5_0_B_PIN GPIO_Pin_10
-#define J5_0_C_PROT GPIOD
-#define J5_0_C_PIN GPIO_Pin_11
-
-#define write485 Bit_SET
-#define read485 Bit_RESET
-
-
-void set_485_Read(void);
-
-/* J1_UART6 */
-void J1_485_Init(uint32_t baud);
-#define readJ1_485 GPIO_WriteBit(J1_DE_PROT, J1_DE_PIN, read485);
-#define writeJ1_485 GPIO_WriteBit(J1_DE_PROT, J1_DE_PIN, write485);
-
-/* J2_UART7 */
-void J2_485_Init(uint32_t baud);
-#define readJ2_485 GPIO_WriteBit(J2_DE_PROT, J2_DE_PIN, read485);
-#define writeJ2_485 GPIO_WriteBit(J2_DE_PROT, J2_DE_PIN, write485);
-
-/* J3_USART2 */
-void J3_485_Init(uint32_t baud);
-#define readJ3_485 GPIO_WriteBit(J3_DE_PROT, J3_DE_PIN, read485);
-#define writeJ3_485 GPIO_WriteBit(J3_DE_PROT, J3_DE_PIN, write485);
-
-/* J4_UART8 */
-void J4_485_Init(uint32_t baud);
-#define readJ4_485 GPIO_WriteBit(J4_DE_PROT, J4_DE_PIN, read485);
-#define writeJ4_485 GPIO_WriteBit(J4_DE_PROT, J4_DE_PIN, write485);
-
-/* J0-5_USART3 */
-void J5_0_485_Init(uint32_t baud);
-#define readJ5_0_485 GPIO_WriteBit(J5_0_DE_PROT, J5_0_DE_PIN, read485);
-#define writeJ5_0_485 GPIO_WriteBit(J5_0_DE_PROT, J5_0_DE_PIN, write485);
-void USART_CONNET_J0(void);
-void USART_CONNET_J5(void);
-void USART_CONNET_J6(void);
-void USART_CONNET_J7(void);
-void USART_CONNET_J8(void);
-void USART_CONNET_J9(void);
-
-#ifdef uart4_enable
-/* LORA_UART4 */
-void LORA_UART4_Init(uint32_t baud);
-#endif
-
-/* Upward_UART5 */
-void Upward_UART5_Init(uint32_t baud);
-
-extern void J3_Interrupt();
-extern void J5_0_Interrupt();
-extern void Upward_Interrupt();
+extern void J0_Interrupt();
extern void J1_Interrupt();
extern void J2_Interrupt();
+extern void J3_Interrupt();
extern void J4_Interrupt();
+extern void J5_Interrupt();
+extern void J6_Interrupt();
+extern void J7_Interrupt();
+extern void J8_Interrupt();
+extern void J9_Interrupt();
+extern void Mcu_Interrupt();
+extern void Su806_Interrupt();
+extern void Lora_Interrupt();
-void USARTx_SendByte(USART_TypeDef* pUSARTx, uint8_t data);
-void USARTx_SendStr_Len(USART_TypeDef* pUSARTx, char *str, int len);
#endif /* HARDWARE_RS485_UART_H_ */
diff --git a/CH32V303-FreeRTOS/App/hardwareDriver/Src/HD_ADC.c b/CH32V303-FreeRTOS/App/hardwareDriver/Src/HD_ADC.c
index 7bb5272..96797ab 100644
--- a/CH32V303-FreeRTOS/App/hardwareDriver/Src/HD_ADC.c
+++ b/CH32V303-FreeRTOS/App/hardwareDriver/Src/HD_ADC.c
@@ -3,7 +3,7 @@
/* adc校准值 */
int16_t Calibrattion_Val = 0;
-#define adcNum 3
+#define adcNum 4
/* 通过dma将adc采集的数据存入 */
uint16_t adcData[adcNum] = {0};
@@ -18,18 +18,22 @@ void HD_ADC_InIt(void)
GPIO_InitTypeDef GPIO_InitStructure={0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE );
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
+ GPIO_Init(GPIOB, &GPIO_InitStructure);
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
+ GPIO_Init(GPIOB, &GPIO_InitStructure);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
@@ -89,8 +93,9 @@ void startAdcCapture(void)
/* 设置转换顺序 */
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);
- ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 2, ADC_SampleTime_239Cycles5);
- ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 3, ADC_SampleTime_239Cycles5);
+ ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 2, ADC_SampleTime_239Cycles5);
+ ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 3, ADC_SampleTime_239Cycles5);
+ ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 4, ADC_SampleTime_239Cycles5);
/* 使能ADC的dma请求 */
ADC_DMACmd(ADC1, ENABLE);
diff --git a/CH32V303-FreeRTOS/App/hardwareDriver/Src/HD_Flash.c b/CH32V303-FreeRTOS/App/hardwareDriver/Src/HD_Flash.c
index 969344c..a28a675 100644
--- a/CH32V303-FreeRTOS/App/hardwareDriver/Src/HD_Flash.c
+++ b/CH32V303-FreeRTOS/App/hardwareDriver/Src/HD_Flash.c
@@ -7,450 +7,54 @@
#include "HD_Flash.h"
#include "pDebug.h"
-/* Global Variable */
-uint8_t SPI_FLASH_BUF[4096];
-void delay_us(uint32_t us) {
- volatile uint32_t cycles = us * SystemCoreClock / 4000000; // 根据实测调整
- while (cycles--) {
- __asm__ volatile ("nop"); // 防止循环被优化
- }
-}
-
-/*******************************************************************************
-* Function Name : SPI_Flash_Init
-* Description : Configuring the SPI for operation flash.
-* Input : None
-* Return : None
-*******************************************************************************/
-void SPI_Flash_Init(void)
+uint8_t readFlash(uint32_t* pBuffer,uint32_t ReadAddr,uint16_t dataLen)
{
- GPIO_InitTypeDef GPIO_InitStructure;
- SPI_InitTypeDef SPI_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOX, ENABLE );
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPIX, ENABLE );
-
- GPIO_InitStructure.GPIO_Pin = CS_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(CS_GPIO, &GPIO_InitStructure);
- GPIO_SetBits(CS_GPIO, CS_PIN); //CS引脚PA15置高电平
-
- GPIO_InitStructure.GPIO_Pin = CLK_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(CLK_GPIO, &GPIO_InitStructure );
-
- GPIO_InitStructure.GPIO_Pin = DO_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
- GPIO_Init(DO_GPIO, &GPIO_InitStructure );
-
- GPIO_InitStructure.GPIO_Pin = DI_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(DI_GPIO, &GPIO_InitStructure );
-
- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI通讯方向为双线全双工方式
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI为主机端模式
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI通讯的数据帧大小为8位
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //设置SPI的时钟极性为高电平
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //设置SPI的时钟相位为在SCK的偶数边沿采集数据
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //设置NSS引脚(即片选引脚)的使用模式为软件模式
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //设置波特率分频因子为4分频
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //设置数据传输为高位数据在前
- SPI_InitStructure.SPI_CRCPolynomial = 7; //SPI的CRC校验中多项式的值
- SPI_Init(SPIX, &SPI_InitStructure); //初始化SPI
-
- SPI_Cmd(SPIX, ENABLE); //使能SPI3外设
-}
-
-/*******************************************************************************
-* Function Name : SPIX_ReadWriteByte
-* Description : SPIX read or write one byte.
-* Input : TxData: write one byte data.
-* Return : Read one byte data.
-*******************************************************************************/
-u8 SPI_ReadWriteByte(u8 TxData)
-{
- u8 i=0;
- while (SPI_I2S_GetFlagStatus(SPIX, SPI_I2S_FLAG_TXE) == RESET) //等待发送缓冲区为空,TXE事件
- {
- i++;
- if(i>200)return 0;
- }
- SPI_I2S_SendData(SPIX, TxData); //写入数据寄存器,把要写入的数据写入发送缓冲区,即通过外设SPI1发送一个数据
- i=0;
- while (SPI_I2S_GetFlagStatus(SPIX, SPI_I2S_FLAG_RXNE) == RESET) //等待接收缓冲区非空,RXNE事件
- {
- i++;
- if(i>200)return 0;
- }
- return SPI_I2S_ReceiveData(SPIX); //读取数据寄存器,获取接收缓冲区数据,即返回SPI1最近接收到的数据
-}
-
-/*******************************************************************************
-* Function Name : SPI_Flash_ReadSR
-* Description : Read W25Qxx status register.
-* ——BIT7 6 5 4 3 2 1 0
-* ——SPR RV TB BP2 BP1 BP0 WEL BUSY
-* Input : None
-* Return : byte: status register value.
-*******************************************************************************/
-u8 SPI_Flash_ReadSR(void)
-{
- u8 byte=0;
-
- GPIO_WriteBit(CS_GPIO, CS_PIN, 0); //PA2=0,使能片选信号
- SPI_ReadWriteByte(W25X_ReadStatusReg); //发送读状态寄存器命令
- byte=SPI_ReadWriteByte(0Xff); //读取一个字节
- GPIO_WriteBit(CS_GPIO, CS_PIN, 1); //取消片选信号
-
- return byte;
-}
-
-/*******************************************************************************
-* Function Name : SPI_FLASH_Write_SR
-* Description : Write W25Qxx status register.
-* Input : sr:status register value.
-* Return : None
-*******************************************************************************/
-void SPI_FLASH_Write_SR(u8 sr)
-{
- GPIO_WriteBit(CS_GPIO, CS_PIN, 0);
- SPI_ReadWriteByte(W25X_WriteStatusReg); //发送写状态寄存器命令
- SPI_ReadWriteByte(sr); //写入一个字节
- GPIO_WriteBit(CS_GPIO, CS_PIN, 1);
-}
-
-/*******************************************************************************
-* Function Name : SPI_Flash_Wait_Busy
-* Description : Wait flash free.
-* Input : None
-* Return : None
-*******************************************************************************/
-void SPI_Flash_Wait_Busy(void)
-{
- while((SPI_Flash_ReadSR()&0x01)==0x01); //等待FLASH空闲
-}
-
-/*******************************************************************************
-* Function Name : SPI_FLASH_Write_Enable
-* Description : Enable flash write.
-* Input : None
-* Return : None
-*******************************************************************************/
-void SPI_FLASH_Write_Enable(void)
-{
- GPIO_WriteBit(CS_GPIO, CS_PIN, 0);
- SPI_ReadWriteByte(W25X_WriteEnable); //发送写使能
- GPIO_WriteBit(CS_GPIO, CS_PIN, 1);
-}
-
-/*******************************************************************************
-* Function Name : SPI_FLASH_Write_Disable
-* Description : Disable flash write.
-* Input : None
-* Return : None
-*******************************************************************************/
-void SPI_FLASH_Write_Disable(void)
-{
- GPIO_WriteBit(CS_GPIO, CS_PIN, 0);
- SPI_ReadWriteByte(W25X_WriteDisable); //发送写禁止指令
- GPIO_WriteBit(CS_GPIO, CS_PIN, 1);
-}
-
-/*******************************************************************************
-* Function Name : SPI_Flash_ReadID
-* Description : Read flash ID.
-* Input : None
-* Return : Temp: FLASH ID.
-*******************************************************************************/
-u16 SPI_Flash_ReadID(void)
-{
- u16 Temp = 0;
-
- GPIO_WriteBit(CS_GPIO, CS_PIN, 0);
- SPI_ReadWriteByte(W25X_ManufactDeviceID); //发送读取ID命令
- SPI_ReadWriteByte(0x00);
- SPI_ReadWriteByte(0x00);
- SPI_ReadWriteByte(0x00);
- Temp|=SPI_ReadWriteByte(0xFF)<<8;
- Temp|=SPI_ReadWriteByte(0xFF);
- GPIO_WriteBit(CS_GPIO, CS_PIN, 1);
-
- return Temp;
-}
-
-/*******************************************************************************
-* Function Name : SPI_Flash_Erase_Sector
-* Description : Erase one sector(4Kbyte).
-* Input : Dst_Addr: 0 —— 2047
-* Return : None
-*******************************************************************************/
-void SPI_Flash_Erase_Sector(u32 Dst_Addr)
-{
- Dst_Addr*=4096;
- SPI_FLASH_Write_Enable();
- SPI_Flash_Wait_Busy();
- GPIO_WriteBit(CS_GPIO, CS_PIN, 0);
- SPI_ReadWriteByte(W25X_SectorErase); //发送扇区擦除指令
- SPI_ReadWriteByte((u8)((Dst_Addr)>>16)); //发送24bit地址
- SPI_ReadWriteByte((u8)((Dst_Addr)>>8));
- SPI_ReadWriteByte((u8)Dst_Addr);
- GPIO_WriteBit(CS_GPIO, CS_PIN, 1);
- SPI_Flash_Wait_Busy(); //等待擦除完成
-}
-
-/*******************************************************************************
-* Function Name : SPI_Flash_Read
-* Description : Read data from flash.
-* Input : pBuffer:
-* ReadAddr:Initial address(24bit).
-* size: Data length.
-* Return : None
-*******************************************************************************/
-void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 size)
-{
- u16 i;
-
- GPIO_WriteBit(CS_GPIO, CS_PIN, 0);
- SPI_ReadWriteByte(W25X_ReadData); //发送读取命令
- SPI_ReadWriteByte((u8)((ReadAddr)>>16)); //发送24bit地址
- SPI_ReadWriteByte((u8)((ReadAddr)>>8));
- SPI_ReadWriteByte((u8)ReadAddr);
-
- for(i=0;i>16)); //发送24bit地址
- SPI_ReadWriteByte((u8)((WriteAddr)>>8));
- SPI_ReadWriteByte((u8)WriteAddr);
-
- for(i=0;i256)pageremain=256; //一次可以写入256个字节
- else pageremain=size; //不够256个字节了
- }
- }
-}
-
-/*******************************************************************************
-* Function Name : SPI_Flash_Write
-* Description : Write data to flash.(no need Erase)
-* Input : pBuffer:
-* WriteAddr: Initial address(24bit).
-* size: Data length.
-* Return : None
-*******************************************************************************/
-void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 size)
-{
- u32 secpos;
- u16 secoff;
- u16 secremain;
- u16 i;
-
- secpos=WriteAddr/4096; //扇区地址
- secoff=WriteAddr%4096; //在扇区内的便宜
- secremain=4096-secoff; //扇区剩余空间大小
-
- if(size<=secremain)secremain=size; //不大于4096个字节
-
- while(1)
- {
- SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096); //读出整个扇区的内容
-
- for(i=0;i4096)
- {
- secremain=4096; //下一个扇区还是写不完
- }
- else
- {
- secremain=size; //下一个扇区可以写完了
- }
- }
- }
-}
-
-/*******************************************************************************
-* Function Name : SPI_Flash_Erase_Chip
-* Description : Erase all FLASH pages.
-* Input : None
-* Return : None
-*******************************************************************************/
-void SPI_Flash_Erase_Chip(void)
-{
- SPI_FLASH_Write_Enable();
- SPI_Flash_Wait_Busy();
- GPIO_WriteBit(CS_GPIO, CS_PIN, 0);
- SPI_ReadWriteByte(W25X_ChipErase); //发送片擦除指令
- GPIO_WriteBit(CS_GPIO, CS_PIN, 1);
- SPI_Flash_Wait_Busy();
-}
-
-/*******************************************************************************
-* Function Name : SPI_Flash_PowerDown
-* Description : Enter power down mode.
-* Input : None
-* Return : None
-*******************************************************************************/
-void SPI_Flash_PowerDown(void)
-{
- GPIO_WriteBit(CS_GPIO, CS_PIN, 0);
- SPI_ReadWriteByte(W25X_PowerDown); //发送进入断电模式之灵
- GPIO_WriteBit(CS_GPIO, CS_PIN, 1);
- delay_us(3);
-}
-
-/*******************************************************************************
-* Function Name : SPI_Flash_WAKEUP
-* Description : Power down wake up.
-* Input : None
-* Return : None
-*******************************************************************************/
-void SPI_Flash_WAKEUP(void)
-{
- GPIO_WriteBit(CS_GPIO, CS_PIN, 0);
- SPI_ReadWriteByte(W25X_ReleasePowerDown); //发送断电唤醒指令
- GPIO_WriteBit(CS_GPIO, CS_PIN, 1);
- delay_us(3);
-}
-
-void SPI_Flash_TEST(void)
-{
- const int SIZE = 100;
- u8 TEXT_Buf[100] = "hello world \n";
- u8 datap[SIZE];
- u16 Flash_Model;
- SPI_Flash_Init();
- Flash_Model = SPI_Flash_ReadID();
- log_info("SPI_Flash_ReadID = %x \n", Flash_Model);
- switch(Flash_Model)
- {
- case W25Q80:
- log_info("W25Q80 OK!\r\n");
- break;
- case W25Q16:
- log_info("W25Q16 OK!\r\n");
- break;
- case W25Q32:
- log_info("W25Q32 OK!\r\n");
- break;
- case W25Q64:
- log_info("W25Q64 OK!\r\n");
- break;
- case W25Q128:
- log_info("W25Q128 OK!\r\n");
- break;
- default:
- log_info("Fail!\r\n");
- break;
+ /* 擦除某个闪存页 */
+ int ret = FLASH_ROM_ERASE(WriteAddr, 256);
+ if (ret != FLASH_COMPLETE) {
+ return 0;
}
- log_info("Start Erase W25Qxx....\r\n");
- SPI_Flash_Erase_Sector(0);
- log_info("W25Qxx Erase Finished!\r\n");
+ uint32_t buf[64] = {0};
+ memcpy(buf, pBuffer, (NumByteToWrite / 4));
- delay_us(500);
- log_info("Start Write W25Qxx....\r\n");
- SPI_Flash_Write((u8*)TEXT_Buf,0,SIZE);
- log_info("W25Qxx Write Finished!\r\n");
+ ret = FLASH_ROM_WRITE(WriteAddr, buf, 256);
+ if (ret != FLASH_COMPLETE) {
+ return 0;
+ }
- delay_us(500);
- log_info("Start Read W25Qxx....\r\n");
- SPI_Flash_Read(datap,0x0,SIZE);
- log_info("READ:%s\r\n", datap );
+
+ // FLASH_Unlock();
+ // for (int i = 0; i < NumByteToWrite; i++) {
+ // ret = FLASH_ProgramOptionByteData((uint32_t)((uint8_t *)WriteAddr + 1), *(pBuffer + i));
+ // if (ret != FLASH_COMPLETE) {
+ // FLASH_Lock();
+ // return 0;
+ // }
+ // }
+ // FLASH_Lock();
+
+ return 1;
}
+
+
diff --git a/CH32V303-FreeRTOS/App/hardwareDriver/Src/HD_GPIO.c b/CH32V303-FreeRTOS/App/hardwareDriver/Src/HD_GPIO.c
index 1852d61..0ee3cd3 100644
--- a/CH32V303-FreeRTOS/App/hardwareDriver/Src/HD_GPIO.c
+++ b/CH32V303-FreeRTOS/App/hardwareDriver/Src/HD_GPIO.c
@@ -1,24 +1,39 @@
#include "HD_GPIO.h"
-void HD_GPIO_Init(void)
+
+/**
+ * @brief 初始化主从mcu判断引脚,并返回主从引脚信息
+ * @param
+ * @retval
+ */
+uint8_t mcu_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
-
- /* 安卓模块电源使能引脚,默认不使能 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_PwrCtrl_GPIO_PIN;
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
+ GPIO_Init(GPIOE, &GPIO_InitStructure);
+
+ return HD_InputGPIO_Read(GPIOE, GPIO_Pin_4);
+}
+
+
+/**
+ * @brief 初始化端口电源控制引脚
+ * @param
+ * @retval
+ */
+void PwrCtrl_GPIO_Init(void)
+{
+ /* 电源控制引脚,默认不开启电源 */
+ GPIO_InitTypeDef GPIO_InitStructure;
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
+
+ GPIO_InitStructure.GPIO_Pin = J1_PwrCtrl_GPIO_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIO_PwrCtrl_GPIO_PROT, &GPIO_InitStructure);
- GPIO_WriteBit(GPIO_PwrCtrl_GPIO_PROT, GPIO_PwrCtrl_GPIO_PIN, Bit_RESET);
-
- /* 复位安卓模块引脚,默认低电平 */
- GPIO_InitStructure.GPIO_Pin = GPIO_PwrKey_GPIO_PIN;
- GPIO_Init(GPIO_PwrKey_GPIO_PROT, &GPIO_InitStructure);
- GPIO_WriteBit(GPIO_PwrKey_GPIO_PROT, GPIO_PwrKey_GPIO_PIN, Bit_RESET);
-
- /* 电源控制引脚,默认不开启电源 */
- GPIO_InitStructure.GPIO_Pin = J1_PwrCtrl_GPIO_PIN;
GPIO_Init(J1_PwrCtrl_GPIO_PROT, &GPIO_InitStructure);
GPIO_WriteBit(J1_PwrCtrl_GPIO_PROT, J1_PwrCtrl_GPIO_PIN, Bit_RESET);
@@ -53,19 +68,153 @@ void HD_GPIO_Init(void)
GPIO_InitStructure.GPIO_Pin = J9_PwrCtrl_GPIO_PIN;
GPIO_Init(J9_PwrCtrl_GPIO_PROT, &GPIO_InitStructure);
GPIO_WriteBit(J9_PwrCtrl_GPIO_PROT, J9_PwrCtrl_GPIO_PIN, Bit_RESET);
+}
+
+/**
+ * @brief 安卓模块控制引脚初始化
+ * @param
+ * @retval
+ */
+void Android_GPIO_Init(void)
+{
+ GPIO_InitTypeDef GPIO_InitStructure;
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
+
+ /* 安卓模块电源使能引脚,默认不使能 */
+ GPIO_InitStructure.GPIO_Pin = GPIO_PwrCtrl_GPIO_PIN;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+ GPIO_Init(GPIO_PwrCtrl_GPIO_PROT, &GPIO_InitStructure);
+ GPIO_WriteBit(GPIO_PwrCtrl_GPIO_PROT, GPIO_PwrCtrl_GPIO_PIN, Bit_RESET);
+
+ /* 复位安卓模块引脚,默认低电平 */
+ GPIO_InitStructure.GPIO_Pin = GPIO_PwrKey_GPIO_PIN;
+ GPIO_Init(GPIO_PwrKey_GPIO_PROT, &GPIO_InitStructure);
+ GPIO_WriteBit(GPIO_PwrKey_GPIO_PROT, GPIO_PwrKey_GPIO_PIN, Bit_RESET);
+}
+
+/**
+ * @brief 喂狗引脚初始化
+ * @param
+ * @retval
+ */
+void WDI_GPIO_Init(void)
+{
+ GPIO_InitTypeDef GPIO_InitStructure;
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
- /* 喂狗引脚 */
GPIO_InitStructure.GPIO_Pin = WDI_GPIO_PIN;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(WDI_GPIO_PROT, &GPIO_InitStructure);
GPIO_WriteBit(WDI_GPIO_PROT, WDI_GPIO_PIN, Bit_SET);
-
- /* LED引脚 */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
+}
+
+/**
+ * @brief led灯引脚初始化
+ * @param
+ * @retval
+ */
+void LED_GPIO_Init(void)
+{
+ GPIO_InitTypeDef GPIO_InitStructure;
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
+
GPIO_InitStructure.GPIO_Pin = LED_GPIO_PIN;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(LED_GPIO_PROT, &GPIO_InitStructure);
GPIO_WriteBit(LED_GPIO_PROT, LED_GPIO_PIN, Bit_SET);
}
+/**
+ * @brief 主机485读写控制引脚初始化
+ * @param
+ * @retval
+ */
+void Host485De_GPIO_Init(void)
+{
+ GPIO_InitTypeDef GPIO_InitStructure;
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
+
+ GPIO_InitStructure.GPIO_Pin = J0De_GPIO_PIN;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+ GPIO_Init(J0De_GPIO_PROT, &GPIO_InitStructure);
+ GPIO_WriteBit(J0De_GPIO_PROT, J0De_GPIO_PIN, write);
+
+ GPIO_InitStructure.GPIO_Pin = J2De_GPIO_PIN;
+ GPIO_Init(J2De_GPIO_PROT, &GPIO_InitStructure);
+ GPIO_WriteBit(J2De_GPIO_PROT, J2De_GPIO_PIN, write);
+
+ GPIO_InitStructure.GPIO_Pin = J4De_GPIO_PIN;
+ GPIO_Init(J4De_GPIO_PROT, &GPIO_InitStructure);
+ GPIO_WriteBit(J4De_GPIO_PROT, J4De_GPIO_PIN, write);
+
+ GPIO_InitStructure.GPIO_Pin = J6De_GPIO_PIN;
+ GPIO_Init(J6De_GPIO_PROT, &GPIO_InitStructure);
+ GPIO_WriteBit(J6De_GPIO_PROT, J6De_GPIO_PIN, write);
+}
+
+/**
+ * @brief 从机485读写控制引脚初始化
+ * @param
+ * @retval
+ */
+void Slave485De_GPIO_Init(void)
+{
+ GPIO_InitTypeDef GPIO_InitStructure;
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
+
+ GPIO_InitStructure.GPIO_Pin = J1De_GPIO_PIN;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+ GPIO_Init(J1De_GPIO_PROT, &GPIO_InitStructure);
+ GPIO_WriteBit(J1De_GPIO_PROT, J1De_GPIO_PIN, write);
+
+
+ GPIO_InitStructure.GPIO_Pin = J3De_GPIO_PIN;
+ GPIO_Init(J3De_GPIO_PROT, &GPIO_InitStructure);
+ GPIO_WriteBit(J3De_GPIO_PROT, J3De_GPIO_PIN, write);
+
+
+ GPIO_InitStructure.GPIO_Pin = J5De_GPIO_PIN;
+ GPIO_Init(J5De_GPIO_PROT, &GPIO_InitStructure);
+ GPIO_WriteBit(J5De_GPIO_PROT, J5De_GPIO_PIN, write);
+
+
+ GPIO_InitStructure.GPIO_Pin = J7De_GPIO_PIN;
+ GPIO_Init(J7De_GPIO_PROT, &GPIO_InitStructure);
+ GPIO_WriteBit(J7De_GPIO_PROT, J7De_GPIO_PIN, write);
+
+ GPIO_InitStructure.GPIO_Pin = J8De_GPIO_PIN;
+ GPIO_Init(J8De_GPIO_PROT, &GPIO_InitStructure);
+ GPIO_WriteBit(J8De_GPIO_PROT, J8De_GPIO_PIN, write);
+
+ GPIO_InitStructure.GPIO_Pin = J9De_GPIO_PIN;
+ GPIO_Init(J9De_GPIO_PROT, &GPIO_InitStructure);
+ GPIO_WriteBit(J9De_GPIO_PROT, J9De_GPIO_PIN, write);
+}
+
+/**
+ * @brief 初始化控制从mcu复位引脚
+ * @param
+ * @retval
+ */
+void ctrlSlave_GPIO_Init(void)
+{
+ GPIO_InitTypeDef GPIO_InitStructure;
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
+
+ GPIO_InitStructure.GPIO_Pin = ctrlSlave_GPIO_PIN;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
+ GPIO_Init(ctrlSlave_GPIO_PROT, &GPIO_InitStructure);
+ GPIO_WriteBit(ctrlSlave_GPIO_PROT, ctrlSlave_GPIO_PIN, Bit_SET);
+}
+
/**
* @brief 设置IO输出电平
* @param GPIOx
diff --git a/CH32V303-FreeRTOS/App/hardwareDriver/Src/HD_UART.c b/CH32V303-FreeRTOS/App/hardwareDriver/Src/HD_UART.c
index 9d63289..78c5115 100644
--- a/CH32V303-FreeRTOS/App/hardwareDriver/Src/HD_UART.c
+++ b/CH32V303-FreeRTOS/App/hardwareDriver/Src/HD_UART.c
@@ -2,161 +2,22 @@
void USART2_IRQHandler(void) __attribute__((interrupt()));
void USART3_IRQHandler(void) __attribute__((interrupt()));
-#ifdef uart4_enable
-// void UART4_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void UART4_IRQHandler(void) __attribute__((interrupt()));
-#endif
void UART5_IRQHandler(void) __attribute__((interrupt()));
void UART6_IRQHandler(void) __attribute__((interrupt()));
void UART7_IRQHandler(void) __attribute__((interrupt()));
void UART8_IRQHandler(void) __attribute__((interrupt()));
-#define write Bit_SET
-#define read Bit_RESET
-/*
- * @brief 设置所有485状态为读
- * @param
- * @retval
- *
- */
-void set_485_Read(void)
+/**
+ * @brief 初始化串口2
+ * @param baud 波特率
+ * @retval
+ */
+void uart2Init(int baud)
{
- readJ1_485;
- readJ2_485;
- readJ3_485;
- readJ4_485;
- readJ5_0_485;
-}
-
-/*
- * @brief 初始化UART6对应的J1_485,默认为接收
- * @param baud 波特率
- * @retval
- *
- */
-void J1_485_Init(uint32_t baud)
-{
- /* 初始化DE引脚 */
GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
- GPIO_InitStructure.GPIO_Pin = J1_DE_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(J1_DE_PROT, &GPIO_InitStructure);
- // readJ1_485;
- writeJ1_485;
-
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- /* UART6 TX --> PC0 RX --> PC1 */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART6, ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置PC0为复用推挽输出
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置PC1为浮空输入
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- USART_InitStructure.USART_BaudRate = baud;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- USART_InitStructure.USART_Parity = USART_Parity_No;
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
- USART_Init(UART6, &USART_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel = UART6_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; //抢占优先级为3
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级为3
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
- NVIC_Init(&NVIC_InitStructure); //中断优先级初始化
-
- USART_ITConfig(UART6, USART_IT_RXNE, ENABLE);
- USART_ITConfig(UART6, USART_IT_IDLE, ENABLE);
-
- USART_Cmd(UART6,ENABLE);
-}
-
-
-/*
- * @brief 初始化UART7对应的J2_485,默认为接收,电源关闭状态
- * @param baud 波特率
- * @retval
- *
- */
-void J2_485_Init(uint32_t baud)
-{
- /* 初始化DE引脚 */
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
- GPIO_InitStructure.GPIO_Pin = J2_DE_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(J2_DE_PROT, &GPIO_InitStructure);
- // readJ2_485;
- writeJ2_485;
-
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- /* UART7 TX --> PC2 RX --> PC3 */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART7, ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置PC2为复用推挽输出
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置PC3为浮空输入
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- USART_InitStructure.USART_BaudRate = baud;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- USART_InitStructure.USART_Parity = USART_Parity_No;
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
- USART_Init(UART7, &USART_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel = UART7_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; //抢占优先级为3
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级为3
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
- NVIC_Init(&NVIC_InitStructure); //中断优先级初始化
-
- USART_ITConfig(UART7, USART_IT_RXNE, ENABLE);
- USART_ITConfig(UART7, USART_IT_IDLE, ENABLE);
-
- USART_Cmd(UART7,ENABLE);
-}
-
-/*
- * @brief 初始化USART2对应的J3_485,默认为接收,电源关闭状态
- * @param baud 波特率
- * @retval
- *
- */
-void J3_485_Init(uint32_t baud)
-{
- /* 初始化DE引脚 */
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- GPIO_InitStructure.GPIO_Pin = J3_DE_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(J3_DE_PROT, &GPIO_InitStructure);
- // readJ3_485;
- writeJ3_485;
-
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
@@ -188,29 +49,234 @@ void J3_485_Init(uint32_t baud)
NVIC_Init(&NVIC_InitStructure); //中断优先级初始化
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
- USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);
USART_Cmd(USART2,ENABLE);
}
-/*
- * @brief 初始化UART8对应的J4_485,默认为接收,电源关闭状态
- * @param baud 波特率
- * @retval
- *
- */
-void J4_485_Init(uint32_t baud)
+/**
+ * @brief 初始化串口3
+ * @param baud 波特率
+ * @retval
+ */
+void uart3Init(int baud)
{
- /* 初始化DE引脚 */
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
- GPIO_InitStructure.GPIO_Pin = J4_DE_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(J4_DE_PROT, &GPIO_InitStructure);
- // readJ4_485;
- writeJ4_485;
+ GPIO_InitTypeDef GPIO_InitStructure;
+ USART_InitTypeDef USART_InitStructure;
+ NVIC_InitTypeDef NVIC_InitStructure;
+ /* USART3 TX --> PB10 RX --> PB11 */
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
+ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置PB10为复用推挽输出
+ GPIO_Init(GPIOB, &GPIO_InitStructure);
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置PB11为浮空输入
+ GPIO_Init(GPIOB, &GPIO_InitStructure);
+
+ USART_InitStructure.USART_BaudRate = baud;
+ USART_InitStructure.USART_WordLength = USART_WordLength_8b;
+ USART_InitStructure.USART_StopBits = USART_StopBits_1;
+ USART_InitStructure.USART_Parity = USART_Parity_No;
+ USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
+ USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
+ USART_Init(USART3, &USART_InitStructure);
+
+ NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
+ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //抢占优先级为1
+ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级为1
+ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
+ NVIC_Init(&NVIC_InitStructure); //中断优先级初始化
+
+ USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
+
+ USART_Cmd(USART3,ENABLE);
+}
+
+/**
+ * @brief 初始化串口4
+ * @param baud 波特率
+ * @retval
+ */
+void uart4Init(int baud)
+{
+ GPIO_InitTypeDef GPIO_InitStructure;
+ USART_InitTypeDef USART_InitStructure;
+ NVIC_InitTypeDef NVIC_InitStructure;
+
+ /* UART4 TX --> PC10 RX --> PC11 */
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
+ RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置PC10为复用推挽输出
+ GPIO_Init(GPIOC, &GPIO_InitStructure);
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置PC11为浮空输入
+ GPIO_Init(GPIOC, &GPIO_InitStructure);
+
+ USART_InitStructure.USART_BaudRate = baud;
+ USART_InitStructure.USART_WordLength = USART_WordLength_8b;
+ USART_InitStructure.USART_StopBits = USART_StopBits_1;
+ USART_InitStructure.USART_Parity = USART_Parity_No;
+ USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
+ USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
+ USART_Init(UART4, &USART_InitStructure);
+
+ NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
+ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //抢占优先级为3
+ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级为3
+ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
+ NVIC_Init(&NVIC_InitStructure); //中断优先级初始化
+
+ USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
+
+ USART_Cmd(UART4,ENABLE);
+}
+
+/**
+ * @brief 初始化串口5
+ * @param baud 波特率
+ * @retval
+ */
+void uart5Init(int baud)
+{
+ GPIO_InitTypeDef GPIO_InitStructure;
+ USART_InitTypeDef USART_InitStructure;
+ NVIC_InitTypeDef NVIC_InitStructure;
+
+ /* UART5 TX --> PC12 RX --> PD2 */
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
+ RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置PC12为复用推挽输出
+ GPIO_Init(GPIOC, &GPIO_InitStructure);
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置PD2为浮空输入
+ GPIO_Init(GPIOD, &GPIO_InitStructure);
+
+ USART_InitStructure.USART_BaudRate = baud;
+ USART_InitStructure.USART_WordLength = USART_WordLength_8b;
+ USART_InitStructure.USART_StopBits = USART_StopBits_1;
+ USART_InitStructure.USART_Parity = USART_Parity_No;
+ USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
+ USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
+ USART_Init(UART5, &USART_InitStructure);
+
+ NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
+ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //抢占优先级为3
+ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级为3
+ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
+ NVIC_Init(&NVIC_InitStructure); //中断优先级初始化
+
+ USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);
+
+ USART_Cmd(UART5,ENABLE);
+}
+
+/**
+ * @brief 初始化串口6
+ * @param baud 波特率
+ * @retval
+ */
+void uart6Init(int baud)
+{
+ GPIO_InitTypeDef GPIO_InitStructure;
+ USART_InitTypeDef USART_InitStructure;
+ NVIC_InitTypeDef NVIC_InitStructure;
+
+ /* UART6 TX --> PC0 RX --> PC1 */
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
+ RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART6, ENABLE);
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置PC0为复用推挽输出
+ GPIO_Init(GPIOC, &GPIO_InitStructure);
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置PC1为浮空输入
+ GPIO_Init(GPIOC, &GPIO_InitStructure);
+
+ USART_InitStructure.USART_BaudRate = baud;
+ USART_InitStructure.USART_WordLength = USART_WordLength_8b;
+ USART_InitStructure.USART_StopBits = USART_StopBits_1;
+ USART_InitStructure.USART_Parity = USART_Parity_No;
+ USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
+ USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
+ USART_Init(UART6, &USART_InitStructure);
+
+ NVIC_InitStructure.NVIC_IRQChannel = UART6_IRQn;
+ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //抢占优先级为3
+ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级为3
+ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
+ NVIC_Init(&NVIC_InitStructure); //中断优先级初始化
+
+ USART_ITConfig(UART6, USART_IT_RXNE, ENABLE);
+
+ USART_Cmd(UART6,ENABLE);
+}
+
+/**
+ * @brief 初始化串口7
+ * @param baud 波特率
+ * @retval
+ */
+void uart7Init(int baud)
+{
+ GPIO_InitTypeDef GPIO_InitStructure;
+ USART_InitTypeDef USART_InitStructure;
+ NVIC_InitTypeDef NVIC_InitStructure;
+
+ /* UART7 TX --> PC2 RX --> PC3 */
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
+ RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART7, ENABLE);
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
+ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置PC2为复用推挽输出
+ GPIO_Init(GPIOC, &GPIO_InitStructure);
+
+ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
+ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置PC3为浮空输入
+ GPIO_Init(GPIOC, &GPIO_InitStructure);
+
+ USART_InitStructure.USART_BaudRate = baud;
+ USART_InitStructure.USART_WordLength = USART_WordLength_8b;
+ USART_InitStructure.USART_StopBits = USART_StopBits_1;
+ USART_InitStructure.USART_Parity = USART_Parity_No;
+ USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
+ USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
+ USART_Init(UART7, &USART_InitStructure);
+
+ NVIC_InitStructure.NVIC_IRQChannel = UART7_IRQn;
+ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //抢占优先级为3
+ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级为3
+ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
+ NVIC_Init(&NVIC_InitStructure); //中断优先级初始化
+
+ USART_ITConfig(UART7, USART_IT_RXNE, ENABLE);
+
+ USART_Cmd(UART7,ENABLE);
+}
+
+/**
+ * @brief 初始化串口8
+ * @param baud 波特率
+ * @retval
+ */
+void uart8Init(int baud)
+{
+ GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
@@ -242,348 +308,75 @@ void J4_485_Init(uint32_t baud)
NVIC_Init(&NVIC_InitStructure); //中断优先级初始化
USART_ITConfig(UART8, USART_IT_RXNE, ENABLE);
- USART_ITConfig(UART8, USART_IT_IDLE, ENABLE);
USART_Cmd(UART8,ENABLE);
}
-/*
- * @brief 初始话USART3用于控制J5-0共6个485接口,设置控制的485为J0,电源全部关闭
- * @param baud 波特率
- * @retval
- *
- */
-void J5_0_485_Init(uint32_t baud)
+/**
+ * @brief 设置空闲中断状态
+ * @param USARTx 波特率
+ state 状态
+ * @retval
+ */
+void setIDLE(USART_TypeDef *USARTx, FunctionalState state)
{
- /* 初始化DE引脚 */
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
- GPIO_InitStructure.GPIO_Pin = J5_0_DE_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(J5_0_DE_PROT, &GPIO_InitStructure);
- // readJ5_0_485;
- writeJ5_0_485;
- // writeJ5_0_485;
- GPIO_InitStructure.GPIO_Pin = J5_0_A_PIN;
- GPIO_Init(J5_0_DE_PROT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = J5_0_B_PIN;
- GPIO_Init(J5_0_DE_PROT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = J5_0_C_PIN;
- GPIO_Init(J5_0_DE_PROT, &GPIO_InitStructure);
- USART_CONNET_J0();
-
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- /* USART3 TX --> PB10 RX --> PB11 */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置PB10为复用推挽输出
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置PB11为浮空输入
- GPIO_Init(GPIOB, &GPIO_InitStructure);
-
- USART_InitStructure.USART_BaudRate = baud;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- USART_InitStructure.USART_Parity = USART_Parity_No;
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
- USART_Init(USART3, &USART_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; //抢占优先级为1
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级为1
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
- NVIC_Init(&NVIC_InitStructure); //中断优先级初始化
-
- USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
- USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);
-// USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);
-
- USART_Cmd(USART3,ENABLE);
-}
-/*
- * Function Name : USART_CONNET_J0
- * Description : 控制串口3连接J0对应的485.
- * Input : None
- * Return : None
- **/
-void USART_CONNET_J0(void)
-{
- GPIO_WriteBit(J5_0_A_PROT, J5_0_A_PIN, Bit_RESET);
- GPIO_WriteBit(J5_0_B_PROT, J5_0_B_PIN, Bit_RESET);
- GPIO_WriteBit(J5_0_C_PROT, J5_0_C_PIN, Bit_RESET);
-}
-
-/*
- * Function Name : USART_CONNET_J5
- * Description : 控制串口3连接J5对应的485.
- * Input : None
- * Return : None
- **/
-void USART_CONNET_J5(void)
-{
- GPIO_WriteBit(J5_0_A_PROT, J5_0_A_PIN, Bit_RESET);
- GPIO_WriteBit(J5_0_B_PROT, J5_0_B_PIN, Bit_RESET);
- GPIO_WriteBit(J5_0_C_PROT, J5_0_C_PIN, Bit_SET);
-}
-
-/*
- * Function Name : USART_CONNET_J6
- * Description : 控制串口3连接J6对应的485.
- * Input : None
- * Return : None
- **/
-void USART_CONNET_J6(void)
-{
- GPIO_WriteBit(J5_0_A_PROT, J5_0_A_PIN, Bit_RESET);
- GPIO_WriteBit(J5_0_B_PROT, J5_0_B_PIN, Bit_SET);
- GPIO_WriteBit(J5_0_C_PROT, J5_0_C_PIN, Bit_RESET);
-}
-
-/*
- * Function Name : USART_CONNET_J7
- * Description : 控制串口3连接J7对应的485.
- * Input : None
- * Return : None
- **/
-void USART_CONNET_J7(void)
-{
- GPIO_WriteBit(J5_0_A_PROT, J5_0_A_PIN, Bit_RESET);
- GPIO_WriteBit(J5_0_B_PROT, J5_0_B_PIN, Bit_SET);
- GPIO_WriteBit(J5_0_C_PROT, J5_0_C_PIN, Bit_SET);
-}
-
-/*
- * Function Name : USART_CONNET_J8
- * Description : 控制串口3连接J8对应的485.
- * Input : None
- * Return : None
- **/
-void USART_CONNET_J8(void)
-{
- GPIO_WriteBit(J5_0_A_PROT, J5_0_A_PIN, Bit_SET);
- GPIO_WriteBit(J5_0_B_PROT, J5_0_B_PIN, Bit_RESET);
- GPIO_WriteBit(J5_0_C_PROT, J5_0_C_PIN, Bit_RESET);
-}
-
-/*
- * Function Name : USART_CONNET_J9
- * Description : 控制串口3连接J9对应的485.
- * Input : None
- * Return : None
- **/
-void USART_CONNET_J9(void)
-{
- GPIO_WriteBit(J5_0_A_PROT, J5_0_A_PIN, Bit_SET);
- GPIO_WriteBit(J5_0_B_PROT, J5_0_B_PIN, Bit_RESET);
- GPIO_WriteBit(J5_0_C_PROT, J5_0_C_PIN, Bit_SET);
+ USART_ITConfig(USARTx, USART_IT_IDLE, state);
}
-#ifdef uart4_enable
-/*
- * @brief 初始化UART4对应的LORA串口
- * @param baud 波特率
- * @retval
- *
- */
-void LORA_UART4_Init(uint32_t baud)
+/**
+ * @brief 设置中断发送状态
+ * @param USARTx 波特率
+ state 状态
+ * @retval
+ */
+void setTXE(USART_TypeDef *USARTx, FunctionalState state)
{
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- /* UART4 TX --> PC10 RX --> PC11 */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置PC10为复用推挽输出
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置PC11为浮空输入
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- USART_InitStructure.USART_BaudRate = baud;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- USART_InitStructure.USART_Parity = USART_Parity_No;
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
- USART_Init(UART4, &USART_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; //抢占优先级为3
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级为3
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
- NVIC_Init(&NVIC_InitStructure); //中断优先级初始化
-
- USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
-
- USART_Cmd(UART4,ENABLE);
+ USART_ITConfig(USARTx, USART_IT_TXE, state);
}
-#endif
-
-/*
- * @brief 初始化UART5对应的对上串口
- * @param baud 波特率
- * @retval
- *
- */
-void Upward_UART5_Init(uint32_t baud)
-{
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- /* UART5 TX --> PC12 RX --> PD2 */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置PC12为复用推挽输出
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置PD2为浮空输入
- GPIO_Init(GPIOD, &GPIO_InitStructure);
-
- USART_InitStructure.USART_BaudRate = baud;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- USART_InitStructure.USART_Parity = USART_Parity_No;
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
- USART_Init(UART5, &USART_InitStructure);
-
- USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);
-
- NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级为3
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级为3
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
- NVIC_Init(&NVIC_InitStructure); //中断优先级初始化
-
- USART_Cmd(UART5,ENABLE);
-}
-
-
void USART2_IRQHandler(void)
{
- J3_Interrupt();
+ Mcu_Interrupt();
}
void USART3_IRQHandler(void)
{
- J5_0_Interrupt();
+ J0_Interrupt();
+ J1_Interrupt();
}
-#ifdef uart4_enable
void UART4_IRQHandler(void)
{
-
+ J2_Interrupt();
+ J3_Interrupt();
}
-#endif
void UART5_IRQHandler(void)
{
- Upward_Interrupt();
+ J4_Interrupt();
+ J5_Interrupt();
}
void UART6_IRQHandler(void)
{
- J1_Interrupt();
+ J6_Interrupt();
+ J7_Interrupt();
}
void UART7_IRQHandler(void)
{
- J2_Interrupt();
+ J9_Interrupt();
+ Lora_Interrupt();
}
void UART8_IRQHandler(void)
{
- J4_Interrupt();
-}
-
-
-/*
- * @brief 发送一个字符
- * @param pUSARTx 串口
- data 字符
- * @retval
- *
- */
-void USARTx_SendByte(USART_TypeDef* pUSARTx, uint8_t data)
-{
- while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET) /* waiting for sending finish */
- {
- }
- USART_SendData(pUSARTx, data);
-}
-
-/*
- * @brief 发送字符串
- * @param pUSARTx 串口
- data 字符
- len 发送字符串的长度
- * @retval
- *
- */
-void USARTx_SendStr_Len(USART_TypeDef* pUSARTx, char *str, int len)
-{
- if (pUSARTx == J1_USART) {
- writeJ1_485;
- } else if (pUSARTx == J2_USART) {
- writeJ2_485;
- } else if (pUSARTx == J3_USART) {
- writeJ3_485;
- } else if (pUSARTx == J4_USART) {
- writeJ4_485;
- } else if (pUSARTx == J5_0_USART) {
- writeJ5_0_485;
- }
-
- for (int i = 0; i < len; i++) {
- USARTx_SendByte(pUSARTx, str[i]);
- }
-
- if (pUSARTx == J1_USART) {
- readJ1_485;
- } else if (pUSARTx == J2_USART) {
- readJ2_485;
- } else if (pUSARTx == J3_USART) {
- readJ3_485;
- } else if (pUSARTx == J4_USART) {
- readJ4_485;
- } else if (pUSARTx == J5_0_USART) {
- readJ5_0_485;
- }
+ J8_Interrupt();
+ Su806_Interrupt();
}
-
-
-
-
-
-
-
-
-
-
diff --git a/CH32V303-FreeRTOS/App/tools/mcu_common.c b/CH32V303-FreeRTOS/App/tools/mcu_common.c
new file mode 100644
index 0000000..0d0c238
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/tools/mcu_common.c
@@ -0,0 +1,175 @@
+
+#include "mcu_common.h"
+#include "uart_dev.h"
+
+
+
+/* 储存解析时的数据 */
+uint8_t *mcuUartRxBuffer;
+uint16_t mcuUartRxBufferIndex = 0;
+uint8_t *J0_485RxBuffer;
+uint16_t J0_485RxBufferIndex = 0;
+uint8_t *J1_485RxBuffer;
+uint16_t J1_485RxBufferIndex = 0;
+uint8_t *J2_485RxBuffer;
+uint16_t J2_485RxBufferIndex = 0;
+uint8_t *J3_485RxBuffer;
+uint16_t J3_485RxBufferIndex = 0;
+uint8_t *J4_485RxBuffer;
+uint16_t J4_485RxBufferIndex = 0;
+uint8_t *J5_485RxBuffer;
+uint16_t J5_485RxBufferIndex = 0;
+uint8_t *J6_485RxBuffer;
+uint16_t J6_485RxBufferIndex = 0;
+uint8_t *J7_485RxBuffer;
+uint16_t J7_485RxBufferIndex = 0;
+uint8_t *J8_485RxBuffer;
+uint16_t J8_485RxBufferIndex = 0;
+uint8_t *J9_485RxBuffer;
+uint16_t J9_485RxBufferIndex = 0;
+uint8_t *su806RxBuffer;
+uint16_t su806RxBufferIndex = 0;
+uint8_t *loraRxBuffer;
+uint16_t loraRxBufferIndex = 0;
+
+/* 计时参数,2秒后没解析出一帧数据,丢掉当前数据 */
+uint32_t mcuUartRxTime = 0;
+uint32_t su806UartRxTime = 0;
+
+/* 状态机状态机变量 */
+uartStateMachine state = wait;
+
+/* 帧长度 */
+uint16_t frameLength = 0;
+
+#define hostMcuUartBufferLen 280
+#define slaveMcuUartBufferLen 1100
+#define su806BufferLen 1100
+#define rs485BufferLen 280
+#define loraBufferLen 280
+
+uint8_t applyDataBuffer(void)
+{
+ /* 从mcu */
+ if (getMCU()) {
+ mcuUartRxBuffer = pvPortMalloc(slaveMcuUartBufferLen);
+ J1_485RxBuffer = pvPortMalloc(rs485BufferLen);
+ J3_485RxBuffer = pvPortMalloc(rs485BufferLen);
+ J5_485RxBuffer = pvPortMalloc(rs485BufferLen);
+ J7_485RxBuffer = pvPortMalloc(rs485BufferLen);
+ J8_485RxBuffer = pvPortMalloc(rs485BufferLen);
+ J9_485RxBuffer = pvPortMalloc(rs485BufferLen);
+
+ }
+ /* 主mcu */
+ else {
+ mcuUartRxBuffer = pvPortMalloc(hostMcuUartBufferLen);
+ su806RxBuffer = pvPortMalloc(su806BufferLen);
+ J0_485RxBuffer = pvPortMalloc(rs485BufferLen);
+ J2_485RxBuffer = pvPortMalloc(rs485BufferLen);
+ J4_485RxBuffer = pvPortMalloc(rs485BufferLen);
+ J6_485RxBuffer = pvPortMalloc(rs485BufferLen);
+ loraRxBuffer = pvPortMalloc(loraBufferLen);
+ }
+
+ return 0;
+}
+
+/**
+ * @brief 得到两次获取节拍的差值
+ * @param lastTick 上次获取的节拍值
+ * @retval
+ */
+uint32_t getTickDiff(uint32_t lastTick)
+{
+ int64_t temp;
+ temp = xTaskGetTickCount() - lastTick;
+
+ /* 节拍值超过最大值后重新计数 */
+ if (temp < 0) {
+ temp = portMAX_DELAY - lastTick + xTaskGetTickCount();
+ }
+
+ return temp;
+}
+
+/**
+ * @brief 用于波特率转化为传递的值
+ * @param
+ * @retval
+ */
+int baudConversionConfig(int baud)
+{
+ if (baud == 4800) {
+ return 0x0001;
+ }
+ else if (baud == 9600) {
+ return 0x0002;
+ }
+ else if (baud == 19200) {
+ return 0x0003;
+ }
+ else if (baud == 38400) {
+ return 0x0004;
+ }
+ else if (baud == 57600) {
+ return 0x0005;
+ }
+ else if (baud == 115200) {
+ return 0x0006;
+ }
+ return 0x0002;
+}
+
+/**
+ * @brief 用于传递的值转化为波特率
+ * @param
+ * @retval
+ */
+int configConversionBaud(int config)
+{
+ if (config == 0x0001) {
+ return 4800;
+ }
+ else if (config == 0x0002) {
+ return 9600;
+ }
+ else if (config == 0x0003) {
+ return 19200;
+ }
+ else if (config == 0x0004) {
+ return 38400;
+ }
+ else if (config == 0x0005) {
+ return 57600;
+ }
+ else if (config == 0x0006) {
+ return 115200;
+ }
+ return 9600;
+}
+
+
+/**
+ * @brief 用于modebus16crc校验
+ * @param
+ * @retval
+ */
+uint16_t modebusCrc(uint8_t *arr_buff, uint8_t len)
+{
+ unsigned short crc = 0xFFFF;
+ unsigned char i, j;
+ for ( j = 0; j < len; j++){
+ crc=crc ^ *arr_buff++;
+ for (i=0; i<8; i++){
+ if((crc&0x0001) >0){
+ crc=crc>>1;
+ crc=crc^ 0xa001;
+ }else{
+ crc=crc>>1;
+ }
+ }
+ }
+ return crc;
+}
+
diff --git a/CH32V303-FreeRTOS/App/tools/mcu_common.h b/CH32V303-FreeRTOS/App/tools/mcu_common.h
new file mode 100644
index 0000000..49e3e03
--- /dev/null
+++ b/CH32V303-FreeRTOS/App/tools/mcu_common.h
@@ -0,0 +1,85 @@
+#ifndef __COMMON_ENUM_
+#define __COMMON_ENUM_
+
+#include "stdio.h"
+
+#include "FreeRTOS.h"
+#include "task.h"
+
+typedef enum {
+ J0 = 0,
+ J1 = 1,
+ J2 = 2,
+ J3 = 3,
+ J4 = 4,
+ J5 = 5,
+ J6 = 6,
+ J7 = 7,
+ J8 = 8,
+ J9 = 9,
+ Lora = 10,
+ HostMcu = 11,
+ SlaveMcu = 12,
+} portEnum;
+
+/* 功能码 */
+enum {
+ SL_Function_Code_Read_Register = 0x30, /* 读寄存器数据 */
+ SL_Function_Code_Write_Register = 0x10, /* 写寄存器数据 */
+};
+
+/* 状态机 */
+typedef enum {
+ wait = 0, /* 串口状态机初始状态 */
+ startFlagSL, /* 接收到帧头 */
+ portSL, /* 接收到端口号 */
+ lengthSL, /* 接收到数据包的长度 */
+ endFlagSL, /* 接收到帧尾 */
+} uartStateMachine;
+
+/* 2秒的节拍数 */
+#define tick_2S (configTICK_RATE_HZ * 2)
+/* 100ms */
+#define delayTick 50
+#define maxdataLen 100
+
+extern uint8_t *mcuUartRxBuffer;
+extern uint16_t mcuUartRxBufferIndex;
+extern uint8_t *J0_485RxBuffer;
+extern uint16_t J0_485RxBufferIndex;
+extern uint8_t *J1_485RxBuffer;
+extern uint16_t J1_485RxBufferIndex;
+extern uint8_t *J2_485RxBuffer;
+extern uint16_t J2_485RxBufferIndex;
+extern uint8_t *J3_485RxBuffer;
+extern uint16_t J3_485RxBufferIndex;
+extern uint8_t *J4_485RxBuffer;
+extern uint16_t J4_485RxBufferIndex;
+extern uint8_t *J5_485RxBuffer;
+extern uint16_t J5_485RxBufferIndex;
+extern uint8_t *J6_485RxBuffer;
+extern uint16_t J6_485RxBufferIndex;
+extern uint8_t *J7_485RxBuffer;
+extern uint16_t J7_485RxBufferIndex;
+extern uint8_t *J8_485RxBuffer;
+extern uint16_t J8_485RxBufferIndex;
+extern uint8_t *J9_485RxBuffer;
+extern uint16_t J9_485RxBufferIndex;
+extern uint8_t *su806RxBuffer;
+extern uint16_t su806RxBufferIndex;
+extern uint8_t *loraRxBuffer;
+extern uint16_t loraRxBufferIndex;
+extern uint32_t mcuUartRxTime;
+extern uint32_t su806UartRxTime;
+extern uartStateMachine state;
+extern uint16_t frameLength;
+
+uint8_t applyDataBuffer(void);
+
+uint16_t modebusCrc(uint8_t *arr_buff, uint8_t len);
+int baudConversionConfig(int baud);
+int configConversionBaud(int config);
+uint32_t getTickDiff(uint32_t lastTick);
+
+
+#endif
diff --git a/CH32V303-FreeRTOS/CH32V303-FreeRTOS.wvproj b/CH32V303-FreeRTOS/CH32V303-FreeRTOS.wvproj
index 77709f1..ffc03d8 100644
--- a/CH32V303-FreeRTOS/CH32V303-FreeRTOS.wvproj
+++ b/CH32V303-FreeRTOS/CH32V303-FreeRTOS.wvproj
@@ -18,6 +18,16 @@
"parentLogicPath": "",
"type": "file",
"name": "*.wvproj"
+ },
+ {
+ "parentLogicPath": "App/application/Host/Inc",
+ "type": "file",
+ "name": "slaveFreerotsTask.h"
+ },
+ {
+ "name": "slaveFreerotsTask.c",
+ "parentLogicPath": "App/application/Host/Src",
+ "type": "file"
}
],
"projectName": "CH32V303-FreeRTOS",
@@ -166,7 +176,8 @@
"${project}/App/tools",
"${project}/App/tools/RingQueue",
"${project}/App/functionalModule/Inc",
- "${project}/App/application/Inc"
+ "${project}/App/application/Host/Inc",
+ "${project}/App/application/Slave/Inc"
],
"include_system_paths": [],
"include_files": []
diff --git a/CH32V303-FreeRTOS/Ld/Link.ld b/CH32V303-FreeRTOS/Ld/Link.ld
index 9969e15..113069b 100644
--- a/CH32V303-FreeRTOS/Ld/Link.ld
+++ b/CH32V303-FreeRTOS/Ld/Link.ld
@@ -11,9 +11,12 @@ MEMORY
CH32V30x_D8 - CH32V303CB-CH32V303RB
*/
/**/
- FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 128K
- RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K
+/* FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 128K
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K
+*/
+ FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256K
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
/* CH32V30x_D8C - CH32V307VC-CH32V307WC-CH32V307RC-CH32V305CC
CH32V30x_D8 - CH32V303VC-CH32V303RC
diff --git a/CH32V303-FreeRTOS/README.md b/CH32V303-FreeRTOS/README.md
deleted file mode 100644
index cbaf038..0000000
--- a/CH32V303-FreeRTOS/README.md
+++ /dev/null
@@ -1,42 +0,0 @@
-### 娴嬭瘯
-
-涓插彛涓柇鍙戦侀氳繃娴嬭瘯
-
-spi_flash璇诲啓閫氳繃娴嬭瘯
-
-瀵规櫤鑳芥ā鍧楅氫俊涓插彛锛岄樆濉炲彂閫佹暟鎹氳繃娴嬭瘯銆
-
-
-
-
-
-
-
-### 闂
-
-##### 涓插彛涓柇
-
-25/02/24
-
-鍦╢reerots鐜涓嬶紝涓柇涓嶇敓鏁
-
-###### 瑙e喅
-
-> 25/02/25
->
-> 闇瑕佸惎鍔╢reerots浠诲姟
->
-> 鍚屾椂涓柇閮ㄥ垎
->
-> ```c
-> void UART5_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
-> ```
->
-> 鍙樹负
->
-> ```c
-> void UART5_IRQHandler(void) __attribute__((interrupt()));
-> ```
->
-> 鍏朵粬涓柇鍚屼笂锛岀敱纭欢鍘嬫爤鍙樹负杞欢鍘嬫爤
-
diff --git a/CH32V303-FreeRTOS/User/FreeRTOSConfig.h b/CH32V303-FreeRTOS/User/FreeRTOSConfig.h
index 94687ca..e5d5b3d 100644
--- a/CH32V303-FreeRTOS/User/FreeRTOSConfig.h
+++ b/CH32V303-FreeRTOS/User/FreeRTOSConfig.h
@@ -101,9 +101,10 @@
#define configTICK_RATE_HZ ( ( TickType_t ) 500 )
// #define configMAX_PRIORITIES ( 15 )
#define configMAX_PRIORITIES ( 10 )
-#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 256 ) /* Can be as low as 60 but some of the demo tasks that use this constant require it to be higher. */
+// #define configMINIMAL_STACK_SIZE ( ( unsigned short ) 256 ) /* Can be as low as 60 but some of the demo tasks that use this constant require it to be higher. */
+#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 64 )
// #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 12 * 1024 ) )
-#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 24 * 1024 ) )
+#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 45 * 1024 ) )
#define configMAX_TASK_NAME_LEN ( 16 )
#define configUSE_TRACE_FACILITY 0
#define configUSE_16_BIT_TICKS 0
@@ -126,7 +127,8 @@
#define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 )
#define configTIMER_QUEUE_LENGTH 4
-#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE )
+// #define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE )
+#define configTIMER_TASK_STACK_DEPTH 16
diff --git a/CH32V303-FreeRTOS/User/main.c b/CH32V303-FreeRTOS/User/main.c
index b84d525..48e9a99 100644
--- a/CH32V303-FreeRTOS/User/main.c
+++ b/CH32V303-FreeRTOS/User/main.c
@@ -19,7 +19,9 @@
#include "FreeRTOS.h"
#include "task.h"
-#include "freerotsTask.h"
+#include "FM_GPIO.h"
+#include "hostFreerotsTask.h"
+#include "slaveFreerotsTask.h"
@@ -40,8 +42,15 @@ int main(void)
printf("SystemClk:%d\r\n", SystemCoreClock);
printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
printf("FreeRTOS Kernel Version:%s\r\n", tskKERNEL_VERSION_NUMBER);
-
- startApp();
+
+ FM_MCU_Init();
+
+ if (getMCU()) {
+ slaveStartApp();
+ }
+ else {
+ hostStartApp();
+ }
while(1) {
printf("shouldn't run at here!!\n");
diff --git a/CH32V303-FreeRTOS/obj/App/tools/RingQueue/subdir.mk b/CH32V303-FreeRTOS/obj/App/tools/RingQueue/subdir.mk
index 6252892..02f65da 100644
--- a/CH32V303-FreeRTOS/obj/App/tools/RingQueue/subdir.mk
+++ b/CH32V303-FreeRTOS/obj/App/tools/RingQueue/subdir.mk
@@ -17,4 +17,4 @@ OBJS += \
# Each subdirectory must supply rules for building sources it contributes
App/tools/RingQueue/%.o: ../App/tools/RingQueue/%.c
- @ riscv-none-embed-gcc -march=rv32imacxw -mabi=ilp32 -msmall-data-limit=8 -msave-restore -fmax-errors=20 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common -Wunused -Wuninitialized -g -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/Debug" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/Core" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/User" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/Peripheral/inc" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/FreeRTOS" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/FreeRTOS/include" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/FreeRTOS/portable/Common" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/FreeRTOS/portable/GCC/RISC-V" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/FreeRTOS/portable/GCC/RISC-V/chip_specific_extensions/RV32I_PFIC_no_extensions" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/FreeRTOS/portable/MemMang" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/App/hardwareDriver/Inc" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/App/tools" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/App/tools/RingQueue" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/App/functionalModule/Inc" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/App/application/Inc" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
+ @ riscv-none-embed-gcc -march=rv32imacxw -mabi=ilp32 -msmall-data-limit=8 -msave-restore -fmax-errors=20 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -fno-common -Wunused -Wuninitialized -g -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/Debug" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/Core" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/User" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/Peripheral/inc" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/FreeRTOS" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/FreeRTOS/include" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/FreeRTOS/portable/Common" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/FreeRTOS/portable/GCC/RISC-V" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/FreeRTOS/portable/GCC/RISC-V/chip_specific_extensions/RV32I_PFIC_no_extensions" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/FreeRTOS/portable/MemMang" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/App/hardwareDriver/Inc" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/App/tools" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/App/tools/RingQueue" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/App/functionalModule/Inc" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/App/application/Host/Inc" -I"d:/psx/su806/2.software/mcu_git/CH32V303-FreeRTOS/App/application/Slave/Inc" -std=gnu99 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -c -o "$@" "$<"
diff --git a/CH32V303-FreeRTOS/obj/CH32V303-FreeRTOS.elf b/CH32V303-FreeRTOS/obj/CH32V303-FreeRTOS.elf
index 71b3f41..75a0e8a 100644
Binary files a/CH32V303-FreeRTOS/obj/CH32V303-FreeRTOS.elf and b/CH32V303-FreeRTOS/obj/CH32V303-FreeRTOS.elf differ
diff --git a/CH32V303-FreeRTOS/obj/CH32V303-FreeRTOS.hex b/CH32V303-FreeRTOS/obj/CH32V303-FreeRTOS.hex
index 7c47b75..d01f1bf 100644
--- a/CH32V303-FreeRTOS/obj/CH32V303-FreeRTOS.hex
+++ b/CH32V303-FreeRTOS/obj/CH32V303-FreeRTOS.hex
@@ -1,39 +1,39 @@
-:040000006F00F00B92
+:040000006F00F00C91
:100004000000000000000000EE050000F005000004
-:1000140000000000BC080000000000000000000018
-:10002400BC080000BC080000000000000000000044
-:100034002216000000000000000200000000000082
-:10004400BC080000BC080000BC080000BC0800009C
-:10005400BC080000BC080000BC080000BC0800008C
-:10006400BC080000BC080000BC080000BC0800007C
-:10007400BC080000BC080000BC080000BC0800006C
-:10008400BC080000BC080000BC080000BC0800005C
-:10009400BC080000BC080000BC080000BC0800004C
-:1000A400BC080000BC080000BC080000BC0800003C
-:1000B400BC080000BC080000BC080000BC0800002C
-:1000C400BC080000BC080000BC080000BC0800001C
-:1000D400BC080000BC080000BE4100000A42000049
-:1000E400BC080000BC080000BC080000BC080000FC
-:1000F400BC080000BC080000BC080000BC080000EC
-:1001040000000000BC080000BC080000BC0800009F
-:10011400BC08000056420000BC080000BC080000F7
-:10012400BC080000BC080000BC080000BC080000BB
-:10013400BC080000BC080000BC080000BC080000AB
-:10014400BC080000BC080000BC080000BC0800009B
-:10015400BC080000BC080000BC080000A24200006B
-:10016400EE4200003A430000BC080000BC08000056
-:10017400BC080000BC080000BC080000BC0800006B
-:10018400BC080000BC080000BC080000BC0800005B
-:10019400BC080000BC080000BC080000BC0800004B
+:1000140000000000CC080000000000000000000008
+:10002400CC080000CC080000000000000000000024
+:10003400D0150000000000000002000000000000D5
+:10004400CC080000CC080000CC080000CC0800005C
+:10005400CC080000CC080000CC080000CC0800004C
+:10006400CC080000CC080000CC080000CC0800003C
+:10007400CC080000CC080000CC080000CC0800002C
+:10008400CC080000CC080000CC080000CC0800001C
+:10009400CC080000CC080000CC080000CC0800000C
+:1000A400CC080000CC080000CC080000CC080000FC
+:1000B400CC080000CC080000CC080000CC080000EC
+:1000C400CC080000CC080000CC080000CC080000DC
+:1000D400CC080000CC080000D641000022420000F9
+:1000E400CC080000CC080000CC080000CC080000BC
+:1000F400CC080000CC080000CC080000CC080000AC
+:1001040000000000CC080000CC080000CC0800006F
+:1001140072420000C2420000CC080000CC0800007B
+:10012400CC080000CC080000CC080000CC0800007B
+:10013400CC080000CC080000CC080000CC0800006B
+:10014400CC080000CC080000CC080000CC0800005B
+:10015400CC080000CC080000CC08000012430000CA
+:1001640062430000B2430000CC080000CC08000049
+:10017400CC080000CC080000CC080000CC0800002B
+:10018400CC080000CC080000CC080000CC0800001B
+:10019400CC080000CC080000CC080000CC0800000B
:1001A400000000000000000000000000000000004B
:0C01B4000000000000000000000000003F
:10020000130181F806C216C41AC61EC822CA26CC1B
:100210002ACE2ED032D236D43AD63ED842DA46DC76
:100220004ADECEC0D2C2D6C4DAC6DEC8E2CAE6CC46
:10023000EACEEED0F2D2F6D4FAD6FED8F3220030CF
-:1002400096DA9702002083A2220023A02200F32541
+:1002400096DA9702002083A2221223A02200F3252F
:1002500010342EC09305000273A0458003A1818154
-:10026000EF20B00817030020032303FE032103003F
+:10026000EF20B00517030020032303100321030030
:10027000824273901234D652739002309240A2425E
:100280003243C2435244E244724582551256A2564A
:100290003257C2575258E25872598649164AA64AEE
@@ -44,7 +44,7 @@
:1002E00013000000130000001300000013000000C2
:1002F00013000000130000001300000013000000B2
:1003000083A28181938202E073900234170100205E
-:10031000032181F3024182403243C2435244E2440A
+:1003100003218105024182403243C2435244E244F8
:10032000724582551256A2563257C2575258E25859
:1003300072598649164AA64A364BC64B564CE64C6D
:10034000764D865D165EA65E365FC65FD652A1020A
@@ -90,2070 +90,2548 @@
:1005C000F50F93968500D58D93960501D58D61B76E
:1005D000939627009702000096968682E78086FA17
:1005E0009680C1171D8F3E96E374C3F8A5B701A08E
-:1005F000EF30E000AA853785000013054500EF6065
-:10060000C07EEF302000AA85378500001305050164
-:10061000EF60A07DEF20707FAA853785000013056D
-:100620000502EF60807C01A0EFF2FFEE0945EF00CC
-:10063000D00AB12AEF20D069716513050520EF209B
-:10064000F06FB707002083A507203785000013054A
-:10065000C502EF608079ED23AA8537850000130578
-:10066000C503EF608078B78500003785000093856B
-:10067000C50413054505EF604077EF5060243784CB
-:10068000000013054407EF6090071305803EEF203C
-:100690005067C5BFB71702409843B706FFF0411136
-:1006A0001367170098C3D84337060200758FD8C365
-:1006B0009843B706F7FEFD16758F98C39843B706A3
-:1006C000FCFFFD16758F98C3D843B70601FFFD16D2
-:1006D000758FD8C39843B70600ECFD16758F98C385
-:1006E0003707FF0098C723A6070202C402C6984333
-:1006F000C166558F98C3B716024005679C42F18FBB
-:100700003EC6A24785073EC4B24781E7A247E397AA
-:10071000E7FEB71702409C431397E70063570706AD
-:1007200085473EC632478547631FF704B717024027
-:10073000D843B706C1FFFD16D8C3D843D8C3D843A2
-:1007400013670740D8C3D843758FD8C3D843B706BB
-:100750001100558FD8C39843B7060001558F98C331
-:10076000984393166700E3DD06FED843B7160240B0
-:10077000719BD8C3D84313672700D8C32147DC42F5
-:10078000B18BE39EE7FE4101828002C661BFB716CE
-:100790000240D842B70700201146318B93870720CB
-:1007A0006305C70021466308C70237177A0013079D
-:1007B000072098C337170240584311839376F700F8
-:1007C0003707002013070700369714239843335741
-:1007D000D70098C38280D842D442416649833D8B7A
-:1007E000F18E1306270015CF3D47630FE602414700
-:1007F000630FE602454781456313E6004146A1E2E7
-:100800003747024003270780418B0DC737177A000F
-:10081000130707203306C70290C3C9DD9843058339
-:1008200049BF81454946E1BF85453546C9BF814538
-:100830003D46F1B737173D0013070790E1BF371565
-:10084000024058559316F700585563DF060411838C
-:100850003D8B9306170037177A001307072033578D
-:10086000D70298C35455A182BD8A8DE295463307BD
-:10087000D702058398C337170240585794433D8BDE
-:10088000050733D7E60298C3984369B705456394D3
-:10089000A600E546E9BF3D456396A600D1463387ED
-:1008A000E602C9BF8906E5BF3D8B930617003717DF
-:1008B0007A00130707203357D702F1B701A0970139
-:1008C000002093812114177100201301A173178553
-:1008D0000000130565C197F5FF1F9385A572138668
-:1008E000018263FAC5008322050023A0550011058B
-:1008F0009105E3EAC5FE170500201305A59297753B
-:1009000000209385A5C26377B5002320050011055B
-:10091000E36DB5FEFD42739002BCFD4273904280D0
-:10092000B7820000938202807390023097F2FFFF3B
-:100930009382826D93E2320073905230EFF09FD534
-:1009400097020000938282CE73901234730020309D
-:10095000EFF27FBCB727014093870740631BF50088
-:100960008545130500204D2F8145130500206D2777
-:10097000E9B6B737014093870780E31BF5FE85454D
-:1009800013050040512F814513050040CDB75C4150
-:100990003707F1E01307F7EF944D7D8F9C41D58F1A
-:1009A000D44DD58FD441A206D58FD98F5CC11C45BB
-:1009B00037F7F1FF1307D77FD4457D8F9C49D58F3B
-:1009C00094458606D58FD98F1CC55C55370710FF17
-:1009D0007D177D8FDC29FD1793F7F70FD207D98F8D
-:1009E0005CD582801C4589C593E717001CC58280B1
-:1009F000F99BEDBF1C4589C593E707101CC5828094
-:100A000093F7F7EFE5BF1C4593E787001CC582808D
-:100A100008450D81058982801C4593E747001CC568
-:100A2000828008450981058982801C4591C5370768
-:100A30005000D98F1CC582803707B0FF7D17F98F12
-:100A4000D5BFA54763F7B7048D47138765FF330705
-:100A5000F7020328C5009D47B397E70093C7F7FF48
-:100A6000B3F70701B396E600DD8E54C5994763E3FB
-:100A7000C70495477D163306F6025859FD47B397CC
-:100A8000C70093C7F7FFF98F3396C5005D8E50D925
-:100A900082800D473387E502032805019D47B39700
-:100AA000E70093C7F7FFB3F70701B396E600DD8EC3
-:100AB00014C96DBFB14763E2C70295476516330697
-:100AC000F6021859FD47B397C70093C7F7FFF98F90
-:100AD0003396C5005D8E10D9828095474D1633063A
-:100AE000F6025855FD47B397C70093C7F7FFF98F34
-:100AF000B395C500DD8D4CD582805C4191C537072B
-:100B00000004D98F5CC18280370700FC7D17F98F04
-:100B1000D5BFEFF25FA001112A8423040100A54490
-:100B20001C8463F8F40423040100A54621461C84B8
-:100B300063FCF606231501002304010095461C847E
-:100B400063FEF60C38853C8599460D46B3F7D7020F
-:100B5000056513050580B3D7C7023357D702BA9787
-:100B6000C207C1837C853C8505611D8D4205418599
-:100B7000E9B21C4493E787001CC42285513D75FDF2
-:100B80001C4493E747001CC42285613D75FD7844F1
-:100B90001C8414108607B6972396E7FE1C848507ED
-:100BA00093F7F70F5C84ADBFA30401009C846378C6
-:100BB000F6001C84850793F7F70F5C848DBF98843B
-:100BC0009C840C100607850786072E97AE9703575F
-:100BD000C7FE83D7C7FE63FDE7029C848607AE97F6
-:100BE00083D7C7FE7C859C84988485078607AE974B
-:100BF00083D5C7FE931717001810BA972396B7FE30
-:100C00009C8438850C1085078607AE972396E7FEEF
-:100C10009C84850793F7F70FDC8449BF1C84101070
-:100C2000388589078607B29783D7C7FEBA97C20768
-:100C3000C1837C851C84850793F7F70F5C8401B71B
-:100C4000B7F7FF1F03A5477082801C4141677917E2
-:100C5000F98F1CC123200500232205002324050051
-:100C6000B707024023260500138787006317E500B6
-:100C7000D8431367F700D8C382801387C701631670
-:100C8000E500D8431367070FFDB713870703631801
-:100C9000E500D8438566938606F0558FE9BF138734
-:100CA00047046315E500D843BD66C5BF13878705B4
-:100CB0006316E500D843B7060F00C5B71387C7060C
-:100CC0006316E500D843B706F000C1BF13870708D5
-:100CD0006316E500D843B706000FC1B713878740F6
-:100CE0006319E50003A747401367F70023A2E74015
-:100CF00082801387C7416317E50003A74740136746
-:100D0000070FEDB793870743631BF500B707024052
-:100D100003A747408566938606F0558FC1BFB70786
-:100D20000240138747446316E50003A74740BD66AA
-:100D3000EDB7138787456317E50003A74740B7065C
-:100D40000F00E1BF1387C7466317E50003A74740BD
-:100D5000B706F000D9B7138707486317E50003A764
-:100D60004740B706000F55BF138707496319E500D1
-:100D700003A7474D1367F70023AAE74C8280138728
-:100D8000074A6317E50003A7474D1367070FEDB741
-:100D90001387074B6319E50003A7474D85669386C4
-:100DA00006F0558FD1BF1387074CE319E5FC03A765
-:100DB000474DBD66FDB71C4161773D0794517D8F5E
-:100DC0009C45D58F9449D58FD449D58F944DD58FD7
-:100DD000D44DD58FD451D58F9455D58FD98F1CC173
-:100DE000DC455CC19C411CC5DC415CC582801C416A
-:100DF00089C593E717001CC1828041677917F98F75
-:100E0000DDBF9C4513F7070113F8F70001C7D84170
-:100E10003368E8008E2113F7F50F39C31841814676
-:100E2000854E3D4F930F800293028004214E3396EE
-:100E3000DE00B3F8C5006311160393982600331340
-:100E40001F011343F3FF3377E300B318180133E7AF
-:100E5000E800639FF70550C98506E39AC6FD18C1EF
-:100E60001307F00F6375B70454412146854E3D4F7B
-:100E7000930F800293028004414EB398CE0033F763
-:100E800015016392E8021317260001173313EF00D0
-:100E90001343F3FFB376D3003317E800D98E639D75
-:100EA000F701232A15010506E319C6FD54C1828006
-:100EB000E39457FA10C94DB7E39757FE232815015D
-:100EC000DDB748456D8D3335A00082800CC9828026
-:100ED00019C20CC982804CC98280B707002023A0A8
-:100EE000A7228280B707002003A707228947102185
-:100EF0006311F70214318D4763EDD7003C219A0648
-:100F000037E700E09607D58F93F7F70F3297230066
-:100F1000F74054410547935756003317C70089CA15
-:100F2000938707048A07B7E600E0B69798C38280E4
-:100F300093870706C5BFB7160240DC4251777D177D
-:100F4000F98F5D8DC8C28280371702405C4391469D
-:100F5000B18B6385D700A1466382D706B7177A00A5
-:100F6000938707201CC1371602405C4237070020D8
-:100F7000130707019183BD8BBA9794231C41B3D704
-:100F8000D7005CC15442A1829D8ABA969422B3D6FE
-:100F9000D70014C55442AD829D8A36971823B3D723
-:100FA000E7005CC558423983937637001387418048
-:100FB00036971823B3D7E7021CC982805C43584395
-:100FC000C166C983758FB7F6FF1F83A6C670BD8B38
-:100FD00089071396160163480600C54601466392C9
-:100FE000D702C94739A88946638FD702BD46638EA9
-:100FF000D702C146638ED702C54601466393D70028
-:10100000C1471DEF3747024003270780418B05C7C3
-:1010100037177A0013070720B307F7021CC121D640
-:101020001C41858381B701466DBF0546B547D1BFD9
-:101030000146BD47F9B737173D0013070790E9BFD1
-:10104000B7150240D8559316F700D85563DF06044C
-:1010500011833D8B9306170037177A00130707207B
-:101060003357D70218C1D455A182BD8A8DE2954667
-:101070003307D702058318C1371702405857144168
-:101080003D8B050733D7E60218C1184171B7854576
-:101090006394B600E546E9BFBD456396B600D14608
-:1010A0003387E602C9BF8906E5BF3D8B930617006B
-:1010B00037177A00130707203357D702F1B799C5BE
-:1010C000371702405C4B5D8D48CB8280B7170240DA
-:1010D000D84B1345F5FF798DC8CB828099C537175A
-:1010E00002401C4F5D8D08CF8280B7170240984F99
-:1010F0001345F5FF798D88CF828099C53717024057
-:101100005C4F5D8D48CF8280B7170240D84F1345A2
-:10111000F5FF798DC8CF828099C5371702405C47AB
-:101120005D8D48C78280B7170240D8471345F5FF49
-:10113000798DC8C782801A218D6793870704B621ED
-:101140007D8F9E21D58FD621D58FF621D58F9625DF
-:10115000D58FB625D58FD625D58FF625D58FD98FA6
-:101160001EA15A2DFD779387F77FF98F5EAD9E29DB
-:101170001EA982801E2189C593E707041EA18280D3
-:10118000C207C18393F7F7FBC207C183C5BF4EA552
-:1011900082804A2582800A256D8D3335A0008280A9
-:1011A000EFF26FB71629F577FD17F58FF621DA25DF
-:1011B0007971D58F1EA95625FD779387379FF58FB7
-:1011C000D6212A842EC6D58F9625D58FB625D58FC4
-:1011D0005EA55E29C207C18393F7F7CFD98F5EA9B9
-:1011E00068089D33B747014093870780B245631E67
-:1011F000F402A2576547B387E70298419306400679
-:101200000A07B3D7E70233D7D702B3F7D7021207DB
-:10121000920793872703B3D7D702BD8BD98FC20715
-:10122000C1831EA445616FF04FB19257E1B791C5DC
-:101230005E250967D98F5EA582805A25F977FD174B
-:10124000F98FD5BF13F7F50F85471583B395B70011
-:101250006319F7009307C500984301CED98D8CC35D
-:101260008280894693074501E318D7FE930705015D
-:10127000E5B793C5F5FFF98DDDB793F5F51F4EA1E1
-:1012800082804A211375F51F82800A216D8D3335C6
-:10129000A000828013F7F50F85461583B397B6003B
-:1012A0006311D7025A25F98F1A210145420741835C
-:1012B00081CB0545A181B315B5006D8F3335E000B5
-:1012C000828089466314D7001A29F1BF5A29E1BFE9
-:1012D000B70700209387C7239843636FA702D043C3
-:1012E000B386C7006316D50054413E85B296D4C379
-:1012F0005041B306C500631CD700B706002083A683
-:1013000046226306D70054431843B29654C118C10D
-:101310006303F50088C38280BA877DBFEFF20F9E1A
-:1013200041112AC6EF10C035B706002083A7462218
-:101330003706002093864622130686223245A1EF07
-:10134000370700209307873893F5F700130787388E
-:1013500081C51387F700419BB70500209385C523FE
-:1013600023A2050098C19965C115AE97C19B23A220
-:10137000070023A00700B385E7409CC21CC3B70742
-:10138000002023A8B722B707002023A6B722B7075B
-:1013900000804CC31CC2032A0600B377AA0085E371
-:1013A0009307F5FF3957636CF7009307050113F7AF
-:1013B000F70041C313F707FF410763EBE7068144DA
-:1013C00089A022872E8461A058C15CC01137584083
-:1013D000B7060020938606239042B307E94023A076
-:1013E000F90063F3C7009CC2B70700203367EA0027
-:1013F0009387472358C09843C1042320040005075E
-:1014000098C3EF10E04493F7F400D1CBA167938722
-:101410000780739007303786000037850000130679
-:10142000C608930500111305450BEF50101C01A0D1
-:10143000BA87370700200329C7229309C722E36030
-:10144000F9F8370700200324C7231307C7235040A8
-:101450006374F6000C40B5F59442E38286F61440BE
-:10146000044314C33307F64093060002E3F1E6F6A3
-:101470003305F4009376F500A1DAA167938707801E
-:101480007390073037860000378500001306C608C2
-:101490009305F00C1305450BEF50301501A0268580
-:1014A00041016FF0EF8855C1EFF2EF86B7070020DA
-:1014B000032745FF83A787222A84B376F7009DE29E
-:1014C000A1679387078073900730378600003785C0
-:1014D00000001306C608930540121305450BEF5094
-:1014E000D01001A0832605FF9DC2A16793870780C6
-:1014F0007390073037860000378500001306C60852
-:10150000930550121305450BEF50300E01A093C701
-:10151000F7FFF98F232AF5FEEF108016B70700209A
-:101520009387C7229443032744FF130504FF36978C
-:1015300098C3793BB7070020938787239843050713
-:1015400098C3EF10E0306FE05FFF8280B7070020A4
-:1015500003A5C7228280B7E700E041572387E74011
-:101560002386E740B7F700E023A0070023A2070087
-:10157000814694C70147D8C7370700208325072035
-:101580001307401F814633D6E5023D4790CBD4CBAD
-:1015900098C38280EFE23FF8411102C6F327503032
-:1015A0003EC6B2470D478D8B6384E702A1679387E0
-:1015B00007807390073037860000378500001306D8
-:1015C000860D9305600B1305450BEF50100201A02B
-:1015D000B787002093870700BD8B9DC3A1679387C2
-:1015E00007807390073037860000378500001306A8
-:1015F000860D9305B00B1305450BEF50007F01A03E
-:10160000993FB7E700E0056723A0E710116723A023
-:10161000E71023A40180EFE0BFCE014541016FE058
-:10162000DFF173110134A16793870780739007304E
-:10163000B7F700E023A20700EF10C00611C5B7E717
-:1016400000E0116723A0E720A16793878788739044
-:1016500007307311013473002030A167938707802E
-:1016600073900730938781809843050798C38280E1
-:10167000138781801C438DE7EFE2FFE9A167938721
-:101680000780739007303786000037850000130607
-:10169000860D930520101305450BEF50007501A032
-:1016A000FD171CC391E7A167938787887390073064
-:1016B00082802165130505807315053082807310C3
-:1016C00005308280930785007D575CC118C55CC5D5
-:1016D0001CC92320050082802328050082809841B0
-:1016E000FD5693078500631ED7001C49D843D8C117
-:1016F0000CC79CC5CCC31C4188C985071CC182800E
-:10170000B687D4439042E37DC7FECDB75441184518
-:101710001C4998C654C3D4436393A600D8C39843C6
-:10172000232805007D1798C388438280EFE2BFDE3F
-:1017300041112AC61D373245005D1D3F1335140087
-:1017400041016FE09FDFEFE21FDD32893041045D30
-:101750002A8409EE1C41014591E70844EF106078A6
-:1017600023240400850404DC6FE03FDD63100902DC
-:101770004841EF50605C5C4038400145BA971844DE
-:101780005CC0E3E1E7FE1C405CC0E9BF4845EF50A8
-:10179000A05A3C4058441440B307F0403E9758C408
-:1017A0006375D7001844BA975CC489470145E31BA9
-:1017B000F9FACDD8FD147DB7EFE25FD42045411191
-:1017C0002AC605E4A16793870780739007303786A0
-:1017D000000085653785000013060610938555BD0A
-:1017E0001305450BEF50606001A0185C5C5C6365FD
-:1017F000F702A16793870780739007303786000050
-:1018000085653785000013060610938565BD1305B1
-:10181000450BEF50805D01A0185C01496378F70229
-:101820008344540401466C002285313F939984011E
-:1018300093D98941FD572A89639EF9005C5099C765
-:1018400013054402EF10E03F11C105494A854101EB
-:101850006FE01FCE9307F0076395F902A1679387A6
-:101860000780739007303786000085653785000054
-:1018700013060610938565BF1305450BEF50E05620
-:1018800001A08504E204E184A3029404C1B73041BD
-:1018900015C2EFE25FC858451445AA87329758C56C
-:1018A0006364D700184158C52E85CC47EF50C04817
-:1018B0006FE0BFC88280EFE21FC62A84793B834471
-:1018C000540413094402E204E18463459002FD5785
-:1018D000A302F404713B513383444404130904010B
-:1018E000E204E18463499002FD572302F404493382
-:1018F0006FE0BFC43C4491CB22857D3D19C1EF1000
-:10190000E050FD14E204E184C9B75C50E9D34A8594
-:10191000EF102033E5B71C48E1DB4A85EF10603259
-:1019200019C1EF10A04EFD14E204E18465BFEFE29F
-:101930009FBE41111DE1A167938707807390073017
-:101940003786000037850000130606109305001146
-:101950001305450BEF50604901A05C5D2EC62A843B
-:10196000BDC33841B3B7E702B9EFC5393040585C61
-:101970001440232C0402B307E602B24554C0338757
-:10198000F600918FB6975CC4FD572302F40418C487
-:10199000A302F40495E11C4899CB13050401EF1050
-:1019A000402A11C5B7E700E0116723A0E720C9313D
-:1019B000054541016FE07FB813050401213313058C
-:1019C00044020933EDB7A16793870780739007300E
-:1019D0003786000037850000130606109305501463
-:1019E0001305450BEF50604001A0EFE2DFB241115B
-:1019F00039C1B3B7A502AA849DEF3305B502930799
-:101A000030FB63EAA7021305C5042EC6EFF01F9151
-:101A10002A8411CDB245AA8799C19307C5042CC069
-:101A20001CC044DC85452285193723240404228503
-:101A300041016FE09FB0A1679387078073900730E3
-:101A40003786000037850000130606109305601CDA
-:101A50001305450BEF50603901A0EFE25FA90111BA
-:101A600032C61DE1A16793870780739007303786E0
-:101A7000000037850000130606109305E0321305B9
-:101A8000450BEF50803601A02A842E89B6848DE55F
-:101A90003C419DC3A16793870780739007303786C9
-:101AA000000037850000130606109305F032130579
-:101AB000450BEF50803301A089476398F402585CCE
-:101AC00085476304F702A167938707807390073007
-:101AD0003786000037850000130606109305003393
-:101AE0001305450BEF50603001A0EF10E03215E513
-:101AF000B247014C85C7A167938707807390073071
-:101B00003786000037850000130606109305303332
-:101B10001305450BEF50602D01A0014C094BFD59F9
-:101B2000930B040137EA00E0916AA5A85C50C5C395
-:101B300013054402EF10E01059A8B24781E70D3EAB
-:101B4000014571A863150C002808EF10401E0D36E2
-:101B5000EF001033193683474404E207E1876394AA
-:101B600037012302040483475404E207E1876394A6
-:101B70003701A3020404ED3C6C002808EF10801C20
-:101B80003DE9E13C185C5C5C631EF704D534B2456A
-:101B90005E85EF00307F2285393BEF00704B29C90D
-:101BA000054C653C185C5C5C6364F700E39764F982
-:101BB0002686CA8522858329840371363C44BDD795
-:101BC00089476394F400639A09002285F53611C5AC
-:101BD000B7E700E0116723A0E720593C0545056100
-:101BE0006FE07F9471342285F931EF0070464DBF6C
-:101BF00023205A2175B722857D39EF00704589B7BA
-:101C0000EFE2DF8F41111DE1A16793870780739099
-:101C1000073037860000378500001306061093054D
-:101C200020401305450BEF50401C01A02A84328A46
-:101C300036898DE53C419DC3A167938707807390EA
-:101C4000073037860000378500001306061093051D
-:101C500030401305450BEF50401901A08947631828
-:101C6000F902585C85476304F702A16793870780F0
-:101C70007390073037860000378500001306061082
-:101C8000930540401305450BEF50201601A02EC6CA
-:101C9000EFF03FA2185C5C5CAA8AB2456366F7006D
-:101CA000894781446318F902834454044A86228593
-:101CB00093998401032B8403793493D98941FD5787
-:101CC0006391F9043C449DC78947631CF900630A8A
-:101CD0000B0085445685EFF09F9E268541016FE0FD
-:101CE0003F852285D13C75D5E3050AFE8547232033
-:101CF000FA00C5B75C50F1DF13054402EF007074C1
-:101D0000DDB79307F0076394F902A1679387078013
-:101D100073900730378600003785000013060610E1
-:101D20009305D0481305450BEF50200C01A0850406
-:101D3000E204E184A302940469BFEFE2CFFD1DE158
-:101D4000A167938707807390073037860000378537
-:101D50000000130606109305D04A1305450BEF50FB
-:101D6000C00801A03C412A849DC3A16793870780D6
-:101D70007390073037860000378500001306061081
-:101D80009305104B1305450BEF50200601A01C4195
-:101D9000AE848DE71C459DC3A16793870780739030
-:101DA00007303786000037850000130606109305BC
-:101DB000604B1305450BEF50400301A0EFF07F8F00
-:101DC000185C5C5C2A896370F70883475404050734
-:101DD00018DC93968701E1867D57639AE6023C44BE
-:101DE00085C32285EFF05F9D01E905444A85EFF048
-:101DF0001F8D22856FE06FF4EDD885479CC0F5B745
-:101E00005C50E5D713054402EF00B063F1BF130740
-:101E1000F0076394E602A167938707807390073009
-:101E200037860000378500001306061093055053CF
-:101E30001305450BEF40707B01A08507E207E187A2
-:101E4000A302F4045DB7014455B7EFE24FEA011174
-:101E500032C61DE1A16793870780739007303786EC
-:101E60000000378500001306061093051055130572
-:101E7000450BEF40907701A02A84AE898DE53C4167
-:101E80009DC3A16793870780739007303786000052
-:101E90003785000013060610930550551305450BB2
-:101EA000EF40B07401A0EF00307715E5B24701496B
-:101EB00085C7A16793870780739007303786000036
-:101EC00037850000130606109305A0551305450B32
-:101ED000EF40B07101A001497D5A930A440237EBEB
-:101EE00000E0916B95A8B24789E7EFF06FF80145E4
-:101EF00069A8631509002808EF007063EFF04FF739
-:101F0000EF000078EFF06FF583474404E207E187C4
-:101F1000639447012302040483475404E207E187E2
-:101F200063944701A3020404EFF08FF46C002808C7
-:101F3000EF00506125E52285EFF04FFF31C9B24532
-:101F40005685EF0030442285EFF0FF96EF005010E9
-:101F500019E123207B210549EFF02FF0045CC1D467
-:101F6000CE852285FD14EFF09F9204DC1C4899CBAE
-:101F700013050401EF00F04C11C5B7E700E011674D
-:101F800023A0E720EFF0CFEE054505616FE0AFD964
-:101F90002285EFF05F92EF00B00B75BF2285EFF066
-:101FA0009F91EF00F00A2285EFF04FF84DD581B7F1
-:101FB000EFE2CFD401112EC61DE1A1679387078000
-:101FC000739007303786000037850000130606102F
-:101FD0009305305E1305450BEF40306101A03C4195
-:101FE0002A849DC3A1679387078073900730378643
-:101FF000000037850000130606109305705E130578
-:10200000450BEF40905E01A0EF0010610DE5B24777
-:102010009DC3A167938707807390073037860000C0
-:1020200037850000130606109305C05E1305450BA7
-:10203000EF40B05B01A081440149FD59130A4402FD
-:10204000B7EA00E0116B6DA0B2479DE79DC0A167A4
-:10205000938707807390073037860000378500002C
-:1020600013060610930520631305450BEF40F05748
-:1020700001A0EFF0EFDF7DA0631509002808EF0055
-:10208000104BEFF0EFDEED2BEFF02FDD8347440434
-:10209000E207E18763943701230204048347540471
-:1020A000E207E18763943701A3020404EFF04FDCF9
-:1020B0006C002808EF00104941E12285EFF00FE79E
-:1020C00035C51C4089EBEFF04FD90844EF0090561E
-:1020D000AA84EFF0EFD9B2455285EF00B02A2285ED
-:1020E000EFF06FFDEF00C07619E123A06A210549EA
-:1020F000EFF0AFD61C5CA9DBFD171CDC1C4081E7B0
-:10210000EF00307908C41C4899CB13050401EF0097
-:10211000503311C5B7E700E0116723A0E720EFF0C7
-:102120002FD58544268505616FE08FC02285EFF0AD
-:102130008FF8EF00E07165BF2285EFF0CFF7EF0079
-:1021400020712285EFF08FDE5DD1E9DCEFF0EFD07A
-:102150005C50814589C71C58A9459C439D8D084406
-:102160008144EF00B064EFF0AFD06DBFEFE2AFBAE3
-:1021700041111DE1A167938707807390073037866F
-:10218000000037850000130606109305407F1305F5
-:10219000450BEF40904501A02A84EFF00FCC1C5C6A
-:1021A000485C1D8D2AC6EFF0AFCC324541016FE08F
-:1021B000CFB815E5EFE22FB6A1679387078073903C
-:1021C0000730378600008565378500001306061046
-:1021D000938585AC1305450BEF40304101A09DCDA3
-:1021E00037660020930686388147014713068638F4
-:1021F000214883A846006398A80093173700B29738
-:102200008CC3C8C321A891E783A806006393080084
-:10221000B6870507A106E31E07FDFDF38280EFE206
-:102220008FAF41112A842EC632C4EFF00FC383470B
-:1022300044047D572246E207E187B2456394E700F4
-:1022400023020404834754047D57E207E187639423
-:10225000E700A302040432C62EC4EFF06FC11C5C79
-:10226000A245324689E713054402EF003016228565
-:10227000EFF06FE441016FE04FACEFE2CFA9014610
-:102280009145EFF08FF66FE04FABEFE2CFA8411131
-:102290002AC62EC4EFF06FBC3245A24501443C452E
-:1022A00091E71C5D014499E32CC50544EFF04FBC58
-:1022B000228541016FE06FA8EFE2EFA541112E8664
-:1022C0006C0002C6EFF07FB8324541016FE0EFA627
-:1022D00037070020130787241C439443B7070020C7
-:1022E0009387872681E67D5798C382801843584795
-:1022F0001843DDBFEFE28FA037090020B7070020A9
-:102300009304492483A987272A849C40884041114B
-:10231000A388070411052EC6EFF04FBF7D57930722
-:102320004924B245631CE40295C9B767002093872E
-:10233000C74C9440D84398C610479440D0C69440A8
-:102340001047910654C29440910614C798405CCB44
-:102350009843050798C341016FE08F9D98434E94C1
-:1023600040C3637B3401370700200325C7248C4317
-:102370009105EFF0CFB6C5B73707002003258724B6
-:102380008C439105EFF0AFB5B70700209387872600
-:102390009843E372E4FC80C37DBFEFE22F9637647D
-:1023A0000020B70900201304044E370A002093844C
-:1023B00049259C40EDDFEFF04FAA5C4403A9C7001C
-:1023C00013054900EFF08FB413070A251C43FD17CE
-:1023D0001CC39C40FD179CC0EFF08FA90325090387
-:1023E000EFF06F8C4A85EFF00F8CD1B7EFE22F90B2
-:1023F00013192600AA8A4A852E8A368BBA8BBE8983
-:10240000EFE0DFF11DC1AA8413054005EFE01FF1E5
-:102410002A8409C904D98147C146631A0A00230ADC
-:10242000050225A02685EFF00F887D5565A23307AC
-:10243000FA00030707003306F400230AE60201C787
-:102440008507E396D7FEA3010404A54763F4770349
-:10245000A167938707807390073037860000378520
-:10246000000013064611930570391305450BEF4024
-:10247000D01701A0130A4400528523267403232297
-:10248000740523240404EFF02FA513058401EFF055
-:10249000AFA429471305C9FF33077741269500C824
-:1024A00018CC40D023060404A30604042307040424
-:1024B000A307040423080404A30804045A86D68549
-:1024C0004199EFD0FFF308C06384090023A089007D
-:1024D000EFF0AF98B7070020938707259843B7041C
-:1024E0000020B7690020050798C3138744241843C8
-:1024F000938444241389893C6310070E80C0984359
-:1025000085476316F7069389893C930A890C4E85A3
-:10251000D109EFF02F9BE39C3AFF37650020930A27
-:10252000054913050549EFF0EF9937650020930938
-:10253000454A1305454AEFF0EF983765002013052B
-:10254000854BEFF02F98376500201305054EEFF00F
-:102550006F97376500201305C54CEFF0AF96B707AE
-:10256000002023A45725B707002023A63725B70747
-:1025700000209387C7259843050798C33707002095
-:10258000130707265C54144363F3F6001CC351473A
-:10259000B387E702CA97D843144718C454C41447F2
-:1025A00023A246012324470198435CC8050798C32A
-:1025B000EFF00F8CB707002083A74727054599CB7D
-:1025C0009C40D8575C546377F700B7E700E0116789
-:1025D00023A0E7206FD03FF5B707002083A7472748
-:1025E000D9F79C40D8575C54E3E3E7F880C041B783
-:1025F000EFD27FF2B7070020B78500003725000033
-:10260000938747260147814613060010938585125C
-:102610001305A539E13B0544631E8502EF007056A2
-:10262000631A8502A1679387078073900730B70705
-:1026300000207D5723A4E726B707002023AAA7265A
-:10264000B707002023AC0726EFE0DFF483A7C180A3
-:102650006FD0BFEEFD57E31BF5FEA16793870780A0
-:1026600073900730378600008565378500001306B4
-:102670004611938505841305450BEF40007701A0B3
-:10268000B7070020938787259843050798C3828062
-:10269000B707002003A587278280B707002003A57E
-:1026A00087278280B707002083A7872563990718AB
-:1026B000EFD27FE6B7070020938787278043050482
-:1026C00080C321ECB70700209387872498431843E1
-:1026D00005C7A1679387078073900730378600008E
-:1026E00085653785000013064611938575AC130583
-:1026F000450BEF40806F01A0370700201307C72468
-:102700009443104390C3B707002014C39387C72690
-:102710009843050798C3EFF0BFBB37060020930727
-:1027200086269C4337670020B705002013068626BF
-:102730001307873C9385452401456375F4029C414A
-:10274000D146DC57B387D7023E971843854763F3DA
-:10275000E7000545B707002083A7C72791C30545B4
-:102760006FD0BFDD370E0020B70E0020514F93070A
-:102770008E249443944281E6FD571CC2C9B79C4302
-:10278000DC47DC47D4436374D40014C24DBF83A834
-:10279000870003A8C700D44B1383470023A4080174
-:1027A0002322180183A846006394680023A206012F
-:1027B00003A8060023AA07007D1823A0060194574A
-:1027C00095CA03A8C70183A8070283AF4600232444
-:1027D000180183A8070223A20801138887016394C4
-:1027E0000F0123A2160103A8060023A407027D18E7
-:1027F00023A0060193860E2603A8C70283A806001D
-:1028000063F4080123A00601B306E803BA9683A87F
-:10281000460083AF880023A4170123A6F70183AFE6
-:10282000880023A26F0023A46800D4CB9C428507B4
-:102830009CC29C41DC57E36CF8F205450DBFB7071D
-:1028400000209387072798430145050798C3828096
-:10285000EFD2DFCA37040020130484251C40411145
-:1028600085E7A1679387078073900730378600005C
-:10287000856537850000130646119385358B130552
-:10288000450BEF40805601A0EFE03FDD1C40FD17F7
-:102890001CC01C4089CB01452AC6EFE07FDD3245D4
-:1028A00041016FD0FFC8B707002083A70725E5D7F0
-:1028B000B76600203765002081479386864B370F27
-:1028C00000201305853CD14837030020370E002037
-:1028D000854E59A8DC46DC47CC4F9053985790C59D
-:1028E00003A807022322B800032847009385870125
-:1028F0006313B80050C3104323A407027D1610C30E
-:102900008C47D047D84B1388470090C54CC24C43E6
-:102910006393050150C3104323AA07007D1610C31B
-:1029200013070F26D0570C4363F3C50010C33307BA
-:1029300016032A974C4383AF85008CC723A6F70163
-:1029400083AF850023A20F0123A405010C43D8CB3C
-:1029500085050CC313074324184358576366E600E4
-:102960001307CE272320D70198422DF799C3EFF004
-:102970003F96B707002013870727044313840727D0
-:1029800091CC370900208549313B09C59307C927F8
-:1029900023A03701FD14EDF823200400B707002021
-:1029A00083A7C727E38907EEB7E700E0116723A0F5
-:1029B000E7200545D5B5EFD21FB641111DE1A1674E
-:1029C00093870780739007303786000037850000B3
-:1029D000130646119305104F1305450BEF40E040D9
-:1029E00001A09DE1A1679387078073900730378628
-:1029F000000037850000130646119305204F13058C
-:102A0000450BEF40803E01A0B707002083A7872534
-:102A10009DC3A167938707807390073037860000B6
-:102A200037850000130646119305304F1305450BFB
-:102A3000EF40A03B01A02A842EC6EFF07FC41840CF
-:102A4000B245B707002003A58727B307B7001CC00E
-:102A50006370E50263E0E7020144DD3B11E5B7E79F
-:102A600000E0116723A0E720228541016FD0FFAC71
-:102A700063E4E700E372F5FE81453385A740EFF09C
-:102A80007F870544D9BF19E5B7E700E0116723A0A8
-:102A9000E7208280EFD23FA8B707002083A78725D1
-:102AA00041119DC3A16793870780739007303786D4
-:102AB0000000378500001306461193059054130556
-:102AC000450BEF40803201A02AC6EFF07FBB3245B4
-:102AD0008145EFF03F82AD3B11E5B7E700E01167BC
-:102AE00023A0E72041016FD05FA5B707002003A70F
-:102AF0008725B70700209387C72701C7054798C3D5
-:102B0000828023A00700B7070020138707261843F9
-:102B100013860726B76700209387873C5148B30682
-:102B20000703B385D700884115C5C841A106BE96E5
-:102B30004841C8C16314D5005441D4C1D146B3063D
-:102B4000D702B697DC43D447B707002023A2D72487
-:102B500018C2828015E7EFD21F9CA1679387078078
-:102B600073900730378600008565378500001306AF
-:102B70004611938525C01305450BEF40002701A0A2
-:102B80007D1771BFEFD23F9905E5A1679387078055
-:102B9000739007303786000085653785000013067F
-:102BA00046119385C5C11305450BEF40002401A0D4
-:102BB000B70700202E8483A54724E105EFE03FB24C
-:102BC00085452285EFF00FF36FD03F97EFD2BF948A
-:102BD0002A8705E5A16793870780739007303786BA
-:102BE000000085653785000013064611938525C5CD
-:102BF0001305450BEF40601F01A0B7070020938726
-:102C0000472454432E858C4303A88600D4CD8C439F
-:102C100023A0050303A807008C46610823A2050131
-:102C200003A807009C43610823A4060198D71C430E
-:102C300085071CC311C27D55B285EFF0AFEB6FD095
-:102C4000DF8F5C45DC4795E7EFD2FF8CA167938768
-:102C50000780739007303786000085653785000050
-:102C600013064611938525C81305450BEF40E01761
-:102C700001A0D04F945398579385870114C6D0C2B2
-:102C800050436313B60054C3144323A40702FD1634
-:102C900014C33707002003278725D45725EF8C4717
-:102CA000D047D84B90C5D04748434CC29385470086
-:102CB0006313B50050C3104323AA07007D1610C349
-:102CC000370700201307072610436373D60014C389
-:102CD00051473386E602376700201307873C329757
-:102CE0005043084690C7C8C708464CC10CC6D8CB4D
-:102CF0001C43014585071CC3B707002083A7472451
-:102D0000DC5763F8D700B7070020054723AEE72656
-:102D100005458280376700201307874B50430846DC
-:102D2000D0CF88D308464CC10CC698D7D1B7B707C7
-:102D3000002083A7C7261CC1B707002083A78727C9
-:102D40005CC18280EFD22FFD411105E5A167938719
-:102D5000078073900730378600008565378500004F
-:102D6000130646119385D5CF1305450BEF40E007B9
-:102D700001A085E5A16793870780739007303786A8
-:102D80000000856537850000130646119385E5CF61
-:102D90001305450BEF40600501A02EC62AC4EFE0E5
-:102DA000DF8B37070020B70700201307472483A6CF
-:102DB00087271C432245B24583C7170599CB1C437F
-:102DC000A38807040544EFE0BF8A228541016FD044
-:102DD000CFF69C417D570144E387E7FE370600208C
-:102DE0000326C6260328050058416307C80063E58B
-:102DF000E60023A00500F9B73386E640E37BF6FE44
-:102E0000958FBA979CC12537014475BFB70700203D
-:102E1000054723AEE7268280B707002083A7472710
-:102E2000054581CBB707002003A58725133515007D
-:102E3000060582804DC5EFD26FEC3709002093075D
-:102E400049249443585513094924D4566373D70829
-:102E50001C4D63C8070083270900D457A947958FE5
-:102E60001CCD51463307C702B76700209386873CC5
-:102E70009384873C369754496398E6049309450048
-:102E80002A844E85EFE09F888327090037070020BA
-:102E900013070726DC5714435CD463F3F6001CC306
-:102EA0005147B387E702A697D843144718C454C4C0
-:102EB000144723A236012324370198435CC8050731
-:102EC00098C305456FD0CFE683270900DC575CD552
-:102ED000CDBF9C436841DC573335F500E5B701456C
-:102EE000828011E50145828001456FD00FE5EFD268
-:102EF0008FE2B707002083A747242A846385A702AF
-:102F0000A167938707807390073037860000856537
-:102F100037850000130646119385F5041305450B0C
-:102F2000EF30B06C01A0BC4785E7A16793870780AD
-:102F300073900730378600008565378500001306DB
-:102F40004611938505051305450BEF30106A01A066
-:102F500054557841FD173CC5E388E6F8D1F7930452
-:102F600045002685EFE08FFA7C4029471D8F18CC5D
-:102F7000370700201307072614435CD463F3F600D9
-:102F80001CC351473387E702B76700209387873C0C
-:102F90000545BA97D843144718C454C41447C4C24B
-:102FA00004C798435CC8050798C381B775C1EFD2C1
-:102FB0008FD634452A8485E6A1679387078073906E
-:102FC00007303786000085653785000013064611F7
-:102FD0009385F5091305450BEF30306101A07C4165
-:102FE00063F3B700AE8758546302F70A0546639F40
-:102FF000C608B706002083A6462463958602A1670B
-:103000009387078073900730378600008565378582
-:103010000000130646119385A50B1305450BEF30F1
-:10302000D05C01A0144C5CD463C60600A946B387EB
-:10303000F6401CCC51463307C702B7670020938681
-:10304000873C9384873C369754486391E604130980
-:1030500044004A85EFE08FEB37070020130707266F
-:103060005C54144363F3F6001CC35147B387E70273
-:10307000A697D843144718C454C4144723A2260162
-:103080002324270198435CC8050798C36FD0EFCA73
-:103090008280B7070020138747241843938747246B
-:1030A00009C79443B8460507B8C688438280EFD263
-:1030B0008FC637040020EFE04FDA1304C4281C4009
-:1030C000B1E7376500201309454F1305454FEFE081
-:1030D0006FDF376500209304855013058550EFE0BE
-:1030E0006FDEB707002023A027290146B70700207D
-:1030F000C145114523A29728EFE03F8F08C019C5AD
-:10310000B785000093854515EFF0AF8AEFE04FD605
-:103110006FD0AFC2EFD22FC04CC108C9AA8763627B
-:10312000B602184D158E0545637BE6009385470072
-:10313000B707002003A54728EFE06FDA01456FD0FD
-:10314000CFBF6375D6000545E3FBD5FE93854700E9
-:10315000B707002003A50728C5B7EFD2CFBB2A8445
-:10316000AE8432890C4CA6864A86A69522855D37A8
-:1031700019E16FD08FBC1C4C2285BE941C508297E5
-:10318000D5B7EFD24FB9B707002083A70728411161
-:10319000AA84DC472EC6C04713054400EFE00FD7D2
-:1031A00083474402324613F7470011CBA685228598
-:1031B0006D371C502285829741016FD00FB8F99B63
-:1031C0002302F402FDB7EFD20FB5370400209306B7
-:1031D000042898421C4391EBB707002093874728A7
-:1031E000904398C390C26FD04FB55C47FD5588435C
-:1031F000493FF1BFEFD2AFAF21694111B70A0020BB
-:10320000B7090020370B0020B70B00201309091362
-:1032100083A70A28984329CBDC47814C03AC0700DD
-:10322000EFF00FC6EFF0CFC683A789282A849384D6
-:103230008928130ACB28636CF50288C0638F0C02BF
-:1032400083A74B2890431336160003250A00B305C5
-:103250008C40EFE0DFFCEFF0AFDF11EDB7E700E00F
-:10326000116723A0E72001A8854C014C55BFA13F61
-:1032700080C0EFF0EFDD214C05A00146E36785FD3E
-:10328000EFF00FDDA2856285ED3DF5B79247B245BF
-:103290008297824763DD070003250A0001468A857D
-:1032A000EFE0BFBA35D582472245E3C107FE22448D
-:1032B0005C4895E3EFF0CFBD9C40AA8C6373F500AA
-:1032C0001937824723A09401FD17E367FCFC8A07A6
-:1032D000CA979C43828713054400EFE02FC3D9BFF0
-:1032E000834744020C4C924693E717002302F402F2
-:1032F0006686B6952285393D45D18347440213F74A
-:10330000470019CB1C4C924566862285BE95B13587
-:103310001C502285829749B7F99B2302F402CDBF46
-:1033200083474402F99B2302F402BDB7834744025A
-:10333000924593E717002302F4020CCC9DE1A167AC
-:103340009387078073900730378600003785000029
-:103350001306C615930590351305450BEF30F0287D
-:1033600001A0E6866686E6952285EFF0BFDA2DB7E6
-:103370008347440213F7270055F72285EFE0AF9209
-:1033800021BFEFD24F99EFF09FD2B707002083A75C
-:10339000C7289DE3A167938707807390073037861E
-:1033A0000000378500001306C6159305901113051C
-:1033B000450BEF30902301A0B7070020B785000030
-:1033C00037350000938707292547814613060010EB
-:1033D000938545171305451FEFF04F8145DD6FD0ED
-:1033E000CF95EFD2AF91AA8A13058002AE843289BD
-:1033F000368ABA89EFD09FF22A8439C9230205029E
-:103400009DE0A1679387078073900730378600009F
-:10341000378500001306C6159305B0161305450B36
-:10342000EF30B01C01A0EFF09FC81305440023202B
-:10343000540104CC232E440123203403EFE0CFA910
-:10344000630809008347440293E747002302F4021C
-:1034500022856FD0EF8DEFD20F8C01111DE1A16796
-:103460009387078073900730378600003785000008
-:103470001306C6159305B0181305450BEF30F0166B
-:1034800001A0370400201304C4281C403AC62A882F
-:1034900001458DC7B6882EC832CA42CC954663C254
-:1034A000B602EFF07F973247894781463A86630339
-:1034B000F500014608400C08EFE02FDA05616FD0F7
-:1034C000CF87814646860C083E85EFE06FF3FDB757
-:1034D000B707002083A7072037177A0013070720B4
-:1034E000B3D7E7023707002093F7F70F230BF7282E
-:1034F0001307803EB387E70237070020231AF72817
-:103500008280B7F700E0D8438146799BD8C337075C
-:103510000020035747293306A70290CBD4CB98430A
-:103520001367070198C398431367170298C3D843DA
-:10353000058B75DF9843799B98C38280EFC2BFFDEE
-:103540002A841165011185451105EFD03FB9930714
-:1035500000207C82371501408D473EC44C00E14776
-:10356000130505803EC6EFD0DF8922C837440140ED
-:10357000B70708000C08130504803ECC02CA231EBE
-:103580000100EFD0FFC1854513050480EFD03FCA8D
-:1035900005616FC09FFAEFC27FF6B7440140AE8964
-:1035A0003289014493840480634524014A856FC0B5
-:1035B0003FF8930500042685EFD03FCD7DD9B38732
-:1035C00089008385070026850504C205C181EFD0E7
-:1035D000DFCAD9BF138701811C43B77600209386C9
-:1035E00086523E95636BD500B78600209386068091
-:1035F00063E5A60008C33E858280FD57EDBF7325B5
-:103600001034828073252034828073253034828088
-:10361000232605000CC150C12324050005458280E6
-:103620005C45544118458507B3E7D702638EE70030
-:1036300058451C41BA978CA35C4558418507B3E7B0
-:10364000E7025CC5054582807955828018455C4556
-:10365000630FF70018451C41BA979C239CA11C4599
-:1036600058418507B3E7E7021CC50545828001453F
-:103670008280EFC25FEA7971130600028145080873
-:10368000EFC07FEC8545114502C202C402C6EFD0EF
-:10369000FFA4854513050020EFD05FA41165EFD08E
-:1036A0009F89371401408547130504804C007C82B4
-:1036B00002C6EFD00FF5C147130504804C007C8291
-:1036C00002C6EFD00FF4930700024C0013050480EC
-:1036D0007C823724014002C6EFD0AFF213050440CC
-:1036E000EFD00FA785473ECA3ECCB7070E003ECEAF
-:1036F0000C088D47130504402302F10202C802D0D2
-:10370000EFD0EFA8854513050440EFD0AFAE854557
-:1037100013050440EFD00FAD814513050440EFD0F1
-:10372000CFBD13050440EFD00FAE930404402685AF
-:10373000EFD00FAE6DFD1305044037240140EFD0EC
-:10374000AFAD930404402685EFD0AFAD6DFD1305FA
-:103750000440EFD00FBCB7070020239CA728456189
-:103760006FC0BFDDEFC23FDB79711306C002814538
-:103770004800EFC05FDD85450545EFD05F94370415
-:10378000024013058400EFD04FCCB7270140938748
-:10379000C7443EC2B70700209387C7293EC48D4760
-:1037A0003EC8930700083ECC930700103ECE930717
-:1037B00000403ED0930700023ED24C008D671305B7
-:1037C00084003ED402C602CA02D6EFD0CFDE4561E5
-:1037D0006FC0BFD6EFC23FD43705024085452105F3
-:1037E00037240140EFD0AFE0130504409D46054665
-:1037F0008145EFD00FA5130504409D46094691452C
-:10380000EFD02FA49D460D46130504409545EFD0FB
-:103810004FA3130504408545EFD0CF9D8545130583
-:103820000440EFD08FA06FC05FD1EFC23FCD011138
-:1038300085453145EFD09F8A85452165EFD0FF8BC7
-:1038400037140140E1778D44C1498A85130504800E
-:103850007C804EC426C2EFD0CFDA13050480A16568
-:10386000EFD0CFE6A14761498A85130504C07C806B
-:103870004AC426C2EFD0EFD891478A85130504C009
-:10388000231031013EC4EFD0CFD7930700028A85C1
-:10389000130504C07C804AC426C2EFD08FD6B70778
-:1038A00004013EC6B70702003EC8B70700028507FD
-:1038B000374400403ECAA1473ECC6C009D471305EB
-:1038C00004C0FC86EFD03F878545130504C0EFD0C8
-:1038D0007F8A05616FC0DFC5EFC25FC2B744004099
-:1038E0002A891304900C938904C089454E85EFD032
-:1038F0009F8A05C9CA85138504C0B7440040EFD02C
-:103900001F891304900C138904C085454A85EFD0A4
-:103910009F8819CD138504C0EFD0BF871375F50FAD
-:1039200031A07D141374F40F69F001456FC05FC0BE
-:103930007D141374F40F71F8CDBFEFC2DFBD2A8977
-:10394000371501402E8413050580A165B284014618
-:10395000EFD00FD80D454937135504011375F50FF6
-:10396000A53F135584001375F50FBD371375F40F7C
-:10397000A537014493170401C18363EC9700371501
-:1039800001400546A16513050580EFD06FD46FC0D7
-:10399000DFBA1305F00FEFF03FF4B307890088A3F7
-:1039A0000504C9BFEFC23FB74111854513050004A7
-:1039B000EFD0CFF2A147372401407C8285473EC437
-:1039C0004C00C147130504803EC6EFD08FC30146AB
-:1039D00013050480A145EFD0AFCF91474C001305EC
-:1039E00004807C82EFD0EFC101461305048091452D
-:1039F000EFD00FCE930700084C00130504807C82A3
-:103A0000EFD02FC001461305048093050008EFD0C6
-:103A10002FCC930400104C00130504806482EFD077
-:103A20004FBE01461305048093050010EFD04FCA26
-:103A3000930700204C00130504807C82EFD06FBCFC
-:103A400001461305048093050020EFD06FC893074B
-:103A500000404C00130504807C82EFD08FBA0146F1
-:103A60001305048093050040EFD08FC685679387C8
-:103A700007804C00130504807C820569EFD06FB885
-:103A800001469305098013050480EFD06FC44C00F4
-:103A90001305048023122101EFD0AFB601461305B0
-:103AA00004808565EFD0CFC209694C0013050480FE
-:103AB00023122101EFD0EFB401461305048089657C
-:103AC000EFD00FC191674C00130504807C82EFD0CA
-:103AD0004FB30146130504809165EFD06FBFE177C6
-:103AE0004C00130504807C82EFD0AFB10146130572
-:103AF0000480A165EFD0CFBD4C00371501402312E3
-:103B00002101EFD00FB00546896537150140EFD090
-:103B10002FBC85452145EFD06FDC371401404C00A8
-:103B2000130504C06482EFD0CFAD054693050010A5
-:103B3000130504C0EFD0CFB941016FC01FA0EFC281
-:103B40009F9DEFD0EFB86FC05F9FEFC2DF9CEFD0BB
-:103B50004FB76FC09F9EEFC21F9C372401401305D3
-:103B60000480014693050002EFD08FB61305048050
-:103B7000014693050004EFD0AFB53714014013059B
-:103B8000048001468945EFD0AFB4130504C0014657
-:103B90008545EFD0EFB301469305001013050440AF
-:103BA000EFD00FB36FC07F99EFC2FF9679712A896A
-:103BB000854513050004EFD06FD2372401409307E9
-:103BC00000028D44FC824C08C147130504803ECEA0
-:103BD00026CCEFD00FA30546130504809305000201
-:103BE000EFD00FAF85454145EFD04FCF8545130549
-:103BF0000004EFD08FD08547FC824C08E147371591
-:103C0000014026CC3ECEEFD0CF9F8947FC824C08A6
-:103C1000914737150140372400403ECEEFD06F9ECC
-:103C20000C10B7070C00130504804AD03ED402D212
-:103C300023160102EFD0CFD6930770357C8668003B
-:103C400085473EC84487EFD0EFA913050480054699
-:103C500093055052EFD00FDF0546130504809305FE
-:103C60004042EFD02FDE854513050480EFD02FDCD6
-:103C700045616FC09F8CEFC21F8A79712A89854583
-:103C800013050004EFD08FC53724014093070004CB
-:103C90008D44FC824C08C147130504803ECE26CCDF
-:103CA000EFD02F9605461305048093050004EFD04E
-:103CB0002FA285454145EFD06FC285451305000809
-:103CC000EFD0AFC39147FC824C08E1473715014064
-:103CD00026CC3ECEEFD0EF92A147FC824C08914714
-:103CE00037150140372400403ECEEFD08F910C10A5
-:103CF000B7070C00130504C04AD03ED402D22316E5
-:103D00000102EFD0EFC9930780357C8668008547B4
-:103D10003EC84487EFD00F9D130504C005469305A8
-:103D20005052EFD02FD20546130504C093054042F0
-:103D3000EFD04FD18545130504C0EFD04FCF45617B
-:103D40006FC0AFFFEFC22FFD79712A8985451145FC
-:103D5000EFD0CFB83714014089478D44FC824C081E
-:103D6000C147130504803ECE26CCEFD08F8905468F
-:103D7000130504808945EFD0AF9585451145EFD0F7
-:103D8000EFB5854537050200EFD02FB79147FC828C
-:103D90004C08E1471305048026CC3ECEEFD06F8659
-:103DA000A147FC824C089147130504803ECE37445E
-:103DB0000040EFD00F850C10B7070C00130504402E
-:103DC0004AD03ED402D223160102EFD06FBD930732
-:103DD00060337C86680085473EC84487EFD08F906B
-:103DE00013050440054693055052EFD0AFC5054674
-:103DF0001305044093054042EFD0CFC48545130519
-:103E00000440EFD0CFC245616FC02FF3EFC20FEF78
-:103E10007971AA8985452145EFD04FAC371901400A
-:103E200085470D44C1444C08130509C0FC8226CEC9
-:103E300022CCEFC01FFD0546130509C08545EFD014
-:103E40002F8985454145EFD06FA9854513050010A1
-:103E5000EFD0AFAAE1474C0837150140E48222CCED
-:103E60003ECEEFC01FFA93070002FC824C08914738
-:103E7000371501403ECEEFC0DFF80C10B7070C003D
-:103E8000372500404ED03ED402D223160102EFD097
-:103E90002FB1930790357C86680085473EC84087E0
-:103EA000EFD04F8405469305505237250040EFD0A0
-:103EB0006FB905469305404237250040EFD08FB8D3
-:103EC000854537250040EFD08FB645616FC04FE67E
-:103ED000EFC26FE437140140130504400146930517
-:103EE0000020EFC0FFFE130504400146930500408B
-:103EF000EFC01FFE856501469385058013050440CC
-:103F0000EFC01FFD6FC06FE3EFC24FDF79712A8AE8
-:103F1000854513050002EFD06F9C371401409307CD
-:103F20000010FC820D49C1474C08130504403ECEE9
-:103F30004ACCEFC01FED0546130504409305001061
-:103F4000EFC01FF9930700204C0813050440FC82C2
-:103F5000EFC03FEB930900404C0813050440231ABF
-:103F600031018564EFC0FFE94C08130504409384D8
-:103F70000480E482EFC0FFE8EFF09FF5854521451E
-:103F8000EFD0CF95854537050400EFD00F97E14777
-:103F90004C08130504C0231A31014ACC3ECEEFC0B1
-:103FA0005FE691474C08130504C0E4823754004093
-:103FB0003ECEEFC01FE50C10B7070C0013050480C0
-:103FC00052D03ED402D223160102EFD06F9D930748
-:103FD00070137C8685475C87680085473EC8EFC0C4
-:103FE0007FF013050480054693055052EFD08FA54E
-:103FF00005461305048093054042EFD0AFA48545E4
-:1040000013050480EFD0AFA245616FC06FD2EFC23D
-:104010008FD037140140130504400146930500205A
-:10402000EFC01FEB13050440014693050040EFC0AD
-:104030003FEA856505469385058013050440EFC07A
-:104040003FE96FC08FCFEFC20FCD3714014013058A
-:104050000440014693050020EFC09FE7130504408C
-:10406000054693050040EFC0BFE685650146938590
-:10407000058013050440EFC0BFE56FC00FCCEFC251
-:104080008FC93714014013050440014693050020F1
-:10409000EFC01FE413050440054693050040EFC040
-:1040A0003FE3856505469385058013050440EFC011
-:1040B0003FE26FC08FC8EFC20FC63714014013052F
-:1040C0000440054693050020EFC09FE0130504401F
-:1040D000014693050040EFC0BFDF8565014693852B
-:1040E000058013050440EFC0BFDE6FC00FC5EFC2EF
-:1040F0008FC2371401401305044005469305002084
-:10410000EFC01FDD13050440014693050040EFC0DA
-:104110003FDC856505469385058013050440EFC0A7
-:104120003FDB6FC08FC1EFC20FBF7971AA84854595
-:104130004145EFC0BFFA854513050002EFC01FFAE5
-:10414000854537051000EFC05FFB85670D44FC8295
-:104150004C08E1473715014022CC3ECEEFC07FCA64
-:10416000914737150140FC824C08914713050540E3
-:104170003ECEEFC01FC9B7070C000C1037550040EA
-:104180003ED426D002D223160102EFD06F8105461D
-:104190009305505237550040EFD0CF8A9307501403
-:1041A0007C86680085473EC84087EFC0BFD3854501
-:1041B00037550040EFD0AF8745616FC00FB83971F8
-:1041C00006DE16DC1ADA1ED82AD62ED432D236D023
-:1041D0003ACE3ECC42CA46C872C676C47AC27EC0C7
-:1041E000EF00A070F250E2525253C2533255A25522
-:1041F000125682567247E2475248C248324EA24E89
-:10420000124F824F216173002030397106DE16DCB7
-:104210001ADA1ED82AD62ED432D236D03ACE3ECC96
-:1042200042CA46C872C676C47AC27EC0EF00C07861
-:10423000F250E2525253C2533255A2551256825690
-:104240007247E2475248C248324EA24E124F824F46
-:10425000216173002030397106DE16DC1ADA1ED8AF
-:104260002AD62ED432D236D03ACE3ECC42CA46C816
-:1042700072C676C47AC27EC0EF00F000F250E252FD
-:104280005253C2533255A255125682567247E247D4
-:104290005248C248324EA24E124F824F21617300E3
-:1042A0002030397106DE16DC1ADA1ED82AD62ED452
-:1042B00032D236D03ACE3ECC42CA46C872C676C456
-:1042C0007AC27EC0EF003005F250E2525253C25320
-:1042D0003255A255125682567247E2475248C2489A
-:1042E000324EA24E124F824F21617300203039713D
-:1042F00006DE16DC1ADA1ED82AD62ED432D236D0F2
-:104300003ACE3ECC42CA46C872C676C47AC27EC095
-:10431000EF00300DF250E2525253C2533255A255C3
-:10432000125682567247E2475248C248324EA24E57
-:10433000124F824F216173002030397106DE16DC86
-:104340001ADA1ED82AD62ED432D236D03ACE3ECC65
-:1043500042CA46C872C676C47AC27EC0EF00101543
-:10436000F250E2525253C2533255A255125682565F
-:104370007247E2475248C248324EA24E124F824F15
-:10438000216173002030B7070020039787298147F8
-:104390002A97634F070009CD05669306F6FFB68797
-:1043A0006358C700AA876305D50093170701C18327
-:1043B0003E858280EFC22F96EFF0AFABEFF08FBA61
-:1043C000EFF04FC16FC06F97378700000327C71703
-:1043D000B707002023A6E72A37870000032707181E
-:1043E000B707002023A4E72A3787000003274718D0
-:1043F000B707002023A2E72A8280EFC2CF91B70738
-:1044000000200395E729EFF01FF8EF20A07FB70702
-:10441000002083A5472AEF2080506FC00F92EFC283
-:104420008F8FB70700200395072AEFF0DFF5EF2005
-:10443000607DB707002083A5872AEF20404E6FC01C
-:10444000CF8FEFC24F8DEFF0EFD56FC00F8FEFC260
-:104450008F8C85472E86930500086307F5028947F0
-:10446000930500106302F5028D4793050020630D4C
-:10447000F5009147930500406308F5009547631DDB
-:10448000F500856593850580372501401305058076
-:10449000EFF0EFEA6FC06F8A99478565E306F5FE96
-:1044A0009D478965E302F5FEA1479165E30EF5FCA2
-:1044B000A547A165E30AF5FCA947E31DF5FCA14565
-:1044C000E1B7EFC24F850547930500086308E50291
-:1044D0000947AA87930500106302E5020D4793057B
-:1044E0000020630DE5001147930500406308E500D7
-:1044F0001547631DE50085659385058037250140D7
-:1045000013050580EFF06FE46FC02F8319478565B1
-:10451000E306E5FE1D478965E302E5FE2147916557
-:10452000E30EE5FC2547A165E30AE5FC29471305F1
-:10453000F00FE39BE7FCA145D1B7EFB2DFFD3714E5
-:10454000014093050010130504C0EFF00FE013368F
-:10455000150093050010130504C0EFF04FDE6FB097
-:10456000DFFDEFB25FFBEFF04FAC6FB01FFDEFB2BE
-:104570009FFAEFF08FBC6FB05FFCEFB23FF83704EB
-:104580000020930704020149130404021947D4438D
-:104590006392A60893094002B3093903330A340130
-:1045A00083470A0095E7AA841385C9002295EFF096
-:1045B0002F86994703258A006390F402EFF0CFDE3F
-:1045C000930740023309F902854722992300F90035
-:1045D000330534016FB0DFF59D476395F400EFF0CC
-:1045E0008FE9F9BF89476395F400EFF0AFF5C9BFD4
-:1045F000A1476395F400EFF07F81D9B78D476395AC
-:10460000F400EFF07F906DBF9547E39BF4FAEFF075
-:104610009FB17DB7050993874702E31AE9F6014583
-:1046200055BF814709C91821814711C75C49084D09
-:10463000898FB337F0003E858280EFB2DFED411104
-:104640002A84A3070100EFF0DFFD19C59305F100EF
-:104650001305C400EFE09FFF888741016FB0FFEDB5
-:10466000EFB27FEBB7070020B765002023A4A702B5
-:10467000130600109385C5511945EFF01FF0B707D9
-:10468000002023A6A72C6FB05FEBEFB2DFE8B707DF
-:104690000020B765002023A6A70413060010938509
-:1046A000C5611D45EFF07FEDB707002023A8A72CBB
-:1046B0006FB0BFE8EFB23FE6B7070020B765002054
-:1046C00023A8A706130600109385C5710945EFF0CE
-:1046D000DFEAB707002023AAA72C6FB01FE6EFB2CE
-:1046E0009FE3B7070020B775002023AAA708130689
-:1046F00000109385C5812145EFF03FE8B707002002
-:1047000023ACA72C6FB07FE3EFB2FFE0B707002028
-:10471000B775002023ACA70A130600109385C59136
-:104720000D45EFF09FE5B707002023AEA72C6FB033
-:10473000DFE0EFB25FDEB7070020B775002023AEE1
-:10474000A70C130600409385C5A11545EFF0FFE2C5
-:10475000B707002023A0A72E6FB03FDEB7070020C9
-:1047600083A7C72C6399A700B707002083C7472EEC
-:10477000858B3E858280B707002083A7072D63982D
-:10478000A700B707002083C7472E898BDDB7B7077F
-:10479000002083A7472D6398A700B707002083C791
-:1047A000472E918BF9B7B707002083A7872D639811
-:1047B000A700B707002083C7472EA18B5DBFB707AF
-:1047C000002083A7C72D6399A700B707002083C7E0
-:1047D000472E93F7070271BFB707002003A7072EE4
-:1047E0009307F00FE317E5F8B707002083C7472EBC
-:1047F00093F70704BDBF8547631BF500B70700208B
-:104800009387472E98231367170098A382807DFD16
-:10481000B70700209387472E9823799BFDB78547DC
-:10482000631BF500B70700209387472E9823136773
-:10483000270098A382807DFDB70700209387472E2D
-:104840009823759BFDB78547631BF500B7070020CC
-:104850009387472E98231367470098A382807DFD96
-:10486000B70700209387472E98236D9BFDB7854798
-:10487000631BF500B70700209387472E9823136723
-:10488000870098A382807DFDB70700209387472E7D
-:1048900098235D9BFDB78547631BF500B707002094
-:1048A0009387472E98231367070298A382807DFD84
-:1048B000B70700209387472E98231377F7FDF5B7A6
-:1048C0008547631BF500B70700209387472E982381
-:1048D0001367070498A382807DFDB70700209387A4
-:1048E000472E98231377F7FBF5B7EFB2DFC23745B2
-:1048F00000409305505213050540EFC0BF9931C5E4
-:10490000B70700209387972B982309E7054798A3BB
-:10491000EF0050173745004013050540EFC07F9664
-:104920009375F50FB7070020238EB72AB70700202D
-:1049300003A5472D1C4D104954498507B3E7C7020D
-:104940006385D7003105EFE0BFCD374400409305C4
-:10495000707213050440EFC0FF931DCDB707002010
-:1049600083A7472D9633BA3363EDE60001469305DE
-:10497000707213050440EFC0FF8CEF10205A6FB027
-:10498000DFBBD84F1386160092B3B307D7008C2332
-:1049900013050440EFC07F8E37440040930540422A
-:1049A00013050440EFC01F8F79D903570440835784
-:1049B0004440EF005003E1B7EFB2FFB53755004078
-:1049C0009305505213050580EFC0DF8C31C5B70742
-:1049D00000209387172C982309E7054798A3EF0039
-:1049E000F00D3755004013050580EFC09F89937582
-:1049F000F50FB70700202382B72CB707002003A5C7
-:104A0000C72D1C4D104954498507B3E7C70263857C
-:104A1000D7003105EFE0DFC03754004093057072D6
-:104A200013050480EFC01F871DCDB707002083A7A3
-:104A3000C72D9633BA3363EDE600014693057072D5
-:104A400013050480EFC01F80EF10804F6FB0FFAEE2
-:104A5000D84F1386160092B3B307D7008C231305E3
-:104A60000480EFC09F8137540040930540421305F6
-:104A70000480EFC03F8279D9035704808357448074
-:104A8000EF00A07AE1B7EFB21FA993055052375556
-:104A90000040EFC03F8015C937550040EFC06FFEA2
-:104AA0009375F50FB70700202384B72CB7070020B4
-:104AB00003A5072E1C4D104954498507B3E7C702CB
-:104AC0006385D7003105EFE0BFB5930570723755A8
-:104AD0000040EFC02FFC15C1B707002083A7072EA9
-:104AE0009633BA3363EDE60001469305707237558D
-:104AF0000040EFC02FF5EF10C0456FB01FA4D84F96
-:104B00001386160092B3B307D7008C2337550040A5
-:104B1000EFC0AFF6DDB7EFB21FA037250040930519
-:104B2000505213050580EFC0EFF631C5B7070020DE
-:104B30009387072B982309E7054798A3EF00007197
-:104B40003725004013050580EFC0AFF39375F50FCF
-:104B5000B7070020238AB72AB707002003A5C72C70
-:104B60001C4D104954498507B3E7C7026385D70038
-:104B70003105EFE0FFAA372400409305707213055A
-:104B80000480EFC02FF11DCDB707002083A7C72CED
-:104B90009633BA3363EDE600014693057072130550
-:104BA0000480EFC02FEAEF1020356FB01F99D84F67
-:104BB0001386160092B3B307D7008C231305048025
-:104BC000EFC0AFEB3724004093054042130504804B
-:104BD000EFC04FEC79D90357048083574480D12329
-:104BE000E9B7EFB25F9337250040930550521305A4
-:104BF00005C0EFC02FEA29C5B70700209387572BC0
-:104C0000982301E7054798A385253725004013051C
-:104C100005C0EFC00FE79375F50FB7070020238C91
-:104C2000B72AB707002003A5072D1C4D104954498A
-:104C30008507B3E7C7026385D7003105EFE05F9EC4
-:104C40003724004093057072130504C0EFC08FE451
-:104C50001DCDB707002083A7072D9633BA3363ED28
-:104C6000E600014693057072130504C0EFC08FDDA6
-:104C7000EF10A0296FB07F8CD84F1386160092B327
-:104C8000B307D7008C23130504C0EFC00FDF372410
-:104C9000004093054042130504C0EFC0AFDF79D94F
-:104CA000035704C0835744C0312BE9B7EFB2BF8626
-:104CB0009305505237250040EFC0CFDD39C1B7070B
-:104CC00000209387D72B982301E7054798A3C92B8A
-:104CD00037250040EFC0EFDA9375F50FB7070020D6
-:104CE0002380B72CB707002003A5872D1C4D104942
-:104CF00054498507B3E7C7026385D7003105EFE064
-:104D00003F929305707237250040EFC0AFD81DCD9C
-:104D1000B707002083A7872D9633BA3363EDE600EB
-:104D200001469305707237250040EFC0AFD1EF10F8
-:104D300000206FB09F80D84F1386160092B3B30740
-:104D4000D7008C2337250040EFC02FD39305404276
-:104D500037250040EFC00FD469DDB72700409A2304
-:104D6000DE235D21F9B7EFB20FFB41112A842EC675
-:104D700032C4EFF0BF9E2A8955E1B2452246B707FB
-:104D8000002083A4C72C4CCC2310040232B06391C2
-:104D900084040545EFF03FA63725014005469305FD
-:104DA000000213050580EFC0AF92054693057072AF
-:104DB0003724004013050480EFC0CFC89A30DC4C84
-:104DC000130504809306170096B0BA978C23A9A008
-:104DD000B707002083A4072D639684040545EFF0F0
-:104DE0001FA43725014005469305000413050580DF
-:104DF000EFC00F8E3724004093057072130504C076
-:104E00000546EFC02FC49A30DC4C130504C093064E
-:104E1000170096B0BA978C23EFC02FC64A85410180
-:104E20006FB0AFF1B707002083A4472D63908404CF
-:104E30000545EFF05FA1371501400546894513058B
-:104E40000580EFC0EF88374400409305707213056A
-:104E500004400546EFC00FBF9A30DC4C13050440F8
-:104E60009306170096B0BA978C237DB7B70700203A
-:104E700083A4872D639E84020545EFF05F9F37155D
-:104E8000014005468545130505C0EFC06F849305B5
-:104E90007072372500400546EFC0CFBA9A30DC4C1F
-:104EA000372500409306170096B0BA978C23ADB70C
-:104EB000B707002083A4C72D639484020545EFF053
-:104EC0009F9D3715014005469305001013050540C9
-:104ED000EFC00F8005469305707237540040D9BD6E
-:104EE000B707002083A4072EE39A84F20545EFF06C
-:104EF0003F9D93057072375500400546EFC08FB453
-:104F00009A30DC4C375500409306170096B0BA979C
-:104F10008C2319B7B707002083A7C72C6399A70074
-:104F2000B707002083C7072B858B3E858280B70794
-:104F3000002083A7072D6397A700B707002083C72A
-:104F4000572BDDB7B707002083A7472D6397A7002E
-:104F5000B707002083C7972BC1BFB707002083A7DF
-:104F6000872D6397A700B707002083C7D72B6DBF96
-:104F7000B707002003A7C72D9307F00FE317A7FA81
-:104F8000B707002083C7172C45B7854763E8B706E6
-:104F9000B707002083A7C72C6397A700B707002097
-:104FA0002388B72A8280B707002083A7072D63973D
-:104FB000A700B7070020A38AB72A8280B70700207E
-:104FC00083A7472D6397A700B7070020A38CB72AB4
-:104FD0008280B707002083A7872D6397A700B707B4
-:104FE0000020A38EB72A8280B707002083A7C72D91
-:104FF0006396A700B7070020A380B72C8280EFB28A
-:105000008FD109E9B7070020A384072CEFE05FECFC
-:105010006FB0AFD295476319F500B7070020A3849E
-:10502000A72CEFE0DFFEEDB799476319F500B7074E
-:105030000020A384A72CEFF00F81D9BF9D476319EF
-:10504000F500B7070020A384A72CEFF04F83C9B762
-:10505000A1476319F500B7070020A384A72CEFF040
-:105060008F857DB7A547E315F5FAB7070020A38420
-:10507000A72CEFF0CF8769BFB707002003C5972C97
-:105080008280EFB24FC9B707002003A5C72D814525
-:10509000EFF0BFEF6FB06FCAEFB2EFC7B7070020F6
-:1050A00003A5872D8145EFF05FEE6FB00FC9EFB21A
-:1050B0008FC6B707002003A5472D8145EFF0FFEC11
-:1050C0006FB0AFC7EFB22FC5B707002003A5072DFC
-:1050D0008145EFF09FEB6FB04FC6EFB2CFC3B7077C
-:1050E000002003A5C72C8145EFF03FEA6FB0EFC465
-:1050F000EFB26FC237570000378500001307A70DC6
-:1051000085460146BD4513058518EFE08FADB7070D
-:10511000002023A4A72E375700003785000013076F
-:10512000470C89460146BD4513050519EFE06FABF5
-:10513000B707002023A6A72E3757000037850000A9
-:105140001307E70A8D460146BD4513058519EFE0B3
-:105150004FA9B707002023A8A72E3757000037858F
-:1051600000001307870991460146BD451305051A3E
-:10517000EFE02FA7B707002023AAA72E375700007C
-:10518000378500001307270895460146BD451305DE
-:10519000851AEFE00FA5B707002023ACA72E6FB04C
-:1051A000CFB9EFB24FB7B707002003A4872EEFD0D7
-:1051B000CFCE2A860147814699452285EFE0AFA9E7
-:1051C0006FB0AFB7EFB22FB5B707002003A4C72E5B
-:1051D000EFD0AFCC2A860147814699452285EFE082
-:1051E0008FA76FB08FB5EFB20FB3B707002003A43E
-:1051F000072FEFD08FCA2A8601478146994522851D
-:10520000EFE06FA56FB06FB3EFB2EFB0B70700205C
-:1052100003A4472FEFD06FC82A86014781469945DE
-:105220002285EFE04FA36FB04FB1EFB2CFAEB7071B
-:10523000002003A4872FEFD04FC62A86014781465E
-:1052400099452285EFE02FA16FB02FAFEFB2AFAC41
-:10525000B707002003A5872E014781460146A145D7
-:10526000EFE06F9F6FB06FADEFB2EFAAB70700200E
-:1052700003A5C72E014781460146A145EFE0AF9D3A
-:105280006FB0AFABEFB22FA9B707002003A5072F70
-:10529000014781460146A145EFE0EF9B6FB0EFA9C2
-:1052A000EFB26FA7B707002003A5472F014781463C
-:1052B0000146A145EFE02F9A6FB02FA8EFB2AFA53E
-:1052C000B707002003A5872F014781460146A14566
-:1052D000EFE06F986FB06FA6EFB2EFA32A84EFF004
-:1052E000EFC701E92285EFF0FFC23335A0006FB0B0
-:1052F000CFA40545EDBFEFB20FA2EFF02FC66FB000
-:10530000CFA3EFB2CF9E370400208357C42F4111A3
-:105310001304C42F89E7EFD0AFB723A4A190EFD037
-:105320002FB737790020AA8A094BB7090020854B8F
-:10533000130A30061309C9E15685EF100054636063
-:10534000AB0A03A5C92CEFF0CFAD631A750906208F
-:10535000637D9A060620EFC06F9F9387E4406363E6
-:10536000F5061385E400EFB07FFB06202AC6B7756B
-:105370000020938764001CC1930785005CC19307DC
-:1053800030051CA59307C0041CB585473CA593D7E1
-:1053900084003CB59307D50044A526863E859385B9
-:1053A000C5E1EF1070192695DD471CA103A5819674
-:1053B000EFC0DFDB29C503A58196814629466C0035
-:1053C000EFC0AFE92310040005A803A5C92C9387FB
-:1053D00014001EA0CA94EFF04FA688A0B1BF1A20F7
-:1053E00093073006E3E8E7F603A58190EF10E04865
-:1053F00093072003E3E0A7F641016FB0CF92324557
-:10540000EFC06F8AC1B7EFB28F8E37040020835789
-:10541000E42F41111304E42F89E7EFD06FA723A6EF
-:10542000A190EFD0EFA637790020AA8A094BB709DF
-:105430000020854B130A30061309C9E95685EF1081
-:10544000C0436360AB0A03A5092DEFF08F9D631A7B
-:1054500075090620637D9A060620EFC02F8F93877B
-:10546000E4406363F5061385E400EFB03FEB0620EC
-:105470002AC6B7750020938764001CC19307850076
-:105480005CC1930730051CA59307C0041CB5894770
-:105490003CA593D784003CB59307D50044A5268648
-:1054A0003E859385C5E9EF1030092695DD471CA19F
-:1054B00003A58196EFC09FCB29C503A581968146A0
-:1054C00029466C00EFC06FD92310040005A803A57E
-:1054D000092D938714001EA0CA94EFF00F9688A0A0
-:1054E000B1BF1A2093073006E3E8E7F603A5C190A1
-:1054F000EF10A03893072003E3E0A7F641016FB057
-:105500008F823245EFB03FFAC1B7EFA25FFE83D77B
-:10551000019041111384019089E7EFD06F9723A880
-:10552000A190EFD0EF9637790020AA8A094BB709EE
-:105530000020854B130A30061309C9F15685EF1078
-:10554000C0336360AB0A03A5492DEFF08F8D631A5A
-:1055500075090620637D9A060620EFB03FFF93870A
-:10556000E4406363F5061385E400EFB03FDB0620FB
-:105570002AC6B7750020938764001CC19307850075
-:105580005CC1930730051CA59307C0041CB58D476B
-:105590003CA593D784003CB59307D50044A5268647
-:1055A0003E859385C5F1EF1020792695DD471CA136
-:1055B00003A58196EFC09FBB29C503A581968146AF
-:1055C00029466C00EFC06FC92310040005A803A58D
-:1055D000492D938714001EA0CA94EFF00F8688A06F
-:1055E000B1BF1A2093073006E3E8E7F603A501915F
-:1055F000EF10A02893072003E3E0A7F641016FA076
-:105600009FF23245EFB03FEAC1B7EFA25FEE83D71A
-:10561000219041111384219089E7EFD06F8723AA4D
-:10562000A190EFD0EF8637790020AA8A094BB709FD
-:105630000020854B130A30061309C9F95685EF106F
-:10564000C0236360AB0A03A5892DEFE09FFD631AB9
-:1056500075090620637D9A060620EFB03FEF938719
-:10566000E4406363F5061385E400EFB03FCB06200A
-:105670002AC6B7750020938764001CC19307850074
-:105680005CC1930730051CA59307C0041CB5914766
-:105690003CA593D784003CB59307D50044A5268646
-:1056A0003E859385C5F9EF1020692695DD471CA13D
-:1056B00003A58196EFC09FAB29C503A581968146BE
-:1056C00029466C00EFC06FB92310040005A803A59C
-:1056D000892D938714001EA0CA94EFE01FF688A0BE
-:1056E000B1BF1A2093073006E3E8E7F603A541911E
-:1056F000EF10A01893072003E3E0A7F641016FA085
-:105700009FE23245EFB03FDAC1B7EFA25FDE83D749
-:10571000419041119384419089E7EFC07FF723AC1A
-:10572000A190EFC0FFF637790020AA8A094BB7098C
-:105730000020854B130A30061309C9015685EF1066
-:10574000C0136364AB0A03A5C92DEFE09FED631E90
-:105750007509822063718A088220EFB03FDF9307CA
-:10576000E4406367F5061305E400EFB03FBB9E20FD
-:105770002AC62A8499071CC1930785005CC1930738
-:1057800030051CA59307C0041CB5EFF0FF8E03D9AC
-:10579000040028A4B7750020935789003CB4230661
-:1057A000240135042285130619009385C501EF10E5
-:1057B000A0584A94DD471CA003A58196EFC01F9B0B
-:1057C00029C503A58196814629466C00EFC0EFA844
-:1057D0002390040005A803A5C92D930714009EA0DB
-:1057E0004A94EFE09FE508A091BF9A209307300606
-:1057F000E3E4E7F603A58191EF1020089307200367
-:10580000E3ECA7F441016FA01FD23245EFB0BFC94E
-:10581000C1B7EFA25FD04D23FDBFEFA2DFCFEFF006
-:105820005FAEEFF05FBEEFF05FCEEFF01FDEEFF0A8
-:10583000DFED1545EFD02FA5DDB7EFA2DFCD3704A3
-:1058400000200325042EEF1040045145EFD0AFA3F4
-:10585000CDBFEFA25FCCED24FDBFEFA23FCA411147
-:10586000EFC01FE32AC601440149E549B78A000099
-:105870000D4AEFE09FB87D2293041900EFE03FBA94
-:10588000C2045D2AC180631D3901EFB03FCCAA86F6
-:105890001306D006854513854A1BEF100055814439
-:1058A000630C4401050442044180930540066800EE
-:1058B000EFD06F90268975BFEFE03FC80144F5B780
-:1058C000EFA27FC5EFE0FFC9DD28EFE09FB7EFE073
-:1058D0007FAEEFE07FAF9D2AEFE0BFE5AD2AEFE0BE
-:1058E0003FD8BD2AEFE07FDA4922EFE0BFDC592242
-:1058F000EFE0FFDE6922EFE03FE179221121EFF0D6
-:105900002FFF1305803EEFD0DFBFEFE0CFA485452A
-:105910002945EFE0DFB3B7850000376500009387C6
-:10592000C19109478146130600209385051E130582
-:10593000A585EFC0BFABB785000037650000938732
-:1059400081921D478146130600109385C51E1305DD
-:105950002585EFC0BFA9B785000037650000938794
-:10596000C19215478146130600109385C51F130584
-:10597000A583EFC0BFA7B7850000376500009387F8
-:10598000019211478146130600409385C5201305F7
-:10599000A581EFC0BFA5B7850000376500009387DC
-:1059A000419215478146130600109385C5211305C2
-:1059B0002581EFC0BFA3EFC0BFC36FA01FB8EFA288
-:1059C0009FB50111694681454800EFE05FBAE145A6
-:1059D000A0864800EF006072B77700209387C70960
-:1059E0006311A402224798CB3247D8CB424798CFC5
-:1059F0005247D8CF624798D31247D8C705616FA0E6
-:105A0000DFB309671307075898CBD8CB98CFD8CF07
-:105A100071671307072098D3CDB7B777002003A588
-:105A2000C7098280B777002023AEA7088280B777A6
-:105A3000002003A5070A8280B777002023A0A70AC9
-:105A40008280B777002003A5470A8280B7770020BD
-:105A500003A5870A8280B777002003A5C70A828042
-:105A6000B777002003A5070B8280B777002003A536
-:105A7000470B8280B777002003A5870B8280B7771A
-:105A8000002003A5C70B8280EFA25FA701469145C6
-:105A90001545EFB09FF5138B41932320AB000146D2
-:105AA00091451545EFB07FF4938AC19323A0AA00D6
-:105AB000014691451545EFB05FF3138A41942320C9
-:105AC000AA00014691451545EFB03FF29389C19474
-:105AD00023A0A900014691452945EFB01FF1138984
-:105AE000419501462320A90091452945EFB0FFEFDC
-:105AF0009384819688C0194513840196EFC0EFF70F
-:105B0000AA8508C003250B00EFC02FF80C4003A5A1
-:105B10000A00EFC08FF70C4003250A00EFC0EFF634
-:105B20000C4003A50900EFC04FF60C400325090007
-:105B3000EFC0AFF50C408840EFC02FF56FA05F9F1E
-:105B4000EFA2DF9B03A50196FD55B7090020EFC02A
-:105B5000AFF623A6A19603A5092E1384C195EFF0F5
-:105B60008FF90DE903A58196B77400209384040C86
-:105B7000014693850401EFC04FAD85472A89631B19
-:105B8000F5009C4803A5092E9223CC43EFF0AF9D6E
-:105B900023002401370900200325C92CEFF0CFF39F
-:105BA0000DE903A54193B77500209389050C0146C3
-:105BB0009385050CEFC06FA98547AA84631BF50088
-:105BC00083A709000325C92C9223CC43EFF0AF999A
-:105BD00004A0B709002003A5092DEFF0EFEF0DE9B0
-:105BE00003A5C193B77400209384040C01469385E8
-:105BF0004400EFC08FA585472A89631BF500DC4070
-:105C000003A5092D9223CC43EFF0EF952300240147
-:105C1000B709002003A5492DEFF00FEC0DE903A50E
-:105C20004194B77400209384040C0146938584004A
-:105C3000EFC0AFA185472A89631BF5009C4403A5EB
-:105C4000492D9223CC43EFF00F9223002401B70992
-:105C5000002003A5892DEFF02FE815E903A5C194D5
-:105C6000B77400209384040C01469385C400EFC0F0
-:105C7000CF9D85472A89631CF500D8449C4403A521
-:105C8000892D1223CC43EFF00F8E23002401370916
-:105C900000200325C92DCA89EFF00FE415ED03A5F7
-:105CA0004195B77400209384040C01469385440108
-:105CB000EFC0AF9985476311F502DC488823EFF008
-:105CC0000FB4DC480325C92DD2238C47EFF0AF89F0
-:105CD000230004006FA0DF851C20FDFB0D45EFC0F5
-:105CE0009FDA03A5C92DEFF02FDFAA8637850000C4
-:105CF0001306100A85451305C522EF10000FC9BF12
-:105D0000EFA2CFFF194513840193EFC00FD708C04E
-:105D10000D4681450545EFB05FCD138B8193232060
-:105D2000AB000D4681450545EFB03FCC938A019409
-:105D300023A0AA000D4681450545EFB01FCB138A6D
-:105D400081942320AA000D4681450545EFB0FFC987
-:105D50009389019523A0A9000D4681450545EFB023
-:105D6000DFC8138981950D462320A900814505458B
-:105D7000EFB0BFC79384419688C00C4003250B0049
-:105D8000EFC0AFD00C4003A50A00EFC00FD00C400D
-:105D900003250A00EFC06FCF0C4003A50900EFC038
-:105DA000CFCE0C4003250900EFC02FCE0C40884019
-:105DB000EFC0AFCD6FA0CFF7EFA2EFF503A5019332
-:105DC000FD55EFC06FCF138481931C40639DA702E4
-:105DD000B777002003A5070CEFB0EFEC0545EFC047
-:105DE0009FCA37250140130505800146930500022F
-:105DF000EFB00F8E0145EFE01FA008408145EFC0D6
-:105E00002F9B6FA08FF3138401941C406398A7020B
-:105E1000B777002003A5470CEFB0EFE80545EFC0CA
-:105E20009FC63725014001469305000413050580F0
-:105E3000EFB00F8A0145EFE09F9EC1B713848194B4
-:105E40001C406397A702B777002003A5870CEFB02B
-:105E50008FE50545EFC03FC3371501400146894531
-:105E600013050580EFB0CF860145EFE0DF9D71B7E8
-:105E7000138401951C406397A702B777002003A500
-:105E8000C70CEFB04FE20545EFC0FFBF371501402B
-:105E900001468545130505C0EFB08F830145EFE04E
-:105EA0001F9DA1BF138481951C406398A702B777FB
-:105EB000002003A5470DEFB00FDF0545EFC0BFBCC5
-:105EC0003715014001469305001013050540EFB05A
-:105ED0002F800145EFE03F9C0DB7138441961C4095
-:105EE000E391A7F2B777002003A5070DEFB0AFDB72
-:105EF0000145EFE0FF9C11B7EFA2EFE103A581930D
-:105F00008145EFB09FE36FA04FE3EFA2CFE003A581
-:105F100001948145EFB07FE26FA02FE2EFA2AFDFE7
-:105F200003A581948145EFB05FE16FA00FE1EFA27F
-:105F30008FDE03A501958145EFB03FE06FA0EFDF55
-:105F4000EFA26FDD03A581958145EFB01FDF6FA044
-:105F5000CFDEEFA24FDC03A541968145EFB0FFDD18
-:105F60006FA0AFDDEFA22FDB2545EFE08FD56FA04F
-:105F7000CFDCEFA24FDA2145EFE0AFD46FA0EFDB2B
-:105F8000EFA26FD91D45EFE0CFD36FA00FDBEFA2DB
-:105F90008FD81945EFE0EFD26FA02FDAEFA2AFD77D
-:105FA0001545EFE00FD26FA04FD9EFA2CFD6114524
-:105FB000EFE02FD16FA06FD8EFA2EFD50D45EFE046
-:105FC0004FD06FA08FD7EFA20FD50945EFE06FCF6D
-:105FD0006FA0AFD6EFA22FD40545EFE08FCE6FA014
-:105FE000CFD5EFA24FD3EFF0DFA5B787000083A591
-:105FF0004725EF00D012EF00903B420541816FA092
-:10600000CFD3EFA24FD1EFF09FA2B787000083A5B7
-:106010004725EF00D010EF009039420541816FA075
-:10602000CFD1EFA24FCFEFF05F9FB787000083A5DE
-:106030004725EF00D00EEF009037420541816FA059
-:10604000CFCFEFA24FCD0C212545EFE04FC001454A
-:106050006FA0AFCEEFA22FCC0C212145EFE02FBFD8
-:1060600001456FA08FCDEFA20FCB0C211D45EFE0B6
-:106070000FBE01456FA06FCCEFA2EFC90C211945EF
-:10608000EFE0EFBC01456FA04FCBEFA2CFC80C21D2
-:106090001545EFE0CFBB01456FA02FCAEFA2AFC7F8
-:1060A0000C211145EFE0AFBA01456FA00FC9EFA277
-:1060B0008FC60C210D45EFE08FB901456FA0EFC7EA
-:1060C000EFA26FC50C210945EFE06FB801456FA045
-:1060D000CFC6EFA24FC40C212A840545EFE02FB7AD
-:1060E0001420378500001306F01285451305852519
-:1060F000EF00B04F01456FA04FC4C167697681467C
-:10610000FD1705061397060141836364B7003E85BA
-:1061100082803307D5001823B98F214713F8170061
-:10612000858363050800B18FC207C1837D174207CD
-:1061300041836DF78506F9B7EFA24FBC138921970C
-:1061400083D401970354090081499387F4FF634C7A
-:10615000F4029385D4FF377A0020930A8A0D93F5D1
-:10616000F50F13058A0DEFF05FF9D69483C7D4FFBE
-:1061700003C7E4FFA207D98F138781976318F5003F
-:1061800095471CC385494E856FA08FBA1306F4FF4F
-:106190004206418293851A0013058A0D23200700C9
-:1061A0002310C900EF005039F9BFEFA24FB4938418
-:1061B00081979C407971B1EF03D6219785469387EB
-:1061C000219763F9C602377500201307850D034830
-:1061D0000700930830059305850D631018031433E9
-:1061E0001307C004639AE654B1479CC0EFC04FCA7E
-:1061F00023AAA19645616FA00FB393087004631D95
-:10620000185303481700130770056317E85294C02A
-:10621000F1BF0547138481976397E7043777002020
-:106220000347A70DC1461376F70D6308D600130781
-:1062300007031377F70F63E5E70089471CC05DBFCD
-:10624000938721979223232004007D1642064182E2
-:1062500092A3377500209305850D85051305850DDF
-:10626000EF00902D41BF09476393E70A03D62197BA
-:10627000114793862197E37FC7F637750020930770
-:10628000850DB823130800039305850D631F0701CF
-:10629000B833DC232207D98F25476360F7462947A7
-:1062A0002398E1968D479CC0B1B74148631B070115
-:1062B000B833DC232207D98F25476360F7449D4715
-:1062C000DDB71308000D63180701B833DC2363E65C
-:1062D000E742A547C9BF1308100D63100743D82331
-:1062E00003C837002207336707019317870021830C
-:1062F000D98FC207C1831388F7FF1307E004636EC9
-:10630000073F2D4798C0A1072398F196E5B50D47A3
-:10631000639CE70403D7219799471389219763F872
-:10632000E702B77700209387870DD433FC23A206BA
-:10633000DD8ECD4763E4D7009147B5B737850000C0
-:1063400013065021854513054527EF00102A0356F3
-:1063500009009947E3F0C7EA7D16420641822320EF
-:1063600004002310C900F5B51147639FE704938922
-:10637000219703D40900A147E3FE87E603D90197DB
-:10638000377A0020930A8A0D9305D9FF93F5F50F0C
-:1063900013058A0DEFF07FD656998347D9FF03473F
-:1063A000E9FFA207D98F6394A7009547EDBD1306B7
-:1063B000F4FF4206418223A004002390C900938584
-:1063C0001A0013058A0D69BD15476397E70203D6C6
-:1063D000219703D70197377500209387219793055D
-:1063E000850D6319E6343387C5008346F7FF5947A7
-:1063F0006392E634994745BD99466390D720B774B8
-:1064000000209387840DB823930700039384840DA1
-:10641000631CF70C83C93400DC2003C95400A209B3
-:10642000B3E9F900FC202209130680023369F90060
-:10643000420913590941931B09018145280093DB47
-:106440000B01EFA04F90130A81004E8B370C0020F8
-:10645000B3073B41C207C18363E3770F910B939965
-:106460001B00EFB0AF8E93878940636FF5061385ED
-:106470008900EFA0BFEA930785005CC19307700411
-:106480002AC21CA593077005232035011CB5E1190C
-:10649000930700033CA5060993D789403CB5230622
-:1064A00025011307D500814763CF370B48419395EA
-:1064B0001B00F51593F5F50FBA99EFF01FC493572C
-:1064C00085002380F900D947A380A9002381F90022
-:1064D00003A58196EFB09FC945C903A58196814662
-:1064E00029464C00EFB06FD7B820C147631CF70CAA
-:1064F00003CA3400DC2083C95400220A336AFA003C
-:10650000FC20A2091306800281452800B3E9F900A6
-:1065100013098100EFA02F83CA86814789046399FC
-:10652000F906D28A370B0020B3874A41C207C183DC
-:1065300063EA3707232004002399019665B9930A7B
-:106540008C0F938C0A0683A70A006398670183A7C0
-:106550004A00014582972310AA00A10AE3959AFFF9
-:10656000090A050BF5B50C1893F6E70FAE9693F5EF
-:1065700017003306F70083D686FD91E1A1828507D7
-:1065800014A293F7F70F0DB71245EFA0DFF1A9BFE3
-:10659000D830F02085072207518FC2079AA2C18305
-:1065A0008906ADBF93048B15938B84049C4063953F
-:1065B0005701DC404A858297A104E39974FF0909D9
-:1065C000850A9DB79C341307000D639CE70037854F
-:1065D000000013063046854513058529EF00F000BD
-:1065E00091BF1307100DE397E7F4378500001306FA
-:1065F000D04685451305452DD5B71D47639BE7025A
-:1066000003D6219713872197E3F6C6BE377500207E
-:106610009306850DDC32F4229305850DA207D58FF4
-:10662000CD4663ECF604950786072398F196A147BB
-:1066300031B121476395E700EFF01FB065BE2547F4
-:106640006394E7041387219712239947E3F4C7BAA9
-:10665000377500209305850DD62593978600A18276
-:10666000D58FC207C1831388F7FF9306500E63E6E8
-:106670000601294718C0A90741B97D164206418283
-:106680002320040012A3D1BE29476395E700EFF051
-:10669000BFAA8DB62D476395E700EFF0FFA999BE1D
-:1066A0003147639BE700B777002003C7A70DA547D5
-:1066B000E3E8E7B8B54759B635476397E7049386EB
-:1066C000219792229147E3F7C7B2377500209305CF
-:1066D000850DD821BC3122075D8F93178700218358
-:1066E000D98FC207C1831388F7FF1307F03F636692
-:1066F0000701394718C0990701B97D164206418242
-:106700002320040092A291BE3947639CE70293873D
-:106710002197922303D70197E36EE6AC37750020EB
-:106720009305850D2E978346F7FF5D476394E6003A
-:10673000BD4729B6232004007D164206418292A35C
-:1067400029BE3D47E398E7AA377900209307890DD2
-:10675000D023A4331309890D2206458E9314860095
-:106760002182D18CC204C180EFA05FDE93870440F8
-:10677000E362F5DC834729000D47B7790020FD1758
-:1067800093F7F70F6361F70413858400EFA01FB937
-:106790002AC4AA8704C12105C8C326869385D90DBA
-:1067A000612B8347290005476399E70203A54193BD
-:1067B000EFB0DF9B5DCD03A54193814629462C00B8
-:1067C000EFB0AFA985BB1385C400EFA03FB52AC4C5
-:1067D000AA8744C1310588C7C9B70947639DE70047
-:1067E00003A5C193EFB09F9849C5814629462C0067
-:1067F00003A5C193F1B70D47639DE70003A541943D
-:10680000EFB0DF963DC5814629462C0003A5419493
-:1068100045BF1147639DE70003A5C194EFB01F95E5
-:1068200029C9814629462C0003A5C19451BF1547AB
-:10683000639FE70022471CA303A54195EFB01F9378
-:106840000DC9814629462C0003A5419595BF1947DE
-:10685000E382E7FE1D47E38FE7FC2147E38CE7FC7B
-:106860002547E389E7FCE39707CCA247238007008D
-:10687000E1B72245EFA03FC375B9EF92DFC92A8483
-:10688000EFB01FE1018D6F905FCBEF923FC7138494
-:106890004197AA84EFB0DFDF0329040023AEA1965D
-:1068A000EFB01FDF330525419307703E9389C197F1
-:1068B00063F9A700EFB0DFDD2399019608C023AC90
-:1068C000019637790020854A114A1309890D2685DA
-:1068D000EFD03FD5630A55012685EFD09FD4854779
-:1068E0006319F5026F90DFC4EFB09FDA83A7090048
-:1068F0001D8DE363AAFE93872197822326851307C4
-:1069000014009AA34A94EFD05FD308A0EFF0FF8958
-:106910007DBF83A78197F9D7EFF03F89E1B7797100
-:1069200022D4135475014ECE52CC9319950006D63D
-:1069300026D24AD056CA5AC81374F40F93D9990074
-:10694000135AF50169C49307F00F6308F40E939787
-:10695000390037070004B3E9E700130414F8814451
-:10696000014B13D77501939A95001377F70F93DABC
-:106970009A0013D9F50145CF9307F00F630CF70286
-:106980008E0A130717F8B7070004B3EAFA003A941F
-:10699000014633452A01BD47AA869305140063E0EA
-:1069A000971017270000130767968A04BA949C4033
-:1069B000BA9782871304F40F63960A0C93E42400B9
-:1069C0000946C1BF01451307F00FB7074000B25099
-:1069D0002254A6075E07A5837E05D98F92540259DB
-:1069E000F249624AD24A424B5D8D45618280CA8635
-:1069F000D689328B8947630FFB088D47E304FBFC84
-:106A0000854736856310FB1A01478147C9B7639DE7
-:106A1000090413D77501939A95001377F70F9144E2
-:106A20000144054B93DA9A0013D9F50131F7639DC0
-:106A30000A0093E414000546A9BF63920902A14429
-:106A40001304F00F094B31BF568541249307B5FF5E
-:106A5000098CB39AFA001304A4F801461DBFB1448F
-:106A60001304F00F0D4BF5BD4E852EC6B92C9307C0
-:106A7000B5FF1304A0F8B399F900098C8144014BC8
-:106A8000B245C5B593E434000D4621B78947D28697
-:106A9000E315FBF636851307F00F81470DBF416301
-:106AA0009306F3FF13D6090193D80A01B3F7D9006F
-:106AB000B3FADA0033885703B389F8021357080191
-:106AC000B30A5603D6994E973306160363735701DC
-:106AD0001A96C167FD17B376F7003378F800C2063F
-:106AE000C2969399660093570701B3393001E98242
-:106AF000B2979A07B3E6D900B3E9D7009397490054
-:106B000063D9070013D7190093F71900B369F70089
-:106B10002E841307F4076350E00493F7790099C7B4
-:106B200093F7F90091466383D70091099397490041
-:106B300063D90700B70700F8FD17B3F9F900130789
-:106B400004089307E00F63CBE70493976900A583DC
-:106B50001377F70FADBD8547B386E74011C76D4684
-:106B600001478147E345D6E61307E4093397E90077
-:106B70003337E000B3D7D900D98F13F7770019C79F
-:106B800013F7F70091466303D70091071397570057
-:106B9000634C07009A07A583014715BD1307F00F43
-:106BA000814735B52E84B5B7054781470DB51357D5
-:106BB0007501370680009307F6FF1377F70F9305EB
-:106BC000E007B3F6A7009357F501014563F4E5002C
-:106BD00099C3828082809307E0097D55E3EBE7FE4D
-:106BE00093055009B3E7C60063D7E5001307A7F67E
-:106BF0003395E7008280130560093307E54033D5FC
-:106C0000E7008280411106C622C426C20DCD9357EB
-:106C1000F54133C4A7001D8CAA8422857D209307EB
-:106C2000E0093387A74093076009FD8063CCE70242
-:106C3000A1469377F70F63D5A60061153314A4001E
-:106C40002604258021A08144814701442604135550
-:106C50009400B2402244DE07FE045D8D458D9244CF
-:106C6000410182809307900963DDE7009307B50136
-:106C70009546B317F400898E3354D400B337F0002F
-:106C80005D8C954763D6A7009307B5FF3314F400D6
-:106C9000B70600FCFD16937774003376D40085C3E5
-:106CA0009377F4009145638CB70011069317560053
-:106CB00063D707009307F009758E3387A740131435
-:106CC000660025809377F70F51B7C167637CF502A3
-:106CD0009307F00F1307000263EBA700971700005C
-:106CE0009387C766AA9788233305A74082802181AE
-:106CF0009717000093878765AA9788236147330514
-:106D0000A7408280B7070001636DF5006181971786
-:106D100000009387A763AA97882321473305A740DC
-:106D2000828041819717000093874762AA97882342
-:106D300041473305A7408280B3C7A5008D8B330739
-:106D4000C50081E78D4763EDC700AA87637EE5082C
-:106D5000942185078505A38FD7FEE3EBE7FE8280AC
-:106D600093763500AA8789CA942185078505A38F64
-:106D7000D7FE93F63700C5BF9376C7FF138606FE8E
-:106D800063F0C70683A3050083A2450083AF850097
-:106D900003AFC50083AE050103AE450103A3850122
-:106DA00083A8C5019385450223A0770003A8C5FFEA
-:106DB00023A2570023A4F70123A6E70123A8D701A4
-:106DC00023AAC70123AC670023AE170193874702AC
-:106DD00023AE07FF75B790419107910523AEC7FE1B
-:106DE000E3EBD7FEE3E6E7F6828039713EDA2ED296
-:106DF00032D436D63AD842DC46DE9387418122CC63
-:106E0000804326CA06CEAA8409C41C4C99E3228575
-:106E1000FD290C4454102686228536C6EF009013B7
-:106E2000F2406244D24421618280011126CA4AC8DC
-:106E300006CE22CC4EC652C4AA842E8901C51C4D52
-:106E400091E3F1219C4C804499E32685C921971751
-:106E500000009387A761631BF402C0405E24A18BEE
-:106E6000B1C71C48A1C7FD59294A1C4483450900E4
-:106E7000FD17B1E91CC463DD07062286A9452685F6
-:106E80006920FD576308F502294535A097170000D2
-:106E90009387C75F6314F4008044C9B79717000055
-:106EA0009387C75AE31CF4FAC0444DBFA2852685D8
-:106EB000192A55D97D55F2406244D2444249B2491B
-:106EC000224A056182801CC4050963D70700184C5B
-:106ED00063CAE700638845011C401387170018C088
-:106EE0008CA361B7228626850D20E31035F9D9B72A
-:106EF0001C401387170018C0294798A371B79387C0
-:106F00004181AA8588436FF05FF2011122CC26CA25
-:106F10004AC806CE4EC6AA842E89328401C51C4DAD
-:106F200091E3F52697170000938747546317F406FB
-:106F3000C0401C4C1CC45E24A18BC1C31C48B5CFEF
-:106F40001C4808409379F90F1379F90F1D8D5C489F
-:106F50006346F500A2852685692C25E51C440505B8
-:106F6000FD171CC41C401387170018C0238037016D
-:106F70005C486388A7005E24858B81CBA947631694
-:106F8000F900A2852685B5240DEDF24062444A85BC
-:106F9000D2444249B2490561828097170000938725
-:106FA000E74E6314F400804469B797170000938795
-:106FB000E749E310F4F8C044ADBFA285268521203F
-:106FC00041D17D59D9B741119387418126C284436C
-:106FD00022C44AC006C62A892E8489C49C4C99E3DF
-:106FE000268535269717000093874748631BF402D0
-:106FF000C0400317C40093170701C18393F68700AD
-:10700000ADEA93F6070195EEA5472320F900136733
-:1070100007045AA47D55B2402244924402494101DA
-:10702000828097170000938767466314F4008044BA
-:10703000C9B79717000093876741E31CF4FAC0446F
-:107040004DBF918B9DC34C5889C9930744046384F9
-:10705000F5004A85292B232A04025E2423220400FA
-:1070600093F7B7FD5EA41C481CC05E2493E787001D
-:107070005EA41C4899EB5E241307002093F70728B1
-:107080006385E700A2854A8591295E2413F71700DE
-:107090001DC35C4823240400B307F0401CCC1C48EB
-:1070A0000145B5FB8317C40013F707082DD793E7F5
-:1070B00007045EA485B7898B014791E3584818C43B
-:1070C000F9BFDE25011122CC26CA06CE4AC84EC61B
-:1070D00013F78700AA842E8479EBD841634DE00032
-:1070E000B841634AE0000145F2406244D24442495B
-:1070F000B2490561828058547DD703A90400939654
-:10710000370123A0040063DB060670485E24918BE0
-:1071100099C75C401D8E5C5899C33C401D8E5C54E1
-:107120000C50814626858297FD575A24631DF50031
-:107130009440F54763E8D706B70740208507B3D7E3
-:10714000D700858BA5C31C48232204001CC09317BD
-:10715000370163D80700FD576314F5009C4091E3A5
-:1071600068C84C5823A02401BDDD93074404638400
-:10717000F5002685ED2E232A0402B5B70C500146F2
-:10718000854626850297FD572A86E311F5F89C402F
-:10719000B5DF75476385E70059476393E70423A08C
-:1071A000240191B7136707045AA47D5535BF83A9FD
-:1071B0000501E38A09F203A905008D8B23A035019F
-:1071C00033093941014791E3D84918C4E35D20F1FF
-:1071D0001C540C50CA864E86268582976347A000B1
-:1071E0005E2493E707045EA4C9B7AA993309A940AE
-:1071F000F1BF9C49A5C3011122CC06CE2A8411C53A
-:107200001C4D81E72EC62122B245971700009387B7
-:10721000E725639CF5004C408397C5009DC72285F8
-:107220006244F24005616FF0DFE997170000938731
-:10723000E7256394F5000C44C5B7971700009387C2
-:10724000E720E39BF5FC4C44C1BFF240624401459A
-:107250000561828001458280411122C406C62A84CC
-:107260004EA572A523200500232205002324050036
-:107270002322050623280500232A0500232C0500C8
-:10728000214681451305C505EF90EFAB9717000028
-:10729000938707B35CD097170000938727B51CD45A
-:1072A00097170000938707B95CD49717000093875E
-:1072B00067BB00D01CD8B2402244410182809705B0
-:1072C0000000938545F391AA411126C2130680065A
-:1072D0009384F5FFB384C4024AC02E8922C406C633
-:1072E000938544070D2E2A8401CD232005002322F7
-:1072F0002501310508C4138684068145EF90AFA4AB
-:107300002285B240224492440249410182801C4DB0
-:10731000A5E7411106C622C497070000938767FAC4
-:107320001CD59387C1819C4323240504232605048F
-:10733000232805046314F50085471CCD2A843528CD
-:1073400048C022851D2808C42285052848C4484015
-:1073500001469145EFF05FF008440546A545EFF082
-:10736000BFEF48440946C945EFF01FEF85471CCCE5
-:10737000B240224441018280828041119387C181C1
-:1073800026C284434AC006C69C4C22C42A8981E78F
-:107390002685EFF0DFF7938484048044DC40FD17FA
-:1073A00063D607009C40B9CF8440C5BF0317C40013
-:1073B00039E7C1778507232204062320040023220E
-:1073C0000400232404005CC423280400232A0400AE
-:1073D000232C0400214681451305C405EF90AF9688
-:1073E000232A0402232C0402232404042326040455
-:1073F0002285B24022449244024941018280130412
-:10740000840671BF91454A85EFF01FEC88C049FDA5
-:10741000B1472320F9000144E1BF797122D44AD059
-:1074200052CC56CA5AC85EC606D626D24ECE2A8A34
-:10743000AE8A130485040149054BFD5B09ECB2508B
-:1074400022544A8592540259F249624AD24A424B26
-:10745000B24B45618280044483294400FD1963D402
-:1074600009000040E1BFDE24637BFB008397E4005A
-:1074700063877701A6855285829A3369A900938430
-:107480008406E9BF1971A6DAAE848395E500A2DC13
-:1074900086DE328463DB0500DE2423A0060093F73A
-:1074A000070885E7930700401DA0300836C6EF00A7
-:1074B000F021B246E34205FE7247BD67F98F797746
-:1074C000BA9793B717009CC2F1BF930700041CC082
-:1074D000F6506654D654014509618280DE250111BB
-:1074E00022CC06CE26CA4AC8898B2E8489CF930720
-:1074F00074041CC01CC885475CC8F2406244D24476
-:1075000042490561828074003000AA84EFF09FF741
-:10751000A2452A892685012219E98317C40013F799
-:10752000072061FFF19B93E727005EA4C9B7970787
-:107530000000938707D99CD45E2408C008C893E74D
-:1075400007085EA4A2475CC8B24781CF8315E40058
-:107550002685EF00D01A11C55E24F19B93E7170032
-:107560005EA45E243369F9002316240179B7DDC1D6
-:1075700083A7C5FF411122C406C626C21384C5FFD6
-:1075800063D307003E94AA84EF00301F93870198CD
-:107590009C4381EF2322040023A081982244B2401F
-:1075A0002685924441016F00701D637EF4001440F3
-:1075B0003307D4006396E7009843DC43369718C03E
-:1075C0005CC0D9BFBA87D84319C3E37DE4FE9443B6
-:1075D0003386D700631F86001040B29694C333866B
-:1075E000D700E31DC7FA10435843B29694C3D8C3DB
-:1075F00075B76375C400B1479CC04DB71040B30662
-:10760000C4006316D70014435843B29614C058C040
-:10761000C0C369B78280011126CA93843500F198EE
-:1076200006CE22CC4AC84EC6A104B14763F3F40487
-:10763000B14463E2B4042A89EF00301493870198BF
-:1076400098433A8439E0938741989C4391E7814578
-:107650004A85252F23A2A198A6854A853D27FD5955
-:1076600063193507B1472320F9004A85EF0010114F
-:1076700029A0E3D004FCB1471CC10145F24062449B
-:10768000D2444249B249056182801C40858F63CF54
-:107690000702AD4663F6F6001CC03E9404C031A05C
-:1076A0005C406313870223A0F1984A85EF00100D18
-:1076B0001305B4009307440061993307F5405DDF7B
-:1076C0003A94898F1CC05DBF5CC3C5B72287404018
-:1076D00095BF130435007198E30285FCB305A440FF
-:1076E0004A856525E31C35FBB5BF1C46FD171CC646
-:1076F00063DA0700184E63C5E700A9476394F500F5
-:107700006FF0BF801C422E851387170018C28CA310
-:107710008280011122CC26CA4AC84EC652C406CE67
-:107720002A89AE893284B304D6007D5A631494004A
-:10773000014509A80C204E864A85EFF01FFB050481
-:10774000E31645FFF2406244D2444249B249224A1C
-:1077500005618280357122CD26CB4AC94EC706CF3E
-:1077600052C556C35AC1DEDEE2DCE6DAAA89AE842F
-:107770003289368409C51C4D99E3EFF05FB997173C
-:1077800000009387A7CE6398F40C83A44900DE24FD
-:10779000A18BE5C79C48F5C393070002A304F1023F
-:1077A0009307000302D22305F10222C6930B500275
-:1077B000971A0000938A8ACF054C294B4A841C20D3
-:1077C00099C3639F770DB30C2441638E0C00E6864A
-:1077D0004A86A6854E85EFF0DFF3FD57630FF51C53
-:1077E0009256E69636D21C206389071CFD57130972
-:1077F000140002C802CE3ECA02CCA309010482D4FE
-:107800008345090015465685A92F13041900C24760
-:1078100051E913F7070109C713070002A309E1049F
-:1078200013F7870009C71307B002A309E1048346D1
-:1078300009001307A002638FE606F2474A848146D7
-:107840002546182093051400130707FD6377E60A01
-:10785000B5CA3ECE85A897170000938727C36395C6
-:10786000F40083A4890025B797170000938707BE0B
-:10787000E39FF4F083A4C90019BFA6854E85EFF0FD
-:107880008FF419D97D55FA406A44DA444A49BA4915
-:107890002A4A9A4A0A4BF65B665CD65C0D61828086
-:1078A000050431BF330555413315AC00C98F3EC8BF
-:1078B0002289B9B7324793064700184336C6634753
-:1078C00007023ACE18209307E002631DF704183030
-:1078D0009307A002631BF702B2470904138747000E
-:1078E0009C433AC663C107023ECA2DA83307E04055
-:1078F00093E727003ACE3EC8F1B7B38767038546C2
-:107900002E84BA973DBFFD57C5B7050402CA81460C
-:1079100081472546182093051400130707FD63745B
-:10792000E606F9F20C200D4617150000130585B880
-:107930000D2D11CD971700009387C7B71D8D9307A5
-:107940000004B397A700424505045D8D2AC80C20AA
-:10795000194617150000130525B613091400230452
-:10796000B102012535C19787FFFF9387A76995E786
-:107970004247B2471377071009CF91073EC6925787
-:10798000D2973ED225BDB387670385462E84BA972A
-:1079900051B79D07E19BA107D5B778009706000076
-:1079A000938666D726860C084E8597000000E70070
-:1079B0000000FD572A8AE314F5FCDE2493F7070440
-:1079C000E39207EC1255C1B5780097060000938644
-:1079D00086D426860C084E85012AE1BF797156CAE5
-:1079E0009C49BA8A984522D426D24ECE52CC06D68D
-:1079F0004AD05AC85EC6AA892E84B284368A63D316
-:107A0000E700BA879CC00347340419C385079CC0AC
-:107A10001C4093F7070281C79C4089079CC003293B
-:107A2000040013796900631A0900130B9401FD5BCC
-:107A30005C449840998F634CF9041C40834634049D
-:107A400093F70702B336D000A5EB13063404D285B2
-:107A50004E85829AFD576303F5041C4011469840F9
-:107A6000998B544481446397C700B384E64063D341
-:107A7000040081441C4418486354F700998FBE9455
-:107A8000014969047D5B63982405014509A8854681
-:107A90005A86D2854E85829A631E75017D55B250F5
-:107AA000225492540259F249624AD24A424BB24B92
-:107AB000456182800509ADBF3307D400130600037A
-:107AC000A301C7040347540493871600A2978906AD
-:107AD000A381E7049DBF85462286D2854E85829A82
-:107AE000E30E65FB050945B7797122D426D24AD049
-:107AF0004ECE06D652CC56CA5AC8B689942D930794
-:107B000090063289AA842E8413863504638DF6028A
-:107B100063E2D706930780056386F61863EDD70006
-:107B2000638E062093073004638EF60A930A2404BA
-:107B30002301D404C9A0930730066385F60A93078E
-:107B40004006E395F6FE1C40084393F607089305AC
-:107B50004500C5C61C410CC363D807001307D002FB
-:107B6000B307F040A301E4049716000093864695FE
-:107B7000294765A8930700076382F61663E5D702D5
-:107B80009307E0066389F6189307F006E390F6FA88
-:107B90000C401C4313F805081385470063070806CB
-:107BA00008C39C4385A893075007E383F6FE930719
-:107BB00080076389F61293073007E399F6F61C43B2
-:107BC000D04181459386470014C383AA0700568598
-:107BD000492E01C53305554148C05C401CC8A3016E
-:107BE000040461A81C43930A2404938647009C4321
-:107BF00014C32301F4048547D5B793F607041C4149
-:107C00000CC3B9DAC207C18781BF93F5050408C365
-:107C1000C9D99E231307F0066387E60E9716000066
-:107C20009386068A2947A30104044C400CC463C50B
-:107C3000050008406D9908C099E3B28A89CDB28ADF
-:107C4000B3F5E702FD1AB6958C212380BA00B3D5AF
-:107C5000E70263F0E70CA147631EF7001C40858B29
-:107C600091CB58401C4863C7E70093070003A38FDC
-:107C7000FAFEFD1A3306564110C84E87CA867000B8
-:107C8000A2852685EFF09FD57D5A631D450B7D5556
-:107C9000B250225492540259F249624AD24A424B9B
-:107CA00045618280A382D5049716000093864681A1
-:107CB0000C40084313F805081C411105630D080228
-:107CC00008C313F7150001C793E505020CC041472F
-:107CD000B9FB0C4093F5F5FD0CC0B1B79C4193E79F
-:107CE00007029CC193078007A302F40497060000D3
-:107CF0009386467E75BF13F8050408C3E30308FCAA
-:107D0000C207C1837DBF970600009386667B21472B
-:107D100019BFAE8735B794411C43CC4913F8060808
-:107D2000138547006306080008C39C438CC339A031
-:107D300008C393F606049C43F5DA8EA323280400B7
-:107D4000B28A25BF14485686CA8526858299E300E3
-:107D500045F51C40898B8DE7B2474844E35AF5F25C
-:107D60003E853DB785465686CA8526858299E300BD
-:107D700065F3050A5C443247998FE345FAFEE9BF93
-:107D8000014A930A94017D5BF5B7411122C42A840C
-:107D90002E8597F7FF1F23A9077806C6EFB09F83AC
-:107DA000FD576319F50097F7FF1F9387E7779C430B
-:107DB00091C31CC0B240224441018280411122C4BF
-:107DC0002E848395E50006C65D2A634905007C483C
-:107DD000AA977CC8B2402244410182805E247D770C
-:107DE0007D17F98F5EA4FDB7DE25011122CC26CACE
-:107DF0004AC84EC606CE93F70710AA842E8432894D
-:107E0000B68991C78395E500894601460D225E2417
-:107E10007D777D17F98F5EA48315E4006244F240FC
-:107E2000CE864A86B24942492685D244056125A8B4
-:107E3000411122C42E848395E50006C6CD28FD5746
-:107E40005A24631AF500FD77FD17F98F5EA4B2403E
-:107E50002244410182808567D98F5EA468C8C5BF6E
-:107E60008395E50025A8411122C42A842E85B28578
-:107E7000368697F7FF1F23A9076A06C6EFB0AFF152
-:107E8000FD576319F50097F7FF1F9387E7699C4338
-:107E900091C31CC0B240224441018280411122C4DE
-:107EA0002A842E8597F7FF1F23A0076806C6112294
-:107EB000FD576319F50097F7FF1F9387E7669C430B
-:107EC00091C31CC0B240224441018280411122C4AE
-:107ED0002A842E85B28597F7FF1F23A7076406C65D
-:107EE000CD20FD576319F50097F7FF1F9387C763F0
-:107EF0009C4391C31CC0B240224441018280411185
-:107F000022C42A842E8597F7FF1F23AF076006C679
-:107F1000C920FD576319F50097F7FF1F9387C760C6
-:107F20009C4391C31CC0B240224441018280411154
-:107F300022C42A842E85B285368697F7FF1F23A593
-:107F4000075E06C67928FD576319F50097F7FF1FEE
-:107F50009387875D9C4391C31CC0B240224441017A
-:107F6000828093F5F50F2A966314C500014582803F
-:107F70001C21E38EB7FE0505C5BF828082804111BA
-:107F800022C42A842E85B285368697F7FF1F23AD3B
-:107F9000075806C6B928FD576319F50097F7FF1F64
-:107FA000938787589C4391C31CC0B240224441012F
-:107FB00082809307800517F7FF1F2327F7567D550B
-:107FC00082809307800517F7FF1F232FF7547D55F5
-:107FD00082809307800517F7FF1F2327F754014579
-:107FE00082809307800517F7FF1F232FF7527D55D7
-:107FF00082809307800517F7FF1F2327F7527D55CF
-:10800000828000006D6570633A253038780A000080
-:108010006D63617573653A253038780A0000000099
-:108020006D7476616C3A253038780A005379737430
-:10803000656D436C6B3A25640D0A000043686970F6
-:1080400049443A253038780D0A0000005631302E68
-:10805000342E36004672656552544F53204B65727C
-:108060006E656C2056657273696F6E3A25730D0AE2
-:108070000000000073686F756C646E277420727561
-:108080006E20617420686572652121002E2E2F46B6
-:1080900072656552544F532F706F727461626C65D4
-:1080A0002F4D656D4D616E672F686561705F342E71
-:1080B00063000000657272206174206C696E652037
-:1080C0002564206F662066696C6520222573222E48
-:1080D000200D0A20000000002E2E2F4672656552EA
-:1080E000544F532F706F727461626C652F47434316
-:1080F0002F524953432D562F706F72742E63000018
-:108100002E2E2F4672656552544F532F717565752B
-:10811000652E63002E2E2F4672656552544F532FE5
-:108120007461736B732E630049444C45000000007A
-:10813000E0320000E0320000203300002C33000069
-:1081400070330000E0320000E03200002033000015
-:108150002C330000546D7251000000002E2E2F466B
-:1081600072656552544F532F74696D6572732E6337
-:1081700000000000546D7220537663006740533A4C
-:10818000473C113C6740D33A4A3154696D657200EF
-:108190004A3254696D6572004A3354696D657200E4
-:1081A0004A3454696D6572004A355F3054696D65B3
-:1081B000720000005B494E464F5D205B25733A25F7
-:1081C000645D2078506F72744765744672656548C7
-:1081D00065617053697A65203A2025640D0A0000B4
-:1081E000636F6D6D6F6E5461736B00007472616EBE
-:1081F000736D69745461736B0000000055705265B3
-:1082000063656976655461736B000000446F776E37
-:10821000526563656976655461736B004672656586
-:108220004D656D6F72795461736B00005B494E460A
-:108230004F5D205B25733A25645D2067657452733A
-:108240003438355374617465203A2025640A0D0A68
-:1082500000000000000020415B494E464F5D205B5E
-:1082600025733A25645D2073746174652025640A62
-:108270000D0A00005B4552524F525D205B25733A58
-:1082800025645D20726573416464724C656E203AAA
-:10829000202564200A0D0A005B494E464F5D205B95
-:1082A00025733A25645D20696E2047575F4D7367DB
-:1082B00050726F6346756E635F446973747269626E
-:1082C0007574696F6E5F50726F66696C650A0D0A2E
-:1082D000000000005B494E464F5D205B25733A2548
-:1082E000645D20696E2047575F4D736750726F63FE
-:1082F00046756E635F526561645F50726F66696C4C
-:10830000650A0D0A0000000096E7FFFFE8E6FFFFA0
-:10831000E8E6FFFFE6E6FFFFECE6FFFFECE6FFFF27
-:10832000BCE6FFFFE6E6FFFFECE6FFFFBCE6FFFF73
-:10833000ECE6FFFFE6E6FFFF84E7FFFF84E7FFFFD1
-:1083400084E7FFFFBCE6FFFF000102020303030313
-:1083500004040404040404040505050505050505D5
-:1083600005050505050505050606060606060606B5
-:10837000060606060606060606060606060606069D
-:108380000606060606060606070707070707070785
-:10839000070707070707070707070707070707076D
-:1083A000070707070707070707070707070707075D
-:1083B000070707070707070707070707070707074D
-:1083C0000707070707070707080808080808080835
-:1083D000080808080808080808080808080808081D
-:1083E000080808080808080808080808080808080D
-:1083F00008080808080808080808080808080808FD
-:1084000008080808080808080808080808080808EC
-:1084100008080808080808080808080808080808DC
-:1084200008080808080808080808080808080808CC
-:1084300008080808080808080808080808080808BC
-:1084400008080808080808080000000000000000EC
-:10845000000000000000000000000000000000001C
-:10846000000000000000000000000000000000000C
-:1084700000000000000000000000000000000000FC
-:1084800000000000000000000000000000000000EC
-:1084900000000000000000000000000000000000DC
-:1084A0000000000000000000232D302B2000000001
-:1084B000686C4C00656667454647000030313233D2
-:1084C00034353637383941424344454600000000D0
-:1084D000303132333435363738396162636465663A
-:0484E0000000000098
-:1084E4000000000000000000010203040607080960
-:1084F4000000000001020304010203040607080946
-:1085040000000000060000008025000000000000BC
-:108514000000000000000000000000000000000057
-:10852400000000000000000007000000802500009B
-:108534000000000000000000000000000000000037
-:108544000000000000000000000000000200000025
-:108554008025000000000000000000000000000072
-:108564000000000000000000000000000000000007
-:10857400080000008025000000000000000000004A
-:1085840000000000000000000000000000000000E7
-:10859400000000000300000080250000000000002F
-:1085A40000000000000000000000000000000000C7
-:1085B40000000000000000000500000000C20100EF
-:1085C40000000000000000000000000000000000A7
-:1085D4000000000000000000000000002260000015
-:1085E400010000000260000002000000E25F0000E1
-:1085F40003000000D45F000004000000C65F000018
-:1086040005000000B85F000006000000AA5F00003B
-:10861400070000009C5F0000080000008E5F00005F
-:1086240009000000805F00000A000000725F000083
-:108634000B000000645F000003000000D260000033
-:1086440004000000C060000005000000AE600000EF
-:10865400060000009C600000070000008A60000023
-:108664000800000078600000090000006660000057
-:108674000A000000546000000B000000426000008B
-:108684000000000068840000888400004884000022
-:1086940000000000000000000000000000000000D6
-:1086A40000000000000000000000000000000000C6
-:1086B40000000000000000000000000000000000B6
-:1086C40000000000000000000000000000000000A6
-:1086D4000000000000000000000000000000000096
-:1086E400006CDC0202040608AAAAAAAA0900000077
-:1086F40028750020A001002000800020A001002097
+:1005F000EF20D07DAA8537A50000130545C1EF8007
+:10060000C03FEF20107DAA8537A50000130505C265
+:10061000EF80A03EEF20507CAA8537A5000013058F
+:1006200005C3EF80803D01A0EFF2FFEE0945EF002A
+:10063000300CB522EF20B066716513050520EF2060
+:10064000D06CB707002083A5073237A5000013053B
+:10065000C5C3EF80803AED2BAA8537A500001305AE
+:10066000C5C4EF808039B7A5000037A50000938589
+:10067000C5C5130545C6EF804038EF305065EF30F3
+:10068000106611CDEF50006B37A40000130544C86D
+:10069000EF80E0471305803EEF209063C5BFEF6019
+:1006A0008072DDB7B71702409843B706FFF04111DB
+:1006B0001367170098C3D84337060200758FD8C355
+:1006C0009843B706F7FEFD16758F98C39843B70693
+:1006D000FCFFFD16758F98C3D843B70601FFFD16C2
+:1006E000758FD8C39843B70600ECFD16758F98C375
+:1006F0003707FF0098C723A6070202C402C6984323
+:10070000C166558F98C3B716024005679C42F18FAA
+:100710003EC6A24785073EC4B24781E7A247E3979A
+:10072000E7FEB71702409C431397E700635707069D
+:1007300085473EC632478547631FF704B717024017
+:10074000D843B706C1FFFD16D8C3D843D8C3D84392
+:1007500013670740D8C3D843758FD8C3D843B706AB
+:100760001100558FD8C39843B7060001558F98C321
+:10077000984393166700E3DD06FED843B7160240A0
+:10078000719BD8C3D84313672700D8C32147DC42E5
+:10079000B18BE39EE7FE4101828002C661BFB716BE
+:1007A0000240D842B70700201146318B93870732A9
+:1007B0006305C70021466308C70237177A0013078D
+:1007C000072098C337170240584311839376F700E8
+:1007D0003707002013070700369714239843335731
+:1007E000D70098C38280D842D442416649833D8B6A
+:1007F000F18E1306270015CF3D47630FE6024147F0
+:10080000630FE602454781456313E6004146A1E2D6
+:100810003747024003270780418B0DC737177A00FF
+:10082000130707203306C70290C3C9DD9843058329
+:1008300049BF81454946E1BF85453546C9BF814528
+:100840003D46F1B737173D0013070790E1BF371555
+:10085000024058559316F700585563DF060411837C
+:100860003D8B9306170037177A001307072033577D
+:10087000D70298C35455A182BD8A8DE295463307AD
+:10088000D702058398C337170240585794433D8BCE
+:10089000050733D7E60298C3984369B705456394C3
+:1008A000A600E546E9BF3D456396A600D1463387DD
+:1008B000E602C9BF8906E5BF3D8B930617003717CF
+:1008C0007A00130707203357D702F1B701A0970129
+:1008D00000209381212517F100201301A17217A593
+:1008E00000001305A58C97F5FF1F9385A57113864E
+:1008F000018263FAC5008322050023A0550011057B
+:100900009105E3EAC5FE170500201305A5A397B5D9
+:100910000020938525336377B5002320050011055A
+:10092000E36DB5FEFD42739002BCFD4273904280C0
+:10093000B7820000938202807390023097F2FFFF2B
+:100940009382826C93E2320073905230EFF09FD525
+:1009500097020000938282CD73901234730020308E
+:10096000EFF27FBBB727014093870740631BF50079
+:10097000854513050020652F814513050020452F6F
+:100980006DBEB737014093870780E31BF5FE8545B1
+:1009900013050040692F814513050040CDB75C4128
+:1009A0003707F1E01307F7EF944D7D8F9C41D58F0A
+:1009B000D44DD58FD441A206D58FD98F5CC11C45AB
+:1009C00037F7F1FF1307D77FD4457D8F9C49D58F2B
+:1009D00094458606D58FD98F1CC55C55370710FF07
+:1009E0007D177D8FDC29FD1793F7F70FD207D98F7D
+:1009F0005CD582801C4589C593E717001CC58280A1
+:100A0000F99BEDBF1C4589C593E707101CC5828083
+:100A100093F7F7EFE5BF1C4593E787001CC582807D
+:100A200008450D81058982801C4593E747001CC558
+:100A3000828008450981058982801C4591C5370758
+:100A40005000D98F1CC582803707B0FF7D17F98F02
+:100A5000D5BFA54763F7B7048D47138765FF3307F5
+:100A6000F7020328C5009D47B397E70093C7F7FF38
+:100A7000B3F70701B396E600DD8E54C5994763E3EB
+:100A8000C70495477D163306F6025859FD47B397BC
+:100A9000C70093C7F7FFF98F3396C5005D8E50D915
+:100AA00082800D473387E502032805019D47B397F0
+:100AB000E70093C7F7FFB3F70701B396E600DD8EB3
+:100AC00014C96DBFB14763E2C70295476516330687
+:100AD000F6021859FD47B397C70093C7F7FFF98F80
+:100AE0003396C5005D8E10D9828095474D1633062A
+:100AF000F6025855FD47B397C70093C7F7FFF98F24
+:100B0000B395C500DD8D4CD582805C4191C537071A
+:100B10000004D98F5CC18280370700FC7D17F98FF4
+:100B2000D5BFEFF25F9F01112A8423040100A54481
+:100B30001C8463F8F40423040100A54621461C84A8
+:100B400063FCF606231501002304010095461C846E
+:100B500063FEF60C38853C8599460D46B3F7D702FF
+:100B6000056513050580B3D7C7023357D702BA9777
+:100B7000C207C1837C853C8505611D8D4205418589
+:100B80006DBA1C4493E787001CC42285513D75FD56
+:100B90001C4493E747001CC42285613D75FD7844E1
+:100BA0001C8414108607B6972396E7FE1C848507DD
+:100BB00093F7F70F5C84ADBFA30401009C846378B6
+:100BC000F6001C84850793F7F70F5C848DBF98842B
+:100BD0009C840C100607850786072E97AE9703574F
+:100BE000C7FE83D7C7FE63FDE7029C848607AE97E6
+:100BF00083D7C7FE7C859C84988485078607AE973B
+:100C000083D5C7FE931717001810BA972396B7FE1F
+:100C10009C8438850C1085078607AE972396E7FEDF
+:100C20009C84850793F7F70FDC8449BF1C84101060
+:100C3000388589078607B29783D7C7FEBA97C20758
+:100C4000C1837C851C84850793F7F70F5C8401B70B
+:100C5000B7F7FF1F03A5477082801C4141677917D2
+:100C6000F98F1CC123200500232205002324050041
+:100C7000B707024023260500138787006317E500A6
+:100C8000D8431367F700D8C382801387C701631660
+:100C9000E500D8431367070FFDB7138707036318F1
+:100CA000E500D8438566938606F0558FE9BF138724
+:100CB00047046315E500D843BD66C5BF13878705A4
+:100CC0006316E500D843B7060F00C5B71387C706FC
+:100CD0006316E500D843B706F000C1BF13870708C5
+:100CE0006316E500D843B706000FC1B713878740E6
+:100CF0006319E50003A747401367F70023A2E74005
+:100D000082801387C7416317E50003A74740136735
+:100D1000070FEDB793870743631BF500B707024042
+:100D200003A747408566938606F0558FC1BFB70776
+:100D30000240138747446316E50003A74740BD669A
+:100D4000EDB7138787456317E50003A74740B7064C
+:100D50000F00E1BF1387C7466317E50003A74740AD
+:100D6000B706F000D9B7138707486317E50003A754
+:100D70004740B706000F55BF138707496319E500C1
+:100D800003A7474D1367F70023AAE74C8280138718
+:100D9000074A6317E50003A7474D1367070FEDB731
+:100DA0001387074B6319E50003A7474D85669386B4
+:100DB00006F0558FD1BF1387074CE319E5FC03A755
+:100DC000474DBD66FDB71C4161773D0794517D8F4E
+:100DD0009C45D58F9449D58FD449D58F944DD58FC7
+:100DE000D44DD58FD451D58F9455D58FD98F1CC163
+:100DF000DC455CC19C411CC5DC415CC582801C415A
+:100E000089C593E717001CC1828041677917F98F64
+:100E1000DDBF9C4513F7070113F8F70001C7D84160
+:100E20003368E8008E2113F7F50F39C31841814666
+:100E3000854E3D4F930F800293028004214E3396DE
+:100E4000DE00B3F8C5006311160393982600331330
+:100E50001F011343F3FF3377E300B318180133E79F
+:100E6000E800639FF70550C98506E39AC6FD18C1DF
+:100E70001307F00F6375B70454412146854E3D4F6B
+:100E8000930F800293028004414EB398CE0033F753
+:100E900015016392E8021317260001173313EF00C0
+:100EA0001343F3FFB376D3003317E800D98E639D65
+:100EB000F701232A15010506E319C6FD54C18280F6
+:100EC000E39457FA10C94DB7E39757FE232815014D
+:100ED000DDB708456D8D3335A000828048456D8DA6
+:100EE0003335A000828019C20CC982804CC982802F
+:100EF000B707002023A0A7348280B707002003A7EC
+:100F00000734894710216311F70214318D4763EDCF
+:100F1000D7003C219A0637E700E09607D58F93F774
+:100F2000F70F32972300F740544105479357560077
+:100F30003317C70089CA938707048A07B7E600E01A
+:100F4000B69798C3828093870706C5BFB71602403D
+:100F5000DC4251777D17F98F5D8DC8C282803717CB
+:100F600002405C439146B18B6385D700A146638202
+:100F7000D706B7177A00938707201CC1371602409F
+:100F80005C4237070020130707019183BD8BBA9796
+:100F900094231C41B3D7D7005CC15442A1829D8ADF
+:100FA000BA969422B3D6D70014C55442AD829D8A16
+:100FB00036971823B3D7E7005CC558423983937638
+:100FC00037001387418036971823B3D7E7021CC92F
+:100FD00082805C435843C166C983758FB7F6FF1F93
+:100FE00083A6C670BD8B8907139616016348060059
+:100FF000C54601466392D702C94739A88946638F1F
+:10100000D702BD46638ED702C146638ED702C5465E
+:1010100001466393D700C1471DEF374702400327BE
+:101020000780418B05C737177A0013070720B307DE
+:10103000F7021CC121D61C41858381B701466DBFD3
+:101040000546B547D1BF0146BD47F9B737173D0043
+:1010500013070790E9BFB7150240D8559316F7005C
+:10106000D85563DF060411833D8B930617003717AD
+:101070007A00130707203357D70218C1D455A1822D
+:10108000BD8A8DE295463307D702058318C137170D
+:101090000240585714413D8B050733D7E60218C16B
+:1010A000184171B785456394B600E546E9BFBD4573
+:1010B0006396B600D1463387E602C9BF8906E5BF0D
+:1010C0003D8B9306170037177A0013070720335715
+:1010D000D702F1B799C5371702405C4B5D8D48CBFD
+:1010E0008280B7170240D84B1345F5FF798DC8CBE6
+:1010F000828099C5371702401C4F5D8D08CF8280D2
+:10110000B7170240984F1345F5FF798D88CF82803D
+:1011100099C5371702405C4F5D8D48CF8280B71765
+:101120000240D84F1345F5FF798DC8CF828099C50D
+:10113000371702405C475D8D48C78280B717024071
+:10114000D8471345F5FF798DC8C78280EFF2AFBC51
+:101150001629F577FD17F58FF621DA257971D58FE8
+:101160001EA95625FD779387379FF58FD6212A84B0
+:101170002EC6D58F9625D58FB625D58F5EA55E292F
+:10118000C207C18393F7F7CFD98F5EA96808C13B27
+:10119000B747014093870780B245631EF402A25708
+:1011A0006547B387E7029841930640060A07B3D71D
+:1011B000E70233D7D702B3F7D70212079207938714
+:1011C0002703B3D7D702BD8BD98FC207C1831EA413
+:1011D00045616FF08FB69257E1B791C55E250967FB
+:1011E000D98F5EA582805A25F977FD17F98FD5BF73
+:1011F00013F7F50F85471583B395B7006319F7000B
+:101200009307C500984301CED98D8CC3828089464F
+:1012100093074501E318D7FE93070501E5B793C58A
+:10122000F5FFF98DDDB793F5F51F4EA182804A21B8
+:101230001375F51F82800A216D8D3335A0008280E1
+:1012400013F7F50F85461583B397B6006311D702E0
+:101250005A25F98F1A2101454207418381CB054563
+:10126000A181B315B5006D8F3335E00082808946CA
+:101270006314D7001A29F1BF5A29E1BFB70700202C
+:101280009387C7359843636FA702D043B386C700DF
+:101290006316D50054413E85B296D4C35041B3067F
+:1012A000C500631CD700B706002083A6463463063A
+:1012B000D70054431843B29654C118C16303F500D4
+:1012C00088C38280BA877DBFEFF24FA341112AC63F
+:1012D000EF100045B706002083A7463437060020EC
+:1012E00093864634130686343245A9EF370700202B
+:1012F0009307C76693F5F7001307C76681C5138781
+:10130000F700419BB70500209385C53523A2050052
+:1013100098C1AD659385053FAE97C19B23A2070099
+:1013200023A00700B385E7409CC21CC3B707002079
+:1013300023A8B734B707002023A6B734B707008027
+:101340004CC31CC2032A0600B377AA0085E39307A7
+:10135000F5FF3957636CF7009307050113F7F700A2
+:1013600041C313F707FF410763EBE706814489A0F8
+:1013700022872E8461A058C15CC009375840B70647
+:101380000020938606359042B307E94023A0F90078
+:1013900063F3C7009CC2B70700203367EA00938756
+:1013A000473558C09843C10423200400050798C35B
+:1013B000EF10005493F7F400D1CBA1679387078017
+:1013C0007390073037A6000037A500001306C6C982
+:1013D00093050011130545CCEF70206201A0BA8778
+:1013E000370700200329C7349309C734E360F9F8AD
+:1013F000370700200324C7351307C73550406374EF
+:10140000F6000C40B5F59442E38286F6144004439E
+:1014100014C33307F64093060002E3F1E6F6330502
+:10142000F4009376F500A1DAA167938707807390A3
+:10143000073037A6000037A500001306C6C993057C
+:10144000F00C130545CCEF70405B01A026854101EF
+:101450006FF00F8E55C1EFF20F8CB70700200327F6
+:1014600045FF83A787342A84B376F7009DE2A167FE
+:10147000938707807390073037A6000037A50000D8
+:101480001306C6C993054012130545CCEF70E0560C
+:1014900001A0832605FF9DC2A167938707807390F3
+:1014A000073037A6000037A500001306C6C993050C
+:1014B0005012130545CCEF70405401A093C7F7FFBD
+:1014C000F98F232AF5FEEF10A025B7070020938798
+:1014D000C7349443032744FF130504FF369798C38A
+:1014E000713BB7070020938787359843050798C35A
+:1014F000EF1000406FF06F848280B707002003A5D3
+:10150000C7348280B7E700E041572387E74023864E
+:10151000E740B7F700E023A0070023A207008146B9
+:1015200094C70147D8C73707002083250732130720
+:10153000401F814633D6E5023D4790CBD4CB98C3BC
+:101540008280EFE25FFD411102C6F32750303EC6B4
+:10155000B2470D478D8B6384E702A16793870780AD
+:101560007390073037A6000037A50000130686CE1B
+:101570009305600B130545CCEF70204801A0B70719
+:10158000012093870700BD8B9DC3A16793870780C8
+:101590007390073037A6000037A50000130686CEEB
+:1015A0009305B00B130545CCEF70204501A0993F82
+:1015B000B7E700E0056723A0E710116723A0E71055
+:1015C00023A40180EFE0DFD3014541016FE0FFF686
+:1015D00073110134A1679387078073900730B7F7C1
+:1015E00000E023A20700EF10E01511C5B7E700E007
+:1015F000116723A0E720A16793878788739007303E
+:101600007311013473002030A167938707807390B2
+:101610000730938781809843050798C3828013879A
+:1016200081801C438DE7EFE21FEFA167938707805E
+:101630007390073037A6000037A50000130686CE4A
+:1016400093052010130545CCEF70203B01A0FD173A
+:101650001CC391E7A16793878788739007308280C6
+:1016600021651305058073150530828073100530E0
+:101670008280930785007D575CC118C55CC51CC975
+:101680002320050082802328050082809841FD5692
+:1016900093078500631ED7001C49D843D8C10CC7E7
+:1016A0009CC5CCC31C4188C985071CC18280B687F4
+:1016B000D4439042E37DC7FECDB7544118451C4941
+:1016C00098C654C3D4436393A600D8C39843232831
+:1016D00005007D1798C388438280EFE2DFE3411164
+:1016E0002AC61D373245005D1D3F133514004101E8
+:1016F0006FE0BFE4EFE23FE232893041045D2A84CB
+:1017000009EE1C41014591E70844EF10807A23243B
+:101710000400850404DC6FE05FE2631009024841C5
+:10172000EF7080225C4038400145BA9718445CC095
+:10173000E3E1E7FE1C405CC0E9BF4845EF70C02014
+:101740003C4058441440B307F0403E9758C463757A
+:10175000D7001844BA975CC489470145E31BF9FADE
+:10176000CDD8FD147DB7EFE27FD9204541112AC6BF
+:1017700005E4A167938707807390073037A60000C0
+:10178000856537A50000130606D1938555BD130561
+:1017900045CCEF70802601A0185C5C5C6365F702A5
+:1017A000A167938707807390073037A6000085658F
+:1017B00037A50000130606D1938565BD130545CCFA
+:1017C000EF70A02301A0185C01496378F7028344FD
+:1017D000540401466C002285313F9399840193D9CA
+:1017E0008941FD572A89639EF9005C5099C713050A
+:1017F0004402EF10004211C105494A8541016FE0E2
+:101800003FD39307F0076395F902A1679387078099
+:101810007390073037A60000856537A500001306D2
+:1018200006D1938565BF130545CCEF70001D01A05F
+:101830008504E204E184A3029404C1B7304115C2D7
+:10184000EFE27FCD58451445AA87329758C56364A7
+:10185000D700184158C52E85CC47EF70E00E6FE0D9
+:10186000DFCD8280EFE23FCB2A84793B834454046E
+:1018700013094402E204E18463459002FD57A30288
+:10188000F404713B51338344440413090401E2041A
+:10189000E18463499002FD572302F40449336FE069
+:1018A000DFC93C4491CB22857D3D19C1EF10005327
+:1018B000FD14E204E184C9B75C50E9D34A85EF1016
+:1018C0004035E5B71C48E1DB4A85EF10803419C18B
+:1018D000EF10C050FD14E204E18465BFEFE2BFC326
+:1018E00041111DE1A167938707807390073037A6E8
+:1018F000000037A50000130606D19305001113055B
+:1019000045CCEF70800F01A05C5D2EC62A84BDC35C
+:101910003841B3B7E702B9EFC5393040585C1440DD
+:10192000232C0402B307E602B24554C03387F60005
+:10193000918FB6975CC4FD572302F40418C4A30228
+:10194000F40495E11C4899CB13050401EF10602CB9
+:1019500011C5B7E700E0116723A0E720C9310545AD
+:1019600041016FE09FBD13050401213313054402BB
+:101970000933EDB7A167938707807390073037A6C7
+:10198000000037A50000130606D193055014130577
+:1019900045CCEF70800601A0EFE2FFB7411139C1DD
+:1019A000B3B7A502AA849DEF3305B502930730FBB8
+:1019B00063EAA7021305C5042EC6EFF0FF902A8440
+:1019C00011CDB245AA8799C19307C5042CC01CC08C
+:1019D00044DC8545228519372324040422854101EE
+:1019E0006FE0BFB5A167938707807390073037A674
+:1019F000000037A50000130606D19305601C1305EF
+:101A000045CCEF60907F01A0EFE27FAE011132C6BE
+:101A10001DE1A167938707807390073037A6000008
+:101A200037A50000130606D19305E032130545CC17
+:101A3000EF60B07C01A02A842E89B6848DE53C41FC
+:101A40009DC3A167938707807390073037A6000076
+:101A500037A50000130606D19305F032130545CCD7
+:101A6000EF60B07901A089476398F402585C85471C
+:101A70006304F702A167938707807390073037A646
+:101A8000000037A50000130606D1930500331305A7
+:101A900045CCEF60907601A0EF10003515E5B24718
+:101AA000014C85C7A167938707807390073037A6DD
+:101AB000000037A50000130606D193053033130547
+:101AC00045CCEF60907301A0014C094BFD59930B7D
+:101AD000040137EA00E0916AA5A85C50C5C313056C
+:101AE0004402EF10001359A8B24781E70D3E0145AB
+:101AF00071A863150C002808EF1060200D36EF0068
+:101B00003042193683474404E207E1876394370182
+:101B10002302040483475404E207E18763943701F6
+:101B2000A3020404ED3C6C002808EF10A01E3DE960
+:101B3000E13C185C5C5C631EF704D534B2455E85FD
+:101B4000EF1040012285393BEF00905A29C9054C1E
+:101B5000653C185C5C5C6364F700E39764F9268677
+:101B6000CA8522858329840371363C44BDD78947C1
+:101B70006394F400639A09002285F53611C5B7E72E
+:101B800000E0116723A0E720593C054505616FE09F
+:101B90009F9971342285F931EF0090554DBF232074
+:101BA0005A2175B722857D39EF00905489B7EFE24D
+:101BB000FF9441111DE1A16793870780739007305F
+:101BC00037A6000037A50000130606D19305204074
+:101BD000130545CCEF60706201A02A84328A3689F1
+:101BE0008DE53C419DC3A1679387078073900730C3
+:101BF00037A6000037A50000130606D19305304034
+:101C0000130545CCEF60705F01A089476318F902A6
+:101C1000585C85476304F702A16793870780739038
+:101C2000073037A6000037A50000130606D193053C
+:101C30004040130545CCEF60505C01A02EC6EFF08C
+:101C40003FA2185C5C5CAA8AB2456366F7008947CC
+:101C500081446318F902834454044A862285939987
+:101C60008401032B8403793493D98941FD5763910F
+:101C7000F9043C449DC78947631CF900630A0B00C3
+:101C800085445685EFF09F9E268541016FE05F8A6F
+:101C90002285D13C75D5E3050AFE85472320FA004D
+:101CA000C5B75C50F1DF13054402EF009076DDB755
+:101CB0009307F0076394F902A167938707807390F5
+:101CC000073037A6000037A50000130606D193059C
+:101CD000D048130545CCEF60505201A08504E204C2
+:101CE000E184A302940469BFEFE2FF821DE1A167D2
+:101CF000938707807390073037A6000037A5000050
+:101D0000130606D19305D04A130545CCEF60F04E7B
+:101D100001A03C412A849DC3A167938707807390EB
+:101D2000073037A6000037A50000130606D193053B
+:101D3000104B130545CCEF60504C01A01C41AE8404
+:101D40008DE71C459DC3A16793870780739007307B
+:101D500037A6000037A50000130606D19305604B97
+:101D6000130545CCEF60704901A0EFF07F8F185C40
+:101D70005C5C2A896370F70883475404050718DC04
+:101D800093968701E1867D57639AE6023C4485C3BA
+:101D90002285EFF05F9D01E905444A85EFF01F8D34
+:101DA00022856FE08FF9EDD885479CC0F5B75C5070
+:101DB000E5D713054402EF00D065F1BF1307F00724
+:101DC0006394E602A167938707807390073037A674
+:101DD000000037A50000130606D1930550531305E4
+:101DE00045CCEF60904101A08507E207E187A3029F
+:101DF000F4045DB7014455B7EFE26FEF011132C64D
+:101E00001DE1A167938707807390073037A6000014
+:101E100037A50000130606D193051055130545CCD0
+:101E2000EF60B03D01A02A84AE898DE53C419DC3A1
+:101E3000A167938707807390073037A6000037A506
+:101E40000000130606D193055055130545CCEF60ED
+:101E5000D03A01A0EF00507915E5B247014985C796
+:101E6000A167938707807390073037A6000037A5D6
+:101E70000000130606D19305A055130545CCEF606D
+:101E8000D03701A001497D5A930A440237EB00E0A4
+:101E9000916B95A8B24789E7EFF06FF8014569A803
+:101EA000631509002808EF009065EFF04FF7EF0089
+:101EB0003007EFF06FF583474404E207E18763944E
+:101EC00047012302040483475404E207E187639433
+:101ED0004701A3020404EFF08FF46C002808EF0020
+:101EE000706325E52285EFF04FFF31C9B245568575
+:101EF000EF0050462285EFF0FF96EF00701F19E1CA
+:101F000023207B210549EFF02FF0045CC1D4CE855E
+:101F10002285FD14EFF09F9204DC1C4899CB130539
+:101F20000401EF00104F11C5B7E700E0116723A0CF
+:101F3000E720EFF0CFEE054505616FE0CFDE2285AB
+:101F4000EFF05F92EF00D01A75BF2285EFF09F91FE
+:101F5000EF00101A2285EFF04FF84DD581B7EFE270
+:101F6000EFD901112EC61DE1A167938707807390F9
+:101F7000073037A6000037A50000130606D19305E9
+:101F8000305E130545CCEF60502701A03C412A8408
+:101F90009DC3A167938707807390073037A6000021
+:101FA00037A50000130606D19305705E130545CCD6
+:101FB000EF60B02401A0EF0030630DE5B2479DC390
+:101FC000A167938707807390073037A6000037A575
+:101FD0000000130606D19305C05E130545CCEF60E3
+:101FE000D02101A081440149FD59130A4402B7EAF6
+:101FF00000E0116B75A0B2479DE79DC0A167938774
+:1020000007807390073037A6000037A5000013063D
+:1020100006D193052063130545CCEF60101E01A087
+:10202000EFF0EFDF45A8631509002808EF00304DF9
+:10203000EFF0EFDEEF00C06EEFF00FDD83474404FA
+:10204000E207E187639437012302040483475404C1
+:10205000E207E18763943701A3020404EFF02FDC69
+:102060006C002808EF00104B41E12285EFF0EFE60D
+:1020700035C51C4089EBEFF02FD90844EF0090588C
+:10208000AA84EFF0CFD9B2455285EF00B02C22855B
+:10209000EFF04FFDEF00D00519E123A06A210549BB
+:1020A000EFF08FD61C5CA1DBFD171CDC1C4081E728
+:1020B000EF00307B08C41C4899CB13050401EF00E6
+:1020C000503511C5B7E700E0116723A0E720EFF016
+:1020D0000FD58544268505616FE08FC52285EFF019
+:1020E0006FF8EF00F00065BF2285EFF0AFF7EF006B
+:1020F00030002285EFF06FDE5DD1E9DCEFF0CFD06C
+:102100005C50814589C71C58A9459C439D8D084456
+:102110008144EF00B066EFF08FD06DBFEFE20FBEED
+:1021200041111DE1A167938707807390073037A69F
+:10213000000037A50000130606D19305107513059E
+:1021400045CCEF60900B01A02A84328A8DE53C419A
+:102150009DC3A167938707807390073037A600005F
+:1021600037A50000130606D193052075130545CC4D
+:10217000EF60B00801A02EC6EFF08FCE03298403D4
+:10218000AA8A6303090883444404B24522859399CB
+:102190008401EFF0AFEA7D1993D98941232C240300
+:1021A000FD576397F9021C4889EB05445685EFF00B
+:1021B000EFCB228541016FE0AFB713050401EF00BB
+:1021C000502565D5E3030AFE85472320FA00F1BFB9
+:1021D0009307F0076394F902A167938707807390D0
+:1021E000073037A6000037A50000130606D1930577
+:1021F0005079130545CCEF60500001A08504E2043E
+:10220000E1842302940455B701444DB7EFE2AFB027
+:1022100041111DE1A167938707807390073037A6AE
+:10222000000037A50000130606D19305407F130573
+:1022300045CCEF60807C01A02A84EFF0EFBC1C5CF1
+:10224000485C1D8D2AC6EFF08FBD324541016FE01D
+:10225000CFAE15E5EFE22FACA167938707807390AF
+:10226000073037A60000856537A50000130606D1A4
+:10227000938585AC130545CCEF60207801A09DCDFA
+:1022800037C600209306C6A6814701471306C6A697
+:10229000214883A846006398A80093173700B29797
+:1022A0008CC3C8C321A891E783A8060063930800E4
+:1022B000B6870507A106E31E07FDFDF38280EFE266
+:1022C0008FA541112A842EC632C4EFF0EFB38347A5
+:1022D00044047D572246E207E187B2456394E70054
+:1022E00023020404834754047D57E207E187639483
+:1022F000E700A302040432C62EC4EFF04FB21C5C08
+:10230000A245324689E713054402EF0030092285D1
+:10231000EFF04FD541016FE04FA2EFE2CF9F0146B2
+:102320009145EFF06FE76FE04FA1EFE2CF9E4111D3
+:102330002AC62EC4EFF04FAD3245A24501443C45BC
+:1023400091E71C5D014499E32CC50544EFF02FADE6
+:10235000228541016FE06F9EEFE2EF9B41112E86D7
+:102360006C0002C6EFF05FA9324541016FE0EF9CBF
+:1023700037070020130787361C439443B707002014
+:102380009387873881E67D5798C3828018435847E2
+:102390001843DDBFEFE28F9637090020B707002012
+:1023A0009304493683A987392A849C408840411187
+:1023B000A388070411052EC6EFF02FB07D579307B1
+:1023C0004936B245631CE40295C9B7C7002093871C
+:1023D00007BB9440D84398C610479440D0C6944059
+:1023E0001047910654C29440910614C798405CCBA4
+:1023F0009843050798C341016FE08F9398434E942B
+:1024000040C3637B3401370700200325C7368C4364
+:102410009105EFF0AFA7C5B7370700200325873632
+:102420008C439105EFF08FA6B7070020938787387C
+:102430009843E372E4FC80C37DBFEFE22F8C37C486
+:102440000020B7090020130444BC370A00209384FD
+:1024500049379C40EDDFEFF02F9B5C4403A9C70098
+:1024600013054900EFF06FA513070A371C43FD174A
+:102470001CC39C40FD179CC0EFF06F9A0325090315
+:10248000EFE05FFD4A85EFE0FFFCD1B7EFE22F867A
+:1024900013192600AA8A4A852E8A368BBA8BBE89E2
+:1024A000EFE09FE21DC1AA8413054005EFE0DFE1E4
+:1024B0002A8409C904D98147C146631A0A00230A3C
+:1024C000050225A02685EFE0FFF87D5565A23307BC
+:1024D000FA00030707003306F400230AE60201C7E7
+:1024E0008507E396D7FEA3010404A54763F47703A9
+:1024F000A167938707807390073037A6000037A540
+:102500000000130646D293057039130545CCEF60E1
+:10251000C04E01A0130A44005285232674032322CF
+:10252000740523240404EFF00F9613058401EFF0E3
+:102530008F9529471305C9FF33077741269500C8B2
+:1025400018CC40D023060404A30604042307040483
+:10255000A307040423080404A30804045A86D685A8
+:102560004199EFD0FFE908C06384090023A08900E6
+:10257000EFF08F89B7070020938707379843B70498
+:102580000020B7C90020050798C3138744361843B5
+:10259000938444361389C9AA6310070E80C09843F8
+:1025A00085476316F7069389C9AA930A890C4E8555
+:1025B000D109EFF00F8CE39C3AFF37C50020930A56
+:1025C00045B7130545B7EFF0CF8A37C5002093090B
+:1025D00085B8130585B8EFF0CF8937C500201305FE
+:1025E000C5B9EFF00F8937C50020130545BCEFF0E2
+:1025F0004F8837C50020130505BBEFF08F87B7075D
+:10260000002023A45737B707002023A63737B70782
+:1026100000209387C7379843050798C337070020E2
+:10262000130707385C54144363F3F6001CC3514787
+:10263000B387E702CA97D843144718C454C4144751
+:1026400023A246012324470198435CC8050798C389
+:10265000EFE0FFFCB707002083A74739054599CB7A
+:102660009C40D8575C546377F700B7E700E01167E8
+:1026700023A0E7206FD03FEBB707002083A747399F
+:10268000D9F79C40D8575C54E3E3E7F880C041B7E2
+:10269000EFD27FE8B7070020B7A50000372500007C
+:1026A000938747380147814613060004938585D3F5
+:1026B0001305A543E13B0544631E8502EF00704905
+:1026C000631A8502A1679387078073900730B70765
+:1026D00000207D5723A4E738B707002023AAA73896
+:1026E000B707002023AC0738EFE0BFE583A7C18020
+:1026F0006FD0BFE4FD57E31BF5FEA167938707800A
+:102700007390073037A60000856537A500001306D3
+:1027100046D293850584130545CCEF60002E01A0B9
+:10272000B7070020938787379843050798C38280AF
+:10273000B707002003A587398280B707002003A5CB
+:1027400087398280B707002083A7873763990718E6
+:10275000EFD27FDCB70700209387873980430504D9
+:1027600080C321ECB707002093878736984318432E
+:1027700005C7A167938707807390073037A60000CD
+:10278000856537A50000130646D2938575AC130501
+:1027900045CCEF60802601A0370700201307C7361D
+:1027A0009443104390C3B707002014C39387C738DE
+:1027B0009843050798C3EFF0BFBB37060020930787
+:1027C00086389C4337C70020B7050020130686389B
+:1027D0001307C7AA9385453601456375F4029C41EA
+:1027E000D146DC57B387D7023E971843854763F33A
+:1027F000E7000545B707002083A7C73991C3054502
+:102800006FD0BFD3370E0020B70E0020514F930773
+:102810008E369443944281E6FD571CC2C9B79C434F
+:10282000DC47DC47D4436374D40014C24DBF83A893
+:10283000870003A8C700D44B1383470023A40801D3
+:102840002322180183A846006394680023A206018E
+:1028500003A8060023AA07007D1823A006019457A9
+:1028600095CA03A8C70183A8070283AF46002324A3
+:10287000180183A8070223A2080113888701639423
+:102880000F0123A2160103A8060023A407027D1846
+:1028900023A0060193860E3803A8C70283A806006A
+:1028A00063F4080123A00601B306E803BA9683A8DF
+:1028B000460083AF880023A4170123A6F70183AF46
+:1028C000880023A26F0023A46800D4CB9C42850714
+:1028D0009CC29C41DC57E36CF8F205450DBFB7077D
+:1028E00000209387073998430145050798C38280E4
+:1028F000EFD2DFC037040020130484371C4041119D
+:1029000085E7A167938707807390073037A600009B
+:10291000856537A50000130646D29385358B1305D0
+:1029200045CCEF60800D01A0EFE01FCE1C40FD17ED
+:102930001CC01C4089CB01452AC6EFE05FCE324562
+:1029400041016FD0FFBEB707002083A70737E5D747
+:10295000B7C6002037C5002081479386C6B9370F18
+:1029600000201305C5AAD14837030020370E0020E8
+:10297000854E59A8DC46DC47CC4F9053985790C5FC
+:1029800003A807022322B800032847009385870184
+:102990006313B80050C3104323A407027D1610C36D
+:1029A0008C47D047D84B1388470090C54CC24C4346
+:1029B0006393050150C3104323AA07007D1610C37B
+:1029C00013070F38D0570C4363F3C50010C3330708
+:1029D00016032A974C4383AF85008CC723A6F701C3
+:1029E00083AF850023A20F0123A405010C43D8CB9C
+:1029F00085050CC313074336184358576366E60032
+:102A00001307CE392320D70198422DF799C3EFF051
+:102A10003F96B7070020138707390443138407390B
+:102A200091CC370900208549313B09C59307C93945
+:102A300023A03701FD14EDF823200400B707002080
+:102A400083A7C739E38907EEB7E700E0116723A042
+:102A5000E7200545D5B519E5B7E700E0116723A0E4
+:102A6000E7208280EFD23FABB707002083A78737EC
+:102A700041119DC3A167938707807390073037A6E4
+:102A8000000037A50000130646D2930590541305A5
+:102A900045CCEF50907601A02AC6EFF07FC83245B2
+:102AA0008145EFF03F8FA93511E5B7E700E01167E9
+:102AB00023A0E72041016FD05FA8B707002003A73C
+:102AC0008737B70700209387C73901C7054798C3E1
+:102AD000828023A00700B707002013870738184318
+:102AE00013860738B7C700209387C7AA5148B30693
+:102AF0000703B385D700884115C5C841A106BE9616
+:102B00004841C8C16314D5005441D4C1D146B3066D
+:102B1000D702B697DC43D447B707002023A2D736A5
+:102B200018C2828015E7EFD21F9FA16793870780A5
+:102B30007390073037A60000856537A5000013069F
+:102B400046D2938525C0130545CCEF50106B01A0EC
+:102B50007D1771BFEFD23F9C05E5A1679387078082
+:102B60007390073037A60000856537A5000013066F
+:102B700046D29385C5C1130545CCEF50106801A01E
+:102B8000B70700202E8483A54736E105EFE01FB08C
+:102B900085452285EFF01F806FD03F9AEFD2BF9717
+:102BA0002A8705E5A167938707807390073037A6CA
+:102BB0000000856537A50000130646D2938525C51C
+:102BC000130545CCEF50706301A0B7070020938731
+:102BD000473654432E858C4303A88600D4CD8C43BE
+:102BE00023A0050303A807008C46610823A2050162
+:102BF00003A807009C43610823A4060198D71C433F
+:102C000085071CC311C27D55B285EFF0AFF86FD0B8
+:102C1000DF925C45DC4795E7EFD2FF8FA167938792
+:102C200007807390073037A60000856537A5000040
+:102C3000130646D2938525C8130545CCEF50F05BAB
+:102C400001A0D04F945398579385870114C6D0C2E2
+:102C500050436313B60054C3144323A40702FD1664
+:102C600014C33707002003278737D45725EF8C4735
+:102C7000D047D84B90C5D04748434CC293854700B6
+:102C80006313B50050C3104323AA07007D1610C379
+:102C9000370700201307073810436373D60014C3A7
+:102CA00051473386E60237C700201307C7AA329779
+:102CB0005043084690C7C8C708464CC10CC6D8CB7D
+:102CC0001C43014585071CC3B707002083A747366F
+:102CD000DC5763F8D700B7070020054723AEE73875
+:102CE0000545828037C700201307C7B950430846FF
+:102CF000D0CF88D308464CC10CC698D7D1B7B707F8
+:102D0000002083A7C7381CC1B707002083A78739D5
+:102D10005CC18280EFD23F80411105E5A1679387B6
+:102D200007807390073037A60000856537A500003F
+:102D3000130646D29385D5CF130545CCEF50F04B03
+:102D400001A085E5A167938707807390073037A6B8
+:102D50000000856537A50000130646D29385E5CFB0
+:102D6000130545CCEF50704901A02EC62AC4EFE0F0
+:102D7000BF8937070020B70700201307473683A60F
+:102D800087391C432245B24583C7170599CB1C439D
+:102D9000A38807040544EFE09F88228541016FD096
+:102DA000CFF99C417D570144E387E7FE37060020B9
+:102DB0000326C6380328050058416307C80063E5A9
+:102DC000E60023A00500F9B73386E640E37BF6FE74
+:102DD000958FBA979CC12537014475BFB70700206E
+:102DE000054723AEE7388280B707002083A747391D
+:102DF000054581CBB707002003A58737133515009C
+:102E0000060582804DC5EFD26FEF3709002093078A
+:102E100049369443585513094936D4566373D70835
+:102E20001C4D63C8070083270900D457A947958F15
+:102E30001CCD51463307C702B7C700209386C7AAE7
+:102E40009384C7AA369754496398E60493094500CA
+:102E50002A844E85EFE07F8683270900370700200C
+:102E600013070738DC5714435CD463F3F6001CC324
+:102E70005147B387E702A697D843144718C454C4F0
+:102E8000144723A236012324370198435CC8050761
+:102E900098C305456FD0CFE983270900DC575CD57F
+:102EA000CDBF9C436841DC573335F500E5B701459C
+:102EB000828011E50145828001456FD00FE8EFD295
+:102EC0008FE5B707002083A747362A846385A702CA
+:102ED000A167938707807390073037A60000856548
+:102EE00037A50000130646D29385F504130545CC9B
+:102EF000EF50B03001A0BC4785E7A16793870780FA
+:102F00007390073037A60000856537A500001306CB
+:102F100046D293850505130545CCEF50102E01A030
+:102F200054557841FD173CC5E388E6F8D1F7930482
+:102F300045002685EFE06FF87C4029471D8F18CCAF
+:102F4000370700201307073814435CD463F3F600F7
+:102F50001CC351473387E702B7C700209387C7AA2E
+:102F60000545BA97D843144718C454C41447C4C27B
+:102F700004C798435CC8050798C381B775C1EFD2F1
+:102F80008FD934452A8485E6A1679387078073909B
+:102F9000073037A60000856537A50000130646D226
+:102FA0009385F509130545CCEF50302501A07C41F0
+:102FB00063F3B700AE8758546302F70A0546639F70
+:102FC000C608B706002083A6463663958602A16729
+:102FD000938707807390073037A60000856537A573
+:102FE0000000130646D29385A50B130545CCEF5080
+:102FF000D02001A0144C5CD463C60600A946B38758
+:10300000F6401CCC51463307C702B7C70020938651
+:10301000C7AA9384C7AA369754486391E604130954
+:1030200044004A85EFE06FE93707002013070738AF
+:103030005C54144363F3F6001CC35147B387E702A3
+:10304000A697D843144718C454C4144723A2260192
+:103050002324270198435CC8050798C36FD0EFCDA0
+:103060008280B70700201387473618439387473677
+:1030700009C79443B8460507B8C688438280EFD293
+:103080008FC937040020EFE02FD81304C43A1C4046
+:10309000B1E737C50020130985BD130585BDEFE0F5
+:1030A0004FDD37C500209304C5BE1305C5BEEFE054
+:1030B0004FDCB707002023A0273B0146B7070020BD
+:1030C000C145114523A2973AEFE01F8D08C019C5ED
+:1030D000B7A50000938545D6EFF0AF97EFE02FD46A
+:1030E0006FD0AFC5EFD22FC34CC108C9AA876362A6
+:1030F000B602184D158E0545637BE60093854700A3
+:10310000B707002003A5473AEFE04FD801456FD03D
+:10311000CFC26375D6000545E3FBD5FE9385470016
+:10312000B707002003A5073AC5B7EFD2CFBE2A8460
+:10313000AE8432890C4CA6864A86A69522855D37D8
+:1031400019E16FD08FBF1C4C2285BE941C50829712
+:10315000D5B7EFD24FBCB707002083A7073A41117C
+:10316000AA84DC472EC6C04713054400EFE0EFD425
+:1031700083474402324613F7470011CBA6852285C8
+:103180006D371C502285829741016FD00FBBF99B90
+:103190002302F402FDB7EFD20FB8370400209306E4
+:1031A000043A98421C4391EBB70700209387473AB3
+:1031B000904398C390C26FD04FB85C47FD55884389
+:1031C000493FF1BFEFD2AFB229694111B70A0020E0
+:1031D000B7090020370B0020B70B0020130909D4D2
+:1031E00083A70A3A984329CBDC47814C03AC0700FC
+:1031F000EFF00FD3EFF0CFD383A7893A2A849384DB
+:10320000893A130ACB3A636CF50288C0638F0C02CB
+:1032100083A74B3A90431336160003250A00B305E3
+:103220008C40EFF0CF89EFF0AFEC11EDB7E700E0A5
+:10323000116723A0E72001A8854C014C55BFA13F91
+:1032400080C0EFF0EFEA214C05A00146E36785FD61
+:10325000EFF00FEAA2856285ED3DF5B79247B245E2
+:103260008297824763DD070003250A0001468A85AD
+:10327000EFE09FB835D582472245E3C107FE2244DF
+:103280005C4895E3EFF0CFCA9C40AA8C6373F500CD
+:103290001937824723A09401FD17E367FCFC8A07D6
+:1032A000CA979C43828713054400EFE00FC1D9BF42
+:1032B000834744020C4C924693E717002302F40222
+:1032C0006686B6952285393D45D18347440213F77A
+:1032D000470019CB1C4C924566862285BE95B135B8
+:1032E0001C502285829749B7F99B2302F402CDBF77
+:1032F00083474402F99B2302F402BDB7834744028B
+:10330000924593E717002302F4020CCC9DE1A167DC
+:10331000938707807390073037A6000037A5000019
+:103320001306C6D693059035130545CCEF50E06CD7
+:1033300001A0E6866686E6952285EFF0BFDA2DB716
+:103340008347440213F7270055F72285EFE08F905B
+:1033500021BFEFD24F9CEFF09FD2B707002083A789
+:10336000C73A9DE3A167938707807390073037A61C
+:10337000000037A500001306C6D69305901113056B
+:1033800045CCEF50806701A0B7070020B7A500002B
+:10339000373500009387073B254781464146938593
+:1033A00045D81305451CEFF06F8E4DDD6FD0EF98BB
+:1033B000EFD2CF94AA8A13058002AE843289368A6E
+:1033C000BA89EFD07FF02A8439C9230205029DE033
+:1033D000A167938707807390073037A6000037A551
+:1033E00000001306C6D69305B016130545CCEF5062
+:1033F000C06001A0EFF0BFC81305440023205401B2
+:1034000004CC232E440123203403EFE0CFA763082C
+:1034100009008347440293E747002302F402228510
+:103420006FD00F91EFD22F8F01111DE1A16793870C
+:1034300007807390073037A6000037A500001306F9
+:10344000C6D69305B018130545CCEF50005B01A01C
+:10345000370400201304C43A1C403AC62A880145A8
+:103460008DC7B6882EC832CA42CC954663C2B60212
+:10347000EFF09F973247894781463A866303F5000C
+:10348000014608400C08EFE02FD805616FD0EF8AA5
+:10349000814646860C083E85EFE06FF1FDB7B70721
+:1034A000002083A7073237177A0013070720B3D706
+:1034B000E7023707002093F7F70F230BF73A1307BC
+:1034C000803EB387E70237070020231AF73A82804D
+:1034D000B7F700E0D8438146799BD8C3370700206F
+:1034E0000357473B3306A70290CBD4CB98431367CF
+:1034F000070198C398431367170298C3D843058BF5
+:1035000075DF9843799B98C38280EFD2CF802A845D
+:103510001165011185451105EFD0BFBD930700204E
+:103520007C82371501408D473EC44C00E1471305AE
+:1035300005803EC6EFD0FF8D22C837440140B70753
+:1035400008000C08130504803ECC02CA231E0100AB
+:10355000EFD0DFBF854513050480EFD01FC805619C
+:103560006FC0BFFDEFC29FF9B7440140AE893289F9
+:10357000014493840480634524014A856FC05FFB46
+:10358000930500042685EFD01FCB7DD9B387890032
+:103590008385070026850504C205C181EFD0BFC819
+:1035A000D9BF138701811C43B7C60020938606C488
+:1035B0003E95636BD500B70601209386068063E5D0
+:1035C000A60008C33E858280FD57EDBF73251034E9
+:1035D00082807325203482807325303482802326B4
+:1035E00005000CC150C123240500054582805C45BF
+:1035F000544118458507B3E7D702638EE700584565
+:103600001C41BA978CA35C4558418507B3E7E70294
+:103610005CC5054582807955828018455C45630FFD
+:10362000F70018451C41BA979C239CA11C455841A2
+:103630008507B3E7E7021CC5054582800145828006
+:10364000EFC27FED37040020EF00706913040441DE
+:103650002DC91305C044EFD03FC708C01305801122
+:10366000EFD09FC6B707002023A0A73C1305801109
+:10367000EFD09FC5B707002023A8A73C13058011F2
+:10368000EFD09FC4B707002023A0A73E13058011E9
+:10369000EFD09FC3B707002023A8A73E13058011D2
+:1036A000EFD09FC2B707002023ACA73E13058011BF
+:1036B000EFD09FC1B707002023A0A74001456FC0EE
+:1036C000DFE713058011EFD03FC008C01305C044E9
+:1036D000EFD09FBF23A0A19013058011EFD0DFBED4
+:1036E000B707002023ACA73A13058011EFD0DFBD48
+:1036F000B707002023A4A73C13058011EFD0DFBC3F
+:10370000B707002023ACA73C13058011EFD0DFBB27
+:10371000B707002023A4A73E13058011EFD0DFBA1E
+:10372000B707002023A4A74051BFEFC2DFDE2A84E1
+:10373000EFF00F80018D6FC05FE085679387072CE6
+:103740006303F5040967130707588947630BE5020C
+:103750001567130707B08D476305E5022567130753
+:1037600007609147630FE500396713070710954716
+:103770006309E50071671307072089476313E500B4
+:1037800099473E8582808547EDBF85476305F502F1
+:1037900089476302F5048D476303F502914763048B
+:1037A000F50295476305F50299476316F5027165C1
+:1037B00013050520828005651305052C828015659B
+:1037C000130505B082802565130505608280396583
+:1037D0001305051082800965130505588280C167AD
+:1037E00069768146FD17050613F7F60F6364B70087
+:1037F0003E8582803307D5001823B98F214713F8FF
+:103800001700858363050800B18FC207C1837D1748
+:103810001377F70F6DF78506C1BFEFC2DFCF797160
+:103820001306000281450808EFC0FFD18545114508
+:1038300002C202C402C6EFD0DF8B85452145EFD01E
+:103840005F8B854513050020EFD0BF8A1165EFD04F
+:10385000EFEF371401408547130504804C007C824C
+:1038600002C6EFD00FDB8947130504804C007C8231
+:1038700002C6EFD00FDA93070010130504C04C0006
+:103880007C8202C6EFD0EFD8930700204C001305CE
+:1038900004C07C823724014002C6EFD08FD71305C5
+:1038A0000440EFD0EF8B85473ECA3ECCB7070E00F1
+:1038B0003ECE0C089147130504402302F10202C8D2
+:1038C00002D0EFD0CF8D854513050440EFD08F9304
+:1038D000854513050440EFD0EF9181451305044061
+:1038E000EFD0AFA213050440EFD0EF929304044051
+:1038F0002685EFD0EF926DFD13050440372401407B
+:10390000EFD08F92930404402685EFD08F926DFD07
+:1039100013050440EFD0EFA02396A19045616FC03E
+:10392000DFC1EFC25FBF79711306C0028145480055
+:10393000EFC07FC185450545EFD0CFF93704024080
+:1039400013058400EFD06FB1B72701409387C744B8
+:103950003EC2938701913EC491473EC89307000839
+:103960003ECC930700103ECE930700403ED0930715
+:1039700000023ED24C008D67130584003ED402C67F
+:1039800002CA02D6EFD02FC445616FC01FBBEFC281
+:103990009FB8370502408545210537240140EFD007
+:1039A0000FC6130504409D4605468145EFD06F8A3A
+:1039B000130504409D460946A145EFD08F891305A4
+:1039C00004409D460D46A545EFD0AF889D46114663
+:1039D000130504408545EFD0CF8713050440854586
+:1039E000EFD04F82854513050440EFD00F856FC09F
+:1039F000DFB4EFC25FB24111854513050004EFD07B
+:103A00004FEFC147372401407C8285473EC44C00BC
+:103A10009147130504803EC6EFD0AFBFC1451305E3
+:103A20000480EFD00FCB41016FC03FB1EFC2BFAEFA
+:103A30004111854513050004EFD0AFEB9307000853
+:103A4000372401407C8285473EC44C00C1471305A2
+:103A500004803EC6EFD0EFBB0146130504809305FA
+:103A60000008EFD04FC8930700104C0013050480E6
+:103A70007C82EFD00FBA0146130504809305001035
+:103A8000EFD06FC6930700204C00130504807C82A2
+:103A9000EFD02FB801461305048093050020EFD026
+:103AA0008FC4930700404C00130504807C82EFD044
+:103AB0004FB601461305048093050040EFD0AFC216
+:103AC0008567938707804C00130504807C8285649A
+:103AD000EFD02FB401469385048013050480EFD006
+:103AE0008FC04C00130504806482EFD08FB2014672
+:103AF000130504808565EFD00FBF89674C0013055F
+:103B000004807C82EFD0EFB0014613050480896504
+:103B1000EFD06FBD91674C00130504807C82EFD01D
+:103B20004FAF0146130504809165EFD0CFBBE1771D
+:103B30004C00130504807C82EFD0AFAD0146A16537
+:103B400013050480EFD02FBA41016FC01F9FEFC251
+:103B50009F9C4111854513050004EFD08FD9A147E3
+:103B6000372401407C8285473EC44C00C147130581
+:103B700004803EC6EFD0EFA9014613050480A1459D
+:103B8000EFD06FB691474C00130504807C82EFD0D4
+:103B90004FA80146914513050480EFD0CFB44101F1
+:103BA0006FC0BF99EFC23F97411185454145EFD0A6
+:103BB0004FD489677C8285473EC44C00C147371586
+:103BC00001403EC6EFD0EFA4054689653715014098
+:103BD000EFD06FB141016FC05F96EFC2DF9341112B
+:103BE00085454145EFD0EFD0930700207C82854783
+:103BF0003EC44C00C147371501403EC6EFD06FA10F
+:103C000005469305002037150140EFD0CFAD4101A7
+:103C10006FC0BF92EFC23F90411185454145EFD043
+:103C20004FCD854513050002EFD0AFCC93070010B0
+:103C30007C828D473EC44C00C147371501403EC6CB
+:103C4000EFD02F9D05469305001037150140EFD0AA
+:103C50008FA9930700084C00371501407C82EFD0F4
+:103C60004F9B05469305000837150140EFD0AFA7DD
+:103C7000930700044C00371501407C82EFD06F9908
+:103C800005469305000437150140EFD0CFA5371442
+:103C90000140E1774C00130504407C82EFD06F9720
+:103CA0000546A16513050440EFD0EFA341016FC0A5
+:103CB000DF88EFC25F86411185454145EFD06FC374
+:103CC000854513050002EFD0CFC2930700107C8218
+:103CD0008D473EC44C00C147371501403EC6EFD06A
+:103CE0004F9305469305001037150140EFD0AF9F65
+:103CF000930700084C00371501407C82EFD06F918C
+:103D000005469305000837150140EFD0CF9D930776
+:103D100000044C00371501407C82EFD08F8F0546A0
+:103D20009305000437150140EFD0EF9B3714014095
+:103D3000E1774C00130504407C82EFD08F8D05465F
+:103D400013050440A165EFD00F9A91674C0013054D
+:103D500004407C82EFD0EF8B05461305044091654B
+:103D6000EFD06F9889674C00130504407C82EFD038
+:103D70004F8A0546896513050440EFD0CF9641016F
+:103D80006FC0AFFBEFC22FF941118545130500024B
+:103D9000EFD02FB68547371401407C8285473EC45B
+:103DA0004C00C147130504403EC6EFD08F86054640
+:103DB000854513050440EFD00F9341016FC0EFF725
+:103DC000EFC26FF5EFD02F926FC02FF7EFC2AFF4B5
+:103DD000EFD0CF906FC06FF6EFC2EFF379712A8901
+:103DE00085451145EFD0EFB0854537050200EFD08E
+:103DF0002FB2371401409147FC828D44E1474C08B3
+:103E00001305048026CC3ECEEFD0AF80A147FC82C4
+:103E10004C089147130504803ECE37440040EFC064
+:103E20005FFF0C10B7070C00130504404AD03ED4C6
+:103E300002D223160102EFD06FB1930760337C8664
+:103E4000680085473EC84487EFD02F8B0546130591
+:103E5000044093055052EFD0AFB985451305044097
+:103E6000EFD0AFB745616FC04FEDEFC2CFEA7971C8
+:103E70002A8985452145EFD0CFA785453705040020
+:103E8000EFD00FA93714014093070040FC828D4406
+:103E9000E1474C08130504C026CC3ECEEFC07FF7A7
+:103EA000856793870780FC824C089147130504C0FF
+:103EB0003ECE37540040EFC0DFF50C10B7070C00C2
+:103EC000130504804AD03ED402D223160102EFD05B
+:103ED000EFA7930770337C86680085473EC8448708
+:103EE000EFD0AF8105461305048093055052EFD003
+:103EF0002FB0854513050480EFD02FAE45616FC00C
+:103F0000CFE3EFC24FE179712A8485454145EFD077
+:103F10004F9E854537050800EFD08F9F93070040DF
+:103F2000FC828D44E1474C083715014026CC3ECE3B
+:103F3000EFC03FEE856793870780FC824C0891476E
+:103F4000371501403ECEEFC0DFEC22D037540040A1
+:103F50000C10B7070C00130504C03ED402D2231680
+:103F60000102EFD0AF9E930740347C8668008547FE
+:103F70003EC84487EFC07FF80546130504C093058B
+:103F80005052EFD0EFA68545130504C0EFD0EFA443
+:103F900045616FC08FDAEFC20FD87971AA84854569
+:103FA0004145EFD00F95854513050002EFD06F9482
+:103FB000854537051000EFD0AF9585670D44FC822D
+:103FC0004C08E1473715014022CC3ECEEFC07FE4DC
+:103FD000914737150140FC824C0891471305054075
+:103FE0003ECEEFC01FE30C10B7070C003755004062
+:103FF00026D03ED402D223160102EFD02F9593078C
+:1040000050347C86680085473EC84087EFC0FFEE8D
+:1040100005469305505237550040EFD06F9D8545BA
+:1040200037550040EFD06F9B45616FC00FD1EFC295
+:104030008FCE79712A8485454145EFD08F8B854598
+:1040400013050004EFD0CF8C8547FC828D44E147F7
+:104050004C083715014026CC3ECEEFC09FDB894788
+:10406000FC824C089147371501403ECEEFC07FDA05
+:1040700022D0372400400C10B7070C001305048031
+:104080003ED402D223160102EFD04F8C9307703535
+:104090007C86680085473EC84487EFC01FE605461A
+:1040A0001305048093055052EFD08F948545130576
+:1040B0000480EFD08F9245616FC02FC8EFC2AFC5AB
+:1040C00079712A8485454145EFD0AF828545130536
+:1040D0000008EFD0EF839147FC828D44E1474C0804
+:1040E0003715014026CC3ECEEFC0BFD2A147FC829F
+:1040F0004C089147371501403ECEEFC09FD122D0EA
+:10410000372400400C10B7070C00130504C03ED440
+:1041100002D223160102EFD06F83930780357C868D
+:10412000680085473EC84487EFC03FDD054613055C
+:1041300004C093055052EFD0AF8B8545130504C0E2
+:10414000EFD0AF8945616FC04FBFEFC2CFBC79716F
+:10415000AA8485454145EFC0DFF985451305001068
+:10416000EFC01FFBC1470D44FC824C08E1473715E7
+:10417000014022CC3ECEEFC0DFC993070002FC8293
+:104180004C089147371501403ECEEFC09FC80C1038
+:10419000B7070C003725004026D03ED402D22316A4
+:1041A0000102EFC0BFFA930790357C86680085470F
+:1041B0003EC84087EFC07FD405469305505237254F
+:1041C0000040EFD0EF82854537250040EFD0EF80EB
+:1041D00045616FC08FB6397106DE16DC1ADA1ED85B
+:1041E0002AD62ED432D236D03ACE3ECC42CA46C897
+:1041F00072C676C47AC27EC0EF009077F250E25267
+:104200005253C2533255A255125682567247E24754
+:104210005248C248324EA24E124F824F2161730063
+:104220002030397106DE16DC1ADA1ED82AD62ED4D2
+:1042300032D236D03ACE3ECC42CA46C872C676C4D6
+:104240007AC27EC0EF00807CEF007008F250E2522C
+:104250005253C2533255A255125682567247E24704
+:104260005248C248324EA24E124F824F2161730013
+:104270002030397106DE16DC1ADA1ED82AD62ED482
+:1042800032D236D03ACE3ECC42CA46C872C676C486
+:104290007AC27EC0EF00D00FEF00B01BF250E252A6
+:1042A0005253C2533255A255125682567247E247B4
+:1042B0005248C248324EA24E124F824F21617300C3
+:1042C0002030397106DE16DC1ADA1ED82AD62ED432
+:1042D00032D236D03ACE3ECC42CA46C872C676C436
+:1042E0007AC27EC0EF001023EF00F02DF250E252B0
+:1042F0005253C2533255A255125682567247E24764
+:104300005248C248324EA24E124F824F2161730072
+:104310002030397106DE16DC1ADA1ED82AD62ED4E1
+:1043200032D236D03ACE3ECC42CA46C872C676C4E5
+:104330007AC27EC0EF005034EF003040F250E252BB
+:104340005253C2533255A255125682567247E24713
+:104350005248C248324EA24E124F824F2161730022
+:104360002030397106DE16DC1ADA1ED82AD62ED491
+:1043700032D236D03ACE3ECC42CA46C872C676C495
+:104380007AC27EC0EF00B052EF007070F250E2527D
+:104390005253C2533255A255125682567247E247C3
+:1043A0005248C248324EA24E124F824F21617300D2
+:1043B0002030397106DE16DC1ADA1ED82AD62ED441
+:1043C00032D236D03ACE3ECC42CA46C872C676C445
+:1043D0007AC27EC0EF009042EF00F062F250E252EB
+:1043E0005253C2533255A255125682567247E24773
+:1043F0005248C248324EA24E124F824F2161730082
+:1044000020300397C19081472A97634F070009CD59
+:1044100005669306F6FFB6876358C700AA8763054B
+:10442000D50093170701C1833E858280EFC2AF8E0E
+:10443000EFF0AFBEEFF0EFCEEFF06FD56FC0EF8FC4
+:1044400037A700000327C7D823A0E19237A70000B1
+:10445000032707D923AEE19037A70000032747D9E8
+:1044600023ACE1908280EFC20F8B03950191EFF0B6
+:104470005FF9EF40402D83A50192EF30707E6FC051
+:10448000CF8BEFC24F8903952191EFF09FF7EF405B
+:10449000802B83A58191EF30B07C6FC00F8AEFC273
+:1044A0008F8703954191EFF0DFF5EF40C02983A599
+:1044B000C191EF30F07A6FC04F88EFC2CF8503957E
+:1044C0006191EFF01FF4EF4060346FC00F87EFC2CF
+:1044D0008F84EFF00FD22382A1926FC00F8603C5A5
+:1044E00041928280EFC22F83EFF04FD4EFF02FE69E
+:1044F000EFF04FEBEFF06FEEEFF0CFF1EFF09F88C2
+:104500006FC0AF83EFC22F810146930500103715AE
+:104510000140EFF0FF8A014693050008371501407E
+:10452000EFF01F8A01469305000437150140EFF0B4
+:104530003F89371501400146A16513050540EFF09D
+:104540003F886FB09FFFEFB21FFDEFF0AFE5EFF0D8
+:104550004FF66FB09FFEEFB21FFC014693050010AF
+:1045600037150140EFF0DF85014693050008371548
+:104570000140EFF0FF840146930500043715014028
+:10458000EFF01F8437140140130504400146A16574
+:10459000EFF01F831305044001469165EFF05F8241
+:1045A0000146896513050440EFF09F816FB0FFF865
+:1045B000EFB27FF685472E86930500086307F50264
+:1045C0008947930500106302F5028D47930500208B
+:1045D000630DF5009147930500406308F50095478A
+:1045E000631DF5008565938505803725014013051A
+:1045F0000580EFF0EFFC6FB05FF499478565E30647
+:10460000F5FE9D478965E302F5FEA1479165E30E3E
+:10461000F5FCA547A165E30AF5FCA947E31DF5FCF8
+:10462000A145E1B7EFB23FEF0547930500086308E6
+:10463000E5020947AA87930500106302E5020D47CA
+:1046400093050020630DE5001147930500406308C2
+:10465000E5001547631DE5008565938505803725D1
+:10466000014013050580EFF06FF66FB01FED19479D
+:104670008565E306E5FE1D478965E302E5FE214702
+:104680009165E30EE5FC2547A165E30AE5FC2947B2
+:104690001305F00FE39BE7FCA145D1B7EFB21FE68E
+:1046A000B70400209387040201499384040225473C
+:1046B000D4436399A60893094002B3093903338AA6
+:1046C000340183470A0085E72A841385C9002695AB
+:1046D000EFE0FFF003258A0019ECEFF00FF99307E4
+:1046E00040023309F902854726992300F9003385F2
+:1046F00034016FB0FFE385476315F400EFF07F806E
+:10470000F9BF89476315F400EFF0FF88C9BF8D47F3
+:104710006315F400EFF0BF91D9B791476315F4002A
+:10472000EFF0BFA26DBF95476315F400EFF01F993E
+:104730007DB79947E30CF4FE9D47E303F4FEEFF0E9
+:10474000AFE971BF050993874702E313E9F6014515
+:104750004DB7814709C91821814711C75C49084DE8
+:10476000898FB337F0003E858280EFB2DFDA4111E6
+:104770002A84A3070100EFF0DFFD19C59305F100BE
+:104780001305C400EFE07FE9888741016FB0FFDACD
+:10479000EFB2DFD61384019A938481999389C199EA
+:1047A0001389419A8CC023A0C9002320D90008C0D6
+:1047B000EFC09FB123A4A1920840EFC0FFB023A88F
+:1047C000A1920840EFC05FB023ACA1920840EFC0B7
+:1047D000BFAF23AEA19203A50900EFC0FFAE23A88F
+:1047E000A19403250900EFC03FAE23AAA1948840FD
+:1047F000EFC09FAD23A6A1946FB09FD3EFB2BFD1FE
+:104800001384019A9384C1998CC008C0EFC0DFABB8
+:1048100023A6A1920840EFC03FAB23AAA192084073
+:10482000EFC09FAA23ACA1920840EFC0FFA923A02C
+:10483000A1940840EFC05FA923A2A1940840EFC053
+:10484000BFA823A4A1948840EFC01FA823A8A194C7
+:104850006FB0BFCEEFB23FCCB707002023A4A702B2
+:1048600003A6019A83A581920145EFF03FE323A2BD
+:10487000A1966FB09FCCEFB21FCAB707002023A448
+:10488000A70203A6019A83A5C1920145EFF01FE19B
+:1048900023A4A1966FB07FCAEFB2FFC7B70700206D
+:1048A00023A6A70403A6019A83A501930545EFF06B
+:1048B000FFDE23A6A1966FB05FC8EFB2DFC5B707D2
+:1048C000002023A6A70403A6019A83A541930545CA
+:1048D000EFF0DFDC23A8A1966FB03FC6EFB2BFC3F5
+:1048E000B707002023A8A70603A6019A83A58193F2
+:1048F0000945EFF0BFDA23AAA1966FB01FC4EFB24B
+:104900009FC1B707002023A8A70603A6019A8145E7
+:104910000945EFF0BFD823ACA1966FB01FC2EFB22C
+:104920009FBFB707002023AAA70803A6019A83A563
+:10493000C1930D45EFF09FD623AEA1966FB0FFBF98
+:10494000EFB27FBDB707002023AAA70803A6019AEC
+:1049500083A501940D45EFF07FD423A0A1986FB0FB
+:10496000DFBDEFB25FBBB707002023ACA70A03A6E9
+:10497000019A83A541941145EFF05FD223A2A1983B
+:104980006FB0BFBBEFB23FB9B707002023AEA70C93
+:1049900003A6019A83A581941545EFF03FD023A487
+:1049A000A1986FB09FB9EFB21FB7B707002023A03F
+:1049B000A71003A6819983A5C1941945EFF01FCED6
+:1049C00023A6A1986FB07FB7EFB2FFB4B70700205E
+:1049D00023A2A71203A6419A83A541951D45EFF096
+:1049E000FFCB23AAA1986FB05FB5EFB2DFB2B707D4
+:1049F000002023A4A71403A6C19983A501952145EE
+:104A0000EFF0DFC923A8A1986FB03FB3EFB2BFB0FA
+:104A1000EFF0FFAC41E137550040930550521305CC
+:104A20000580EFC0FF811DCD93878195982309E70D
+:104A3000054798A3EF2060213755004013050580F6
+:104A4000EFC0EFFE03A741961C4F104B544B850758
+:104A5000B3E7C7026388D7009375F50F1305C70046
+:104A6000EFE0FFB8375400409305707213050480DF
+:104A7000EFC00FFD0DCD83A741969633BA3363ED9A
+:104A8000E60001469305707213050480EFC04FF6EF
+:104A9000EF30E01D6FB07FAAD84F1386160092B397
+:104AA000B307D7008C2313050480EFC0CFF737542A
+:104AB00000409305404213050480EFC06FF879D998
+:104AC0000357048083574480EF20A010E1B7EFB272
+:104AD0009FA4EFF0DFA041C137550040930550522D
+:104AE00013050580EFC0CFF51DCD938791959823D1
+:104AF00009E7054798A3EF10800B375500401305D1
+:104B00000580EFC0CFF203A781961C4F104B544B8A
+:104B10008507B3E7C7026388D7009375F50F1305C0
+:104B2000C700EFE0DFAC3754004093057072130507
+:104B30000480EFC0EFF00DCD83A781969633BA3392
+:104B400063EDE60001469305707213050480EFC023
+:104B50002FEAEF10D0396FB05F9ED84F1386160042
+:104B600092B3B307D7008C2313050480EFC0AFEBDB
+:104B7000375400409305404213050480EFC04FECCA
+:104B800079D90357048083574480EF001077E1B749
+:104B9000EFB27F98EFF0BF9441E1375500409305A5
+:104BA0005052130505C0EFC0AFE91DCD9387A19505
+:104BB000982309E7054798A3EF20600B375500407D
+:104BC000130505C0EFC0AFE603A7C1961C4F104BFD
+:104BD000544B8507B3E7C7026388D7009375F50F79
+:104BE0001305C700EFE0BFA0375400409305707273
+:104BF000130504C0EFC0CFE40DCD83A7C196963353
+:104C0000BA3363EDE600014693057072130504C0E4
+:104C1000EFC00FDEEF30C0066FB03F92D84F138663
+:104C2000160092B3B307D7008C23130504C0EFC05E
+:104C30008FDF3754004093054042130504C0EFC096
+:104C40002FE079D9035704C0835744C0EF10507A3E
+:104C5000E1B7EFB25F8CEFF09F8841C1375500405C
+:104C600093055052130505C0EFC08FDD1DCD93870E
+:104C7000B195982309E7054798A3EF00907537553C
+:104C80000040130505C0EFC08FDA03A701971C4F42
+:104C9000104B544B8507B3E7C7026388D700937561
+:104CA000F50F1305C700EFE09F94375400409305BC
+:104CB0007072130504C0EFC0AFD80DCD83A7019764
+:104CC0009633BA3363EDE60001469305707213051F
+:104CD00004C0EFC0EFD1EF10B0226FB01F86D84FE5
+:104CE0001386160092B3B307D7008C23130504C0B4
+:104CF000EFC06FD33754004093054042130504C002
+:104D0000EFC00FD479D9035704C0835744C0EF00D4
+:104D1000B060E1B7EFB23F80EFF06FFC35E993058B
+:104D2000505237550040EFC0AFD10DCD9387C1959C
+:104D3000982309E7054798A3EF10B0753755004051
+:104D4000EFC0EFCE03A741971C4F104B544B850784
+:104D5000B3E7C7026388D7009375F50F1305C70043
+:104D6000EFE0FF889305707237550040EFC04FCDDC
+:104D70000DCD83A741979633BA3363EDE600014624
+:104D80009305707237550040EFC08FC6EF207070EA
+:104D90006FB0AFFAD84F1386160092B3B307D7009F
+:104DA0008C2337550040EFC00FC89305404237555C
+:104DB0000040EFC0EFC869DDB75700409A23DE23FB
+:104DC000EF10F064F1B7EFB20FF5EFF04FF135C926
+:104DD0009305505237550040EFC08FC60DCD9387D5
+:104DE000D195982309E7054798A3EF00D060375580
+:104DF0000040EFC0CFC303A781971C4F104B544B0B
+:104E00008507B3E7C7026388D7009375F50F1305CD
+:104E1000C700EFE0CFFD9305707237550040EFC03B
+:104E20002FC20DCD83A781979633BA3363EDE60089
+:104E300001469305707237550040EFC06FBBEF100D
+:104E4000500D6FB08FEFD84F1386160092B3B30793
+:104E5000D7008C2337550040EFC0EFBC930540428C
+:104E600037550040EFC0CFBD69DDB75700409A23EA
+:104E7000DE23EF00504CF1B7EFB2EFE9EFF02FE691
+:104E800041E1375500409305505213050580EFC0AE
+:104E90002FBB1DCD9387E195982309E7054798A37C
+:104EA000EF1070613725004013050580EFC02FB863
+:104EB00003A7C1971C4F104B544B8507B3E7C7029C
+:104EC0006388D7009375F50F1305C700EFE02FF245
+:104ED000372400409305707213050480EFC04FB66D
+:104EE0000DCD83A7C1979633BA3363EDE600014633
+:104EF0009305707213050480EFC08FAFEF20905AB6
+:104F00006FB0AFE3D84F1386160092B3B307D70044
+:104F10008C2313050480EFC00FB1372400409305A4
+:104F2000404213050480EFC0AFB179D90357048024
+:104F300083574480EF10904FE1B7EFB2CFDDEFF031
+:104F40000FDA41C137250040930550521305058003
+:104F5000EFC00FAF1DCD9387F195982309E7054763
+:104F600098A3EF00904B3725004013050580EFC054
+:104F70000FAC03A701981C4F104B544B8507B3E7A8
+:104F8000C7026388D7009375F50F1305C700EFE0DC
+:104F90000FE6372400409305707213050480EFC0BC
+:104FA0002FAA0DCD83A701989633BA3363EDE6009F
+:104FB00001469305707213050480EFC06FA3EF10D4
+:104FC00060766FB08FD7D84F1386160092B3B307B1
+:104FD000D7008C2313050480EFC0EFA437240040D2
+:104FE0009305404213050480EFC08FA579D903577C
+:104FF000048083574480EF00F035E1B7EFB2AFD1C2
+:10500000EFF0EFCD35C99305505237250040EFC082
+:105010002FA30DCD93870196982309E7054798A301
+:10502000EF00F04137250040EFC06FA003A7419883
+:105030001C4F104B544B8507B3E7C7026388D7005A
+:105040009375F50F1305C700EFE06FDA93057072E3
+:1050500037250040EFC0CF9E0DCD83A741989633F2
+:10506000BA3363EDE60001469305707237250040C0
+:10507000EFC00F98EF10206C6FB02FCCD84F138675
+:10508000160092B3B307D7008C2337250040EFC03A
+:105090008F999305404237250040EFC06F9A69DD34
+:1050A000B72700409A23DE23EF00B02CF1B7EFB210
+:1050B0008FC6EFF0CFC241C1372500409305505253
+:1050C000130505C0EFC0CF971DCD93871196982388
+:1050D00009E7054798A3EF00D038372500401305AE
+:1050E00005C0EFC0CF9403A781981C4F104B544BC1
+:1050F0008507B3E7C7026388D7009375F50F1305DB
+:10510000C700EFE0CFCE372400409305707213053F
+:1051100004C0EFC0EF920DCD83A781989633BA33C8
+:1051200063EDE600014693057072130504C0EFC0FD
+:105130002F8CEF1060616FB04FC0D84F13861600F0
+:1051400092B3B307D7008C23130504C0EFC0AF8D13
+:105150003724004093054042130504C0EFC04F8E32
+:1051600079D9035704C0835744C0EF007022E1B7D8
+:10517000EFB26FBA37440040930550521305044014
+:10518000EFC00F8C0DC513050440EFC04F8A03A775
+:1051900001991C4F104B544B8507B3E7C702638836
+:1051A000D7009375F50F1305C700EFE04FC43744E0
+:1051B00000409305707213050440EFC06F881DC155
+:1051C00083A701999633BA3363E3E6020146930558
+:1051D000707213050440EFC0AF81EFF04FB009C506
+:1051E000EF10A0576FB06FB5EF20302FE5BFD84F4D
+:1051F0001386160092B3B307D7008C23130504401F
+:10520000EFC06F82C5B7EFB20FB1EFF04FAD35E130
+:105210009305505237250040EFC08F820DC53725CA
+:105220000040EFC0CF8003A741991C4F104B544B57
+:105230008507B3E7C7026388D7009375F50F130599
+:10524000C700EFE0CFBA9305707237250040EFB08A
+:105250003FFF05C183A741999633BA3363EDE6005A
+:1052600001469305707237250040EFB07FF8EF20BC
+:10527000B0256FB08FACD84F1386160092B3B3072A
+:10528000D7008C2337250040EFB0FFF9DDB7EFB230
+:105290008FA8EFF0CFA435E5372400409305505296
+:1052A000130504C0EFB0DFF90DC5130504C0EFB05E
+:1052B0001FF803A7C1981C4F104B544B8507B3E749
+:1052C000C7026388D7009375F50F1305C700EFE099
+:1052D0000FB23724004093057072130504C0EFB07D
+:1052E0003FF605C183A7C1989633BA3363EDE60054
+:1052F000014693057072130504C0EFB07FEFEF20F5
+:10530000901B6FB08FA3D84F1386160092B3B307CC
+:10531000D7008C23130504C0EFB0FFF0DDB7EFB268
+:105320000F9D370400208357443C411189E7EFD09B
+:105330002FC023A4A19AEFD0AFBF2A8A894A054B78
+:1053400093093006B70B00205285EFE00FBE63E6ED
+:10535000AA0A03A58196EFF0CFBF6310650B8357B0
+:10536000443C63FFF9068354443CEFC00F99938794
+:10537000E4406364F5061385E400EFB0FFF4835462
+:10538000443C2AC637070020938764001CC193075A
+:1053900085005CC1930730051CA59307C0041CB5AC
+:1053A00085473CA58325073C93D784003CB59307EC
+:1053B000D50044A526863E85EF3000592695DD4769
+:1053C0001CA103A581A6EFC07FE429C903A581A67E
+:1053D000814629466C00EFC02FE32312043C25A828
+:1053E00083A40B3C03A5819613871700BE94231258
+:1053F000E43CEFF08FB788A081BF0357443C93078C
+:105400003006E3E2E7F603A5819AEFE00FB29307D7
+:105410002003E3EAA7F441016FB0EF903245EFC0FB
+:105420006F8365BFEFB2AF8C370400208357443DD4
+:10543000411189E7EFD0CFAF23A6A19AEFD04FAFAC
+:105440002A8A894A054B93093006B70B00205285FA
+:10545000EFE0AFAD63E6AA0A03A50197EFF06FAFE7
+:105460006310650B8357443D63FFF9068354443D45
+:10547000EFC0AF889387E4406364F5061385E400CA
+:10548000EFB09FE48354443D2AC63707002093873A
+:1054900064001CC1930785005CC1930730051CA5FF
+:1054A0009307C0041CB58D473CA58325073D93D7C2
+:1054B00084003CB59307D50044A526863E85EF3091
+:1054C000A0482695DD471CA103A581A6EFC01FD4E7
+:1054D00029C903A581A6814629466C00EFC0CFD219
+:1054E000231A043C25A883A40B3D03A50197138729
+:1054F0001700BE94231AE43CEFF02FA788A081BFC9
+:105500000357443D93073006E3E2E7F603A5C19A4B
+:10551000EFE0AFA193072003E3EAA7F441016FB0E6
+:105520008F803245EFB01FF365BFEFA25FFC3704F9
+:1055300000208357443E411189E7EFD06F9F23A895
+:10554000A19AEFD0EF9E2A8A894A054B930930062B
+:10555000B70B00205285EFE04F9D63E6AA0A03A532
+:105560008197EFF00F9F6310650B8357443E63FFF5
+:10557000F9068354443EEFB05FF89387E4406364D8
+:10558000F5061385E400EFB03FD48354443E2AC6A9
+:1055900037070020938764001CC1930785005CC116
+:1055A000930730051CA59307C0041CB595473CA57F
+:1055B0008325073E93D784003CB59307D50044A5C7
+:1055C00026863E85EF3040382695DD471CA103A591
+:1055D00081A6EFC0BFC329C903A581A6814629467C
+:1055E0006C00EFC06FC22312043E25A883A40B3EBB
+:1055F00003A5819713871700BE942312E43EEFF0B2
+:10560000CF9688A081BF0357443E93073006E3E25C
+:10561000E7F603A5019BEFE04F9193072003E3EA30
+:10562000A7F441016FA03FF03245EFB0BFE265BF84
+:10563000EFA2FFEB370400208357443F411189E775
+:10564000EFD00F8F23AAA19AEFD08F8E2A8A894A92
+:10565000054B93093006B70B00205285EFE0EF8C25
+:1056600063E6AA0A03A50198EFF0AF8E6310650BFD
+:105670008357443F63FFF9068354443FEFB0FFE78D
+:105680009387E4406364F5061385E400EFB0DFC35D
+:105690008354443F2AC637070020938764001CC107
+:1056A000930785005CC1930730051CA59307C004D0
+:1056B0001CB59D473CA58325073F93D784003CB587
+:1056C0009307D50044A526863E85EF30E027269532
+:1056D000DD471CA103A581A6EFC05FB329C903A5BF
+:1056E00081A6814629466C00EFC00FB2231A043E02
+:1056F00025A883A40B3F03A5019813871700BE9428
+:10570000231AE43EEFF06F8688A081BF0357443F21
+:1057100093073006E3E2E7F603A5419BEFE0EF8055
+:1057200093072003E3EAA7F441016FA0DFDF3245CE
+:10573000EFB05FD265BFEFA29FDB37040020835735
+:10574000C43F411189E7EFC0BFFE23ACA19AEFC06F
+:105750003FFE2A8A894A054B93093006B70B002081
+:105760005285EFD09FFC63E6AA0A03A54198EFE0BB
+:105770005FFE6310650B8357C43F63FFF9068354D4
+:10578000C43FEFB09FD79387E4406364F506138569
+:10579000E400EFB07FB38354C43F2AC6370700202C
+:1057A000938764001CC1930785005CC19307300593
+:1057B0001CA59307C0041CB5A1473CA58325873FC2
+:1057C00093D784003CB59307D50044A526863E8533
+:1057D000EF3080172695DD471CA103A581A6EFC0F9
+:1057E000FFA229C903A581A6814629466C00EFC006
+:1057F000AFA1231E043E25A883A48B3F03A5419897
+:1058000013871700BE94231EE43EEFE01FF688A026
+:1058100081BF0357C43F93073006E3E2E7F603A5D1
+:10582000819BEFD09FF093072003E3EAA7F44101A7
+:105830006FA07FCF3245EFB0FFC165BFEFA23FCB76
+:105840003704002083574440411189E7EFC05FEEE1
+:1058500023AEA19AEFC0DFED2A8A894A054B93094E
+:105860003006B70B00205285EFD03FEC63E6AA0A62
+:1058700003A58198EFE0FFED6310650B835744406B
+:1058800063FFF90683544440EFB03FC79387E44079
+:105890006364F5061385E400EFB01FA3835444400E
+:1058A0002AC637070020938764001CC19307850030
+:1058B0005CC1930730051CA59307C0041CB5A54720
+:1058C0003CA58325074093D784003CB59307D500BA
+:1058D00044A526863E85EF3020072695DD471CA18E
+:1058E00003A581A6EFC09F9229C903A581A6814681
+:1058F00029466C00EFC04F912312044025A883A4D1
+:105900000B4003A5819813871700BE942312E4402F
+:10591000EFE0BFE588A081BF0357444093073006FE
+:10592000E3E2E7F603A5C19BEFD03FE09307200336
+:10593000E3EAA7F441016FA01FBF3245EFB09FB16A
+:1059400065BFEFA25FBD03A5C19E8145EFC0CFB982
+:105950006FA0BFBEEFA23FBC03A5419E8145EFC033
+:10596000AFB86FA09FBDEFA21FBB03A5C19D81452E
+:10597000EFC08FB76FA07FBCEFA2FFB903A5419D19
+:105980008145EFC06FB66FA05FBBEFA2DFB803A584
+:10599000C19C8145EFC04FB56FA03FBAEFA2BFB722
+:1059A00003A5419C8145EFC02FB46FA01FB9EFA2A2
+:1059B0009FB63767000037A500001307C7998546D3
+:1059C0000146BD45130585D9EFD09F9E23A0A19C1C
+:1059D0003767000037A500001307A79889460146DE
+:1059E000BD45130505DAEFD0BF9C23A4A19C376702
+:1059F000000037A500001307879789460146BD457B
+:105A0000130585DAEFD0DF9A23A8A19C3767000041
+:105A100037A500001307679689460146BD45130563
+:105A200005DBEFD0FF9823ACA19C3767000037A5BA
+:105A300000001307479589460146BD45130585DBE0
+:105A4000EFD01F9723A0A19E3767000037A5000065
+:105A50001307279489460146BD45130505DCEFD0A1
+:105A60003F9523A4A19E0D4681450545EFB0DFF289
+:105A700081460146814523A2A19CEFB0FFF80D4667
+:105A800081450545EFB05FF181460146814523A67A
+:105A9000A19CEFB07FF70D4681450545EFB0DFEFE4
+:105AA00081460146814523AAA19CEFB0FFF50D4632
+:105AB00081450545EFB05FEE81460146814523AE45
+:105AC000A19CEFB07FF40D4681450545EFB0DFECBA
+:105AD00081460146814523A2A19EEFB0FFF20D460B
+:105AE00081450545EFB05FEB81460146814523A620
+:105AF000A19EEFB07FF16FA05FA4EFA2DFA103A48E
+:105B0000019CEFC09FC32A860147814699452285A3
+:105B1000EFD05F916FA07FA2EFA2FF9F03A4819CB3
+:105B2000EFC0BFC12A860147814699452285EFD043
+:105B30007F8F6FA09FA0EFA21F9E03A4019DEFC0C7
+:105B4000DFBF2A860147814699452285EFD09F8D88
+:105B50006FA0BF9EEFA23F9C03A4819DEFC0FFBD3D
+:105B60002A860147814699452285EFD0BF8B6FA0D9
+:105B7000DF9CEFA25F9A03A4019EEFC01FBC2A86A0
+:105B80000147814699452285EFD0DF896FA0FF9AB2
+:105B9000EFA27F9803A4819EEFC03FBA2A860147F7
+:105BA000814699452285EFD0FF876FA01F99EFA20C
+:105BB0009F9603A5019C014781460146A145EFD070
+:105BC0007F8603A5419C01468145EFC02FD56FA07C
+:105BD000DF96EFA25F9403A5819C014781460146B1
+:105BE000A145EFD03F8403A5C19C01468145EFC08C
+:105BF000EFD26FA09F94EFA21F9203A5019D0147D2
+:105C000081460146A145EFD0FF8103A5419D014694
+:105C10008145EFC0AFD06FA05F92EFA2DF8F03A5E9
+:105C2000819D014781460146A145EFD0AFFF03A505
+:105C3000C19D01468145EFC06FCE6FA01F90EFA2BE
+:105C40009F8D03A5019E014781460146A145EFD0E6
+:105C50006FFD03A5419E01468145EFC02FCC6FA08B
+:105C6000DF8DEFA25F8B03A5819E01478146014630
+:105C7000A145EFD02FFB03A5C19E01468145EFC092
+:105C8000EFC96FA09F8BEFA21F8937A40000EFB070
+:105C9000DF86AA861306A00A8545130584DCEF205B
+:105CA000D0551305803EEFC01FDBD5B7EFA2BF86EE
+:105CB000EFF0EFE6EFF00FF7EFF03F87EFF05F97D1
+:105CC000EFF07FA7EFF09FB71545EFC0DFD8CDB756
+:105CD000EFA27F8403A50199EF0020702945EFC052
+:105CE0009FD7CDBFEFA23F83EF005028F5BFEFA2B3
+:105CF0009F82EF009058F5BFEFA2FF81EF00F053B5
+:105D0000F5BFEFA25F81EF00504FF5BFEFA2BF805C
+:105D1000EF00B04AF5BFEFA21F80EF001046F5BFBD
+:105D2000EFA26FFFEF007041F5BFEFA2CFFEEF00D3
+:105D3000D03CF5BFEFA22FFEEFE0FF80EF00007434
+:105D40009305004013050010EFE05FABEF00C07457
+:105D5000EFE07FB2EF008075EFE03FB6EF004076F6
+:105D6000EFE0FFB9EF000077EFE09FBDEF00C077F5
+:105D7000EFE03FBFEF008078EFE0DFC07165130513
+:105D80000520EFE09FC6EFD0BF8BEF006078EFF00B
+:105D90001FC2EFE04FFCB7A50000376500009387F6
+:105DA000019F1D47814613060004938545DF1305B7
+:105DB000A5D2EFC0AFEDB7A500003765000093870F
+:105DC000419F1D47814613060004938545E0130556
+:105DD00005D2EFC0AFEBB7A5000037650000938791
+:105DE000819F1D47814613060004938545E11305F5
+:105DF00065D1EFC0AFE9B7A5000037650000938714
+:105E0000C19F1D47814613060004938545E2130593
+:105E1000C5D0EFC0AFE7B7A5000037650000938796
+:105E200001A01D47814613060004938545E3130531
+:105E300025D0EFC0AFE5B7A5000037650000938718
+:105E400041A01D47814613060004938545E41305D0
+:105E500085CFEFC0AFE3B7A500003765000093879B
+:105E600041A11D47814613060004938545E51305AE
+:105E7000E5CEEFC0AFE1B7A500003765000093871E
+:105E8000C1A021478146130600049385C5E613058A
+:105E900045CEEFC0AFDFB7A50000376500009387A0
+:105EA00001A11547814613060020938505E81305D7
+:105EB00005CDEFC0AFDDB7A50000376500009387C3
+:105EC00081A01547814613060020938545E91305F7
+:105ED000C5CAEFC0AFDBB7A50000376500009387E8
+:105EE00081A10D47814613060004938585EA1305B9
+:105EF00065C8EFC0AFD9EFC0AFF96FA00FE4EFA254
+:105F00008FE1ED2BEFD07F83420541816FA0EFE25F
+:105F1000EFA26FE0D12BEFD05F82420541816FA0ED
+:105F2000CFE1EFA24FDF7D23EFD03F8142054181DA
+:105F30006FA0AFE0EFA22FDE6123EFD01F804205FC
+:105F400041816FA08FDFEFA20FDD8D23EFD0EFFE39
+:105F5000420541816FA06FDEEFA2EFDB352BEFD062
+:105F6000CFFD420541816FA04FDDEFA2CFDA0A21BC
+:105F7000EFD0BF81492B5923EFE0DFA001456FA08F
+:105F8000CFDBEFA24FD90A21EFD03F809D23A92B71
+:105F9000EFE03F9D01456FA04FDAEFA2CFD70A2176
+:105FA000EFD0AFFE2D2B3D23EFE09F9901456FA071
+:105FB000CFD8EFA24FD60A21EFD02FFD39230923E6
+:105FC000EFE0FF9301456FA04FD7EFA2CFD40A2196
+:105FD000EFD0AFFBCD21D929EFE03F8E01456FA077
+:105FE000CFD5EFA24FD30A21EFD02FFA5D296D2133
+:105FF000EFE07F8801456FA04FD4EFA24FCFB307EA
+:10600000B50083C4C7FF83C7D7FFF5154111A204AC
+:1060100093F5F50FDD8C2A84EFD06FFC6319950C96
+:10602000034B5400930700036312FB108349840061
+:106030001C34034A6400A209B3E9F900834A7400DE
+:1060400013991900EFB06FCB930759416361F50ABB
+:1060500013055901EFB04FA72AC61307850058C191
+:106060001307300518A51307C00418B53147930767
+:10607000D90038A5130779001CC1218393F7F70FC6
+:1060800038B51387A7FFA306650158A578201359D3
+:106090008900CD1778A57830220A336A5A01AA847C
+:1060A00078B513040501230825011CB9814A370B73
+:1060B000002093970A01C18363EE37038C40C840E8
+:1060C000F51593F5F50FEFD08FF1935785003CA0B0
+:1060D000DD4728B05CA003A581A6EFC02F9339C18E
+:1060E00003A581A6814629466C00EFB0FF914101CE
+:1060F0006FA06FC313094B16930B0903338C4A012E
+:1061000083270900639B8701832749000145090410
+:106110008297935785001CA008B02109E31279FFEC
+:10612000850A41BF3245EFB0EFB2D1B7C147E310A6
+:10613000FBFC64207C3083498400A204DD8C1C3489
+:10614000A2092904B3E9F900268AB70A0020B30797
+:106150009A40C207C183E3FC37F913894A19130B2C
+:10616000090383270900639B47011C20183068003E
+:10617000A207D98F7C868327490082972109E312E1
+:106180002BFF0904050AE1B7EFA24FB7370400203F
+:106190008327C4414111A9E3B707002003D6474133
+:1061A00005476378C702B706002003A5064193069A
+:1061B00030050C216397D5040C319306C00463921B
+:1061C000D504232EE440EFC0AFD6B707002023ACA0
+:1061D000A74041016FA0CFB58549639E3703B7073C
+:1061E000002003A50741B147382163E6E70089474E
+:1061F000232EF440F9BFB707002003D64741232ED2
+:1062000004407D1642064182239AC740930515003B
+:10621000EF2080737DBF0947639CE704B706002029
+:1062200003D646419147E3F6C7FAB707002003A516
+:10623000074158213C3122075D8F93178700218346
+:10624000D98FC207C18313070040636BF7000D4766
+:10625000232EE4409907370700202313F74095BF0A
+:106260007D1642064182232E0440239AC64079BF00
+:106270000D496390270537070020B7070020035614
+:10628000474183D76740E366F6F4B706002003A5CD
+:106290000641AA9783C6F7FFDD476394F60091474E
+:1062A00081BF7D1642064182232E0440231AC74037
+:1062B000B1BF1147E39FE7F0B70A002003A50A41E9
+:1062C000B147370B00205021243138212206458E5A
+:1062D000931486002182D18CC204C180631BF70015
+:1062E00083454B41EFF07FD1231A0B40232E04400E
+:1062F000CDB5EFB08FA093870440228A6361F50487
+:1063000013858400EFA05FFC03A40A412AC6AA8774
+:1063100004C12105C8C3268693055400EF20C0623E
+:106320003C206393370303A501A2EFB03FEE55C1B4
+:1063300003A501A2814629466C00EFB0EFEC232EA5
+:106340000A40231A0B4071B5639D270103A5C1A222
+:10635000EFB0DFEB3DCD814629466C0003A5C1A21D
+:10636000E9BF1547639DE70003A581A3EFB01FEACE
+:106370002DC1814629466C0003A581A37DBF1D4721
+:10638000639DE70003A541A4EFB05FE839C18146F2
+:1063900029466C0003A541A44DB72147639DE70042
+:1063A00003A501A5EFB09FE60DC5814629466C0007
+:1063B00003A501A559B72547E393E7F803A5C1A5B0
+:1063C000EFB0DFE419C5814629466C0003A5C1A5DD
+:1063D000ADB73245EFB00F889DB7EFA22F92AA89D3
+:1063E00037040020EFC0CFB423AEA1A00325844121
+:1063F0001389C1A1EFD06FB39307703E63FEA7006E
+:10640000EFC00FB3B7070020239A0740B70700205B
+:10641000232CA44023AE0740854A114A370B0020A5
+:10642000B70400204E85EFE0CFB2630A55014E85D8
+:10643000EFE02FB28547631BF5026FA06F8FEFC0AF
+:106440002FAF832709001D8DE363AAFE83D7444144
+:1064500003240B414E85138717003E94239AE44092
+:10646000EFE0AFB008A0EFF03FD26DBFB70700205C
+:1064700083A7C741F9D3EFF03FD1C1B7B7C7002019
+:106480000967938707C01307075898C3D8C398C7ED
+:10649000D8C798CBD8CB8280B7C7002003A507C048
+:1064A0008280B7C7002023A0A7C08280B7C7002082
+:1064B00003A547C08280B7C7002023A2A7C082805F
+:1064C000B7C7002003A587C08280B7C7002023A4D8
+:1064D000A7C08280B7C7002003A5C7C08280B7C706
+:1064E000002023A6A7C08280B7C7002003A507C14C
+:1064F0008280B7C7002023A8A7C08280B7C700202A
+:1065000003A547C18280B7C7002023AAA7C0828005
+:10651000EF92FFFD014691451545EFB0EFC723A06F
+:10652000A1A2014691451545EFB00FC723A6A1A230
+:10653000014691451545EFB02FC623ACA1A20146F7
+:1065400091451545EFB04FC523A2A1A40146914541
+:106550001545EFB06FC423A8A1A401469145154588
+:10656000EFB08FC323AEA1A4014691452945EFB0FA
+:10657000AFC223A4A1A60D4681450545EFB0CFC10A
+:10658000938B41A223A0AB000D4681450545EFB09A
+:10659000AFC0138B01A32320AB000D4681450545F9
+:1065A000EFB08FBF938AC1A323A0AA000D468145F7
+:1065B0000545EFB06FBE138A81A42320AA000D46C3
+:1065C00081450545EFB04FBD938941A523A0A900A2
+:1065D0000D4681450545EFB02FBC138901A60D4638
+:1065E0002320A90081450545EFB00FBB938401A787
+:1065F00088C01D45EFB07FD21384C1A6AA8508C00C
+:1066000003A50B00EFB07FD20C4003250B00EFB0C9
+:10661000DFD10C4003A50A00EFB03FD10C400325A9
+:106620000A00EFB09FD00C4003A50900EFB0FFCFE8
+:106630000C4003250900EFB05FCF0C408840EFB05D
+:10664000DFCE0D4681450545EFB00FB581460146C9
+:10665000814523A4A1A2EFB02FBB0D46814505457E
+:10666000EFB08FB381460146814523AAA1A2EFB0C6
+:10667000AFB90D4681450545EFB00FB281460146E1
+:10668000814523A0A1A4EFB02FB80D468145054553
+:10669000EFB08FB081460146814523A6A1A4EFB09B
+:1066A000AFB60D4681450545EFB00FAF81460146B7
+:1066B000814523ACA1A4EFB02FB50D46814505451A
+:1066C000EFB08FAD81460146814523A2A1A6EFB070
+:1066D000AFB30D4681450545EFB00FAC814601468D
+:1066E000814523AAA1A6EFB02FB26F90DFE3EF920E
+:1066F0009FE203A541A28145EFB00FDF6F90FFE35A
+:10670000EF927FE103A501A38145EFB0EFDD6F902C
+:10671000DFE2EF925FE003A5C1A38145EFB0CFDCDC
+:106720006F90BFE1EF923FDF03A581A48145EFB0F9
+:10673000AFDB6F909FE0EF921FDE03A541A581457F
+:10674000EFB08FDA6F907FDFEF92FFDC03A501A639
+:106750008145EFB06FD96F905FDEEF92DFDB03A56D
+:1067600001A78145EFB04FD86F903FDDEF92BFDAC0
+:1067700003A5C1A6FD55EFB03FBE138441A21C4046
+:10678000639CA7020145EFA0FFCC0545EFC0AFAC6D
+:1067900001469305001037150140EFD06FE2084025
+:1067A0008145EFB0CFFB03A581A28146014681451B
+:1067B000EFB08FA56F907FD8138401A31C4063991D
+:1067C000A7020145EFA01FC90545EFC0CFA80146AC
+:1067D0009305000837150140EFD08FDE0840814552
+:1067E000EFB0EFF781460146814503A541A3C9B744
+:1067F0001384C1A31C406399A7020145EFA09FC564
+:106800000545EFC04FA5014693050004371501402B
+:10681000EFD00FDB08408145EFB06FF481460146B1
+:10682000814503A501A469B7138481A41C40639A20
+:10683000A7020145EFA01FC20545EFC0CFA1371544
+:1068400001400146A16513050540EFD06FD7084010
+:106850008145EFB0CFF081460146814503A5C1A433
+:1068600081BF138441A51C40639AA7020145EFA094
+:106870007FBE0545EFC02F9E37150140014691654B
+:1068800013050540EFD0CFD308408145EFB02FED81
+:1068900081460146814503A581A519BF138401A640
+:1068A0001C40639AA7020145EFA0DFBA0545EFC07F
+:1068B0008F9A371501400146896513050540EFD0D1
+:1068C0002FD008408145EFB08FE9814601468145D0
+:1068D00003A541A6F1BD138401A71C40E39CA7ECCE
+:1068E0000145EFA03FB708408145EFB04FE7814633
+:1068F0000146814503A541A765BDEF92DFC103A510
+:1069000001A27D568145EFB02FCF85476315F50273
+:10691000AA8403A581A2FD55EFB06FE42A84631C0D
+:10692000950003A5419CFD55EFB06FE3630585001D
+:106930008327400002906F905FC0EF92DFBD03A5F8
+:10694000C1A27D568145EFB02FCB85476315F50277
+:10695000AA8403A541A3FD55EFB06FE02A84631C10
+:10696000950003A5C19CFD55EFB06FDF6305850061
+:106970008327400002906F905FBCEF92DFB903A5C0
+:1069800081A37D568145EFB02FC785476315F5027A
+:10699000AA8403A501A4FD55EFB06FDC2A84631C13
+:1069A000950003A5419DFD55EFB06FDB63058500A4
+:1069B0008327400002906F905FB8EF92DFB503A588
+:1069C00041A47D568145EFB02FC385476315F5027D
+:1069D000AA8403A5C1A4FD55EFB06FD82A84631C17
+:1069E000950003A5C19DFD55EFB06FD763058500E8
+:1069F0008327400002906F905FB4EF92DFB103A550
+:106A000001A57D568145EFB02FBF85476315F5027F
+:106A1000AA8403A581A5FD55EFB06FD42A84631C19
+:106A2000950003A5419EFD55EFB06FD3630585002A
+:106A30008327400002906F905FB0EF92DFAD03A517
+:106A4000C1A57D568145EFB02FBB85476315F50283
+:106A5000AA8403A541A6FD55EFB06FD02A84631C1C
+:106A6000950003A5C19EFD55EFB06FCF630585006E
+:106A70008327400002906F905FACEF92DFA903A5DF
+:106A800081A67D568145EFB02FB78547631DF50080
+:106A90002A8403A541A7FD55EFB06FCC631585008F
+:106AA0008327400002906F905FA9EF92DFA603A5B5
+:106AB00041A98145EFB04FA36F903FA8EF92BFA5CA
+:106AC00003A5C1A88145EFB02FA26F901FA7EF9239
+:106AD0009FA403A541A88145EFB00FA16F90FFA52A
+:106AE000EF927FA303A5C1A78145EFB0EF9F6F9001
+:106AF000DFA4EF925FA23777000037A500001307ED
+:106B000007AE85460146BD45130585EBEFC05F8A9C
+:106B100023ACA1A63777000037A500001307E7AC28
+:106B200089460146BD45130505ECEFC07F8823A0CB
+:106B3000A1A83777000037A500001307C7AB894627
+:106B40000146BD45130585ECEFC09F8623A4A1A88F
+:106B50003777000037A500001307A7AA894601462A
+:106B6000BD45130505EDEFC0BF8423A8A1A80D46C0
+:106B700081450545EFA05FE281460146814523AE90
+:106B8000A1A6EFA07FE80D4681450545EFA0DFE017
+:106B900081460146814523A2A1A8EFA0FFE60D464C
+:106BA00081450545EFA05FDF81460146814523A66B
+:106BB000A1A8EFA07FE50D4681450545EFA0DFDDEB
+:106BC00081460146814523AAA1A8EFA0FFE36F906B
+:106BD000DF96EF925F9403A481A7EFB01FB62A86D9
+:106BE0000147814699452285EFC0DF836F90FF946E
+:106BF000EF927F9203A401A8EFB03FB42A86014729
+:106C0000814699452285EFC0FF816F901F93EF92D7
+:106C10009F9003A481A8EFB05FB22A860147814606
+:106C200099452285EFC01F806F903F91EF92BF8EF4
+:106C300003A401A9EFB07FB02A8601478146994598
+:106C40002285EFC02FFE6F905F8FEF92DF8C03A540
+:106C500081A7014781460146A145EFC0AFFC03A5CE
+:106C6000C1A701468145EFB06FCB6F901F8DEF92AA
+:106C70009F8A03A501A8014781460146A145EFC0AF
+:106C80006FFA03A541A801468145EFB02FC96F9067
+:106C9000DF8AEF925F8803A581A8014781460146FC
+:106CA000A145EFC02FF803A5C1A801468145EFB06B
+:106CB000EFC66F909F88EF921F8603A501A9014739
+:106CC00081460146A145EFC0EFF503A541A9014664
+:106CD0008145EFB0AFC46F905F86EF92DF8337A43A
+:106CE0000000EFA09F81AA861306100D85451305AD
+:106CF00084DCEF1090501305803EEFB0DFD5D5B7A0
+:106D0000EF927F81EFD06FFBEF009022EFD02FF951
+:106D1000EF00D020EFD0EFF6EF00101FEFD0AFF470
+:106D2000EF00501D1305401FEFB0FFD2E1BFEF92FF
+:106D30008FFE03A50199EF10E0162945EFB0BFD1F2
+:106D4000CDBFEF924FFDEF100020EF102030EF107D
+:106D50004040EF106050EF1060601545EFB0BFCFBE
+:106D6000DDB7EF924FFB03A54199EF00B00D294528
+:106D7000EFB07FCECDBFEF920FFAEF003040F5BFFE
+:106D8000EF926FF9EF00B06BF5BFEF92CFF8EF0025
+:106D90001068F5BFEF922FF8EF007064F5BFEF9227
+:106DA0008FF7EF00D05FF5BFEF92EFF6EF00305BAB
+:106DB000F5BFEF924FF6EF009056F5BFEF92AFF5AB
+:106DC000EF00F051F5BFEF920FF5EFD0AFF1EF000C
+:106DD000D010930600401306001093050010130511
+:106DE0000010EFD0FF9AEF005015EFD0BFA6EF00D4
+:106DF0001016EFD07FAAEF00D016EFD03FAEEF0015
+:106E00009017EFD0DFB1EF005018EFD0DFB9716409
+:106E100013050420EFD07FBD13050420EFD0DFBAA7
+:106E2000EFD0CFE0EFD0CFE1EFC09F81EF00301780
+:106E3000EFF03FCCEFD00FEDB7A5000037750000A5
+:106E40009387C1A91D47814613060004938585EDEC
+:106E50001305C5DBEFB08FE3B7A500003775000061
+:106E6000938701AA1D47814613060004938585EE8A
+:106E7000130525DBEFB08FE1B7A5000037750000E3
+:106E8000938741AA1D47814613060004938585EF29
+:106E9000130585DAEFB08FDFB7A500003775000066
+:106EA000938781AA1D47814613060004938585F0C8
+:106EB0001305E5D9EFB08FDDB7A5000037750000E9
+:106EC0009387C1AA1D47814613060004938585F167
+:106ED000130545D9EFB08FDBB7A50000377500006B
+:106EE000938701AB1D478146130600049385C5F2C5
+:106EF0001305A5D8EFB08FD9B7A5000037750000EE
+:106F0000938781A91D47814613060004938505F4E4
+:106F1000130505D8EFB08FD7B7A50000377500006F
+:106F2000938781AB2147814613060004938545F57D
+:106F3000130565D7EFB08FD5B7A5000037750000F2
+:106F40009387C1AB1547814613060020938585F6CC
+:106F5000130525D6EFB08FD3B7A500003775000015
+:106F6000938781AC1547814613060020938585F7EA
+:106F7000130525D4EFB08FD1B7A5000037750000F9
+:106F8000938741AC15478146130600209385C5F8C9
+:106F90001305E5D2EFB08FCFB7A50000377500001D
+:106FA000938741AB1147814613060008938545FA44
+:106FB000130505D0EFB08FCDB7A5000037750000E1
+:106FC000938701AC0947814613060008938585FB2A
+:106FD0001305A5CDEFB08FCBEFB08FEB6F90EFD552
+:106FE000EF926FD3EF00607AEFC02FF54205418139
+:106FF0006F90AFD4EF922FD2EF00E077EFC0EFF3B6
+:10700000420541816F906FD3EF92EFD0EF00607532
+:10701000EFC0AFF2420541816F902FD2EF92AFCF18
+:10702000EF00E072EFC06FF1420541816F90EFD049
+:10703000EF926FCEEF006070EFC02FF042054181FC
+:107040006F90AFCFEF922FCD2545EFD0AFDD6F9092
+:10705000CFCEEF924FCC2145EFD0CFDC6F90EFCD6C
+:10706000EF926FCB1D45EFD0EFDB6F900FCDEF921E
+:107070008FCA1945EFD00FDB6F902FCCEF92AFC9BD
+:107080001545EFD02FDA6F904FCBEF92CFC8114557
+:10709000EFD04FD96F906FCAEF92EFC70D45EFD089
+:1070A0006FD86F908FC9EF920FC70945EFD08FD778
+:1070B0006F90AFC8EF922FC60545EFD0AFD66F9057
+:1070C000CFC7EF924FC5EF000066B7A7000083A5BA
+:1070D00087FCEF10E038EF10A061420541816F900E
+:1070E000CFC5EF924FC3EF00C062B7A7000083A5E2
+:1070F00087FCEF10E036EF10A05F420541816F90F2
+:10710000CFC3EF924FC1E52BB7A7000083A587FC43
+:10711000EF100035EF10C05D420541816F90EFC167
+:10712000EF926FBF0A21EFC04FE6EF00A066EF00BD
+:10713000C065EFD0CFFE01456F902FC0EF92AFBD7D
+:107140000A21EFC08FE42D2D3D25EFD04FFD0145E5
+:107150006F90AFBEEF922FBC0A21EFC00FE339252D
+:107160000925EFD0AFF701456F902FBDEF92AFBA71
+:107170000A21EFC08FE1CD23D92BEFD0EFF10145EC
+:107180006F90AFBBEF922FB90A21EFC00FE05D2BDC
+:107190006D23EFD02FEC01456F902FBAEF92AFB770
+:1071A0000C212545EFD0CFC001456F900FB9EF926C
+:1071B0008FB60C212145EFD0AFBF01456F90EFB7DF
+:1071C000EF926FB50C211D45EFD08FBE01456F903A
+:1071D000CFB6EF924FB40C211945EFD06FBD0145EA
+:1071E0006F90AFB5EF922FB30C211545EFD04FBC88
+:1071F00001456F908FB4EF920FB20C211145EFD083
+:107200002FBB01456F906FB3EF92EFB00C210D458E
+:10721000EFD00FBA01456F904FB2EF92CFAF0C2174
+:107220000945EFD0EFB801456F902FB1EF92AFAEA7
+:107230000C210545EFD0CFB701456F900FB0EF920D
+:107240000FABB307B50083C4C7FF83C7D7FFF515DE
+:107250004111A20493F5F50FDD8C2A84EFC02FD8DD
+:107260006319950C034B5400930700036312FB1042
+:10727000834984001C34034A6400A209B3E9F9007D
+:10728000834A740013991900EFA02FA7930759415F
+:107290006361F50A13055901EFA00F832AC613078E
+:1072A000850058C11307300518A51307C00418B589
+:1072B0002D479307D90038A5130779001CC12183F6
+:1072C00093F7F70F38B51387A7FFA306650158A5F5
+:1072D000782013598900CD1778A57830220A336AAF
+:1072E0005A01AA8478B513040501230825011CB9A5
+:1072F000814A370B002093970A01C18363EE37035D
+:107300008C40C840F51593F5F50FEFC04FCD93575E
+:1073100085003CA0DD4728B05CA003A5C1B0EFA06C
+:10732000FFEE39C103A5C1B0814629466C00EFA02C
+:10733000AFED41016F902F9F13094B1C930B8908F0
+:10734000338C4A0183270900639B87018327490007
+:10735000014509048297935785001CA008B02109B4
+:10736000E31279FF850A41BF3245EFA0AF8ED1B756
+:10737000C147E310FBFC64207C3083498400A204F5
+:10738000DD8C1C34A2092904B3E9F900268AB70A66
+:107390000020B3079A40C207C183E3FC37F9138981
+:1073A000CA24130B090783270900639B47011C208C
+:1073B00018306800A207D98F7C86832749008297FE
+:1073C0002109E3122BFF0904050AE1B7EF920F939D
+:1073D000B704002083A7C44141118DEF03D641902B
+:1073E00005476376C702B706002003A50642930649
+:1073F00030050C216393D5040C319306C004639EC1
+:10740000D50223AEE440EFB0AFB223A4A190410176
+:107410006F900F920547639CE702B707002003A512
+:107420000742B147382163E6E700894723AEF440BD
+:10743000F9BF03D6419023AE04407D164206418237
+:107440002392C19093051500EF100050C9B709476A
+:10745000639AE70403D641909147E3FAC7FAB70766
+:10746000002003A5074258213C3122075D8F931766
+:1074700087002183D98FC207C18313070040636B44
+:10748000F7000D4723AEE440990737070020231388
+:10749000F740B5BF7D164206418223AE04402392D9
+:1074A000C1904DB70D47639EE702B707002003D692
+:1074B000419083D76740E36CF6F4B706002003A53C
+:1074C0000642AA9783C6F7FFDD476394F60091470B
+:1074D000B1BF7D164206418223AE04402392C19083
+:1074E00095B71147E395E7F23709002003250942D4
+:1074F0005C2120313821A207C18F13948700A1831A
+:10750000C18F13940701AD474180631BF70083C50A
+:107510004190EFF0DFD22392019023AE0440C5BD2D
+:10752000EF90BFFD93070440A6896368F5088327A1
+:107530000942B823B14763E4E70485679387A73A14
+:10754000B3D7E700858B85CF1305E400EF90DFD735
+:107550002AC61306640083250942AA8710C12105A3
+:10756000C8C3EF10603E03A5C1B0EFA03FCA39C940
+:1075700003A5C1B0814629466C00EFA0EFC81305F2
+:107580008400EF907FD4832409422AC6AA8700C1D1
+:107590002105C8C3228693855400EF10E03ABC2031
+:1075A00095E703A501ADEFA07FC649C903A501ADCD
+:1075B000814629466C00EFA02FC523AE09402392D7
+:1075C0000190B1B53245EF90FFE855BF0947639D83
+:1075D000E70003A5C1ADEFA07FC32DC181462946B9
+:1075E0006C0003A5C1ADC1BF1147639DE70003A5B2
+:1075F00081AEEFA0BFC139C1814629466C0003A509
+:1076000081AE55BF1947639DE70003A541AFEFA0C9
+:10761000FFBF0DC5814629466C0003A541AF61BF80
+:107620002947E39CE7F803A581B1EFA03FBE19C548
+:10763000814629466C0003A581B1B5BF3245EF9064
+:107640007FE1A5BFEF829FEBAA89EFB06F8E23A6E3
+:10765000A1AC03A581901389C1ACEFC00F8D930736
+:10766000703E63FCA700EFB0AF8C23920190B70788
+:10767000002023A4A19023AE0740854A114A370B6E
+:1076800000204E85EFD0EF8C630A55014E85EFD078
+:107690004F8C8547631BF5026F809FE9EFB04F89E0
+:1076A000832709001D8DE363AAFE83D7419003243D
+:1076B0000B424E85138717003E942392E190EFD042
+:1076C000CF8A08A0EFF09FD06DBFB707002083A737
+:1076D000C741F9D3EFF09FCFC1B7B7C70020096703
+:1076E000938787C11307075898CBD8CB98CFD8CFAB
+:1076F00098D38280B7C7002023ACA7C08280B7C7C9
+:10770000002003A5C7C18280B7C7002023AEA7C051
+:107710008280B7C7002003A507C28280B7C70020B8
+:1077200023A0A7C28280B7C7002003A547C28280DA
+:10773000B7C7002023A2A7C28280B7C7002003A535
+:1077400087C28280B7C7002023A4A7C28280B7C7A0
+:10775000002003A5C7C28280B7C7002023A6A7C206
+:107760008280B7C7002003A507C38280B7C7002067
+:1077700023A8A7C28280B7C7002003A547C3828081
+:10778000B7C7002023AAA7C28280B7C7002003A5DD
+:1077900087C38280B7C7002023ACA7C28280EF8254
+:1077A0001FD5014691451545EFA00F9F23A8A1AC19
+:1077B000014691451545EFA02F9E23AEA1AC014691
+:1077C00091451545EFA04F9D23A4A1AE01469145DB
+:1077D0001545EFA06F9C23AAA1AE01469145154522
+:1077E000EFA08F9B23ACA1B0014691451545EFA0BA
+:1077F000AF9A23A2A1B2014691451545EFA0CF99BA
+:1078000023A6A1B00D4681450545EFA0EF98938BC7
+:1078100041AD23A0AB000D4681450545EFA0CF97B4
+:10782000138B01AE2320AB000D4681450545EFA02B
+:10783000AF96938AC1AE23A0AA000D4681450545A7
+:10784000EFA08F95138A81AF2320AA000D468145B2
+:107850000545EFA06F94938901B123A0A9000D46BF
+:1078600081450545EFA04F931389C1B10D462320F3
+:10787000A90081450545EFA02F92938441B088C0AF
+:107880001D45EFA09FA9138401B0AA8508C003A5D8
+:107890000B00EFA09FA90C4003250B00EFA0FFA851
+:1078A0000C4003A50A00EFA05FA80C4003250A00C6
+:1078B000EFA0BFA70C4003A50900EFA01FA70C4035
+:1078C00003250900EFA07FA60C408840EFA0FFA58C
+:1078D0000D4681450545EFA02F8C81460146814527
+:1078E00023ACA1ACEFA04F920D4681450545EFA01A
+:1078F000AF8A81460146814523A2A1AEEFA0CF9079
+:107900000D4681450545EFA02F89814601468145F9
+:1079100023A8A1AEEFA04F8F0D4681450545EFA0EE
+:10792000AF8781460146814523AEA1AEEFA0CF8D42
+:107930000D4681450545EFA02F86814601468145CC
+:1079400023AAA1B0EFA04F8C0D4681450545EFA0BD
+:10795000AF8481460146814523A0A1B2EFA0CF8A22
+:107960000D4681450545EFA02F838146014681459F
+:1079700023A4A1B0EFA04F896F80FFBAEF82BFB9F7
+:1079800003A501B0FD55EFA03F9D138441AD1C4000
+:10799000639CA7020145EF90FFAB0545EFB0AF8BAD
+:1079A00001469305001037150140EFC06FC1084034
+:1079B0008145EFA0CFDA03A581AD8146014681451F
+:1079C000EFA08F846F807FB7138401AE1C40639952
+:1079D000A7020145EF901FA80545EFB0CF870146EC
+:1079E0009305000837150140EFC08FBD0840814561
+:1079F000EFA0EFD681460146814503A541AEC9B748
+:107A00001384C1AE1C406399A7020145EF909FA467
+:107A10000545EFB04F84014693050004371501403A
+:107A2000EFC00FBA08408145EFA06FD381460146F1
+:107A3000814503A501AF69B7138481AF1C40639AE8
+:107A4000A7020145EF901FA10545EFB0CF80371584
+:107A500001400146A16513050540EFC06FB608401F
+:107A60008145EFA0CFCF81460146814503A5C1AF37
+:107A700081BF138401B11C40639FA7000145EF90B3
+:107A80007F9D08408145EFA08FCD8146014681450D
+:107A900003A541B135B71384C1B11C40639FA70052
+:107AA0000145EF903F9B08408145EFA04FCB8146B9
+:107AB0000146814503A501B221B7138441B01C40A2
+:107AC000E392A7F00145EF90FF9808408145EFA0B1
+:107AD0000FC981460146814503A581B0D5B5EF8226
+:107AE0009FA303A501AD7D568145EFA0EFB085476B
+:107AF0006315F502AA8403A581ADFD55EFA02FC63D
+:107B00002A84631C950003A5C1A7FD55EFA02FC5CE
+:107B1000630585008327400002906F801FA2EF82DB
+:107B20009F9F03A5C1AD7D568145EFA0EFAC854772
+:107B30006315F502AA8403A541AEFD55EFA02FC23F
+:107B40002A84631C950003A541A8FD55EFA02FC111
+:107B5000630585008327400002906F801F9EEF829F
+:107B60009F9B03A581AE7D568145EFA0EFA8854779
+:107B70006315F502AA8403A501AFFD55EFA02FBE42
+:107B80002A84631C950003A5C1A8FD55EFA02FBD55
+:107B9000630585008327400002906F801F9AEF8263
+:107BA0009F9703A541AF7D568145EFA0EFA4854780
+:107BB0006315F502AA8403A5C1AFFD55EFA02FBA46
+:107BC0002A84631C950003A541A9FD55EFA02FB998
+:107BD000630585008327400002906F801F96EF8227
+:107BE0009F9303A581B17D568145EFA0EFA0854706
+:107BF000631DF5002A8403A541B1FD55EFA02FB602
+:107C0000631585008327400002906F801F93EF82E9
+:107C10009F9003A541B27D568145EFA0EF9D85471A
+:107C2000631DF5002A8403A501B2FD55EFA02FB313
+:107C3000631585008327400002906F801F90EF82BC
+:107C40009F8D03A5C1B07D568145EFA0EF9A854772
+:107C5000631DF5002A8403A581B0FD55EFA02FB068
+:107C6000631585008327400002906F801F8DEF828F
+:107C70009F8A03A541AD8145EFA00F876F80FF8BE1
+:107C8000EF827F8903A501AE8145EFA0EF856F806C
+:107C9000DF8AEF825F8803A5C1AE8145EFA0CF8464
+:107CA0006F80BF89EF823F8703A581AF8145EFA039
+:107CB000AF836F809F88EF821F8603A501B1814546
+:107CC000EFA08F826F807F87EF82FF8403A5C1B111
+:107CD0008145EFA06F816F805F86EF82DF8303A510
+:107CE00041B08145EFA04F806F803F85EF82BF821A
+:107CF00083A781B24111ADE3B707002003D6474106
+:107D0000854663FCC602370700200325074193051B
+:107D1000300537070020034805006313B802034805
+:107D200015009305C004631DB800232ED740EFA0B3
+:107D30003FA0B707002023ACA74041016F80EFFFB1
+:107D4000232E07407D1642064182239AC7409305A1
+:107D50001500EF00703FD5B705476397E702B707F7
+:107D6000002003A507413147B7070020342163668F
+:107D7000D700094723AEE740C9B723AE0740B7078E
+:107D8000002003D647417DBF0947639EE704B7063D
+:107D9000002003D646419147E3F1C7FAB707002018
+:107DA00003A507419305004058213C3122075D8F10
+:107DB000931787002183D98FC207C183370700201B
+:107DC00063EBF5008D46232ED74099073707002037
+:107DD0002313F7409DB77D1642064182232E0740AC
+:107DE000239AC640ADB70D476392E70437070020DA
+:107DF000B70700200356474183D76740E36FF6F289
+:107E0000B706002003A50641DD46AA9783C5F7FF04
+:107E1000B70700206394D5001147A9BF7D1642061D
+:107E2000418223AE0740231AC74015B71147E39696
+:107E3000E7F0B707002083A70741A033D02322042F
+:107E4000518C190442044180EF902FEB93070440BA
+:107E50006379F500B707002023AE07402392019015
+:107E6000E9BD13058400EF902FC62AC600C1AA877A
+:107E70002105C8C3B707002083A507422286EF006B
+:107E8000B02C03A541B2EFA06FB809C903A541B258
+:107E9000814629466C00EF903FB745B53245EF90DB
+:107EA0006FDB61BDEF828FE5AA8937040020EFA068
+:107EB0003F8823A6A1B2032584411389C1B2EFB044
+:107EC000DF869307703E63FEA700EFA07F86B707AB
+:107ED0000020239A0740B7070020232CA44023AE9C
+:107EE0000740854A114A370B0020B70400204E8511
+:107EF000EFC03F86630A55014E85EFC09F858547D9
+:107F0000631BF5026F80CFE2EFA09F8283270900F9
+:107F10001D8DE363AAFE83D7444103240B414E85A4
+:107F2000138717003E94239AE440EFC01F8408A0F3
+:107F3000EFF0DFDB6DBFB707002083A7C741F9D3A0
+:107F4000EFF0DFDAC1B7EF828FDA37040020835712
+:107F5000C43B411189E7EFA0AFFD23A8A1B2EFA078
+:107F60002FFD2A8A894A054B93093006B70B00205A
+:107F70005285EFB08FFB63E6AA0A03A54196EFC0D6
+:107F80004FFD6310650B8357C43B63FFF9068354B1
+:107F9000C43BEF908FD69387E4406364F506138566
+:107FA000E400EF906FB28354C43B2AC63707002029
+:107FB000938764001CC1930785005CC1930730055B
+:107FC0001CA59307C0041CB58325873B93D7840069
+:107FD0003CB59307D50044A52305050026863E85BC
+:107FE000EF0090162695DD471CA103A541B2EFA036
+:107FF000EFA129C903A541B2814629466C00EF9043
+:10800000BFA0231E043A25A883A48B3B03A5419659
+:1080100013871700BE94231EE43AEFC00FF588A023
+:1080200081BF0357C43B93073006E3E2E7F603A59D
+:1080300001B3EFB08FEF93072003E3EAA7F4410108
+:108040006F806FCE3245EF90EFC065BFEF822FCAD1
+:10805000370400208357C43C411189E7EFA04FED5E
+:1080600023AAA1B2EFA0CFEC2A8A894A054B930933
+:108070003006B70B00205285EFB02FEB63E6AA0A5B
+:1080800003A5C196EFC0EFEC6310650B8357C43CAA
+:1080900063FFF9068354C43CEF902FC69387E440F6
+:1080A0006364F5061385E400EF900FA28354C43C8B
+:1080B0002AC637070020938764001CC193078500F8
+:1080C0005CC1930730051CA59307C0041CB5894704
+:1080D0003CA58325873C93D784003CB59307D50006
+:1080E00044A526863E85EF0030062695DD471CA177
+:1080F00003A541B2EFA08F9129C903A541B28146E2
+:1081000029466C00EF905F902316043C25A883A4B9
+:108110008B3C03A5C19613871700BE942316E43C3D
+:10812000EFC0AFE488A081BF0357C43C930730067B
+:10813000E3E2E7F603A541B3EFB02FDF9307200397
+:10814000E3EAA7F441016F800FBE3245EF908FB094
+:1081500065BFEF82CFB9370400208357C43D41117A
+:1081600089E7EFA0EFDC23ACA1B2EFA06FDC2A8A95
+:10817000894A054B93093006B70B00205285EFB0B2
+:10818000CFDA63E6AA0A03A54197EFC08FDC63103C
+:10819000650B8357C43D63FFF9068354C43DEF90DC
+:1081A000CFB59387E4406364F5061385E400EF9050
+:1081B000AF918354C43D2AC63707002093876400DB
+:1081C0001CC1930785005CC1930730051CA593076C
+:1081D000C0041CB591473CA58325873D93D78400F7
+:1081E0003CB59307D50044A526863E85EF00C075B3
+:1081F0002695DD471CA103A541B2EFA02F8129C917
+:1082000003A541B2814629466C00EF90EFFF231E83
+:10821000043C25A883A48B3D03A541971387170031
+:10822000BE94231EE43CEFC04FD488A081BF035707
+:10823000C43D93073006E3E2E7F603A581B3EFB050
+:10824000CFCE93072003E3EAA7F441016F80AFADDF
+:108250003245EF902FA065BFEF826FA93704002051
+:108260008357C43E411189E7EFA08FCC23AEA1B262
+:10827000EFA00FCC2A8A894A054B93093006B70B29
+:1082800000205285EFB06FCA63E5AA0A03A5C19723
+:10829000EFC02FCC631F65098357C43E63FEF90608
+:1082A0008354C43EEF906FA59387E4406363F50663
+:1082B0001385E400EF904F818354C43E2AC63707EC
+:1082C0000020938764001CC1930785005CC193075D
+:1082D00030051CA59307C0041CB599473CA5832510
+:1082E000873E93D784003CB59307D50044A52686E6
+:1082F0003E85992D2695DD471CA103A541B2EF903F
+:10830000FFF029C903A541B2814629466C00EF90D0
+:10831000AFEF2316043E25A883A48B3E03A5C19787
+:1083200013871700BE942316E43EEFC00FC488A045
+:1083300089BF0357C43E93073006E3E3E7F603A57E
+:10834000C1B3EFB08FBE93072003E3EBA7F4410165
+:108350006F806F9D3245EF90EF8F65BFEF822F9951
+:10836000370400208357C440411189E7EFA04FBC78
+:1083700023A0A1B4EFA0CFBB2A8A894A054B930959
+:108380003006B70B00205285EFB02FBA63E5AA0A7A
+:1083900003A5C198EFC0EFBB631F65098357C440B5
+:1083A00063FEF9068354C440EF902F959387E44011
+:1083B0006363F5061385E400EF801FF18354C44026
+:1083C0002AC637070020938764001CC193078500E5
+:1083D0005CC1930730051CA59307C0041CB5A947D1
+:1083E0003CA58325874093D784003CB59307D500EF
+:1083F00044A526863E85892B2695DD471CA103A52D
+:1084000041B2EF90BFE029C903A541B28146294698
+:108410006C00EF906FDF2316044025A883A48B40E7
+:1084200003A5C19813871700BE942316E440EFC03C
+:10843000CFB388A089BF0357C44093073006E3E356
+:10844000E7F603A501B4EFB04FAE93072003E3EBCB
+:10845000A7F441016F802F8D3245EF80BFFF65BFCC
+:10846000797122D4135475014ECE52CC93199500D4
+:1084700006D626D24AD056CA5AC81374F40F93D9D6
+:108480009900135AF50169C49307F00F6308F40EBD
+:108490009397390037070004B3E9E700130414F891
+:1084A0008144014B13D77501939A95001377F70F09
+:1084B00093DA9A0013D9F50145CF9307F00F630CB7
+:1084C000F7028E0A130717F8B7070004B3EAFA0099
+:1084D0003A94014633452A01BD47AA869305140004
+:1084E00063E0971017270000130787AE8A04BA9439
+:1084F0009C40BA9782871304F40F63960A0C93E4A6
+:1085000024000946C1BF01451307F00FB70740001B
+:10851000B2502254A6075E07A5837E05D98F9254D8
+:108520000259F249624AD24A424B5D8D45618280CE
+:10853000CA86D689328B8947630FFB088D47E304CF
+:10854000FBFC854736856310FB1A01478147C9B795
+:10855000639D090413D77501939A95001377F70F5C
+:1085600091440144054B93DA9A0013D9F50131F790
+:10857000639D0A0093E414000546A9BF63920902B3
+:10858000A1441304F00F094B31BF5685B926930758
+:10859000B5FF098CB39AFA001304A4F801461DBF75
+:1085A000B1441304F00F0D4BF5BD4E852EC6352694
+:1085B0009307B5FF1304A0F8B399F900098C81441F
+:1085C000014BB245C5B593E434000D4621B7894748
+:1085D000D286E315FBF636851307F00F81470DBFF2
+:1085E00041639306F3FF13D6090193D80A01B3F749
+:1085F000D900B3FADA0033885703B389F802135766
+:108600000801B30A5603D6994E97330616036373CF
+:1086100057011A96C167FD17B376F7003378F80053
+:10862000C206C2969399660093570701B339300189
+:10863000E982B2979A07B3E6D900B3E9D7009397D6
+:10864000490063D9070013D7190093F71900B369DC
+:10865000F7002E841307F4076350E00493F77900C2
+:1086600099C793F7F90091466383D70091099397CF
+:10867000490063D90700B70700F8FD17B3F9F900FF
+:10868000130704089307E00F63CBE704939769008F
+:10869000A5831377F70FADBD8547B386E74011C7B4
+:1086A0006D4601478147E345D6E61307E409339752
+:1086B000E9003337E000B3D7D900D98F13F777003B
+:1086C00019C713F7F70091466303D7009107139773
+:1086D0005700634C07009A07A583014715BD130790
+:1086E000F00F814735B52E84B5B7054781470DB5E5
+:1086F00013577501370680009307F6FF1377F70FBE
+:108700009305E007B3F6A7009357F501014563F41D
+:10871000E50099C3828082809307E0097D55E3EBF1
+:10872000E7FE93055009B3E7C60063D7E5001307DA
+:10873000A7F63395E7008280130560093307E5400B
+:1087400033D5E7008280411106C622C426C20DCD72
+:108750009357F54133C4A7001D8CAA842285B52AFE
+:108760009307E0093387A74093076009FD8063CC36
+:10877000E702A1469377F70F63D5A600611533147E
+:10878000A4002604258021A08144814701442604B9
+:1087900013559400B2402244DE07FE045D8D458DE2
+:1087A0009244410182809307900963DDE7009307BB
+:1087B000B5019546B317F400898E3354D400B3370E
+:1087C000F0005D8C954763D6A7009307B5FF33147F
+:1087D000F400B70600FCFD16937774003376D400DE
+:1087E00085C39377F4009145638CB7001106931706
+:1087F000560063D707009307F009758E3387A740AB
+:108800001314660025809377F70F51B7411106C600
+:1088100022C415CD2A84D1209307E0093387A740CD
+:108820009307600963C0E704A1469377F70F63D508
+:10883000A60061153314A4002604258026041355D0
+:108840009400B2402244DE075D8D410182800144E4
+:10885000260413559400B24022448147DE075D8D03
+:10886000410182809307900963DDE7009307B5011A
+:108870009546B317F400898EB337F0003354D40013
+:108880005D8C954763D6A7009307B5FF3314F400BA
+:10889000B70600FCFD16937774003376D40085C3C9
+:1088A0009377F4009145638CB70011069317560037
+:1088B00063D707009307F009758E3387A740131419
+:1088C00066002580260413559400B2402244937715
+:1088D000F70FDE075D8D41018280C167637CF50281
+:1088E0009307F00F1307000263EBA7009717000030
+:1088F00093870772AA9788233305A7408280218136
+:10890000971700009387C770AA978823614733059C
+:10891000A7408280B7070001636DF500618197175A
+:1089200000009387E76EAA97882321473305A74065
+:1089300082804181971700009387876DAA978823CB
+:1089400041473305A7408280B3C7A5008D8B33070D
+:10895000C50081E78D4763EDC700AA87637EE50800
+:10896000942185078505A38FD7FEE3EBE7FE828080
+:1089700093763500AA8789CA942185078505A38F38
+:10898000D7FE93F63700C5BF9376C7FF138606FE62
+:1089900063F0C70683A3050083A2450083AF85006B
+:1089A00003AFC50083AE050103AE450103A38501F6
+:1089B00083A8C5019385450223A0770003A8C5FFBE
+:1089C00023A2570023A4F70123A6E70123A8D70178
+:1089D00023AAC70123AC670023AE17019387470280
+:1089E00023AE07FF75B790419107910523AEC7FEEF
+:1089F000E3EBD7FEE3E6E7F6828039713EDA2ED26A
+:108A000032D436D63AD842DC46DE9387418122CC36
+:108A1000804326CA06CEAA8409C41C4C99E3228549
+:108A2000FD290C4454102686228536C6EF0090138B
+:108A3000F2406244D24421618280011126CA4AC8B0
+:108A400006CE22CC4EC652C4AA842E8901C51C4D26
+:108A500091E3F1219C4C804499E32685C921971725
+:108A600000009387E76C631BF402C0405E24A18B77
+:108A7000B1C71C48A1C7FD59294A1C4483450900B8
+:108A8000FD17B1E91CC463DD07062286A9452685CA
+:108A90006920FD576308F502294535A097170000A6
+:108AA0009387076B6314F4008044C9B797170000DD
+:108AB00093870766E31CF4FAC0444DBFA285268560
+:108AC000192A55D97D55F2406244D2444249B249EF
+:108AD000224A056182801CC4050963D70700184C2F
+:108AE00063CAE700638845011C401387170018C05C
+:108AF0008CA361B7228626850D20E31035F9D9B7FE
+:108B00001C401387170018C0294798A371B7938793
+:108B10004181AA8588436FF05FF2011122CC26CAF9
+:108B20004AC806CE4EC6AA842E89328401C51C4D81
+:108B300091E3F526971700009387875F6317F40684
+:108B4000C0401C4C1CC45E24A18BC1C31C48B5CFC3
+:108B50001C4808409379F90F1379F90F1D8D5C4873
+:108B60006346F500A2852685692C25E51C4405058C
+:108B7000FD171CC41C401387170018C02380370141
+:108B80005C486388A7005E24858B81CBA947631668
+:108B9000F900A2852685B5240DEDF24062444A8590
+:108BA000D2444249B24905618280971700009387F9
+:108BB000275A6314F400804469B79717000093871D
+:108BC0002755E310F4F8C044ADBFA28526852120C7
+:108BD00041D17D59D9B741119387418126C2844340
+:108BE00022C44AC006C62A892E8489C49C4C99E3B3
+:108BF000268535269717000093878753631BF40259
+:108C0000C0400317C40093170701C18393F6870080
+:108C1000ADEA93F6070195EEA5472320F900136707
+:108C200007045AA47D55B2402244924402494101AE
+:108C30008280971700009387A7516314F400804443
+:108C4000C9B7971700009387A74CE31CF4FAC044F8
+:108C50004DBF918B9DC34C5889C9930744046384CD
+:108C6000F5004A85292B232A04025E2423220400CE
+:108C700093F7B7FD5EA41C481CC05E2493E78700F1
+:108C80005EA41C4899EB5E241307002093F7072885
+:108C90006385E700A2854A8591295E2413F71700B2
+:108CA0001DC35C4823240400B307F0401CCC1C48BF
+:108CB0000145B5FB8317C40013F707082DD793E7C9
+:108CC00007045EA485B7898B014791E3584818C40F
+:108CD000F9BFDE25011122CC26CA06CE4AC84EC6EF
+:108CE00013F78700AA842E8479EBD841634DE00006
+:108CF000B841634AE0000145F2406244D24442492F
+:108D0000B2490561828058547DD703A90400939627
+:108D1000370123A0040063DB060670485E24918BB4
+:108D200099C75C401D8E5C5899C33C401D8E5C54B5
+:108D30000C50814626858297FD575A24631DF50005
+:108D40009440F54763E8D706B70740208507B3D7B7
+:108D5000D700858BA5C31C48232204001CC0931791
+:108D6000370163D80700FD576314F5009C4091E379
+:108D700068C84C5823A02401BDDD930744046384D4
+:108D8000F5002685ED2E232A0402B5B70C500146C6
+:108D9000854626850297FD572A86E311F5F89C4003
+:108DA000B5DF75476385E70059476393E70423A060
+:108DB000240191B7136707045AA47D5535BF83A9D1
+:108DC0000501E38A09F203A905008D8B23A0350173
+:108DD00033093941014791E3D84918C4E35D20F1D3
+:108DE0001C540C50CA864E86268582976347A00085
+:108DF0005E2493E707045EA4C9B7AA993309A94082
+:108E0000F1BF9C49A5C3011122CC06CE2A8411C50D
+:108E10001C4D81E72EC62122B2459717000093878B
+:108E20002731639CF5004C408397C5009DC7228580
+:108E30006244F24005616FF0DFE997170000938705
+:108E400027316394F5000C44C5B79717000093874A
+:108E5000272CE39BF5FC4C44C1BFF2406244014522
+:108E60000561828001458280411122C406C62A84A0
+:108E70004EA572A52320050023220500232405000A
+:108E80002322050623280500232A0500232C05009C
+:108E9000214681451305C505EF70EFEA97170000DD
+:108EA000938707B35CD097170000938727B51CD42E
+:108EB00097170000938707B95CD497170000938732
+:108EC00067BB00D01CD8B240224441018280970584
+:108ED0000000938545F391AA411126C2130680062E
+:108EE0009384F5FFB384C4024AC02E8922C406C607
+:108EF000938544070D2E2A8401CD232005002322CB
+:108F00002501310508C4138684068145EF70AFE35F
+:108F10002285B240224492440249410182801C4D84
+:108F2000A5E7411106C622C497070000938767FA98
+:108F30001CD59387C1819C43232405042326050463
+:108F4000232805046314F50085471CCD2A843528A1
+:108F500048C022851D2808C42285052848C44840E9
+:108F600001469145EFF05FF008440546A545EFF056
+:108F7000BFEF48440946C945EFF01FEF85471CCCB9
+:108F8000B240224441018280828041119387C18195
+:108F900026C284434AC006C69C4C22C42A8981E763
+:108FA0002685EFF0DFF7938484048044DC40FD17CE
+:108FB00063D607009C40B9CF8440C5BF0317C400E7
+:108FC00039E7C177850723220406232004002322E2
+:108FD0000400232404005CC423280400232A040082
+:108FE000232C0400214681451305C405EF70AFD53D
+:108FF000232A0402232C0402232404042326040429
+:109000002285B240224492440249410182801304E5
+:10901000840671BF91454A85EFF01FEC88C049FD79
+:10902000B1472320F9000144E1BF797122D44AD02D
+:1090300052CC56CA5AC85EC606D626D24ECE2A8A08
+:10904000AE8A130485040149054BFD5B09ECB2505F
+:1090500022544A8592540259F249624AD24A424BFA
+:10906000B24B45618280044483294400FD1963D4D6
+:1090700009000040E1BFDE24637BFB008397E4002E
+:1090800063877701A6855285829A3369A900938404
+:109090008406E9BF1971A6DAAE848395E500A2DCE7
+:1090A00086DE328463DB0500DE2423A0060093F70E
+:1090B000070885E7930700401DA0300836C6EF007B
+:1090C000F021B246E34205FE7247BD67F98F79771A
+:1090D000BA9793B717009CC2F1BF930700041CC056
+:1090E000F6506654D654014509618280DE2501118F
+:1090F00022CC06CE26CA4AC8898B2E8489CF9307F4
+:1091000074041CC01CC885475CC8F2406244D24449
+:1091100042490561828074003000AA84EFF09FF715
+:10912000A2452A892685012219E98317C40013F76D
+:10913000072061FFF19B93E727005EA4C9B797075B
+:109140000000938707D99CD45E2408C008C893E721
+:1091500007085EA4A2475CC8B24781CF8315E4002C
+:109160002685EF00D01A11C55E24F19B93E7170006
+:109170005EA45E243369F9002316240179B7DDC1AA
+:1091800083A7C5FF411122C406C626C21384C5FFAA
+:1091900063D307003E94AA84EF00301F938741B445
+:1091A0009C4381EF2322040023A281B42244B240D5
+:1091B0002685924441016F00701D637EF4001440C7
+:1091C0003307D4006396E7009843DC43369718C012
+:1091D0005CC0D9BFBA87D84319C3E37DE4FE94438A
+:1091E0003386D700631F86001040B29694C333863F
+:1091F000D700E31DC7FA10435843B29694C3D8C3AF
+:1092000075B76375C400B1479CC04DB71040B30635
+:10921000C4006316D70014435843B29614C058C014
+:10922000C0C369B78280011126CA93843500F198C2
+:1092300006CE22CC4AC84EC6A104B14763F3F4045B
+:10924000B14463E2B4042A89EF003014938741B437
+:1092500098433A8439E0938781B49C4391E78145F0
+:109260004A85252F23A4A1B4A6854A853D27FD590B
+:1092700063193507B1472320F9004A85EF00101123
+:1092800029A0E3D004FCB1471CC10145F24062446F
+:10929000D2444249B249056182801C40858F63CF28
+:1092A0000702AD4663F6F6001CC03E9404C031A030
+:1092B0005C406313870223A2F1B44A85EF00100DCE
+:1092C0001305B4009307440061993307F5405DDF4F
+:1092D0003A94898F1CC05DBF5CC3C5B722874040EC
+:1092E00095BF130435007198E30285FCB305A440D3
+:1092F0004A856525E31C35FBB5BF1C46FD171CC61A
+:1093000063DA0700184E63C5E700A9476394F500C8
+:109310006FF0BF801C422E851387170018C28CA3E4
+:109320008280011122CC26CA4AC84EC652C406CE3B
+:109330002A89AE893284B304D6007D5A631494001E
+:10934000014509A80C204E864A85EFF01FFB050455
+:10935000E31645FFF2406244D2444249B249224AF0
+:1093600005618280357122CD26CB4AC94EC706CF12
+:1093700052C556C35AC1DEDEE2DCE6DAAA89AE8403
+:109380003289368409C51C4D99E3EFF05FB9971710
+:1093900000009387E7D96398F40C83A44900DE2486
+:1093A000A18BE5C79C48F5C393070002A304F10213
+:1093B0009307000302D22305F10222C6930B500249
+:1093C000971A0000938ACADA054C294B4A841C205C
+:1093D00099C3639F770DB30C2441638E0C00E6861E
+:1093E0004A86A6854E85EFF0DFF3FD57630FF51C27
+:1093F0009256E69636D21C206389071CFD57130946
+:10940000140002C802CE3ECA02CCA309010482D4D1
+:109410008345090015465685A92F13041900C24734
+:1094200051E913F7070109C713070002A309E10473
+:1094300013F7870009C71307B002A309E1048346A5
+:1094400009001307A002638FE606F2474A848146AB
+:109450002546182093051400130707FD6377E60AD5
+:10946000B5CA3ECE85A897170000938767CE63954F
+:10947000F40083A4890025B797170000938747C994
+:10948000E39FF4F083A4C90019BFA6854E85EFF0D1
+:109490008FF419D97D55FA406A44DA444A49BA49E9
+:1094A0002A4A9A4A0A4BF65B665CD65C0D6182805A
+:1094B000050431BF330555413315AC00C98F3EC893
+:1094C0002289B9B7324793064700184336C6634727
+:1094D00007023ACE18209307E002631DF704183004
+:1094E0009307A002631BF702B247090413874700E2
+:1094F0009C433AC663C107023ECA2DA83307E04029
+:1095000093E727003ACE3EC8F1B7B3876703854695
+:109510002E84BA973DBFFD57C5B7050402CA8146E0
+:1095200081472546182093051400130707FD63742F
+:10953000E606F9F20C200D46171500001305C5C309
+:109540000D2D11CD97170000938707C31D8D93072D
+:109550000004B397A700424505045D8D2AC80C207E
+:10956000194617150000130565C1130914002304DB
+:10957000B102012535C19777FFFF9387A7A895E72B
+:109580004247B2471377071009CF91073EC692575B
+:10959000D2973ED225BDB387670385462E84BA97FE
+:1095A00051B79D07E19BA107D5B77800970600004A
+:1095B000938666D726860C084E8597000000E70044
+:1095C0000000FD572A8AE314F5FCDE2493F7070414
+:1095D000E39207EC1255C1B5780097060000938618
+:1095E00086D426860C084E85012AE1BF797156CAB9
+:1095F0009C49BA8A984522D426D24ECE52CC06D661
+:109600004AD05AC85EC6AA892E84B284368A63D3E9
+:10961000E700BA879CC00347340419C385079CC080
+:109620001C4093F7070281C79C4089079CC003290F
+:10963000040013796900631A0900130B9401FD5BA0
+:109640005C449840998F634CF9041C408346340471
+:1096500093F70702B336D000A5EB13063404D28586
+:109660004E85829AFD576303F5041C4011469840CD
+:10967000998B544481446397C700B384E64063D315
+:10968000040081441C4418486354F700998FBE9429
+:10969000014969047D5B63982405014509A8854655
+:1096A0005A86D2854E85829A631E75017D55B250C9
+:1096B000225492540259F249624AD24A424BB24B66
+:1096C000456182800509ADBF3307D400130600034E
+:1096D000A301C7040347540493871600A297890681
+:1096E000A381E7049DBF85462286D2854E85829A56
+:1096F000E30E65FB050945B7797122D426D24AD01D
+:109700004ECE06D652CC56CA5AC8B689942D930767
+:1097100090063289AA842E8413863504638DF6025E
+:1097200063E2D706930780056386F61863EDD700DA
+:10973000638E062093073004638EF60A930A24048E
+:109740002301D404C9A0930730066385F60A930762
+:109750004006E395F6FE1C40084393F60708930580
+:109760004500C5C61C410CC363D807001307D002CF
+:10977000B307F040A301E40497160000938686A087
+:10978000294765A8930700076382F61663E5D702A9
+:109790009307E0066389F6189307F006E390F6FA5C
+:1097A0000C401C4313F8050813854700630708069F
+:1097B00008C39C4385A893075007E383F6FE9307ED
+:1097C00080076389F61293073007E399F6F61C4386
+:1097D000D04181459386470014C383AA070056856C
+:1097E000492E01C53305554148C05C401CC8A30142
+:1097F000040461A81C43930A2404938647009C43F5
+:1098000014C32301F4048547D5B793F607041C411C
+:109810000CC3B9DAC207C18781BF93F5050408C339
+:10982000C9D99E231307F0066387E60E971600003A
+:10983000938646952947A30104044C400CC463C594
+:10984000050008406D9908C099E3B28A89CDB28AB3
+:10985000B3F5E702FD1AB6958C212380BA00B3D583
+:10986000E70263F0E70CA147631EF7001C40858BFD
+:1098700091CB58401C4863C7E70093070003A38FB0
+:10988000FAFEFD1A3306564110C84E87CA8670008C
+:10989000A2852685EFF09FD57D5A631D450B7D552A
+:1098A000B250225492540259F249624AD24A424B6F
+:1098B00045618280A382D504971600009386868C2A
+:1098C0000C40084313F805081C411105630D0802FC
+:1098D00008C313F7150001C793E505020CC0414703
+:1098E000B9FB0C4093F5F5FD0CC0B1B79C4193E773
+:1098F00007029CC193078007A302F4049716000097
+:109900009386868975BF13F8050408C3E30308FC32
+:10991000C207C1837DBF971600009386A6862147A4
+:1099200019BFAE8735B794411C43CC4913F80608DC
+:10993000138547006306080008C39C438CC339A005
+:1099400008C393F606049C43F5DA8EA3232804008B
+:10995000B28A25BF14485686CA8526858299E300B7
+:1099600045F51C40898B8DE7B2474844E35AF5F230
+:109970003E853DB785465686CA8526858299E30091
+:1099800065F3050A5C443247998FE345FAFEE9BF67
+:10999000014A930A94017D5BF5B7411122C42A84E0
+:1099A0002E859727002023AD072806C6EF907FBF9E
+:1099B000FD576319F50097270020938767289C437C
+:1099C00091C31CC0B240224441018280411122C493
+:1099D0002E848395E50006C65D2A634905007C4810
+:1099E000AA977CC8B2402244410182805E247D77E0
+:1099F0007D17F98F5EA4FDB7DE25011122CC26CAA2
+:109A00004AC84EC606CE93F70710AA842E84328920
+:109A1000B68991C78395E500894601460D225E24EB
+:109A20007D777D17F98F5EA48315E4006244F240D0
+:109A3000CE864A86B24942492685D244056125A888
+:109A4000411122C42E848395E50006C6CD28FD571A
+:109A50005A24631AF500FD77FD17F98F5EA4B24012
+:109A60002244410182808567D98F5EA468C8C5BF42
+:109A70008395E50025A8411122C42A842E85B2854C
+:109A800036869727002023AD071A06C6EF909FADB4
+:109A9000FD576319F500972700209387671A9C43A9
+:109AA00091C31CC0B240224441018280411122C4B2
+:109AB0002A842E859727002023A4071806C6112282
+:109AC000FD576319F50097270020938767179C437C
+:109AD00091C31CC0B240224441018280411122C482
+:109AE0002A842E85B2859727002023AB071406C64B
+:109AF000CD20FD576319F500972700209387471461
+:109B00009C4391C31CC0B240224441018280411158
+:109B100022C42A842E859727002023A3071206C675
+:109B2000C920FD576319F500972700209387471137
+:109B30009C4391C31CC0B240224441018280411128
+:109B400022C42A842E85B28536869727002023A931
+:109B5000070E06C67928FD576319F50097270020E0
+:109B60009387070E9C4391C31CC0B240224441011D
+:109B7000828093F5F50F2A966314C5000145828013
+:109B80001C21E38EB7FE0505C5BF8280828041118E
+:109B900022C42A842E85B28536869727002023A1E9
+:109BA000070A06C6B928FD576319F5009727002054
+:109BB000938707099C4391C31CC0B24022444101D2
+:109BC00082809307800517270020232BF7067D55F9
+:109BD000828093078005172700202323F7067D55F1
+:109BE00082809307800517270020232BF704014567
+:109BF000828093078005172700202323F7047D55D3
+:109C000082809307800517270020232BF7027D55BC
+:109C1000828000006D6570633A253038780A000054
+:109C20006D63617573653A253038780A000000006D
+:109C30006D7476616C3A253038780A005379737404
+:109C4000656D436C6B3A25640D0A000043686970CA
+:109C500049443A253038780D0A0000005631302E3C
+:109C6000342E36004672656552544F53204B657250
+:109C70006E656C2056657273696F6E3A25730D0AB6
+:109C80000000000073686F756C646E277420727535
+:109C90006E20617420686572652121002E2E2F468A
+:109CA00072656552544F532F706F727461626C65A8
+:109CB0002F4D656D4D616E672F686561705F342E45
+:109CC00063000000657272206174206C696E65200B
+:109CD0002564206F662066696C6520222573222E1C
+:109CE000200D0A20000000002E2E2F4672656552BE
+:109CF000544F532F706F727461626C652F474343EA
+:109D00002F524953432D562F706F72742E630000EB
+:109D10002E2E2F4672656552544F532F71756575FF
+:109D2000652E63002E2E2F4672656552544F532FB9
+:109D30007461736B732E630049444C45000000004E
+:109D4000B0320000B0320000F0320000FC320000FF
+:109D500040330000B0320000B0320000F0320000AA
+:109D6000FC320000546D7251000000002E2E2F4670
+:109D700072656552544F532F74696D6572732E630B
+:109D800000000000546D7220537663006740533A20
+:109D9000473C113C6740D33A4A3154696D657200C3
+:109DA0004A3354696D6572004A3554696D657200B5
+:109DB0004A3754696D6572004A3854696D6572009E
+:109DC0004A3954696D6572005B494E464F5D205BB0
+:109DD00025733A25645D2078506F72744765744628
+:109DE0007265654865617053697A65203A2025641B
+:109DF0000D0A00004A315472616E736D69745461CA
+:109E0000736B00004A335472616E736D69745461F0
+:109E1000736B00004A355472616E736D69745461DE
+:109E2000736B00004A375472616E736D69745461CC
+:109E3000736B00004A385472616E736D69745461BB
+:109E4000736B00004A395472616E736D69745461AA
+:109E5000736B0000736C6176654D63755472616E4F
+:109E6000736D69745461736B00000000736C6176EC
+:109E700065467265654D656D6F72795461736B00EF
+:109E8000736C6176654D6375446174615061727382
+:109E900065000000736C6176653438354461746127
+:109EA0005061727365000000736C6176654F746871
+:109EB00065725461736B00004A3054696D657200BD
+:109EC0004A3254696D6572004A3454696D65720096
+:109ED0004A3654696D6572004A305472616E736D12
+:109EE00069745461736B00004A325472616E736D11
+:109EF00069745461736B00004A345472616E736DFF
+:109F000069745461736B00004A365472616E736DEC
+:109F100069745461736B00004C6F72615472616EAE
+:109F2000736D69745461736B0000000053753830B1
+:109F3000365472616E736D69745461736B00000006
+:109F4000486F73744D63755472616E736D697454A8
+:109F500061736B00686F7374467265654D656D6FF4
+:109F600072795461736B0000686F73744D6375444C
+:109F70006174615461736B00686F737453656E73C1
+:109F80006F72446174615461736B0000686F737425
+:109F900052656376536C6176654461746154617394
+:109FA0006B00000064617461436F6C6C656374697D
+:109FB0006F6E5461736B0000686F73744F746865E3
+:109FC000725461736B0000000000204114E6FFFF33
+:109FD00066E5FFFF66E5FFFF64E5FFFF6AE5FFFF5B
+:109FE0006AE5FFFF3AE5FFFF64E5FFFF6AE5FFFF73
+:109FF0003AE5FFFF6AE5FFFF64E5FFFF02E6FFFFCA
+:10A0000002E6FFFF02E6FFFF3AE5FFFF0001020262
+:10A010000303030304040404040404040505050500
+:10A0200005050505050505050505050506060606DC
+:10A0300006060606060606060606060606060606C0
+:10A0400006060606060606060606060607070707AC
+:10A050000707070707070707070707070707070790
+:10A060000707070707070707070707070707070780
+:10A070000707070707070707070707070707070770
+:10A08000070707070707070707070707080808085C
+:10A090000808080808080808080808080808080840
+:10A0A0000808080808080808080808080808080830
+:10A0B0000808080808080808080808080808080820
+:10A0C0000808080808080808080808080808080810
+:10A0D0000808080808080808080808080808080800
+:10A0E00008080808080808080808080808080808F0
+:10A0F00008080808080808080808080808080808E0
+:10A1000008080808080808080808080800000000EF
+:10A11000000000000000000000000000000000003F
+:10A12000000000000000000000000000000000002F
+:10A13000000000000000000000000000000000001F
+:10A14000000000000000000000000000000000000F
+:10A1500000000000000000000000000000000000FF
+:10A16000000000000000000000000000232D302B44
+:10A1700020000000686C4C0065666745464700009B
+:10A18000303132333435363738394142434445462D
+:10A1900000000000303132333435363738396162EF
+:08A1A000636465660000000025
+:10A1A800000000000000000001020304060708097F
+:10A1B8000000000001020304010203040607080965
+:10A1C80000000000000000008025000000000000E2
+:10A1D8000000000000000000000000000000000077
+:10A1E80000000000000000000100000080250000C1
+:10A1F8000000000000000000000000000000000057
+:10A208000000000000000000000000000200000044
+:10A218008025000000000000000000000000000091
+:10A228000000000000000000000000000000000026
+:10A23800030000008025000000000000000000006E
+:10A248000000000000000000000000000000000006
+:10A25800000000000400000080250000000000004D
+:10A2680000000000000000000000000000000000E6
+:10A27800000000000000000005000000802500002C
+:10A2880000000000000000000000000000000000C6
+:10A2980000000000000000000000000006000000B0
+:10A2A8008025000000000000000000000000000001
+:10A2B8000000000000000000000000000000000096
+:10A2C8000700000000C201000000000000000000BC
+:10A2D8000000000000000000000000000000000076
+:10A2E800000000000800000000C20100000000009B
+:10A2F8000000000000000000000000000000000056
+:10A308000000000001000000585F0000020000008B
+:10A31800465F000003000000345F000004000000F6
+:10A32800225F000005000000105F0000060000002A
+:10A33800FE5E000001000000E25F00000200000075
+:10A34800CA5F000003000000B25F000004000000C4
+:10A358009A5F000005000000825F00000600000010
+:10A368006A5F0000000000000271000001000000A8
+:10A37800E270000002000000C2700000030000004C
+:10A38800B470000004000000A67000000500000082
+:10A3980098700000060000008A70000007000000A6
+:10A3A8007C700000080000006E70000009000000CA
+:10A3B800607000000A000000527000000B000000EE
+:10A3C800447000000C000000307000000D00000018
+:10A3D8001C7000000E000000087000000F00000054
+:10A3E800F46F000010000000E06F000003000000A0
+:10A3F8002C720000040000001A7200000500000022
+:10A408000872000006000000F67100000700000056
+:10A41800E471000008000000D2710000090000008B
+:10A42800C07100000A000000AE7100000B000000BF
+:10A438009C7100000C000000847100000D000000F9
+:10A448006C7100000E000000547100000F00000045
+:10A458003C710000100000002071000000000000A6
+:10A468002CA100004CA100000CA10000000000007D
+:10A4780000000000000000000000000000000000D4
+:10A4880000000000000000000000000000000000C4
+:10A4980000000000000000000000000000000000B4
+:10A4A80000000000000000000000000000000000A4
+:10A4B8000000000000000000000000000000000094
+:10A4C800006CDC0202040608AAAAAAAA0900000075
+:10A4D80040BC0020BC02002000000120BC0200207B
:00000001FF
diff --git a/CH32V303-FreeRTOS/obj/CH32V303-FreeRTOS.lst b/CH32V303-FreeRTOS/obj/CH32V303-FreeRTOS.lst
index a5769c1..7019bcd 100644
--- a/CH32V303-FreeRTOS/obj/CH32V303-FreeRTOS.lst
+++ b/CH32V303-FreeRTOS/obj/CH32V303-FreeRTOS.lst
@@ -7,10 +7,10 @@ start address 0x00000000
Program Header:
LOAD off 0x00001000 vaddr 0x00000000 paddr 0x00000000 align 2**12
- filesz 0x000084e4 memsz 0x000084e4 flags r-x
- LOAD off 0x0000a000 vaddr 0x20000000 paddr 0x000084e4 align 2**12
- filesz 0x00000220 memsz 0x00007528 flags rw-
- LOAD off 0x0000a800 vaddr 0x20007800 paddr 0x20007800 align 2**12
+ filesz 0x0000a1a8 memsz 0x0000a1a8 flags r-x
+ LOAD off 0x0000c000 vaddr 0x20000000 paddr 0x0000a1a8 align 2**12
+ filesz 0x00000340 memsz 0x0000bc40 flags rw-
+ LOAD off 0x0000c800 vaddr 0x2000f800 paddr 0x2000f800 align 2**12
filesz 0x00000000 memsz 0x00000800 flags rw-
Sections:
@@ -19,52 +19,52 @@ Idx Name Size VMA LMA File off Algn
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .vector 000001bc 00000004 00000004 00001004 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
- 2 .text 000082e4 00000200 00000200 00001200 2**8
+ 2 .text 00009fa8 00000200 00000200 00001200 2**8
CONTENTS, ALLOC, LOAD, READONLY, CODE
- 3 .fini 00000000 000084e4 000084e4 0000a220 2**0
+ 3 .fini 00000000 0000a1a8 0000a1a8 0000c340 2**0
CONTENTS, ALLOC, LOAD, CODE
- 4 .dalign 00000000 20000000 20000000 0000a220 2**0
+ 4 .dalign 00000000 20000000 20000000 0000c340 2**0
CONTENTS
- 5 .dlalign 00000000 000084e4 000084e4 0000a220 2**0
+ 5 .dlalign 00000000 0000a1a8 0000a1a8 0000c340 2**0
CONTENTS
- 6 .data 00000220 20000000 000084e4 0000a000 2**2
+ 6 .data 00000340 20000000 0000a1a8 0000c000 2**2
CONTENTS, ALLOC, LOAD, DATA
- 7 .bss 00007308 20000220 00008704 0000a220 2**2
+ 7 .bss 0000b900 20000340 0000a4e8 0000c340 2**2
ALLOC
- 8 .stack 00000800 20007800 20007800 0000a800 2**0
+ 8 .stack 00000800 2000f800 2000f800 0000c800 2**0
ALLOC
- 9 .debug_info 00029d09 00000000 00000000 0000a220 2**0
+ 9 .debug_info 00032fc0 00000000 00000000 0000c340 2**0
CONTENTS, READONLY, DEBUGGING
- 10 .debug_abbrev 00006837 00000000 00000000 00033f29 2**0
+ 10 .debug_abbrev 000079f0 00000000 00000000 0003f300 2**0
CONTENTS, READONLY, DEBUGGING
- 11 .debug_aranges 000013c0 00000000 00000000 0003a760 2**3
+ 11 .debug_aranges 000016b8 00000000 00000000 00046cf0 2**3
CONTENTS, READONLY, DEBUGGING
- 12 .debug_ranges 00001b00 00000000 00000000 0003bb20 2**3
+ 12 .debug_ranges 00001df0 00000000 00000000 000483a8 2**3
CONTENTS, READONLY, DEBUGGING
- 13 .debug_line 00020b81 00000000 00000000 0003d620 2**0
+ 13 .debug_line 00025bf4 00000000 00000000 0004a198 2**0
CONTENTS, READONLY, DEBUGGING
- 14 .debug_str 000063b3 00000000 00000000 0005e1a1 2**0
+ 14 .debug_str 00006cc1 00000000 00000000 0006fd8c 2**0
CONTENTS, READONLY, DEBUGGING
- 15 .comment 00000033 00000000 00000000 00064554 2**0
+ 15 .comment 00000033 00000000 00000000 00076a4d 2**0
CONTENTS, READONLY
- 16 .debug_frame 000040bc 00000000 00000000 00064588 2**2
+ 16 .debug_frame 00004b10 00000000 00000000 00076a80 2**2
CONTENTS, READONLY, DEBUGGING
- 17 .debug_loc 0000a6b6 00000000 00000000 00068644 2**0
+ 17 .debug_loc 0000ae03 00000000 00000000 0007b590 2**0
CONTENTS, READONLY, DEBUGGING
- 18 .stab 00000084 00000000 00000000 00072cfc 2**2
+ 18 .stab 00000084 00000000 00000000 00086394 2**2
CONTENTS, READONLY, DEBUGGING
- 19 .stabstr 00000117 00000000 00000000 00072d80 2**0
+ 19 .stabstr 00000117 00000000 00000000 00086418 2**0
CONTENTS, READONLY, DEBUGGING
SYMBOL TABLE:
00000000 l d .init 00000000 .init
00000004 l d .vector 00000000 .vector
00000200 l d .text 00000000 .text
-000084e4 l d .fini 00000000 .fini
+0000a1a8 l d .fini 00000000 .fini
20000000 l d .dalign 00000000 .dalign
-000084e4 l d .dlalign 00000000 .dlalign
+0000a1a8 l d .dlalign 00000000 .dlalign
20000000 l d .data 00000000 .data
-20000220 l d .bss 00000000 .bss
-20007800 l d .stack 00000000 .stack
+20000340 l d .bss 00000000 .bss
+2000f800 l d .stack 00000000 .stack
00000000 l d .debug_info 00000000 .debug_info
00000000 l d .debug_abbrev 00000000 .debug_abbrev
00000000 l d .debug_aranges 00000000 .debug_aranges
@@ -91,170 +91,289 @@ SYMBOL TABLE:
00000000 l df *ABS* 00000000 ch32v30x_misc.c
00000000 l df *ABS* 00000000 ch32v30x_rcc.c
20000010 l O .data 00000010 APBAHBPrescTable
-20000204 l O .data 00000004 ADCPrescTable
-00000000 l df *ABS* 00000000 ch32v30x_spi.c
+20000324 l O .data 00000004 ADCPrescTable
00000000 l df *ABS* 00000000 ch32v30x_usart.c
00000000 l df *ABS* 00000000 heap_4.c
-000012d0 l F .text 0000004c prvInsertBlockIntoFreeList
-20000388 l O .bss 00006000 ucHeap
-20000224 l O .bss 00000004 pxEnd
-20000228 l O .bss 00000004 xBlockAllocatedBit
-2000022c l O .bss 00000004 xFreeBytesRemaining
-20000230 l O .bss 00000004 xMinimumEverFreeBytesRemaining
-20000234 l O .bss 00000004 xNumberOfSuccessfulAllocations
-20000238 l O .bss 00000004 xNumberOfSuccessfulFrees
-2000023c l O .bss 00000008 xStart
+0000127c l F .text 0000004c prvInsertBlockIntoFreeList
+2000066c l O .bss 0000b400 ucHeap
+20000344 l O .bss 00000004 pxEnd
+20000348 l O .bss 00000004 xBlockAllocatedBit
+2000034c l O .bss 00000004 xFreeBytesRemaining
+20000350 l O .bss 00000004 xMinimumEverFreeBytesRemaining
+20000354 l O .bss 00000004 xNumberOfSuccessfulAllocations
+20000358 l O .bss 00000004 xNumberOfSuccessfulFrees
+2000035c l O .bss 00000008 xStart
00000000 l df *ABS* 00000000 port.c
-20000208 l O .data 00000004 uxCriticalNesting
+20000328 l O .data 00000004 uxCriticalNesting
00000000 l df *ABS* 00000000 list.c
00000000 l df *ABS* 00000000 queue.c
-0000172c l F .text 0000001a prvIsQueueEmpty
-00001746 l F .text 00000072 prvCopyDataToQueue
-000017b8 l F .text 000000d6 prvNotifyQueueSetContainer
-0000188e l F .text 00000028 prvCopyDataFromQueue
-000018b6 l F .text 00000078 prvUnlockQueue
+000016da l F .text 0000001a prvIsQueueEmpty
+000016f4 l F .text 00000072 prvCopyDataToQueue
+00001766 l F .text 000000d6 prvNotifyQueueSetContainer
+0000183c l F .text 00000028 prvCopyDataFromQueue
+00001864 l F .text 00000078 prvUnlockQueue
00000000 l df *ABS* 00000000 tasks.c
-000022d0 l F .text 00000024 prvResetNextTaskUnblockTime
-000022f4 l F .text 000000a6 prvAddCurrentTaskToDelayedList
-0000239a l F .text 00000052 prvIdleTask
-200063c8 l O .bss 000000c8 pxReadyTasksLists
-20006490 l O .bss 00000014 xDelayedTaskList1
-200064a4 l O .bss 00000014 xDelayedTaskList2
-200064b8 l O .bss 00000014 xPendingReadyList
-200064cc l O .bss 00000014 xSuspendedTaskList
-200064e0 l O .bss 00000014 xTasksWaitingTermination
-20000248 l O .bss 00000004 pxDelayedTaskList
-2000024c l O .bss 00000004 pxOverflowDelayedTaskList
-20000250 l O .bss 00000004 uxCurrentNumberOfTasks
-20000254 l O .bss 00000004 uxDeletedTasksWaitingCleanUp
-20000258 l O .bss 00000004 uxSchedulerSuspended
-2000025c l O .bss 00000004 uxTaskNumber
-20000260 l O .bss 00000004 uxTopReadyPriority
-20000264 l O .bss 00000004 xIdleTaskHandle
-20000268 l O .bss 00000004 xNextTaskUnblockTime
-2000026c l O .bss 00000004 xNumOfOverflows
-20000270 l O .bss 00000004 xPendedTicks
-20000274 l O .bss 00000004 xSchedulerRunning
-20000278 l O .bss 00000004 xTickCount
-2000027c l O .bss 00000004 xYieldPending
+00002370 l F .text 00000024 prvResetNextTaskUnblockTime
+00002394 l F .text 000000a6 prvAddCurrentTaskToDelayedList
+0000243a l F .text 00000052 prvIdleTask
+2000baac l O .bss 000000c8 pxReadyTasksLists
+2000bb74 l O .bss 00000014 xDelayedTaskList1
+2000bb88 l O .bss 00000014 xDelayedTaskList2
+2000bb9c l O .bss 00000014 xPendingReadyList
+2000bbb0 l O .bss 00000014 xSuspendedTaskList
+2000bbc4 l O .bss 00000014 xTasksWaitingTermination
+20000368 l O .bss 00000004 pxDelayedTaskList
+2000036c l O .bss 00000004 pxOverflowDelayedTaskList
+20000370 l O .bss 00000004 uxCurrentNumberOfTasks
+20000374 l O .bss 00000004 uxDeletedTasksWaitingCleanUp
+20000378 l O .bss 00000004 uxSchedulerSuspended
+2000037c l O .bss 00000004 uxTaskNumber
+20000380 l O .bss 00000004 uxTopReadyPriority
+20000384 l O .bss 00000004 xIdleTaskHandle
+20000388 l O .bss 00000004 xNextTaskUnblockTime
+2000038c l O .bss 00000004 xNumOfOverflows
+20000390 l O .bss 00000004 xPendedTicks
+20000394 l O .bss 00000004 xSchedulerRunning
+20000398 l O .bss 00000004 xTickCount
+2000039c l O .bss 00000004 xYieldPending
00000000 l df *ABS* 00000000 timers.c
-000030ae l F .text 00000066 prvCheckForValidListAndQueue
-00003114 l F .text 00000046 prvInsertTimerInActiveList
-0000315a l F .text 00000028 prvReloadTimer
-00003182 l F .text 00000044 prvProcessExpiredTimer
-000031c6 l F .text 0000002e prvSwitchTimerLists
-000031f4 l F .text 0000018e prvTimerTask
-200064f4 l O .bss 00000014 xActiveTimerList1
-20006508 l O .bss 00000014 xActiveTimerList2
-20000280 l O .bss 00000004 pxCurrentTimerList
-20000284 l O .bss 00000004 pxOverflowTimerList
-20000288 l O .bss 00000004 xLastTime.6324
-2000028c l O .bss 00000004 xTimerQueue
-20000290 l O .bss 00000004 xTimerTaskHandle
+0000307e l F .text 00000066 prvCheckForValidListAndQueue
+000030e4 l F .text 00000046 prvInsertTimerInActiveList
+0000312a l F .text 00000028 prvReloadTimer
+00003152 l F .text 00000044 prvProcessExpiredTimer
+00003196 l F .text 0000002e prvSwitchTimerLists
+000031c4 l F .text 0000018e prvTimerTask
+2000bbd8 l O .bss 00000014 xActiveTimerList1
+2000bbec l O .bss 00000014 xActiveTimerList2
+200003a0 l O .bss 00000004 pxCurrentTimerList
+200003a4 l O .bss 00000004 pxOverflowTimerList
+200003a8 l O .bss 00000004 xLastTime.6324
+200003ac l O .bss 00000004 xTimerQueue
+200003b0 l O .bss 00000004 xTimerTaskHandle
00000000 l df *ABS* 00000000 debug.c
-20000294 l O .bss 00000002 p_ms
-20000296 l O .bss 00000001 p_us
-20000210 l O .data 00000004 curbrk.5274
+200003b4 l O .bss 00000002 p_ms
+200003b6 l O .bss 00000001 p_us
+20000330 l O .data 00000004 curbrk.5274
00000000 l df *ABS* 00000000 core_riscv.c
00000000 l df *ABS* 00000000 ring_queue.c
+00000000 l df *ABS* 00000000 mcu_common.c
00000000 l df *ABS* 00000000 HD_ADC.c
-00000000 l df *ABS* 00000000 HD_Flash.c
00000000 l df *ABS* 00000000 HD_GPIO.c
00000000 l df *ABS* 00000000 HD_UART.c
00000000 l df *ABS* 00000000 FM_ADC.c
-00004386 l F .text 0000002e Get_ConversionVal
-200002a4 l O .bss 00000004 P_In_Current
-200002a8 l O .bss 00000004 P_In_Voltage
-200002ac l O .bss 00000004 P_PwrOn_Voltage
+00004402 l F .text 0000002a Get_ConversionVal
+20000438 l O .bss 00000004 P_In_Current
+2000043c l O .bss 00000004 P_In_Voltage
+20000440 l O .bss 00000004 P_PwrOn_Voltage
00000000 l df *ABS* 00000000 FM_GPIO.c
-00000000 l df *ABS* 00000000 flash.c
+20000444 l O .bss 00000001 mcuFlag
00000000 l df *ABS* 00000000 uart_dev.c
-0000457a l F .text 000000a8 uart_dev_init
-200002b0 l O .bss 00000001 J1_485_IDLE_Flag
-200002b5 l O .bss 00000001 J2_485_IDLE_Flag
-200002b9 l O .bss 00000001 J3_485_IDLE_Flag
-200002bd l O .bss 00000001 J4_485_IDLE_Flag
-200002c1 l O .bss 00000001 J5_0_485_IDLE_Flag
-200002c9 l O .bss 00000001 connectPort
-200002e4 l O .bss 00000001 uartInterruptSendFlag
-00000000 l df *ABS* 00000000 busIdleDetection.c
-00005082 l F .text 00000016 J5_0_485_tmrCallback
-00005098 l F .text 00000016 J4_485_tmrCallback
-000050ae l F .text 00000016 J3_485_tmrCallback
-000050c4 l F .text 00000016 J2_485_tmrCallback
-000050da l F .text 00000016 J1_485_tmrCallback
-200002e8 l O .bss 00000004 J1_485_Swtmr
-200002ec l O .bss 00000004 J2_485_Swtmr
-200002f0 l O .bss 00000004 J3_485_Swtmr
-200002f4 l O .bss 00000004 J4_485_Swtmr
-200002f8 l O .bss 00000004 J5_0_485_Swtmr
-00000000 l df *ABS* 00000000 downUartParse.c
-20006e1c l O .bss 00000080 J1_485RxBuffer
-20006e9c l O .bss 00000080 J2_485RxBuffer
-20006f1c l O .bss 00000080 J3_485RxBuffer
-20006f9c l O .bss 00000080 J4_485RxBuffer
-2000701c l O .bss 00000080 J5_0_485RxBuffer
-200002fc l O .bss 00000002 J1_485RxBufferIndex
-200002fe l O .bss 00000002 J2_485RxBufferIndex
-20000300 l O .bss 00000002 J3_485RxBufferIndex
-20000302 l O .bss 00000002 J4_485RxBufferIndex
-20000304 l O .bss 00000002 J5_0_485RxBufferIndex
-20000308 l O .bss 00000004 tick.6183
-2000030c l O .bss 00000004 tick.6195
-20000310 l O .bss 00000004 tick.6207
-20000314 l O .bss 00000004 tick.6219
-20000318 l O .bss 00000004 tick.6231
-00000000 l df *ABS* 00000000 freerotsTask.c
-00005812 l F .text 00000008 FreeMemory_Task
-0000581a l F .text 00000020 DownReceive_Task
-0000583a l F .text 00000018 UpReceive_Task
-00005852 l F .text 00000008 transmit_Task
-0000585a l F .text 00000066 common_Task
-2000031c l O .bss 00000004 CommonTask_Handler
-20000320 l O .bss 00000004 DownReceive_Handler
-20000324 l O .bss 00000004 FreeMemory_Handler
-20000328 l O .bss 00000004 TransmitTask_Handler
-2000032c l O .bss 00000004 UpReceive_Handler
-00000000 l df *ABS* 00000000 parameter.c
-2000709c l O .bss 00000024 parameter
-00000000 l df *ABS* 00000000 queueUart.c
-200070c0 l O .bss 00000018 queueRecvData
-2000035c l O .bss 00000001 flag.6261
-00000000 l df *ABS* 00000000 upUartParse.c
-00005f64 l F .text 0000000e ReadRegisterPort9_Power
-00005f72 l F .text 0000000e ReadRegisterPort8_Power
-00005f80 l F .text 0000000e ReadRegisterPort7_Power
-00005f8e l F .text 0000000e ReadRegisterPort6_Power
-00005f9c l F .text 0000000e ReadRegisterPort5_Power
-00005faa l F .text 0000000e ReadRegisterPort4_Power
-00005fb8 l F .text 0000000e ReadRegisterPort3_Power
-00005fc6 l F .text 0000000e ReadRegisterPort2_Power
-00005fd4 l F .text 0000000e ReadRegisterPort1_Power
-00005fe2 l F .text 00000020 ReadRegisterTemperature
-00006002 l F .text 00000020 ReadRegisterWorkVoltage
-00006022 l F .text 00000020 ReadRegisterWorkCurrent
-00006042 l F .text 00000012 WriteRegisterPort9_Power
-00006054 l F .text 00000012 WriteRegisterPort8_Power
-00006066 l F .text 00000012 WriteRegisterPort7_Power
-00006078 l F .text 00000012 WriteRegisterPort6_Power
-0000608a l F .text 00000012 WriteRegisterPort5_Power
-0000609c l F .text 00000012 WriteRegisterPort4_Power
-000060ae l F .text 00000012 WriteRegisterPort3_Power
-000060c0 l F .text 00000012 WriteRegisterPort2_Power
-000060d2 l F .text 00000028 WriteRegisterPort1_Power
-00006138 l F .text 00000072 analysisWriteRegStartNumberGW
-00006138 l F .text 00000072 analysisReadCfgLengthGW
-00006138 l F .text 00000072 analysisCfgLengthGW
-000061aa l F .text 000006d0 stateMachine.isra.5
-200070d8 l O .bss 0000044c gw485RxBuffer
-20000370 l O .bss 00000002 frameLength
-20000372 l O .bss 00000002 gw485RxBufferIndex
-20000374 l O .bss 00000004 gw485RxTime
-20000378 l O .bss 00000004 state
-2000037c l O .bss 00000004 tickstart.6660
+0000469c l F .text 000000b6 uart_dev_init
+20000448 l O .bss 00000004 J0Buff
+2000044c l O .bss 00000004 J1Buff
+20000450 l O .bss 00000004 J2Buff
+20000454 l O .bss 00000004 J3Buff
+20000458 l O .bss 00000004 J4Buff
+2000045c l O .bss 00000004 J6Buff
+20000460 l O .bss 00000004 J7Buff
+20000464 l O .bss 00000004 J8Buff
+20000468 l O .bss 00000004 J9Buff
+2000046c l O .bss 00000004 LoraBuff
+20000470 l O .bss 00000004 McuBuff
+20000474 l O .bss 00000004 Su806Buff
+20000478 l O .bss 00000001 flag.5686
+20000479 l O .bss 00000001 flag.5692
+2000047a l O .bss 00000001 flag.5698
+2000047b l O .bss 00000001 flag.5704
+2000047c l O .bss 00000001 flag.5710
+2000047d l O .bss 00000001 flag.5716
+2000047e l O .bss 00000001 flag.5722
+2000047f l O .bss 00000001 flag.5728
+20000480 l O .bss 00000001 flag.5734
+20000481 l O .bss 00000001 flag.5740
+200004b8 l O .bss 00000004 loraBuffLen
+200004bc l O .bss 00000004 mcuBuffLen
+200004c0 l O .bss 00000004 rs485BuffLen
+200004c4 l O .bss 00000004 su806BuffLen
+00000000 l df *ABS* 00000000 slave485DataParse.c
+200004c8 l O .bss 00000004 tick.6278
+200004cc l O .bss 00000004 tick.6290
+200004d0 l O .bss 00000004 tick.6302
+200004d4 l O .bss 00000004 tick.6314
+200004d8 l O .bss 00000004 tick.6326
+200004dc l O .bss 00000004 tick.6338
+00000000 l df *ABS* 00000000 slaveBusIdleDetection.c
+00005942 l F .text 00000012 J9_485_tmrCallback
+00005954 l F .text 00000012 J8_485_tmrCallback
+00005966 l F .text 00000012 J7_485_tmrCallback
+00005978 l F .text 00000012 J5_485_tmrCallback
+0000598a l F .text 00000012 J3_485_tmrCallback
+0000599c l F .text 00000012 J1_485_tmrCallback
+200004e0 l O .bss 00000004 J1_485_Swtmr
+200004e8 l O .bss 00000004 J3_485_Swtmr
+200004f0 l O .bss 00000004 J5_485_Swtmr
+200004f8 l O .bss 00000004 J7_485_Swtmr
+20000500 l O .bss 00000004 J8_485_Swtmr
+20000508 l O .bss 00000004 J9_485_Swtmr
+00000000 l df *ABS* 00000000 slaveFreerotsTask.c
+00005c86 l F .text 00000026 slaveOther_Task
+00005cac l F .text 00000024 slave485DataParse_Task
+00005cd0 l F .text 00000014 slaveMcuDataParse_Task
+00005ce4 l F .text 0000000a slaveFreeMemory_Task
+00005cee l F .text 0000000a slaveMcu_transmit_Task
+00005cf8 l F .text 0000000a J9_transmit_Task
+00005d02 l F .text 0000000a J8_transmit_Task
+00005d0c l F .text 0000000a J7_transmit_Task
+00005d16 l F .text 0000000a J5_transmit_Task
+00005d20 l F .text 0000000a J3_transmit_Task
+00005d2a l F .text 0000000a J1_transmit_Task
+20000510 l O .bss 00000004 J1_TransmitTask_Handler
+20000514 l O .bss 00000004 J3_TransmitTask_Handler
+20000518 l O .bss 00000004 J5_TransmitTask_Handler
+2000051c l O .bss 00000004 J7_TransmitTask_Handler
+20000520 l O .bss 00000004 J8_TransmitTask_Handler
+20000524 l O .bss 00000004 J9_TransmitTask_Handler
+20000528 l O .bss 00000004 slave485DataParse_Handler
+2000052c l O .bss 00000004 slaveFreeMemory_Handler
+20000530 l O .bss 00000004 slaveMcuDataParse_Handler
+20000534 l O .bss 00000004 slaveMcu_TransmitTask_Handler
+20000538 l O .bss 00000004 slaveOther_Handler
+00000000 l df *ABS* 00000000 slaveMcuComm.c
+00005efe l F .text 00000012 ReadRegisterJ9Baud
+00005f10 l F .text 00000012 ReadRegisterJ8Baud
+00005f22 l F .text 00000012 ReadRegisterJ7Baud
+00005f34 l F .text 00000012 ReadRegisterJ5Baud
+00005f46 l F .text 00000012 ReadRegisterJ3Baud
+00005f58 l F .text 00000012 ReadRegisterJ1Baud
+00005f6a l F .text 00000018 WriteRegisterJ9Baud
+00005f82 l F .text 00000018 WriteRegisterJ8Baud
+00005f9a l F .text 00000018 WriteRegisterJ7Baud
+00005fb2 l F .text 00000018 WriteRegisterJ5Baud
+00005fca l F .text 00000018 WriteRegisterJ3Baud
+00005fe2 l F .text 00000018 WriteRegisterJ1Baud
+00000000 l df *ABS* 00000000 slaveMcuDataParse.c
+00006188 l F .text 00000252 stateMachine
+2000053c l O .bss 00000004 tickstart.6306
+00000000 l df *ABS* 00000000 slaveParameter.c
+2000bc00 l O .bss 00000018 slaveParameter
+00000000 l df *ABS* 00000000 slaveQueueUart.c
+20000544 l O .bss 00000004 J1_FreeMemorySemaphore
+20000548 l O .bss 00000004 J1_sendOverSemaphore
+20000550 l O .bss 00000004 J3_FreeMemorySemaphore
+20000554 l O .bss 00000004 J3_sendOverSemaphore
+2000055c l O .bss 00000004 J5_FreeMemorySemaphore
+20000560 l O .bss 00000004 J5_sendOverSemaphore
+20000568 l O .bss 00000004 J7_FreeMemorySemaphore
+2000056c l O .bss 00000004 J7_sendOverSemaphore
+20000574 l O .bss 00000004 J8_FreeMemorySemaphore
+20000578 l O .bss 00000004 J8_sendOverSemaphore
+20000580 l O .bss 00000004 J9_FreeMemorySemaphore
+20000584 l O .bss 00000004 J9_sendOverSemaphore
+2000058c l O .bss 00000004 slaveBinarySemaphoreSet
+20000590 l O .bss 00000004 slaveMcu_uart_FreeMemorySemaphore
+20000594 l O .bss 00000004 slaveMcu_uart_sendOverSemaphore
+00000000 l df *ABS* 00000000 hostBusIdleDetection.c
+00006aaa l F .text 00000012 J6_485_tmrCallback
+00006abc l F .text 00000012 J4_485_tmrCallback
+00006ace l F .text 00000012 J2_485_tmrCallback
+00006ae0 l F .text 00000012 J0_485_tmrCallback
+20000598 l O .bss 00000004 J0_485_Swtmr
+200005a0 l O .bss 00000004 J2_485_Swtmr
+200005a8 l O .bss 00000004 J4_485_Swtmr
+200005b0 l O .bss 00000004 J6_485_Swtmr
+00000000 l df *ABS* 00000000 hostFreerotsTask.c
+00006cda l F .text 00000026 hostOther_Task
+00006d00 l F .text 0000002e dataCollection_Task
+00006d2e l F .text 00000014 hostRecvSlaveDataParse_Task
+00006d42 l F .text 00000020 hostSensorDataParse_Task
+00006d62 l F .text 00000014 hostMcuDataParse_Task
+00006d76 l F .text 0000000a hostFreeMemory_Task
+00006d80 l F .text 0000000a HostMcu_transmit_Task
+00006d8a l F .text 0000000a Su806_transmit_Task
+00006d94 l F .text 0000000a Lora_transmit_Task
+00006d9e l F .text 0000000a J6_transmit_Task
+00006da8 l F .text 0000000a J4_transmit_Task
+00006db2 l F .text 0000000a J2_transmit_Task
+00006dbc l F .text 0000000a J0_transmit_Task
+200005b8 l O .bss 00000004 HostMcu_TransmitTask_Handler
+200005bc l O .bss 00000004 J0_TransmitTask_Handler
+200005c0 l O .bss 00000004 J2_TransmitTask_Handler
+200005c4 l O .bss 00000004 J4_TransmitTask_Handler
+200005c8 l O .bss 00000004 J6_TransmitTask_Handler
+200005cc l O .bss 00000004 Lora_TransmitTask_Handler
+200005d0 l O .bss 00000004 Su806_TransmitTask_Handler
+200005d4 l O .bss 00000004 dataCollection_Handler
+200005d8 l O .bss 00000004 hostFreeMemory_Handler
+200005dc l O .bss 00000004 hostMcuDataParse_Handler
+200005e0 l O .bss 00000004 hostOther_Handler
+200005e4 l O .bss 00000004 hostRecvSlaveDataParse_Handler
+200005e8 l O .bss 00000004 hostSensorDataParse_Handler
+00000000 l df *ABS* 00000000 hostMcuComm.c
+00006fe0 l F .text 00000014 ReadRegisterLoraBaud
+00006ff4 l F .text 00000014 ReadRegisterJ6Baud
+00007008 l F .text 00000014 ReadRegisterJ4Baud
+0000701c l F .text 00000014 ReadRegisterJ2Baud
+00007030 l F .text 00000014 ReadRegisterJ0Baud
+00007044 l F .text 0000000e ReadRegisterJ9_Power
+00007052 l F .text 0000000e ReadRegisterJ8_Power
+00007060 l F .text 0000000e ReadRegisterJ7_Power
+0000706e l F .text 0000000e ReadRegisterJ6_Power
+0000707c l F .text 0000000e ReadRegisterJ5_Power
+0000708a l F .text 0000000e ReadRegisterJ4_Power
+00007098 l F .text 0000000e ReadRegisterJ3_Power
+000070a6 l F .text 0000000e ReadRegisterJ2_Power
+000070b4 l F .text 0000000e ReadRegisterJ1_Power
+000070c2 l F .text 00000020 ReadRegisterWorkTemperature
+000070e2 l F .text 00000020 ReadRegisterWorkVoltage
+00007102 l F .text 0000001e ReadRegisterWorkCurrent
+00007120 l F .text 0000001c WriteRegisterLoraBaud
+0000713c l F .text 00000018 WriteRegisterJ6Baud
+00007154 l F .text 00000018 WriteRegisterJ4Baud
+0000716c l F .text 00000018 WriteRegisterJ2Baud
+00007184 l F .text 00000018 WriteRegisterJ0Baud
+0000719c l F .text 00000012 WriteRegisterJ9_Power
+000071ae l F .text 00000012 WriteRegisterJ8_Power
+000071c0 l F .text 00000012 WriteRegisterJ7_Power
+000071d2 l F .text 00000012 WriteRegisterJ6_Power
+000071e4 l F .text 00000012 WriteRegisterJ5_Power
+000071f6 l F .text 00000012 WriteRegisterJ4_Power
+00007208 l F .text 00000012 WriteRegisterJ3_Power
+0000721a l F .text 00000012 WriteRegisterJ2_Power
+0000722c l F .text 00000012 WriteRegisterJ1_Power
+00000000 l df *ABS* 00000000 hostMcuDataParse.c
+000073cc l F .text 00000278 stateMachine
+200005ec l O .bss 00000004 tickstart.6307
+00000000 l df *ABS* 00000000 hostParameter.c
+2000bc18 l O .bss 00000024 hostParameter
+00000000 l df *ABS* 00000000 hostQueueUart.c
+200005f4 l O .bss 00000004 J0_FreeMemorySemaphore
+200005f8 l O .bss 00000004 J0_sendOverSemaphore
+20000600 l O .bss 00000004 J2_FreeMemorySemaphore
+20000604 l O .bss 00000004 J2_sendOverSemaphore
+2000060c l O .bss 00000004 J4_FreeMemorySemaphore
+20000610 l O .bss 00000004 J4_sendOverSemaphore
+20000618 l O .bss 00000004 J6_FreeMemorySemaphore
+2000061c l O .bss 00000004 J6_sendOverSemaphore
+20000620 l O .bss 00000004 hostBinarySemaphoreSet
+20000624 l O .bss 00000004 hostMcu_FreeMemorySemaphore
+20000628 l O .bss 00000004 hostMcu_sendOverSemaphore
+20000630 l O .bss 00000004 lora_FreeMemorySemaphore
+20000634 l O .bss 00000004 lora_sendOverSemaphore
+2000063c l O .bss 00000004 su806_FreeMemorySemaphore
+20000640 l O .bss 00000004 su806_sendOverSemaphore
+00000000 l df *ABS* 00000000 hostRecvSlaveDataParse.c
+00007cec l F .text 000001b8 slaveStateMachine
+2000064c l O .bss 00000004 tickstart.6303
+00000000 l df *ABS* 00000000 hostSensorDataParse.c
+20000650 l O .bss 00000004 tick.6276
+20000654 l O .bss 00000004 tick.6288
+20000658 l O .bss 00000004 tick.6300
+2000065c l O .bss 00000004 tick.6312
+20000660 l O .bss 00000004 tick.6324
00000000 l df *ABS* 00000000 mulsf3.c
00000000 l df *ABS* 00000000 fixunssfsi.c
00000000 l df *ABS* 00000000 floatsisf.c
+00000000 l df *ABS* 00000000 floatunsisf.c
00000000 l df *ABS* 00000000 libgcc2.c
00000000 l df *ABS* 00000000 memcpy.c
00000000 l df *ABS* 00000000 printf.c
@@ -263,13 +382,13 @@ SYMBOL TABLE:
00000000 l df *ABS* 00000000 wsetup.c
00000000 l df *ABS* 00000000 fflush.c
00000000 l df *ABS* 00000000 findfp.c
-00007258 l F .text 00000066 std
+00008e68 l F .text 00000066 std
00000000 l df *ABS* 00000000 fwalk.c
00000000 l df *ABS* 00000000 makebuf.c
00000000 l df *ABS* 00000000 nano-mallocr.c
00000000 l df *ABS* 00000000 nano-mallocr.c
00000000 l df *ABS* 00000000 nano-vfprintf.c
-000076ea l F .text 00000028 __sfputc_r
+000092fa l F .text 00000028 __sfputc_r
00000000 l df *ABS* 00000000 nano-vfprintf_i.c
00000000 l df *ABS* 00000000 sbrkr.c
00000000 l df *ABS* 00000000 stdio.c
@@ -288,459 +407,562 @@ SYMBOL TABLE:
00000000 l df *ABS* 00000000 read.c
00000000 l df *ABS* 00000000 libgcc2.c
00000000 l df *ABS* 00000000 impure.c
-200001a0 l O .data 00000060 impure_data
+200002bc l O .data 00000060 impure_data
00000000 l df *ABS* 00000000 reent.c
-000008bc w .text 00000000 EXTI2_IRQHandler
-20000158 g O .data 00000048 g_RegTblW
-00005268 g F .text 0000001c J2_485_IN_RXNE
-000008bc w .text 00000000 TIM8_TRG_COM_IRQHandler
-000008bc w .text 00000000 TIM8_CC_IRQHandler
-000051a2 g F .text 00000022 J1_485_IN_IDLE
-00007efe g F .text 00000030 _isatty_r
-00006e2a g F .text 000000d4 _puts_r
-0000444e g F .text 00000074 writePwrCtrlState
-00007f2e g F .text 00000034 _lseek_r
-00000dee g F .text 00000014 DMA_Cmd
-0000154c g F .text 0000000a xPortGetFreeHeapSize
-20000364 g O .bss 00000004 upward_BinarySemaphore
-0000433a g F .text 0000004c UART8_IRQHandler
-00001670 g F .text 00000042 vPortExitCritical
-000048c0 g F .text 0000002a setUpward_uart_SendState
-000033e2 g F .text 00000074 xTimerCreate
-00000ec2 g F .text 0000000a GPIO_ReadOutputDataBit
-20000330 g O .bss 00000004 BinarySemaphoreSet
-00004660 g F .text 0000002a Init_J1_485
-00006dea g F .text 00000040 printf
-20000a00 g .data 00000000 __global_pointer$
+00007b9e g F .text 00000040 J6QueueSend
+000008cc w .text 00000000 EXTI2_IRQHandler
+20000194 g O .data 00000030 g_RegTblW
+00006c6e g F .text 00000024 J2_485_IN_RXNE
+000008cc w .text 00000000 TIM8_TRG_COM_IRQHandler
+000008cc w .text 00000000 TIM8_CC_IRQHandler
+20000570 g O .bss 00000004 J8_485_Queue
+00005afa g F .text 0000001e J1_485_IN_IDLE
+00009b0e g F .text 00000030 _isatty_r
+200004ec g O .bss 00000004 J3_IDLESemaphore
+00008a3a g F .text 000000d4 _puts_r
+00006cb6 g F .text 00000024 J6_485_IN_RXNE
+2000057c g O .bss 00000004 J9_485_Queue
+000045b0 g F .text 00000074 writePwrCtrlState
+00009b3e g F .text 00000034 _lseek_r
+00000dfe g F .text 00000014 DMA_Cmd
+000014fa g F .text 0000000a xPortGetFreeHeapSize
+000043b2 g F .text 00000050 UART8_IRQHandler
+00007644 g F .text 00000096 hostMcuUartDataAnalysis
+2000024c g O .data 00000070 m_host_RegTblW
+20000428 g O .bss 00000004 su806UartRxTime
+0000161e g F .text 00000042 vPortExitCritical
+000033b0 g F .text 00000074 xTimerCreate
+00000edc g F .text 0000000a GPIO_ReadOutputDataBit
+00004876 g F .text 00000022 Init_J1_485
+000089fa g F .text 00000040 printf
+20000b20 g .data 00000000 __global_pointer$
+00007ade g F .text 00000040 J0QueueSend
000004ee g F .text 00000028 .hidden __riscv_save_8
-00005f40 g F .text 00000012 J5_0_485_IN_TXE
-000008bc w .text 00000000 TIM1_CC_IRQHandler
-00007e30 g F .text 00000030 __sseek
-0000730e g F .text 0000006c __sinit
-0000118e g F .text 00000004 SPI_I2S_SendData
-00006f0a g F .text 000000bc __swbuf_r
-200002d8 g O .bss 00000004 g_J4_uart8_handle
+0000528e g F .text 00000090 Lora_Interrupt
+000008cc w .text 00000000 TIM1_CC_IRQHandler
+00009a40 g F .text 00000030 __sseek
+00008f1e g F .text 0000006c __sinit
+00008b1a g F .text 000000bc __swbuf_r
000005f0 g F .text 00000038 HardFault_Handler
-0000221e g F .text 0000005c vQueueWaitForMessageRestricted
-000072c8 g F .text 00000046 __sfmoreglue
-200002b8 g O .bss 00000001 J2_Rbuffer
-00007f7c g F .text 00000002 __malloc_unlock
-000009f4 g F .text 00000012 ADC_DMACmd
-00003620 g F .text 0000002c InRingQueue
-00005a74 g F .text 0000000a getJ4_485_Baud
-000029b6 g F .text 000000d0 xTaskDelayUntil
+00004ffc g F .text 000000b2 J8_Interrupt
+000022be g F .text 0000005c vQueueWaitForMessageRestricted
+00008ed8 g F .text 00000046 __sfmoreglue
+00005736 g F .text 00000106 J8_SensorDataAnalysis
+00009b8c g F .text 00000002 __malloc_unlock
+00000a04 g F .text 00000012 ADC_DMACmd
+000035ee g F .text 0000002c InRingQueue
+00007762 g F .text 0000000a getJ4_485_Baud
+000069fa g F .text 00000040 J8QueueSend
+20000420 g O .bss 00000004 su806RxBuffer
0000053a g F .text 0000000c .hidden __riscv_restore_3
-000008bc w .text 00000000 TIM6_IRQHandler
-00001622 g F .text 00000038 SysTick_Handler
-00000a18 g F .text 0000000a ADC_StartCalibration
-00004622 g F .text 00000018 uart_dev_char_present
-000046b4 g F .text 0000002a Init_J3_485
-000058c0 g F .text 000000fe startApp
-20000348 g O .bss 00000004 J3_BinarySemaphore
-00000ee4 g F .text 00000052 NVIC_Init
-000008bc w .text 00000000 PVD_IRQHandler
-000008bc w .text 00000000 SDIO_IRQHandler
-000008bc w .text 00000000 TIM9_BRK_IRQHandler
+000008cc w .text 00000000 TIM6_IRQHandler
+000015d0 g F .text 00000038 SysTick_Handler
+00000a28 g F .text 0000000a ADC_StartCalibration
+00004752 g F .text 00000018 uart_dev_char_present
+000048ba g F .text 00000022 Init_J3_485
+00000efa g F .text 00000052 NVIC_Init
+000008cc w .text 00000000 PVD_IRQHandler
+000008cc w .text 00000000 SDIO_IRQHandler
+000008cc w .text 00000000 TIM9_BRK_IRQHandler
00000526 g F .text 00000020 .hidden __riscv_restore_10
-00001192 g F .text 00000004 SPI_I2S_ReceiveData
-00001c00 g F .text 0000013a xQueueGenericSendFromISR
-000008bc w .text 00000000 DMA2_Channel8_IRQHandler
+20000644 g O .bss 00000004 su806_uart_Queue
+00007b5e g F .text 00000040 J4QueueSend
+00001bae g F .text 0000013a xQueueGenericSendFromISR
+000008cc w .text 00000000 DMA2_Channel8_IRQHandler
000005ee g F .text 00000002 NMI_Handler
-000008bc w .text 00000000 CAN2_RX1_IRQHandler
-000008bc w .text 00000000 EXTI3_IRQHandler
+000008cc w .text 00000000 CAN2_RX1_IRQHandler
+000008cc w .text 00000000 EXTI3_IRQHandler
+00006c4a g F .text 00000024 J0_485_IN_RXNE
000004ee g F .text 00000028 .hidden __riscv_save_11
-00000c40 g F .text 0000000a DBGMCU_GetCHIPID
-2000691c g O .bss 00000100 J5_0_inBuff
-000022b8 g F .text 00000018 xQueueSelectFromSet
-0000453a g F .text 00000028 ledToggle
-20000244 g O .bss 00000004 pxCurrentTCB
-000008bc w .text 00000000 USBHS_IRQHandler
-00005a60 g F .text 0000000a getJ2_485_Baud
-0000128a g F .text 0000000a USART_GetFlagStatus
-000008bc w .text 00000000 DMA2_Channel9_IRQHandler
-00007ecc g F .text 00000032 _fstat_r
-000008bc w .text 00000000 TIM10_CC_IRQHandler
-20007524 g O .bss 00000004 errno
-2000033c g O .bss 00000004 J2_485_Queue
-20000220 g .bss 00000000 _sbss
+00000c50 g F .text 0000000a DBGMCU_GetCHIPID
+00002358 g F .text 00000018 xQueueSelectFromSet
+00007c6e g F .text 00000012 J0_485_IN_TXE
+20000364 g O .bss 00000004 pxCurrentTCB
+000008cc w .text 00000000 USBHS_IRQHandler
+20000494 g O .bss 00000004 g_J4_handle
+0000774e g F .text 0000000a getJ2_485_Baud
+200003fc g O .bss 00000002 J8_485RxBufferIndex
+00001236 g F .text 0000000a USART_GetFlagStatus
+000008cc w .text 00000000 DMA2_Channel9_IRQHandler
+000076da g F .text 0000001a readHostConfigParameter
+00009adc g F .text 00000032 _fstat_r
+000008cc w .text 00000000 TIM10_CC_IRQHandler
+2000bc3c g O .bss 00000004 errno
+200005fc g O .bss 00000004 J2_485_Queue
+20000340 g .bss 00000000 _sbss
00000800 g *ABS* 00000000 __stack_size
-20000334 g O .bss 00000004 J1_485_Queue
-0000441e g F .text 00000024 getInVoltage
-000044c2 g F .text 00000078 readPwrCtrlState
-0000353c g F .text 0000005a USART_Printf_Init
-00000db6 g F .text 00000038 DMA_Init
-000008bc w .text 00000000 USBFS_IRQHandler
-200002c8 g O .bss 00000001 Upward_Rbuffer
-00002d2e g F .text 00000016 vTaskInternalSetTimeOutState
+20000540 g O .bss 00000004 J1_485_Queue
+0000449e g F .text 0000001c getInVoltage
+00004624 g F .text 00000078 readPwrCtrlState
+0000350a g F .text 0000005a USART_Printf_Init
+00000dc6 g F .text 00000038 DMA_Init
+000008cc w .text 00000000 USBFS_IRQHandler
+000040bc g F .text 0000008e uart7Init
+00002cfe g F .text 00000016 vTaskInternalSetTimeOutState
0000053a g F .text 0000000c .hidden __riscv_restore_2
-20000340 g O .bss 00000004 J2_BinarySemaphore
-00005a42 g F .text 0000000a getTemperature
-00001594 g F .text 0000008e xPortStartScheduler
-00006d38 g F .text 000000b2 memcpy
-00002b84 g F .text 00000048 vTaskPlaceOnEventList
-000009e4 g F .text 00000010 ADC_Cmd
-2000661c g O .bss 00000100 J2_inBuff
-000072be g F .text 0000000a _cleanup_r
-00001556 w F .text 0000003e vPortSetupTimerInterrupt
-00005d00 g F .text 000000b8 binarySemaphoreInit
-000008bc w .text 00000000 EXTI0_IRQHandler
-000008bc w .text 00000000 I2C2_EV_IRQHandler
-000008bc w .text 00000000 TIM10_TRG_COM_IRQHandler
-20000298 g O .bss 00000002 Calibrattion_Val
-200002dc g O .bss 00000004 g_J5_0_usart3_handle
-00006efe g F .text 0000000c puts
-000014a6 g F .text 000000a6 vPortFree
-0000407e g F .text 00000038 USART_CONNET_J7
-20000200 g O .data 00000004 SystemCoreClock
-20008000 g .stack 00000000 __freertos_irq_stack_top
-00004046 g F .text 00000038 USART_CONNET_J6
-00001282 g F .text 00000008 USART_ReceiveData
-00001fb0 g F .text 000001bc xQueueSemaphoreTake
-00007fc2 g F .text 00000010 _fstat
+000044ba g F .text 00000014 getTemperature
+00006bd2 g F .text 0000001e J0_485_IN_IDLE
+200003c4 g O .bss 00000002 J1_485RxBufferIndex
+20000490 g O .bss 00000004 g_J3_handle
+00001542 g F .text 0000008e xPortStartScheduler
+0000491e g F .text 00000022 Init_J6_485
+00008948 g F .text 000000b2 memcpy
+00003ba4 g F .text 00000036 WDI_GPIO_Init
+00002b54 g F .text 00000048 vTaskPlaceOnEventList
+000009f4 g F .text 00000010 ADC_Cmd
+00008ece g F .text 0000000a _cleanup_r
+00001504 w F .text 0000003e vPortSetupTimerInterrupt
+0000373a g F .text 00000050 baudConversionConfig
+0000693a g F .text 00000040 J3QueueSend
+000008cc w .text 00000000 EXTI0_IRQHandler
+000008cc w .text 00000000 I2C2_EV_IRQHandler
+000008cc w .text 00000000 TIM10_TRG_COM_IRQHandler
+2000042c g O .bss 00000002 Calibrattion_Val
+00008b0e g F .text 0000000c puts
+00001454 g F .text 000000a6 vPortFree
+2000050c g O .bss 00000004 J9_IDLESemaphore
+20000320 g O .data 00000004 SystemCoreClock
+20010000 g .stack 00000000 __freertos_irq_stack_top
+0000122e g F .text 00000008 USART_ReceiveData
+00001f5e g F .text 000001be xQueueSemaphoreTake
+00005d34 g F .text 000001ca slaveStartApp
+00004854 g F .text 00000022 Init_J0_485
+00009bd2 g F .text 00000010 _fstat
00000004 g .init 00000000 _einit
-000010dc g F .text 0000001e RCC_APB2PeriphClockCmd
-200002e0 g O .bss 00000004 g_Upward_uart5_handle
+0000723e g F .text 0000018e hostFrameDataAnalyze
+200004b4 g O .bss 00000004 g_Su806_handle
+00008258 g F .text 00000104 J6_SensorDataAnalysis
+000010f2 g F .text 0000001e RCC_APB2PeriphClockCmd
000004e6 g F .text 00000030 .hidden __riscv_save_12
-00004d66 g F .text 000001ae uartInterruptSend
-000008bc w .text 00000000 CAN2_SCE_IRQHandler
-000008bc w .text 00000000 ADC1_2_IRQHandler
-00000e02 g F .text 000000c0 GPIO_Init
-00000f36 g F .text 00000012 RCC_ADCCLKConfig
-000008bc w .text 00000000 Break_Point_Handler
-00003c76 g F .text 000000ce J2_485_Init
+000069ba g F .text 00000040 J7QueueSend
+000008cc w .text 00000000 CAN2_SCE_IRQHandler
+000008cc w .text 00000000 ADC1_2_IRQHandler
+000064a2 g F .text 0000000a setJ1_485_Baud
+000076f4 g F .text 0000000a setPwrOnVoltage
+00000e12 g F .text 000000c0 GPIO_Init
+00000f4c g F .text 00000012 RCC_ADCCLKConfig
+000008cc w .text 00000000 Break_Point_Handler
+200003ec g O .bss 00000002 J6_485RxBufferIndex
00000526 g F .text 00000020 .hidden __riscv_restore_11
-20000220 g O .bss 00000004 NVIC_Priority_Group
-000008bc w .text 00000000 SPI1_IRQHandler
-00000a06 g F .text 0000000a ADC_ResetCalibration
-0000122e g F .text 00000016 USART_Cmd
-00007d8a g F .text 00000032 _sbrk_r
-00004562 g F .text 0000000c Flash_Init
-00003b56 g F .text 00000052 set_485_Read
-000008bc w .text 00000000 TAMPER_IRQHandler
+20000340 g O .bss 00000004 NVIC_Priority_Group
+000008cc w .text 00000000 SPI1_IRQHandler
+00000a16 g F .text 0000000a ADC_ResetCalibration
+000011da g F .text 00000016 USART_Cmd
+0000402e g F .text 0000008e uart6Init
+0000999a g F .text 00000032 _sbrk_r
+000008cc w .text 00000000 TAMPER_IRQHandler
00000516 g F .text 0000000c .hidden __riscv_save_1
+0000647c g F .text 0000001c readSlaveConfigParameter
0000053a g F .text 0000000c .hidden __riscv_restore_0
-00007f7e g F .text 00000034 _read_r
-000016d8 g F .text 00000006 vListInitialiseItem
-2000036c g O .bss 00000004 xActivatedMemberUartQueue
+00009b8e g F .text 00000034 _read_r
+2000040c g O .bss 00000002 loraRxBufferIndex
+00001686 g F .text 00000006 vListInitialiseItem
000004fc g F .text 0000001a .hidden __riscv_save_7
-000050f0 g F .text 000000b2 softwareTimeInit
-00001e4a g F .text 00000166 xQueueReceive
-000008bc w .text 00000000 CAN2_RX0_IRQHandler
-20006388 g O .bss 00000040 xQueueRegistry
-000016be g F .text 00000006 vPortClearInterruptMask
-000008bc w .text 00000000 TIM8_UP_IRQHandler
-00005a6a g F .text 0000000a getJ3_485_Baud
-000010fa g F .text 0000001e RCC_APB1PeriphClockCmd
-00003b4a g F .text 0000000c HD_OutputGPIO_Read
-0000475c g F .text 0000009a getUartSendState
-000008bc w .text 00000000 Ecall_M_Mode_Handler
-20007800 g .stack 00000000 _heap_end
-00004846 g F .text 00000028 setJ3_485_SendState
-00007fd2 g F .text 00000010 _isatty
-200000f8 g O .data 00000060 g_RegTblR
-2000021c g O .data 00000004 _global_impure_ptr
-000043fa g F .text 00000024 getInCurrent
+00001df8 g F .text 00000166 xQueueReceive
+000008cc w .text 00000000 CAN2_RX0_IRQHandler
+2000ba6c g O .bss 00000040 xQueueRegistry
+0000166c g F .text 00000006 vPortClearInterruptMask
+00004a0c g F .text 000000c2 J0_Interrupt
+20000648 g O .bss 00000004 slaveState
+000008cc w .text 00000000 TIM8_UP_IRQHandler
+000064ac g F .text 0000000a getJ3_485_Baud
+00004984 g F .text 00000022 Init_J9_485
+00001110 g F .text 0000001e RCC_APB1PeriphClockCmd
+000059ae g F .text 0000014c slaveIdleInit
+00006af2 g F .text 000000e0 hostIdleInit
+00003dcc g F .text 0000000c HD_OutputGPIO_Read
+000037de g F .text 0000003c modebusCrc
+000008cc w .text 00000000 Ecall_M_Mode_Handler
+0000773a g F .text 0000000a getJ0_485_Baud
+2000f800 g .stack 00000000 _heap_end
+20000400 g O .bss 00000004 J9_485RxBuffer
+00005bf6 g F .text 00000024 J5_485_IN_RXNE
+00009be2 g F .text 00000010 _isatty
+20000164 g O .data 00000030 g_RegTblR
+2000033c g O .data 00000004 _global_impure_ptr
+00004482 g F .text 0000001c getInCurrent
00000530 g F .text 00000016 .hidden __riscv_restore_5
-0000560a g F .text 00000100 J4_SensorDataAnalysis
-0000227a g F .text 00000010 xQueueCreateSet
-00001196 g F .text 0000000a SPI_I2S_GetFlagStatus
-000008bc w .text 00000000 DMA2_Channel2_IRQHandler
-000010be g F .text 0000001e RCC_AHBPeriphClockCmd
-000008bc w .text 00000000 DMA1_Channel4_IRQHandler
-00000a42 g F .text 000000b8 ADC_RegularChannelConfig
-000035d4 g F .text 0000002a _sbrk
-0000131c g F .text 0000018a pvPortMalloc
-00003610 g F .text 00000010 InitRingQueue
-000047f6 g F .text 00000028 setJ1_485_SendState
-000016c4 g F .text 00000014 vListInitialise
-00005406 g F .text 00000104 J2_SensorDataAnalysis
-00004f14 g F .text 00000076 getBUSIDLEFlag
-000008bc w .text 00000000 TIM9_UP_IRQHandler
-00005284 g F .text 0000001c J3_485_IN_RXNE
-000038d8 g F .text 00000062 SPI_ReadWriteByte
+00008152 g F .text 00000106 J4_SensorDataAnalysis
+0000675a g F .text 00000012 slaveMcu_uart_IN_TXE
+0000231a g F .text 00000010 xQueueCreateSet
+000008cc w .text 00000000 DMA2_Channel2_IRQHandler
+000010d4 g F .text 0000001e RCC_AHBPeriphClockCmd
+000008cc w .text 00000000 DMA1_Channel4_IRQHandler
+00000a52 g F .text 000000b8 ADC_RegularChannelConfig
+00004790 g F .text 0000006c HostMcu_uartBuf_Init
+000035a2 g F .text 0000002a _sbrk
+000012c8 g F .text 0000018c pvPortMalloc
+200004a4 g O .bss 00000004 g_J8_handle
+000035de g F .text 00000010 InitRingQueue
+20000504 g O .bss 00000004 J8_IDLESemaphore
+00005b36 g F .text 0000001e J5_485_IN_IDLE
+20000404 g O .bss 00000002 J9_485RxBufferIndex
+2000041c g O .bss 00000004 state
+00001672 g F .text 00000014 vListInitialise
+0000804c g F .text 00000106 J2_SensorDataAnalysis
+00005630 g F .text 00000106 J7_SensorDataAnalysis
+000008cc w .text 00000000 TIM9_UP_IRQHandler
+00005bd2 g F .text 00000024 J3_485_IN_RXNE
00000530 g F .text 00000016 .hidden __riscv_restore_6
-0000420a g F .text 0000004c USART3_IRQHandler
-00002690 g F .text 0000000a xTaskGetTickCount
-00001a5a g F .text 000001a6 xQueueGenericSend
-00005078 g F .text 0000000a getConnectPort
-000008bc w .text 00000000 RTC_IRQHandler
-000046de g F .text 0000002a Init_J4_485
-00000a22 g F .text 00000008 ADC_GetCalibrationStatus
-20007528 g .bss 00000000 _ebss
-00001294 g F .text 0000003c USART_GetITStatus
-000008bc w .text 00000000 DMA1_Channel7_IRQHandler
-00004f8a g F .text 00000074 setBUSIDLEFlag
-00000a2a g F .text 00000018 ADC_SoftwareStartConvCmd
-00000a10 g F .text 00000008 ADC_GetResetCalibrationStatus
-000008bc w .text 00000000 CAN1_RX1_IRQHandler
-000052a0 g F .text 0000001c J4_485_IN_RXNE
-000034d0 g F .text 00000032 Delay_Init
-00002ee2 g F .text 000000ca xTaskPriorityDisinherit
-000008bc w .text 00000000 DVP_IRQHandler
-00004256 g F .text 0000004c UART5_IRQHandler
-0000393a g F .text 0000006a SPI_Flash_Read
-00003ed0 g F .text 00000038 USART_CONNET_J0
-0000364c g F .text 00000026 OutRingQueue
-00003ba8 g F .text 000000ce J1_485_Init
-00005a1a g F .text 0000000a getWorkCurrent
-000051e6 g F .text 00000022 J3_485_IN_IDLE
-00002c42 g F .text 000000ec xTaskRemoveFromEventList
-00000ecc g F .text 00000004 GPIO_SetBits
-000008bc w .text 00000000 TIM4_IRQHandler
-00004442 g F .text 0000000c FM_GPIO_Init
+00004222 g F .text 00000050 USART3_IRQHandler
+00002730 g F .text 0000000a xTaskGetTickCount
+00001a08 g F .text 000001a6 xQueueGenericSend
+000008cc w .text 00000000 RTC_IRQHandler
+000048dc g F .text 00000022 Init_J4_485
+00000a32 g F .text 00000008 ADC_GetCalibrationStatus
+2000bc40 g .bss 00000000 _ebss
+00001240 g F .text 0000003c USART_GetITStatus
+000008cc w .text 00000000 DMA1_Channel7_IRQHandler
+2000059c g O .bss 00000004 J0_IDLESemaphore
+0000583c g F .text 00000106 J9_SensorDataAnalysis
+00000a3a g F .text 00000018 ADC_SoftwareStartConvCmd
+00000a20 g F .text 00000008 ADC_GetResetCalibrationStatus
+00003c14 g F .text 0000009e Host485De_GPIO_Init
+000008cc w .text 00000000 CAN1_RX1_IRQHandler
+00006c92 g F .text 00000024 J4_485_IN_RXNE
+0000349e g F .text 00000032 Delay_Init
+00002eb2 g F .text 000000ca xTaskPriorityDisinherit
+000008cc w .text 00000000 DVP_IRQHandler
+000042c2 g F .text 00000050 UART5_IRQHandler
+0000361a g F .text 00000026 OutRingQueue
+000076fe g F .text 0000000a getWorkCurrent
+00005b18 g F .text 0000001e J3_485_IN_IDLE
+000050ae g F .text 000000c2 J9_Interrupt
+00002c12 g F .text 000000ec xTaskRemoveFromEventList
+00003b4e g F .text 00000056 Android_GPIO_Init
+200003d4 g O .bss 00000002 J3_485RxBufferIndex
+00005c62 g F .text 00000024 J9_485_IN_RXNE
+000008cc w .text 00000000 TIM4_IRQHandler
+00007c0e g F .text 00000030 Su806QueueSend
000004ee g F .text 00000028 .hidden __riscv_save_9
-20000360 g O .bss 00000004 uart_Queue
-00000ed0 g F .text 0000000a GPIO_WriteBit
-000008bc w .text 00000000 DMA2_Channel1_IRQHandler
-00005db8 g F .text 00000140 binarySemaphoreFreeMemory
-00008448 g O .text 00000020 __sf_fake_stderr
+00006a3a g F .text 00000040 J9QueueSend
+00000ee6 g F .text 0000000a GPIO_WriteBit
+20000414 g O .bss 00000002 mcuUartRxBufferIndex
+000008cc w .text 00000000 DMA2_Channel1_IRQHandler
+20000408 g O .bss 00000004 loraRxBuffer
+000064e8 g F .text 0000000a getJ8_485_Baud
+0000676c g F .text 0000018e binarySemaphoreFreeMemory
+0000a10c g O .text 00000020 __sf_fake_stderr
000004fc g F .text 0000001a .hidden __riscv_save_4
-00005a88 g F .text 000000b8 uartQueueInit
-00005a56 g F .text 0000000a getJ1_485_Baud
-0000400e g F .text 00000038 USART_CONNET_J5
-000008bc w .text 00000000 I2C1_EV_IRQHandler
-20000218 g O .data 00000004 xISRStackTop
-0000550a g F .text 00000100 J3_SensorDataAnalysis
-00000f48 g F .text 00000176 RCC_GetClocksFreq
-00003092 g F .text 0000001c pvTaskIncrementMutexHeldCount
-000008bc w .text 00000000 DMA1_Channel6_IRQHandler
-00006cca g F .text 0000006e .hidden __clzsi2
-00007712 g F .text 00000042 __sfputs_r
-000008bc w .text 00000000 UART4_IRQHandler
-000008bc w .text 00000000 DMA2_Channel4_IRQHandler
-00007f62 g F .text 00000018 memchr
-000011a0 g F .text 0000008e USART_Init
-00002d44 g F .text 000000c8 xTaskCheckForTimeOut
-0000756e g F .text 000000a8 _free_r
-00002e34 g F .text 000000ae xTaskPriorityInherit
-000008bc w .text 00000000 TIM3_IRQHandler
-000008bc w .text 00000000 RCC_IRQHandler
+00006498 g F .text 0000000a getJ1_485_Baud
+000008cc w .text 00000000 I2C1_EV_IRQHandler
+20000338 g O .data 00000004 xISRStackTop
+000064c0 g F .text 0000000a getJ5_485_Baud
+00005424 g F .text 00000106 J3_SensorDataAnalysis
+00006c2c g F .text 0000001e J6_485_IN_IDLE
+00000f5e g F .text 00000176 RCC_GetClocksFreq
+00003062 g F .text 0000001c pvTaskIncrementMutexHeldCount
+000008cc w .text 00000000 DMA1_Channel6_IRQHandler
+000088da g F .text 0000006e .hidden __clzsi2
+00009322 g F .text 00000042 __sfputs_r
+000063da g F .text 000000a2 slaveMcuUartDataAnalysis
+200005ac g O .bss 00000004 J4_IDLESemaphore
+00004272 g F .text 00000050 UART4_IRQHandler
+000064ca g F .text 0000000a setJ5_485_Baud
+000008cc w .text 00000000 DMA2_Channel4_IRQHandler
+00009b72 g F .text 00000018 memchr
+00006a7a g F .text 00000030 slaveMcuQueueSend
+200001c4 g O .data 00000088 m_host_RegTblR
+0000114c g F .text 0000008e USART_Init
+00002d14 g F .text 000000c8 xTaskCheckForTimeOut
+0000917e g F .text 000000a8 _free_r
+00002e04 g F .text 000000ae xTaskPriorityInherit
+000008cc w .text 00000000 TIM3_IRQHandler
+000008cc w .text 00000000 RCC_IRQHandler
+200003e4 g O .bss 00000002 J5_485RxBufferIndex
+200003f0 g O .bss 00000004 J7_485RxBuffer
00000516 g F .text 0000000c .hidden __riscv_save_3
-000008bc w .text 00000000 TIM1_TRG_COM_IRQHandler
-000008bc w .text 00000000 DMA1_Channel1_IRQHandler
+0000779e g F .text 000001de hostUartSendInit
+000008cc w .text 00000000 TIM1_TRG_COM_IRQHandler
+00005b54 g F .text 0000001e J7_485_IN_IDLE
+000008cc w .text 00000000 DMA1_Channel1_IRQHandler
+00006510 g F .text 000001de slaveUartSendInit
+000064f2 g F .text 0000000a setJ8_485_Baud
00000000 g .init 00000000 _start
-000008bc w .text 00000000 DMA2_Channel7_IRQHandler
-00002680 g F .text 00000010 vTaskSuspendAll
+000008cc w .text 00000000 DMA2_Channel7_IRQHandler
+00002720 g F .text 00000010 vTaskSuspendAll
20000000 g O .data 00000010 AHBPrescTable
-0000269a g F .text 0000000a xTaskGetTickCountFromISR
-00007fe2 g F .text 00000010 _lseek
-00006c04 g F .text 000000c6 .hidden __floatsisf
-00005f52 g F .text 00000012 Upward_USART_IN_TXE
-00004a86 g F .text 00000090 Upward_Interrupt
-0000170c g F .text 00000020 uxListRemove
-000008bc w .text 00000000 EXTI15_10_IRQHandler
-00001244 g F .text 00000036 USART_ITConfig
-00005302 g F .text 00000104 J1_SensorDataAnalysis
-200002d0 g O .bss 00000004 g_J2_uart7_handle
-00002aea g F .text 0000009a vTaskSwitchContext
-00004126 g F .text 00000098 Upward_UART5_Init
-00005208 g F .text 00000022 J4_485_IN_IDLE
-20000358 g O .bss 00000004 J5_0_BinarySemaphore
-00002bcc g F .text 00000076 vTaskPlaceOnEventListRestricted
-00003604 g F .text 00000006 __get_MCAUSE
-000008bc w .text 00000000 TIM7_IRQHandler
-00007e9c g F .text 00000030 _close_r
-000043b4 g F .text 00000014 FM_ADC_Init
-000008bc w .text 00000000 CAN2_TX_IRQHandler
+200005f0 g O .bss 00000004 J0_485_Queue
+0000273a g F .text 0000000a xTaskGetTickCountFromISR
+20000424 g O .bss 00000002 su806RxBufferIndex
+00009bf2 g F .text 00000010 _lseek
+00008746 g F .text 000000c6 .hidden __floatsisf
+000016ba g F .text 00000020 uxListRemove
+000008cc w .text 00000000 EXTI15_10_IRQHandler
+20000498 g O .bss 00000004 g_J5_handle
+000011f0 g F .text 00000036 USART_ITConfig
+20000558 g O .bss 00000004 J5_485_Queue
+200003f4 g O .bss 00000002 J7_485RxBufferIndex
+200003dc g O .bss 00000002 J4_485RxBufferIndex
+0000531e g F .text 00000106 J1_SensorDataAnalysis
+00004dc6 g F .text 000000b2 J5_Interrupt
+200003bc g O .bss 00000002 J0_485RxBufferIndex
+00002aba g F .text 0000009a vTaskSwitchContext
+00006c0e g F .text 0000001e J4_485_IN_IDLE
+00003e6a g F .text 00000098 uart3Init
+00007bde g F .text 00000030 LoraQueueSend
+00002b9c g F .text 00000076 vTaskPlaceOnEventListRestricted
+000035d2 g F .text 00000006 __get_MCAUSE
+000008cc w .text 00000000 TIM7_IRQHandler
+00009aac g F .text 00000030 _close_r
+0000442c g F .text 00000014 FM_ADC_Init
+000008cc w .text 00000000 CAN2_TX_IRQHandler
20000000 g .dalign 00000000 _data_vma
-000008bc w .text 00000000 TIM5_IRQHandler
-20006a1c g O .bss 00000400 Upward_inBuff
-00003456 g F .text 0000007a xTimerGenericCommand
-00006fc6 g F .text 000000fc __swsetup_r
-20000350 g O .bss 00000004 J4_BinarySemaphore
-00004732 g F .text 0000002a Init_Upward_uart
-000008bc w .text 00000000 EXTI9_5_IRQHandler
-0000737a g F .text 000000a0 __sfp
+000008cc w .text 00000000 TIM5_IRQHandler
+000044e4 g F .text 00000020 HostMcu_GPIO_Init
+00003424 g F .text 0000007a xTimerGenericCommand
+00008bd6 g F .text 000000fc __swsetup_r
+00005c1a g F .text 00000024 J7_485_IN_RXNE
+000008cc w .text 00000000 EXTI9_5_IRQHandler
+00003d84 g F .text 0000003c ctrlSlave_GPIO_Init
+00008f8a g F .text 000000a0 __sfp
+200004ac g O .bss 00000004 g_Lora_handle
+00006724 g F .text 00000012 J7_485_IN_TXE
+20000614 g O .bss 00000004 J6_485_Queue
+00007c3e g F .text 00000030 HostMcuQueueSend
000004ee g F .text 00000028 .hidden __riscv_save_10
-00007dbc g F .text 0000002c __sread
-2000681c g O .bss 00000100 J4_inBuff
-000008bc w .text 00000000 ETH_WKUP_IRQHandler
-20000020 g O .data 000000d8 uart_devices
-00007f7a g F .text 00000002 __malloc_lock
+000099cc g F .text 0000002c __sread
+000049c8 g F .text 00000022 Init_Su806_Uart
+00007744 g F .text 0000000a setJ0_485_Baud
+20000410 g O .bss 00000004 mcuUartRxBuffer
+000008cc w .text 00000000 ETH_WKUP_IRQHandler
+20000020 g O .data 00000144 uart_devices
+00007b1e g F .text 00000040 J2QueueSend
+00009b8a g F .text 00000002 __malloc_lock
+00006748 g F .text 00000012 J9_485_IN_TXE
00000530 g F .text 00000016 .hidden __riscv_restore_4
-0000360a g F .text 00000006 __get_MTVAL
+000035d8 g F .text 00000006 __get_MTVAL
+200003d0 g O .bss 00000004 J3_485RxBuffer
00000526 g F .text 00000020 .hidden __riscv_restore_8
-000035fe g F .text 00000006 __get_MEPC
-000071f2 g F .text 00000066 _fflush_r
+00004f3a g F .text 000000c2 J7_Interrupt
+000068fa g F .text 00000040 J1QueueSend
+000035cc g F .text 00000006 __get_MEPC
+00008e02 g F .text 00000066 _fflush_r
000004fc g F .text 0000001a .hidden __riscv_save_6
-000008bc w .text 00000000 SPI2_IRQHandler
-00008468 g O .text 00000020 __sf_fake_stdin
-20000338 g O .bss 00000004 J1_BinarySemaphore
+000008cc w .text 00000000 SPI2_IRQHandler
+0000a12c g O .text 00000020 __sf_fake_stdin
+00006712 g F .text 00000012 J5_485_IN_TXE
00000546 g F .text 000000a8 memset
00000526 g F .text 00000020 .hidden __riscv_restore_9
-00003f08 g F .text 00000106 J5_0_485_Init
00000530 g F .text 00000016 .hidden __riscv_restore_7
-00000628 g F .text 0000006c main
-000008bc w .text 00000000 TIM10_BRK_IRQHandler
-20000354 g O .bss 00000004 J5_0_485_Queue
-0000522a g F .text 00000022 J5_0_485_IN_IDLE
-00005a24 g F .text 0000000a setWorkCurrent
-200002b4 g O .bss 00000001 J1_Rbuffer
-000008bc w .text 00000000 TIM9_CC_IRQHandler
-000016de g F .text 0000002e vListInsert
-2000671c g O .bss 00000100 J3_inBuff
-00007e60 g F .text 00000006 __sclose
-000008bc w .text 00000000 DMA2_Channel5_IRQHandler
-00003382 g F .text 00000060 xTimerCreateTimerTask
-00005b40 g F .text 000001c0 uartQueueSend
-00007616 g F .text 000000d4 _malloc_r
-00000b12 g F .text 0000012e Get_CalibrationValue
-00004708 g F .text 0000002a Init_J5_0_485
-000008bc w .text 00000000 DMA1_Channel5_IRQHandler
-00004be2 g F .text 000000ca J2_Interrupt
-000008bc w .text 00000000 EXTI4_IRQHandler
-00003502 g F .text 0000003a Delay_Ms
-000019ea g F .text 00000070 xQueueGenericCreate
-000040b6 g F .text 00000038 USART_CONNET_J8
-000008bc w .text 00000000 USB_LP_CAN1_RX0_IRQHandler
-0000691e g F .text 00000290 .hidden __mulsf3
-00000afa g F .text 00000018 ADC_BufferCmd
-0000468a g F .text 0000002a Init_J2_485
-00001174 g F .text 0000001a SPI_Cmd
-00000694 g F .text 000000fa SystemInit
-000008bc w .text 00000000 RNG_IRQHandler
-0000524c g F .text 0000001c J1_485_IN_RXNE
-00006dea g F .text 00000040 iprintf
-2000034c g O .bss 00000004 J4_485_Queue
-00002850 g F .text 00000166 xTaskResumeAll
-2000020c g O .data 00000004 uxTopUsedPriority
-000008bc w .text 00000000 USB_HP_CAN1_TX_IRQHandler
-0000216c g F .text 00000046 uxQueueSpacesAvailable
-00008348 g O .text 00000100 .hidden __clz_tab
-000016b2 g F .text 0000000c xPortSetInterruptMask
-000025f0 g F .text 00000090 vTaskStartScheduler
+00000628 g F .text 0000007c main
+0000778a g F .text 0000000a getLora_Uart_Baud
+20000484 g O .bss 00000004 g_J0_handle
+000008cc w .text 00000000 TIM10_BRK_IRQHandler
+00007708 g F .text 0000000a setWorkCurrent
+000008cc w .text 00000000 TIM9_CC_IRQHandler
+0000168c g F .text 0000002e vListInsert
+20000488 g O .bss 00000004 g_J1_handle
+200003e0 g O .bss 00000004 J5_485RxBuffer
+00009a70 g F .text 00000006 __sclose
+000008cc w .text 00000000 DMA2_Channel5_IRQHandler
+00005b90 g F .text 0000001e J9_485_IN_IDLE
+0000414a g F .text 0000008c uart8Init
+00003352 g F .text 0000005e xTimerCreateTimerTask
+0000776c g F .text 0000000a setJ4_485_Baud
+00009226 g F .text 000000d4 _malloc_r
+000064fc g F .text 0000000a getJ9_485_Baud
+00004940 g F .text 00000022 Init_J7_485
+00007726 g F .text 0000000a getBoardTemperature
+000049ea g F .text 00000022 Init_Mcu_Uart
+00000b22 g F .text 0000012e Get_CalibrationValue
+0000211c g F .text 000000f0 xQueueReceiveFromISR
+000008cc w .text 00000000 DMA1_Channel5_IRQHandler
+200003c0 g O .bss 00000004 J1_485RxBuffer
+00004b90 g F .text 000000c2 J2_Interrupt
+000008cc w .text 00000000 EXTI4_IRQHandler
+000034d0 g F .text 0000003a Delay_Ms
+00001998 g F .text 00000070 xQueueGenericCreate
+000008cc w .text 00000000 USB_LP_CAN1_RX0_IRQHandler
+00008460 g F .text 00000290 .hidden __mulsf3
+00000b0a g F .text 00000018 ADC_BufferCmd
+00004e78 g F .text 000000c2 J6_Interrupt
+00004898 g F .text 00000022 Init_J2_485
+000047fc g F .text 00000058 SlaveMcu_uartBuf_Init
+0000552a g F .text 00000106 J5_SensorDataAnalysis
+00003cb2 g F .text 000000d2 Slave485De_GPIO_Init
+0000797c g F .text 00000162 hostBinarySemaphoreFreeMemory
+2000049c g O .bss 00000004 g_J6_handle
+000006a4 g F .text 000000fa SystemInit
+000008cc w .text 00000000 RNG_IRQHandler
+200003cc g O .bss 00000002 J2_485RxBufferIndex
+00005bae g F .text 00000024 J1_485_IN_RXNE
+000089fa g F .text 00000040 iprintf
+20000608 g O .bss 00000004 J4_485_Queue
+000028f0 g F .text 00000166 xTaskResumeAll
+2000062c g O .bss 00000004 hostMcu_uart_Queue
+2000032c g O .data 00000004 uxTopUsedPriority
+000008cc w .text 00000000 USB_HP_CAN1_TX_IRQHandler
+0000220c g F .text 00000046 uxQueueSpacesAvailable
+0000a00c g O .text 00000100 .hidden __clz_tab
+00001660 g F .text 0000000c xPortSetInterruptMask
+00002690 g F .text 00000090 vTaskStartScheduler
00000000 g .init 00000000 _sinit
-00005ef8 g F .text 00000012 J1_485_IN_TXE
-00007e66 g F .text 00000036 _write_r
+000066ee g F .text 00000012 J1_485_IN_TXE
+00003dd8 g F .text 00000092 uart2Init
+000064de g F .text 0000000a setJ7_485_Baud
+00007780 g F .text 0000000a setJ6_485_Baud
+200005b4 g O .bss 00000004 J6_IDLESemaphore
+00009a76 g F .text 00000036 _write_r
+00007758 g F .text 0000000a setJ2_485_Baud
00000300 g .text 00000000 xPortStartFirstTask
-0000481e g F .text 00000028 setJ2_485_SendState
-000008bc w .text 00000000 DMA1_Channel3_IRQHandler
-000008bc w .text 00000000 ETH_IRQHandler
-000079dc g F .text 0000010c _printf_common
-20000214 g O .data 00000004 _impure_ptr
-000008bc w .text 00000000 TIM1_UP_IRQHandler
-000070c2 g F .text 00000130 __sflush_r
-00005f0a g F .text 00000012 J2_485_IN_TXE
-000051c4 g F .text 00000022 J2_485_IN_IDLE
-000008bc w .text 00000000 WWDG_IRQHandler
-00004896 g F .text 0000002a setJ5_0_485_SendState
-00003764 g F .text 00000070 ADC_DMA_Init
-000008bc w .text 00000000 USBHSWakeup_IRQHandler
-000008bc w .text 00000000 DMA2_Channel11_IRQHandler
-000008bc w .text 00000000 Ecall_U_Mode_Handler
-00002e0c g F .text 0000000c vTaskMissedYield
-000052d8 g F .text 0000001e getRs485State
-000008bc w .text 00000000 DMA2_Channel6_IRQHandler
-00005a7e g F .text 0000000a getJ5_0_485_Baud
-200002cc g O .bss 00000004 g_J1_uart6_handle
-00005a2e g F .text 0000000a getWorkVoltage
-000008bc w .text 00000000 TIM2_IRQHandler
-20008000 g .stack 00000000 _eusrstack
-200002d4 g O .bss 00000004 g_J3_usart2_handle
-00003672 g F .text 000000f2 HD_ADC_InIt
+000008cc w .text 00000000 DMA1_Channel3_IRQHandler
+20000588 g O .bss 00000004 mcu_uart_Queue
+00007ea4 g F .text 000000a2 hostRecvSlaveDataParse
+00007f46 g F .text 00000106 J0_SensorDataAnalysis
+000008cc w .text 00000000 ETH_IRQHandler
+000095ec g F .text 0000010c _printf_common
+000044ce g F .text 00000010 FM_MCU_Init
+20000334 g O .data 00000004 _impure_ptr
+000008cc w .text 00000000 TIM1_UP_IRQHandler
+00008cd2 g F .text 00000130 __sflush_r
+00007c80 g F .text 00000012 J2_485_IN_TXE
+200003f8 g O .bss 00000004 J8_485RxBuffer
+00006bf0 g F .text 0000001e J2_485_IN_IDLE
+000008cc w .text 00000000 WWDG_IRQHandler
+00003f02 g F .text 00000094 uart4Init
+00003bda g F .text 0000003a LED_GPIO_Init
+00003922 g F .text 0000006c ADC_DMA_Init
+000008cc w .text 00000000 USBHSWakeup_IRQHandler
+000008cc w .text 00000000 DMA2_Channel11_IRQHandler
+00007cc8 g F .text 00000012 Su806_uart_IN_TXE
+000008cc w .text 00000000 Ecall_U_Mode_Handler
+00002ddc g F .text 0000000c vTaskMissedYield
+00005b72 g F .text 0000001e J8_485_IN_IDLE
+00004546 g F .text 00000010 SlaveMcu_GPIO_Init
+000008cc w .text 00000000 DMA2_Channel6_IRQHandler
+00007730 g F .text 0000000a setBoardTemperature
+00005ffa g F .text 0000018e slaveFrameDataAnalyze
+00003640 g F .text 000000ea applyDataBuffer
+00007712 g F .text 0000000a getWorkVoltage
+000008cc w .text 00000000 TIM2_IRQHandler
+20010000 g .stack 00000000 _eusrstack
+20000638 g O .bss 00000004 lora_uart_Queue
+0000381a g F .text 00000108 HD_ADC_InIt
00000516 g F .text 0000000c .hidden __riscv_save_2
00000200 g .text 00000000 SW_Handler
-000021b2 g F .text 0000006c vQueueAddToRegistry
-000026a4 g F .text 000001ac xTaskIncrementTick
-00000950 g F .text 0000003e ADC_DeInit
-00005a38 g F .text 0000000a setWorkVoltage
-0000570a g F .text 00000108 J5_0_SensorDataAnalysis
-000008bc w .text 00000000 TIM1_BRK_IRQHandler
-00007484 g F .text 00000058 __swhatbuf_r
-0000098e g F .text 00000056 ADC_Init
-0000127a g F .text 00000008 USART_SendData
-000008bc w .text 00000000 DMA2_Channel10_IRQHandler
-00005a4c g F .text 0000000a getUpWard_Uart_Baud
-000008bc w .text 00000000 EXTI1_IRQHandler
+00002252 g F .text 0000006c vQueueAddToRegistry
+00004962 g F .text 00000022 Init_J8_485
+00002744 g F .text 000001ac xTaskIncrementTick
+00000960 g F .text 0000003e ADC_DeInit
+0000771c g F .text 0000000a setWorkVoltage
+2000048c g O .bss 00000004 g_J2_handle
+000008cc w .text 00000000 TIM1_BRK_IRQHandler
+00009094 g F .text 00000058 __swhatbuf_r
+0000099e g F .text 00000056 ADC_Init
+00001226 g F .text 00000008 USART_SendData
+000049a6 g F .text 00000022 Init_Lora_Uart
+000008cc w .text 00000000 DMA2_Channel10_IRQHandler
+000008cc w .text 00000000 EXTI1_IRQHandler
000004fc g F .text 0000001a .hidden __riscv_save_5
-0000192e g F .text 000000bc xQueueGenericReset
-00003596 g F .text 0000003e _write
-20000220 g .data 00000000 _edata
-00004ffe g F .text 0000007a setConnectPort
-20007528 g .bss 00000000 _end
-200002c4 g O .bss 00000001 J5_0_Rbuffer
-000037d4 g F .text 00000056 startAdcCapture
-00003d44 g F .text 000000c8 J3_485_Init
-000008bc w .text 00000000 RTCAlarm_IRQHandler
-000023ec g F .text 00000204 xTaskCreate
-00004b16 g F .text 000000cc J1_Interrupt
-000084e4 g .dlalign 00000000 _data_lma
-000008bc w .text 00000000 TIM10_UP_IRQHandler
-000008bc w .text 00000000 TIM9_TRG_COM_IRQHandler
-000042ee g F .text 0000004c UART7_IRQHandler
-000041be g F .text 0000004c USART2_IRQHandler
-000042a2 g F .text 0000004c UART6_IRQHandler
-2000651c g O .bss 00000100 J1_inBuff
-00007de8 g F .text 00000048 __swrite
-000052f6 g F .text 0000000c getUartState
-00007754 g F .text 00000288 _vfiprintf_r
-0000741a g F .text 0000006a _fwalk_reent
-0000078e g F .text 0000012e SystemCoreClockUpdate
-00003b3e g F .text 0000000c HD_GPIO_Write
-000039a4 g F .text 0000019a HD_GPIO_Init
-000008bc w .text 00000000 I2C2_ER_IRQHandler
-00002a86 g F .text 00000064 vTaskDelay
-000008bc w .text 00000000 DMA1_Channel2_IRQHandler
-00008488 g O .text 00000020 __sf_fake_stdout
+000018dc g F .text 000000bc xQueueGenericReset
+20000418 g O .bss 00000004 mcuUartRxTime
+00003564 g F .text 0000003e _write
+200005a4 g O .bss 00000004 J2_IDLESemaphore
+20000340 g .data 00000000 _edata
+000064d4 g F .text 0000000a getJ7_485_Baud
+00005170 g F .text 00000096 Mcu_Interrupt
+2000bc40 g .bss 00000000 _end
+200004f4 g O .bss 00000004 J5_IDLESemaphore
+0000378a g F .text 00000054 configConversionBaud
+0000398e g F .text 00000064 startAdcCapture
+000008cc w .text 00000000 RTCAlarm_IRQHandler
+00007794 g F .text 0000000a setLora_Uart_Baud
+0000248c g F .text 00000204 xTaskCreate
+00004ace g F .text 000000c2 J1_Interrupt
+0000a1a8 g .dlalign 00000000 _data_lma
+000008cc w .text 00000000 TIM10_UP_IRQHandler
+000008cc w .text 00000000 TIM9_TRG_COM_IRQHandler
+00004362 g F .text 00000050 UART7_IRQHandler
+200004a8 g O .bss 00000004 g_J9_handle
+00004504 g F .text 00000042 HostMcu_485DE_Read
+000041d6 g F .text 0000004c USART2_IRQHandler
+00004312 g F .text 00000050 UART6_IRQHandler
+000099f8 g F .text 00000048 __swrite
+0000835c g F .text 00000104 Lora_SensorDataAnalysis
+00009364 g F .text 00000288 _vfiprintf_r
+000048fe g F .text 00000020 Init_J5_485
+0000902a g F .text 0000006a _fwalk_reent
+200004fc g O .bss 00000004 J7_IDLESemaphore
+00003a2c g F .text 00000122 PwrCtrl_GPIO_Init
+0000079e g F .text 0000012e SystemCoreClockUpdate
+0000880c g F .text 000000ce .hidden __floatunsisf
+00005c3e g F .text 00000024 J8_485_IN_RXNE
+00003dc0 g F .text 0000000c HD_GPIO_Write
+000064b6 g F .text 0000000a setJ3_485_Baud
+000008cc w .text 00000000 I2C2_ER_IRQHandler
+00002a56 g F .text 00000064 vTaskDelay
+000008cc w .text 00000000 DMA1_Channel2_IRQHandler
+00007776 g F .text 0000000a getJ6_485_Baud
+00007cda g F .text 00000012 hostMcu_uart_IN_TXE
+0000a14c g O .text 00000020 __sf_fake_stdout
+200003e8 g O .bss 00000004 J6_485RxBuffer
00000522 g F .text 00000024 .hidden __riscv_restore_12
-000008bc w .text 00000000 TIM8_BRK_IRQHandler
-000040ee g F .text 00000038 USART_CONNET_J9
-00002e18 g F .text 0000001c xTaskGetSchedulerState
-00002fac g F .text 000000e6 vTaskPriorityDisinheritAfterTimeout
-00007ff2 g F .text 00000010 _read
-000008be w .text 00000000 handle_reset
-000008bc w .text 00000000 CAN1_SCE_IRQHandler
-00004cac g F .text 000000ba J4_Interrupt
-200002bc g O .bss 00000001 J3_Rbuffer
-00006bae g F .text 00000056 .hidden __fixunssfsi
+000008cc w .text 00000000 TIM8_BRK_IRQHandler
+00002de8 g F .text 0000001c xTaskGetSchedulerState
+00006506 g F .text 0000000a setJ9_485_Baud
+00002f7c g F .text 000000e6 vTaskPriorityDisinheritAfterTimeout
+200004e4 g O .bss 00000004 J1_IDLESemaphore
+00009c02 g F .text 00000010 _read
+000008ce w .text 00000000 handle_reset
+000008cc w .text 00000000 CAN1_SCE_IRQHandler
+00004d14 g F .text 000000b2 J4_Interrupt
+000086f0 g F .text 00000056 .hidden __fixunssfsi
00000516 g F .text 0000000c .hidden __riscv_save_0
-000008bc w .text 00000000 FLASH_IRQHandler
-00005f2e g F .text 00000012 J4_485_IN_TXE
-0000688a g F .text 00000094 upwardUartDataAnalysis
-000008bc w .text 00000000 USART1_IRQHandler
-000074dc g F .text 00000092 __smakebuf_r
+000008cc w .text 00000000 FLASH_IRQHandler
+200003d8 g O .bss 00000004 J4_485RxBuffer
+00007ca4 g F .text 00000012 J6_485_IN_TXE
+00007c92 g F .text 00000012 J4_485_IN_TXE
+000008cc w .text 00000000 USART1_IRQHandler
+000090ec g F .text 00000092 __smakebuf_r
+00007cb6 g F .text 00000012 Lora_uart_IN_TXE
00000400 g .text 00000000 pxPortInitialiseStack
-00007ae8 g F .text 000002a2 _printf_i
-000008bc w .text 00000000 SPI3_IRQHandler
-0000456e g F .text 0000000c read_Flash
-0000228a g F .text 0000002e xQueueAddToSet
-20000384 g O .bss 00000004 __malloc_sbrk_start
-00001118 g F .text 0000001e RCC_APB2PeriphResetCmd
-000048ea g F .text 000000ce J3_Interrupt
-0000687a g F .text 00000010 getTickDiff
-000008bc w .text 00000000 I2C1_ER_IRQHandler
-0000382a g F .text 000000ae SPI_Flash_Init
-00001136 g F .text 0000003e SPI_Init
-00000eda g F .text 0000000a NVIC_PriorityGroupConfig
-0000165a g F .text 00000016 vPortEnterCritical
-000052bc g F .text 0000001c J5_0_485_IN_RXNE
-00000c4a g F .text 0000016c DMA_DeInit
-20000368 g O .bss 00000004 upward_uart_Queue
-20000380 g O .bss 00000004 __malloc_free_list
+000096f8 g F .text 000002a2 _printf_i
+000008cc w .text 00000000 SPI3_IRQHandler
+20000406 g O .bss 00000002 frameLength
+00004556 g F .text 0000005a SlaveMcu_485DE_Read
+200004b0 g O .bss 00000004 g_Mcu_handle
+200003c8 g O .bss 00000004 J2_485RxBuffer
+20000564 g O .bss 00000004 J7_485_Queue
+0000232a g F .text 0000002e xQueueAddToSet
+20000668 g O .bss 00000004 __malloc_sbrk_start
+0000697a g F .text 00000040 J5QueueSend
+0000112e g F .text 0000001e RCC_APB2PeriphResetCmd
+00004c52 g F .text 000000c2 J3_Interrupt
+0000372a g F .text 00000010 getTickDiff
+000008cc w .text 00000000 I2C1_ER_IRQHandler
+00003f96 g F .text 00000098 uart5Init
+00000ef0 g F .text 0000000a NVIC_PriorityGroupConfig
+00001608 g F .text 00000016 vPortEnterCritical
+00000c5a g F .text 0000016c DMA_DeInit
+20000664 g O .bss 00000004 __malloc_free_list
0000053a g F .text 0000000c .hidden __riscv_restore_1
-000049b8 g F .text 000000ce J5_0_Interrupt
-000059be g F .text 0000005c readConfigParameter
-00007754 g F .text 00000288 _vfprintf_r
-000043c8 g F .text 00000032 proportionalInt
-0000486e g F .text 00000028 setJ4_485_SendState
-00003e0c g F .text 000000c4 J4_485_Init
-00005f1c g F .text 00000012 J3_485_IN_TXE
-2000029c g O .bss 00000006 adcData
-000008bc w .text 00000000 USBWakeUp_IRQHandler
-000060fa g F .text 0000003e checkModebusCrc
-20000344 g O .bss 00000004 J3_485_Queue
-00001d3a g F .text 00000110 xQueueGiveFromISR
-00007fb2 g F .text 00000010 _close
-0000463a g F .text 00000026 uart_dev_in_char
-000008bc w .text 00000000 DMA2_Channel3_IRQHandler
-200002c0 g O .bss 00000001 J4_Rbuffer
+00005206 g F .text 00000088 Su806_Interrupt
+00009364 g F .text 00000288 _vfprintf_r
+00004440 g F .text 00000026 proportionalInt
+000044de g F .text 00000006 getMCU
+200003b8 g O .bss 00000004 J0_485RxBuffer
+200004a0 g O .bss 00000004 g_J7_handle
+00000ed2 g F .text 0000000a GPIO_ReadInputDataBit
+00006700 g F .text 00000012 J3_485_IN_TXE
+20000430 g O .bss 00000008 adcData
+00006dc6 g F .text 0000021a hostStartApp
+000008cc w .text 00000000 USBWakeUp_IRQHandler
+000039f2 g F .text 0000003a mcu_GPIO_Init
+00004466 g F .text 0000001c getSOCPwrOnVoltage
+2000054c g O .bss 00000004 J3_485_Queue
+00001ce8 g F .text 00000110 xQueueGiveFromISR
+00009bc2 g F .text 00000010 _close
+0000476a g F .text 00000026 uart_dev_in_char
+00006736 g F .text 00000012 J8_485_IN_TXE
+000008cc w .text 00000000 DMA2_Channel3_IRQHandler
Disassembly of section .init:
00000000 <_sinit>:
- 0: 0bf0006f j 8be
+ 0: 0cf0006f j 8ce
Disassembly of section .vector:
@@ -752,15 +974,15 @@ Disassembly of section .vector:
12: 0000 unimp
14: 0000 unimp
16: 0000 unimp
- 18: 08bc addi a5,sp,88
+ 18: 08cc addi a1,sp,84
...
22: 0000 unimp
- 24: 08bc addi a5,sp,88
+ 24: 08cc addi a1,sp,84
26: 0000 unimp
- 28: 08bc addi a5,sp,88
+ 28: 08cc addi a1,sp,84
...
32: 0000 unimp
- 34: 1622 slli a2,a2,0x28
+ 34: 15d0 addi a2,sp,740
36: 0000 unimp
38: 0000 unimp
3a: 0000 unimp
@@ -768,181 +990,181 @@ Disassembly of section .vector:
3e: 0000 unimp
40: 0000 unimp
42: 0000 unimp
- 44: 08bc addi a5,sp,88
+ 44: 08cc addi a1,sp,84
46: 0000 unimp
- 48: 08bc addi a5,sp,88
+ 48: 08cc addi a1,sp,84
4a: 0000 unimp
- 4c: 08bc addi a5,sp,88
+ 4c: 08cc addi a1,sp,84
4e: 0000 unimp
- 50: 08bc addi a5,sp,88
+ 50: 08cc addi a1,sp,84
52: 0000 unimp
- 54: 08bc addi a5,sp,88
+ 54: 08cc addi a1,sp,84
56: 0000 unimp
- 58: 08bc addi a5,sp,88
+ 58: 08cc addi a1,sp,84
5a: 0000 unimp
- 5c: 08bc addi a5,sp,88
+ 5c: 08cc addi a1,sp,84
5e: 0000 unimp
- 60: 08bc addi a5,sp,88
+ 60: 08cc addi a1,sp,84
62: 0000 unimp
- 64: 08bc addi a5,sp,88
+ 64: 08cc addi a1,sp,84
66: 0000 unimp
- 68: 08bc addi a5,sp,88
+ 68: 08cc addi a1,sp,84
6a: 0000 unimp
- 6c: 08bc addi a5,sp,88
+ 6c: 08cc addi a1,sp,84
6e: 0000 unimp
- 70: 08bc addi a5,sp,88
+ 70: 08cc addi a1,sp,84
72: 0000 unimp
- 74: 08bc addi a5,sp,88
+ 74: 08cc addi a1,sp,84
76: 0000 unimp
- 78: 08bc addi a5,sp,88
+ 78: 08cc addi a1,sp,84
7a: 0000 unimp
- 7c: 08bc addi a5,sp,88
+ 7c: 08cc addi a1,sp,84
7e: 0000 unimp
- 80: 08bc addi a5,sp,88
+ 80: 08cc addi a1,sp,84
82: 0000 unimp
- 84: 08bc addi a5,sp,88
+ 84: 08cc addi a1,sp,84
86: 0000 unimp
- 88: 08bc addi a5,sp,88
+ 88: 08cc addi a1,sp,84
8a: 0000 unimp
- 8c: 08bc addi a5,sp,88
+ 8c: 08cc addi a1,sp,84
8e: 0000 unimp
- 90: 08bc addi a5,sp,88
+ 90: 08cc addi a1,sp,84
92: 0000 unimp
- 94: 08bc addi a5,sp,88
+ 94: 08cc addi a1,sp,84
96: 0000 unimp
- 98: 08bc addi a5,sp,88
+ 98: 08cc addi a1,sp,84
9a: 0000 unimp
- 9c: 08bc addi a5,sp,88
+ 9c: 08cc addi a1,sp,84
9e: 0000 unimp
- a0: 08bc addi a5,sp,88
+ a0: 08cc addi a1,sp,84
a2: 0000 unimp
- a4: 08bc addi a5,sp,88
+ a4: 08cc addi a1,sp,84
a6: 0000 unimp
- a8: 08bc addi a5,sp,88
+ a8: 08cc addi a1,sp,84
aa: 0000 unimp
- ac: 08bc addi a5,sp,88
+ ac: 08cc addi a1,sp,84
ae: 0000 unimp
- b0: 08bc addi a5,sp,88
+ b0: 08cc addi a1,sp,84
b2: 0000 unimp
- b4: 08bc addi a5,sp,88
+ b4: 08cc addi a1,sp,84
b6: 0000 unimp
- b8: 08bc addi a5,sp,88
+ b8: 08cc addi a1,sp,84
ba: 0000 unimp
- bc: 08bc addi a5,sp,88
+ bc: 08cc addi a1,sp,84
be: 0000 unimp
- c0: 08bc addi a5,sp,88
+ c0: 08cc addi a1,sp,84
c2: 0000 unimp
- c4: 08bc addi a5,sp,88
+ c4: 08cc addi a1,sp,84
c6: 0000 unimp
- c8: 08bc addi a5,sp,88
+ c8: 08cc addi a1,sp,84
ca: 0000 unimp
- cc: 08bc addi a5,sp,88
+ cc: 08cc addi a1,sp,84
ce: 0000 unimp
- d0: 08bc addi a5,sp,88
+ d0: 08cc addi a1,sp,84
d2: 0000 unimp
- d4: 08bc addi a5,sp,88
+ d4: 08cc addi a1,sp,84
d6: 0000 unimp
- d8: 08bc addi a5,sp,88
+ d8: 08cc addi a1,sp,84
da: 0000 unimp
- dc: 41be lw gp,204(sp)
+ dc: 41d6 lw gp,84(sp)
de: 0000 unimp
- e0: 420a lw tp,128(sp)
+ e0: 4222 lw tp,8(sp)
e2: 0000 unimp
- e4: 08bc addi a5,sp,88
+ e4: 08cc addi a1,sp,84
e6: 0000 unimp
- e8: 08bc addi a5,sp,88
+ e8: 08cc addi a1,sp,84
ea: 0000 unimp
- ec: 08bc addi a5,sp,88
+ ec: 08cc addi a1,sp,84
ee: 0000 unimp
- f0: 08bc addi a5,sp,88
+ f0: 08cc addi a1,sp,84
f2: 0000 unimp
- f4: 08bc addi a5,sp,88
+ f4: 08cc addi a1,sp,84
f6: 0000 unimp
- f8: 08bc addi a5,sp,88
+ f8: 08cc addi a1,sp,84
fa: 0000 unimp
- fc: 08bc addi a5,sp,88
+ fc: 08cc addi a1,sp,84
fe: 0000 unimp
- 100: 08bc addi a5,sp,88
+ 100: 08cc addi a1,sp,84
102: 0000 unimp
104: 0000 unimp
106: 0000 unimp
- 108: 08bc addi a5,sp,88
+ 108: 08cc addi a1,sp,84
10a: 0000 unimp
- 10c: 08bc addi a5,sp,88
+ 10c: 08cc addi a1,sp,84
10e: 0000 unimp
- 110: 08bc addi a5,sp,88
+ 110: 08cc addi a1,sp,84
112: 0000 unimp
- 114: 08bc addi a5,sp,88
+ 114: 4272 lw tp,28(sp)
116: 0000 unimp
- 118: 4256 lw tp,84(sp)
+ 118: 42c2 lw t0,16(sp)
11a: 0000 unimp
- 11c: 08bc addi a5,sp,88
+ 11c: 08cc addi a1,sp,84
11e: 0000 unimp
- 120: 08bc addi a5,sp,88
+ 120: 08cc addi a1,sp,84
122: 0000 unimp
- 124: 08bc addi a5,sp,88
+ 124: 08cc addi a1,sp,84
126: 0000 unimp
- 128: 08bc addi a5,sp,88
+ 128: 08cc addi a1,sp,84
12a: 0000 unimp
- 12c: 08bc addi a5,sp,88
+ 12c: 08cc addi a1,sp,84
12e: 0000 unimp
- 130: 08bc addi a5,sp,88
+ 130: 08cc addi a1,sp,84
132: 0000 unimp
- 134: 08bc addi a5,sp,88
+ 134: 08cc addi a1,sp,84
136: 0000 unimp
- 138: 08bc addi a5,sp,88
+ 138: 08cc addi a1,sp,84
13a: 0000 unimp
- 13c: 08bc addi a5,sp,88
+ 13c: 08cc addi a1,sp,84
13e: 0000 unimp
- 140: 08bc addi a5,sp,88
+ 140: 08cc addi a1,sp,84
142: 0000 unimp
- 144: 08bc addi a5,sp,88
+ 144: 08cc addi a1,sp,84
146: 0000 unimp
- 148: 08bc addi a5,sp,88
+ 148: 08cc addi a1,sp,84
14a: 0000 unimp
- 14c: 08bc addi a5,sp,88
+ 14c: 08cc addi a1,sp,84
14e: 0000 unimp
- 150: 08bc addi a5,sp,88
+ 150: 08cc addi a1,sp,84
152: 0000 unimp
- 154: 08bc addi a5,sp,88
+ 154: 08cc addi a1,sp,84
156: 0000 unimp
- 158: 08bc addi a5,sp,88
+ 158: 08cc addi a1,sp,84
15a: 0000 unimp
- 15c: 08bc addi a5,sp,88
+ 15c: 08cc addi a1,sp,84
15e: 0000 unimp
- 160: 42a2 lw t0,8(sp)
+ 160: 4312 lw t1,4(sp)
162: 0000 unimp
- 164: 42ee lw t0,216(sp)
+ 164: 4362 lw t1,24(sp)
166: 0000 unimp
- 168: 433a lw t1,140(sp)
+ 168: 43b2 lw t2,12(sp)
16a: 0000 unimp
- 16c: 08bc addi a5,sp,88
+ 16c: 08cc addi a1,sp,84
16e: 0000 unimp
- 170: 08bc addi a5,sp,88
+ 170: 08cc addi a1,sp,84
172: 0000 unimp
- 174: 08bc addi a5,sp,88
+ 174: 08cc addi a1,sp,84
176: 0000 unimp
- 178: 08bc addi a5,sp,88
+ 178: 08cc addi a1,sp,84
17a: 0000 unimp
- 17c: 08bc addi a5,sp,88
+ 17c: 08cc addi a1,sp,84
17e: 0000 unimp
- 180: 08bc addi a5,sp,88
+ 180: 08cc addi a1,sp,84
182: 0000 unimp
- 184: 08bc addi a5,sp,88
+ 184: 08cc addi a1,sp,84
186: 0000 unimp
- 188: 08bc addi a5,sp,88
+ 188: 08cc addi a1,sp,84
18a: 0000 unimp
- 18c: 08bc addi a5,sp,88
+ 18c: 08cc addi a1,sp,84
18e: 0000 unimp
- 190: 08bc addi a5,sp,88
+ 190: 08cc addi a1,sp,84
192: 0000 unimp
- 194: 08bc addi a5,sp,88
+ 194: 08cc addi a1,sp,84
196: 0000 unimp
- 198: 08bc addi a5,sp,88
+ 198: 08cc addi a1,sp,84
19a: 0000 unimp
- 19c: 08bc addi a5,sp,88
+ 19c: 08cc addi a1,sp,84
19e: 0000 unimp
- 1a0: 08bc addi a5,sp,88
+ 1a0: 08cc addi a1,sp,84
...
Disassembly of section .text:
@@ -980,18 +1202,18 @@ Disassembly of section .text:
23c: 300022f3 csrr t0,mstatus
240: da96 sw t0,116(sp)
242: 20000297 auipc t0,0x20000
- 246: 0022a283 lw t0,2(t0) # 20000244
+ 246: 1222a283 lw t0,290(t0) # 20000364
24a: 0022a023 sw sp,0(t0)
24e: 341025f3 csrr a1,mepc
252: c02e sw a1,0(sp)
254: 02000593 li a1,32
258: 8045a073 csrs 0x804,a1
- 25c: 8181a103 lw sp,-2024(gp) # 20000218
- 260: 08b020ef jal ra,2aea
+ 25c: 8181a103 lw sp,-2024(gp) # 20000338
+ 260: 05b020ef jal ra,2aba
00000264 :
264: 20000317 auipc t1,0x20000
- 268: fe032303 lw t1,-32(t1) # 20000244
+ 268: 10032303 lw t1,256(t1) # 20000364
26c: 00032103 lw sp,0(t1)
270: 4282 lw t0,0(sp)
272: 34129073 csrw mepc,t0
@@ -1046,11 +1268,11 @@ Disassembly of section .text:
2fc: 00000013 nop
00000300 :
- 300: 8181a283 lw t0,-2024(gp) # 20000218
+ 300: 8181a283 lw t0,-2024(gp) # 20000338
304: e0028293 addi t0,t0,-512
308: 34029073 csrw mscratch,t0
30c: 20000117 auipc sp,0x20000
- 310: f3812103 lw sp,-200(sp) # 20000244
+ 310: 05812103 lw sp,88(sp) # 20000364
314: 4102 lw sp,0(sp)
316: 4082 lw ra,0(sp)
318: 4332 lw t1,12(sp)
@@ -1276,11684 +1498,14242 @@ Disassembly of section .text:
5ee: a001 j 5ee
000005f0 :
- 5f0: 00e030ef jal ra,35fe <__get_MEPC>
+ 5f0: 7dd020ef jal ra,35cc <__get_MEPC>
5f4: 85aa mv a1,a0
- 5f6: 00008537 lui a0,0x8
- 5fa: 00450513 addi a0,a0,4 # 8004 <_read+0x12>
- 5fe: 7ec060ef jal ra,6dea
- 602: 002030ef jal ra,3604 <__get_MCAUSE>
+ 5f6: 0000a537 lui a0,0xa
+ 5fa: c1450513 addi a0,a0,-1004 # 9c14 <_read+0x12>
+ 5fe: 3fc080ef jal ra,89fa
+ 602: 7d1020ef jal ra,35d2 <__get_MCAUSE>
606: 85aa mv a1,a0
- 608: 00008537 lui a0,0x8
- 60c: 01050513 addi a0,a0,16 # 8010 <_read+0x1e>
- 610: 7da060ef jal ra,6dea
- 614: 7f7020ef jal ra,360a <__get_MTVAL>
+ 608: 0000a537 lui a0,0xa
+ 60c: c2050513 addi a0,a0,-992 # 9c20 <_read+0x1e>
+ 610: 3ea080ef jal ra,89fa
+ 614: 7c5020ef jal ra,35d8 <__get_MTVAL>
618: 85aa mv a1,a0
- 61a: 00008537 lui a0,0x8
- 61e: 02050513 addi a0,a0,32 # 8020 <_read+0x2e>
- 622: 7c8060ef jal ra,6dea
+ 61a: 0000a537 lui a0,0xa
+ 61e: c3050513 addi a0,a0,-976 # 9c30 <_read+0x2e>
+ 622: 3d8080ef jal ra,89fa
626: a001 j 626
00000628 :
628: eefff2ef jal t0,516 <__riscv_save_0>
62c: 4509 li a0,2
- 62e: 0ad000ef jal ra,eda
- 632: 2ab1 jal 78e
- 634: 69d020ef jal ra,34d0
+ 62e: 0c3000ef jal ra,ef0
+ 632: 22b5 jal 79e
+ 634: 66b020ef jal ra,349e
638: 6571 lui a0,0x1c
- 63a: 20050513 addi a0,a0,512 # 1c200 <_data_lma+0x13d1c>
- 63e: 6ff020ef jal ra,353c
+ 63a: 20050513 addi a0,a0,512 # 1c200 <_data_lma+0x12058>
+ 63e: 6cd020ef jal ra,350a
642: 200007b7 lui a5,0x20000
- 646: 2007a583 lw a1,512(a5) # 20000200
- 64a: 00008537 lui a0,0x8
- 64e: 02c50513 addi a0,a0,44 # 802c <_read+0x3a>
- 652: 798060ef jal ra,6dea
- 656: 23ed jal c40
+ 646: 3207a583 lw a1,800(a5) # 20000320
+ 64a: 0000a537 lui a0,0xa
+ 64e: c3c50513 addi a0,a0,-964 # 9c3c <_read+0x3a>
+ 652: 3a8080ef jal ra,89fa
+ 656: 2bed jal c50
658: 85aa mv a1,a0
- 65a: 00008537 lui a0,0x8
- 65e: 03c50513 addi a0,a0,60 # 803c <_read+0x4a>
- 662: 788060ef jal ra,6dea
- 666: 000085b7 lui a1,0x8
- 66a: 00008537 lui a0,0x8
- 66e: 04c58593 addi a1,a1,76 # 804c <_read+0x5a>
- 672: 05450513 addi a0,a0,84 # 8054 <_read+0x62>
- 676: 774060ef jal ra,6dea
- 67a: 246050ef jal ra,58c0
- 67e: 00008437 lui s0,0x8
- 682: 07440513 addi a0,s0,116 # 8074 <_read+0x82>
- 686: 079060ef jal ra,6efe
- 68a: 3e800513 li a0,1000
- 68e: 675020ef jal ra,3502
- 692: bfc5 j 682
+ 65a: 0000a537 lui a0,0xa
+ 65e: c4c50513 addi a0,a0,-948 # 9c4c <_read+0x4a>
+ 662: 398080ef jal ra,89fa
+ 666: 0000a5b7 lui a1,0xa
+ 66a: 0000a537 lui a0,0xa
+ 66e: c5c58593 addi a1,a1,-932 # 9c5c <_read+0x5a>
+ 672: c6450513 addi a0,a0,-924 # 9c64 <_read+0x62>
+ 676: 384080ef jal ra,89fa
+ 67a: 655030ef jal ra,44ce
+ 67e: 661030ef jal ra,44de
+ 682: cd11 beqz a0,69e
+ 684: 6b0050ef jal ra,5d34
+ 688: 0000a437 lui s0,0xa
+ 68c: c8440513 addi a0,s0,-892 # 9c84 <_read+0x82>
+ 690: 47e080ef jal ra,8b0e
+ 694: 3e800513 li a0,1000
+ 698: 639020ef jal ra,34d0
+ 69c: bfc5 j 68c
+ 69e: 728060ef jal ra,6dc6
+ 6a2: b7dd j 688
-00000694 :
- 694: 400217b7 lui a5,0x40021
- 698: 4398 lw a4,0(a5)
- 69a: f0ff06b7 lui a3,0xf0ff0
- 69e: 1141 addi sp,sp,-16
- 6a0: 00176713 ori a4,a4,1
- 6a4: c398 sw a4,0(a5)
- 6a6: 43d8 lw a4,4(a5)
- 6a8: 00020637 lui a2,0x20
- 6ac: 8f75 and a4,a4,a3
- 6ae: c3d8 sw a4,4(a5)
- 6b0: 4398 lw a4,0(a5)
- 6b2: fef706b7 lui a3,0xfef70
- 6b6: 16fd addi a3,a3,-1
- 6b8: 8f75 and a4,a4,a3
- 6ba: c398 sw a4,0(a5)
- 6bc: 4398 lw a4,0(a5)
- 6be: fffc06b7 lui a3,0xfffc0
- 6c2: 16fd addi a3,a3,-1
- 6c4: 8f75 and a4,a4,a3
- 6c6: c398 sw a4,0(a5)
- 6c8: 43d8 lw a4,4(a5)
- 6ca: ff0106b7 lui a3,0xff010
- 6ce: 16fd addi a3,a3,-1
- 6d0: 8f75 and a4,a4,a3
- 6d2: c3d8 sw a4,4(a5)
- 6d4: 4398 lw a4,0(a5)
- 6d6: ec0006b7 lui a3,0xec000
- 6da: 16fd addi a3,a3,-1
- 6dc: 8f75 and a4,a4,a3
- 6de: c398 sw a4,0(a5)
- 6e0: 00ff0737 lui a4,0xff0
- 6e4: c798 sw a4,8(a5)
- 6e6: 0207a623 sw zero,44(a5) # 4002102c <__freertos_irq_stack_top+0x2001902c>
- 6ea: c402 sw zero,8(sp)
- 6ec: c602 sw zero,12(sp)
- 6ee: 4398 lw a4,0(a5)
- 6f0: 66c1 lui a3,0x10
- 6f2: 8f55 or a4,a4,a3
- 6f4: c398 sw a4,0(a5)
- 6f6: 400216b7 lui a3,0x40021
- 6fa: 6705 lui a4,0x1
- 6fc: 429c lw a5,0(a3)
- 6fe: 8ff1 and a5,a5,a2
- 700: c63e sw a5,12(sp)
- 702: 47a2 lw a5,8(sp)
- 704: 0785 addi a5,a5,1
- 706: c43e sw a5,8(sp)
- 708: 47b2 lw a5,12(sp)
- 70a: e781 bnez a5,712
- 70c: 47a2 lw a5,8(sp)
- 70e: fee797e3 bne a5,a4,6fc
- 712: 400217b7 lui a5,0x40021
- 716: 439c lw a5,0(a5)
- 718: 00e79713 slli a4,a5,0xe
- 71c: 06075763 bgez a4,78a
- 720: 4785 li a5,1
- 722: c63e sw a5,12(sp)
- 724: 4732 lw a4,12(sp)
- 726: 4785 li a5,1
- 728: 04f71f63 bne a4,a5,786
- 72c: 400217b7 lui a5,0x40021
- 730: 43d8 lw a4,4(a5)
- 732: ffc106b7 lui a3,0xffc10
- 736: 16fd addi a3,a3,-1
- 738: c3d8 sw a4,4(a5)
- 73a: 43d8 lw a4,4(a5)
- 73c: c3d8 sw a4,4(a5)
- 73e: 43d8 lw a4,4(a5)
- 740: 40076713 ori a4,a4,1024
- 744: c3d8 sw a4,4(a5)
- 746: 43d8 lw a4,4(a5)
- 748: 8f75 and a4,a4,a3
- 74a: c3d8 sw a4,4(a5)
- 74c: 43d8 lw a4,4(a5)
- 74e: 001106b7 lui a3,0x110
- 752: 8f55 or a4,a4,a3
+000006a4 :
+ 6a4: 400217b7 lui a5,0x40021
+ 6a8: 4398 lw a4,0(a5)
+ 6aa: f0ff06b7 lui a3,0xf0ff0
+ 6ae: 1141 addi sp,sp,-16
+ 6b0: 00176713 ori a4,a4,1
+ 6b4: c398 sw a4,0(a5)
+ 6b6: 43d8 lw a4,4(a5)
+ 6b8: 00020637 lui a2,0x20
+ 6bc: 8f75 and a4,a4,a3
+ 6be: c3d8 sw a4,4(a5)
+ 6c0: 4398 lw a4,0(a5)
+ 6c2: fef706b7 lui a3,0xfef70
+ 6c6: 16fd addi a3,a3,-1
+ 6c8: 8f75 and a4,a4,a3
+ 6ca: c398 sw a4,0(a5)
+ 6cc: 4398 lw a4,0(a5)
+ 6ce: fffc06b7 lui a3,0xfffc0
+ 6d2: 16fd addi a3,a3,-1
+ 6d4: 8f75 and a4,a4,a3
+ 6d6: c398 sw a4,0(a5)
+ 6d8: 43d8 lw a4,4(a5)
+ 6da: ff0106b7 lui a3,0xff010
+ 6de: 16fd addi a3,a3,-1
+ 6e0: 8f75 and a4,a4,a3
+ 6e2: c3d8 sw a4,4(a5)
+ 6e4: 4398 lw a4,0(a5)
+ 6e6: ec0006b7 lui a3,0xec000
+ 6ea: 16fd addi a3,a3,-1
+ 6ec: 8f75 and a4,a4,a3
+ 6ee: c398 sw a4,0(a5)
+ 6f0: 00ff0737 lui a4,0xff0
+ 6f4: c798 sw a4,8(a5)
+ 6f6: 0207a623 sw zero,44(a5) # 4002102c <__freertos_irq_stack_top+0x2001102c>
+ 6fa: c402 sw zero,8(sp)
+ 6fc: c602 sw zero,12(sp)
+ 6fe: 4398 lw a4,0(a5)
+ 700: 66c1 lui a3,0x10
+ 702: 8f55 or a4,a4,a3
+ 704: c398 sw a4,0(a5)
+ 706: 400216b7 lui a3,0x40021
+ 70a: 6705 lui a4,0x1
+ 70c: 429c lw a5,0(a3)
+ 70e: 8ff1 and a5,a5,a2
+ 710: c63e sw a5,12(sp)
+ 712: 47a2 lw a5,8(sp)
+ 714: 0785 addi a5,a5,1
+ 716: c43e sw a5,8(sp)
+ 718: 47b2 lw a5,12(sp)
+ 71a: e781 bnez a5,722
+ 71c: 47a2 lw a5,8(sp)
+ 71e: fee797e3 bne a5,a4,70c
+ 722: 400217b7 lui a5,0x40021
+ 726: 439c lw a5,0(a5)
+ 728: 00e79713 slli a4,a5,0xe
+ 72c: 06075763 bgez a4,79a
+ 730: 4785 li a5,1
+ 732: c63e sw a5,12(sp)
+ 734: 4732 lw a4,12(sp)
+ 736: 4785 li a5,1
+ 738: 04f71f63 bne a4,a5,796
+ 73c: 400217b7 lui a5,0x40021
+ 740: 43d8 lw a4,4(a5)
+ 742: ffc106b7 lui a3,0xffc10
+ 746: 16fd addi a3,a3,-1
+ 748: c3d8 sw a4,4(a5)
+ 74a: 43d8 lw a4,4(a5)
+ 74c: c3d8 sw a4,4(a5)
+ 74e: 43d8 lw a4,4(a5)
+ 750: 40076713 ori a4,a4,1024
754: c3d8 sw a4,4(a5)
- 756: 4398 lw a4,0(a5)
- 758: 010006b7 lui a3,0x1000
- 75c: 8f55 or a4,a4,a3
- 75e: c398 sw a4,0(a5)
- 760: 4398 lw a4,0(a5)
- 762: 00671693 slli a3,a4,0x6
- 766: fe06dde3 bgez a3,760
- 76a: 43d8 lw a4,4(a5)
- 76c: 400216b7 lui a3,0x40021
- 770: 9b71 andi a4,a4,-4
- 772: c3d8 sw a4,4(a5)
- 774: 43d8 lw a4,4(a5)
- 776: 00276713 ori a4,a4,2
- 77a: c3d8 sw a4,4(a5)
- 77c: 4721 li a4,8
- 77e: 42dc lw a5,4(a3)
- 780: 8bb1 andi a5,a5,12
- 782: fee79ee3 bne a5,a4,77e
- 786: 0141 addi sp,sp,16
- 788: 8082 ret
- 78a: c602 sw zero,12(sp)
- 78c: bf61 j 724
+ 756: 43d8 lw a4,4(a5)
+ 758: 8f75 and a4,a4,a3
+ 75a: c3d8 sw a4,4(a5)
+ 75c: 43d8 lw a4,4(a5)
+ 75e: 001106b7 lui a3,0x110
+ 762: 8f55 or a4,a4,a3
+ 764: c3d8 sw a4,4(a5)
+ 766: 4398 lw a4,0(a5)
+ 768: 010006b7 lui a3,0x1000
+ 76c: 8f55 or a4,a4,a3
+ 76e: c398 sw a4,0(a5)
+ 770: 4398 lw a4,0(a5)
+ 772: 00671693 slli a3,a4,0x6
+ 776: fe06dde3 bgez a3,770
+ 77a: 43d8 lw a4,4(a5)
+ 77c: 400216b7 lui a3,0x40021
+ 780: 9b71 andi a4,a4,-4
+ 782: c3d8 sw a4,4(a5)
+ 784: 43d8 lw a4,4(a5)
+ 786: 00276713 ori a4,a4,2
+ 78a: c3d8 sw a4,4(a5)
+ 78c: 4721 li a4,8
+ 78e: 42dc lw a5,4(a3)
+ 790: 8bb1 andi a5,a5,12
+ 792: fee79ee3 bne a5,a4,78e
+ 796: 0141 addi sp,sp,16
+ 798: 8082 ret
+ 79a: c602 sw zero,12(sp)
+ 79c: bf61 j 734
-0000078e :
- 78e: 400216b7 lui a3,0x40021
- 792: 42d8 lw a4,4(a3)
- 794: 200007b7 lui a5,0x20000
- 798: 4611 li a2,4
- 79a: 8b31 andi a4,a4,12
- 79c: 20078793 addi a5,a5,512 # 20000200
- 7a0: 00c70563 beq a4,a2,7aa
- 7a4: 4621 li a2,8
- 7a6: 02c70863 beq a4,a2,7d6
- 7aa: 007a1737 lui a4,0x7a1
- 7ae: 20070713 addi a4,a4,512 # 7a1200 <_data_lma+0x798d1c>
- 7b2: c398 sw a4,0(a5)
- 7b4: 40021737 lui a4,0x40021
- 7b8: 4358 lw a4,4(a4)
- 7ba: 8311 srli a4,a4,0x4
- 7bc: 00f77693 andi a3,a4,15
- 7c0: 20000737 lui a4,0x20000
- 7c4: 00070713 mv a4,a4
- 7c8: 9736 add a4,a4,a3
- 7ca: 2314 lbu a3,0(a4)
- 7cc: 4398 lw a4,0(a5)
- 7ce: 00d75733 srl a4,a4,a3
- 7d2: c398 sw a4,0(a5)
- 7d4: 8082 ret
- 7d6: 42d8 lw a4,4(a3)
- 7d8: 42d4 lw a3,4(a3)
- 7da: 6641 lui a2,0x10
- 7dc: 8349 srli a4,a4,0x12
- 7de: 8b3d andi a4,a4,15
- 7e0: 8ef1 and a3,a3,a2
- 7e2: 00270613 addi a2,a4,2 # 20000002 <_data_vma+0x2>
- 7e6: cf15 beqz a4,822 <__stack_size+0x22>
- 7e8: 473d li a4,15
- 7ea: 02e60f63 beq a2,a4,828 <__stack_size+0x28>
- 7ee: 4741 li a4,16
- 7f0: 02e60f63 beq a2,a4,82e <__stack_size+0x2e>
- 7f4: 4745 li a4,17
- 7f6: 4581 li a1,0
- 7f8: 00e61363 bne a2,a4,7fe
- 7fc: 4641 li a2,16
- 7fe: e2a1 bnez a3,83e <__stack_size+0x3e>
- 800: 40024737 lui a4,0x40024
- 804: 80072703 lw a4,-2048(a4) # 40023800 <__freertos_irq_stack_top+0x2001b800>
- 808: 8b41 andi a4,a4,16
- 80a: c70d beqz a4,834 <__stack_size+0x34>
- 80c: 007a1737 lui a4,0x7a1
- 810: 20070713 addi a4,a4,512 # 7a1200 <_data_lma+0x798d1c>
- 814: 02c70633 mul a2,a4,a2
- 818: c390 sw a2,0(a5)
- 81a: ddc9 beqz a1,7b4
- 81c: 4398 lw a4,0(a5)
- 81e: 8305 srli a4,a4,0x1
- 820: bf49 j 7b2
- 822: 4581 li a1,0
- 824: 4649 li a2,18
- 826: bfe1 j 7fe
- 828: 4585 li a1,1
- 82a: 4635 li a2,13
- 82c: bfc9 j 7fe
- 82e: 4581 li a1,0
- 830: 463d li a2,15
- 832: b7f1 j 7fe
- 834: 003d1737 lui a4,0x3d1
- 838: 90070713 addi a4,a4,-1792 # 3d0900 <_data_lma+0x3c841c>
- 83c: bfe1 j 814 <__stack_size+0x14>
- 83e: 40021537 lui a0,0x40021
- 842: 5558 lw a4,44(a0)
- 844: 00f71693 slli a3,a4,0xf
- 848: 5558 lw a4,44(a0)
- 84a: 0406df63 bgez a3,8a8 <__stack_size+0xa8>
- 84e: 8311 srli a4,a4,0x4
- 850: 8b3d andi a4,a4,15
- 852: 00170693 addi a3,a4,1
- 856: 007a1737 lui a4,0x7a1
- 85a: 20070713 addi a4,a4,512 # 7a1200 <_data_lma+0x798d1c>
- 85e: 02d75733 divu a4,a4,a3
- 862: c398 sw a4,0(a5)
- 864: 5554 lw a3,44(a0)
- 866: 82a1 srli a3,a3,0x8
- 868: 8abd andi a3,a3,15
- 86a: e28d bnez a3,88c <__stack_size+0x8c>
- 86c: 4695 li a3,5
- 86e: 02d70733 mul a4,a4,a3
- 872: 8305 srli a4,a4,0x1
- 874: c398 sw a4,0(a5)
- 876: 40021737 lui a4,0x40021
- 87a: 5758 lw a4,44(a4)
- 87c: 4394 lw a3,0(a5)
- 87e: 8b3d andi a4,a4,15
- 880: 0705 addi a4,a4,1
- 882: 02e6d733 divu a4,a3,a4
- 886: c398 sw a4,0(a5)
- 888: 4398 lw a4,0(a5)
- 88a: b769 j 814 <__stack_size+0x14>
- 88c: 4505 li a0,1
- 88e: 00a69463 bne a3,a0,896 <__stack_size+0x96>
- 892: 46e5 li a3,25
- 894: bfe9 j 86e <__stack_size+0x6e>
- 896: 453d li a0,15
- 898: 00a69663 bne a3,a0,8a4 <__stack_size+0xa4>
- 89c: 46d1 li a3,20
- 89e: 02e68733 mul a4,a3,a4
- 8a2: bfc9 j 874 <__stack_size+0x74>
- 8a4: 0689 addi a3,a3,2
- 8a6: bfe5 j 89e <__stack_size+0x9e>
- 8a8: 8b3d andi a4,a4,15
- 8aa: 00170693 addi a3,a4,1 # 40021001 <__freertos_irq_stack_top+0x20019001>
- 8ae: 007a1737 lui a4,0x7a1
- 8b2: 20070713 addi a4,a4,512 # 7a1200 <_data_lma+0x798d1c>
- 8b6: 02d75733 divu a4,a4,a3
- 8ba: b7f1 j 886 <__stack_size+0x86>
+0000079e :
+ 79e: 400216b7 lui a3,0x40021
+ 7a2: 42d8 lw a4,4(a3)
+ 7a4: 200007b7 lui a5,0x20000
+ 7a8: 4611 li a2,4
+ 7aa: 8b31 andi a4,a4,12
+ 7ac: 32078793 addi a5,a5,800 # 20000320
+ 7b0: 00c70563 beq a4,a2,7ba
+ 7b4: 4621 li a2,8
+ 7b6: 02c70863 beq a4,a2,7e6
+ 7ba: 007a1737 lui a4,0x7a1
+ 7be: 20070713 addi a4,a4,512 # 7a1200 <_data_lma+0x797058>
+ 7c2: c398 sw a4,0(a5)
+ 7c4: 40021737 lui a4,0x40021
+ 7c8: 4358 lw a4,4(a4)
+ 7ca: 8311 srli a4,a4,0x4
+ 7cc: 00f77693 andi a3,a4,15
+ 7d0: 20000737 lui a4,0x20000
+ 7d4: 00070713 mv a4,a4
+ 7d8: 9736 add a4,a4,a3
+ 7da: 2314 lbu a3,0(a4)
+ 7dc: 4398 lw a4,0(a5)
+ 7de: 00d75733 srl a4,a4,a3
+ 7e2: c398 sw a4,0(a5)
+ 7e4: 8082 ret
+ 7e6: 42d8 lw a4,4(a3)
+ 7e8: 42d4 lw a3,4(a3)
+ 7ea: 6641 lui a2,0x10
+ 7ec: 8349 srli a4,a4,0x12
+ 7ee: 8b3d andi a4,a4,15
+ 7f0: 8ef1 and a3,a3,a2
+ 7f2: 00270613 addi a2,a4,2 # 20000002 <_data_vma+0x2>
+ 7f6: cf15 beqz a4,832 <__stack_size+0x32>
+ 7f8: 473d li a4,15
+ 7fa: 02e60f63 beq a2,a4,838 <__stack_size+0x38>
+ 7fe: 4741 li a4,16
+ 800: 02e60f63 beq a2,a4,83e <__stack_size+0x3e>
+ 804: 4745 li a4,17
+ 806: 4581 li a1,0
+ 808: 00e61363 bne a2,a4,80e <__stack_size+0xe>
+ 80c: 4641 li a2,16
+ 80e: e2a1 bnez a3,84e <__stack_size+0x4e>
+ 810: 40024737 lui a4,0x40024
+ 814: 80072703 lw a4,-2048(a4) # 40023800 <__freertos_irq_stack_top+0x20013800>
+ 818: 8b41 andi a4,a4,16
+ 81a: c70d beqz a4,844 <__stack_size+0x44>
+ 81c: 007a1737 lui a4,0x7a1
+ 820: 20070713 addi a4,a4,512 # 7a1200 <_data_lma+0x797058>
+ 824: 02c70633 mul a2,a4,a2
+ 828: c390 sw a2,0(a5)
+ 82a: ddc9 beqz a1,7c4
+ 82c: 4398 lw a4,0(a5)
+ 82e: 8305 srli a4,a4,0x1
+ 830: bf49 j 7c2
+ 832: 4581 li a1,0
+ 834: 4649 li a2,18
+ 836: bfe1 j 80e <__stack_size+0xe>
+ 838: 4585 li a1,1
+ 83a: 4635 li a2,13
+ 83c: bfc9 j 80e <__stack_size+0xe>
+ 83e: 4581 li a1,0
+ 840: 463d li a2,15
+ 842: b7f1 j 80e <__stack_size+0xe>
+ 844: 003d1737 lui a4,0x3d1
+ 848: 90070713 addi a4,a4,-1792 # 3d0900 <_data_lma+0x3c6758>
+ 84c: bfe1 j 824 <__stack_size+0x24>
+ 84e: 40021537 lui a0,0x40021
+ 852: 5558 lw a4,44(a0)
+ 854: 00f71693 slli a3,a4,0xf
+ 858: 5558 lw a4,44(a0)
+ 85a: 0406df63 bgez a3,8b8 <__stack_size+0xb8>
+ 85e: 8311 srli a4,a4,0x4
+ 860: 8b3d andi a4,a4,15
+ 862: 00170693 addi a3,a4,1
+ 866: 007a1737 lui a4,0x7a1
+ 86a: 20070713 addi a4,a4,512 # 7a1200 <_data_lma+0x797058>
+ 86e: 02d75733 divu a4,a4,a3
+ 872: c398 sw a4,0(a5)
+ 874: 5554 lw a3,44(a0)
+ 876: 82a1 srli a3,a3,0x8
+ 878: 8abd andi a3,a3,15
+ 87a: e28d bnez a3,89c <__stack_size+0x9c>
+ 87c: 4695 li a3,5
+ 87e: 02d70733 mul a4,a4,a3
+ 882: 8305 srli a4,a4,0x1
+ 884: c398 sw a4,0(a5)
+ 886: 40021737 lui a4,0x40021
+ 88a: 5758 lw a4,44(a4)
+ 88c: 4394 lw a3,0(a5)
+ 88e: 8b3d andi a4,a4,15
+ 890: 0705 addi a4,a4,1
+ 892: 02e6d733 divu a4,a3,a4
+ 896: c398 sw a4,0(a5)
+ 898: 4398 lw a4,0(a5)
+ 89a: b769 j 824 <__stack_size+0x24>
+ 89c: 4505 li a0,1
+ 89e: 00a69463 bne a3,a0,8a6 <__stack_size+0xa6>
+ 8a2: 46e5 li a3,25
+ 8a4: bfe9 j 87e <__stack_size+0x7e>
+ 8a6: 453d li a0,15
+ 8a8: 00a69663 bne a3,a0,8b4 <__stack_size+0xb4>
+ 8ac: 46d1 li a3,20
+ 8ae: 02e68733 mul a4,a3,a4
+ 8b2: bfc9 j 884 <__stack_size+0x84>
+ 8b4: 0689 addi a3,a3,2
+ 8b6: bfe5 j 8ae <__stack_size+0xae>
+ 8b8: 8b3d andi a4,a4,15
+ 8ba: 00170693 addi a3,a4,1 # 40021001 <__freertos_irq_stack_top+0x20011001>
+ 8be: 007a1737 lui a4,0x7a1
+ 8c2: 20070713 addi a4,a4,512 # 7a1200 <_data_lma+0x797058>
+ 8c6: 02d75733 divu a4,a4,a3
+ 8ca: b7f1 j 896 <__stack_size+0x96>
-000008bc :
- 8bc: a001 j 8bc
+000008cc :
+ 8cc: a001 j 8cc
-000008be :
- 8be: 20000197 auipc gp,0x20000
- 8c2: 14218193 addi gp,gp,322 # 20000a00 <__global_pointer$>
- 8c6: 20007117 auipc sp,0x20007
- 8ca: 73a10113 addi sp,sp,1850 # 20008000 <__freertos_irq_stack_top>
- 8ce: 00008517 auipc a0,0x8
- 8d2: c1650513 addi a0,a0,-1002 # 84e4 <_data_lma>
- 8d6: 1ffff597 auipc a1,0x1ffff
- 8da: 72a58593 addi a1,a1,1834 # 20000000 <_data_vma>
- 8de: 82018613 addi a2,gp,-2016 # 20000220 <_edata>
- 8e2: 00c5fa63 bgeu a1,a2,8f6
- 8e6: 00052283 lw t0,0(a0)
- 8ea: 0055a023 sw t0,0(a1)
- 8ee: 0511 addi a0,a0,4
- 8f0: 0591 addi a1,a1,4
- 8f2: fec5eae3 bltu a1,a2,8e6
- 8f6: 20000517 auipc a0,0x20000
- 8fa: 92a50513 addi a0,a0,-1750 # 20000220 <_edata>
- 8fe: 20007597 auipc a1,0x20007
- 902: c2a58593 addi a1,a1,-982 # 20007528 <_ebss>
- 906: 00b57763 bgeu a0,a1,914
- 90a: 00052023 sw zero,0(a0)
- 90e: 0511 addi a0,a0,4
- 910: feb56de3 bltu a0,a1,90a
- 914: 42fd li t0,31
- 916: bc029073 csrw 0xbc0,t0
- 91a: 42fd li t0,31
- 91c: 80429073 csrw 0x804,t0
- 920: 000082b7 lui t0,0x8
- 924: 80028293 addi t0,t0,-2048 # 7800 <_vfiprintf_r+0xac>
- 928: 30029073 csrw mstatus,t0
- 92c: fffff297 auipc t0,0xfffff
- 930: 6d828293 addi t0,t0,1752 # 4 <_einit>
- 934: 0032e293 ori t0,t0,3
- 938: 30529073 csrw mtvec,t0
- 93c: d59ff0ef jal ra,694
- 940: 00000297 auipc t0,0x0
- 944: ce828293 addi t0,t0,-792 # 628
- 948: 34129073 csrw mepc,t0
- 94c: 30200073 mret
+000008ce :
+ 8ce: 20000197 auipc gp,0x20000
+ 8d2: 25218193 addi gp,gp,594 # 20000b20 <__global_pointer$>
+ 8d6: 2000f117 auipc sp,0x2000f
+ 8da: 72a10113 addi sp,sp,1834 # 20010000 <__freertos_irq_stack_top>
+ 8de: 0000a517 auipc a0,0xa
+ 8e2: 8ca50513 addi a0,a0,-1846 # a1a8 <_data_lma>
+ 8e6: 1ffff597 auipc a1,0x1ffff
+ 8ea: 71a58593 addi a1,a1,1818 # 20000000 <_data_vma>
+ 8ee: 82018613 addi a2,gp,-2016 # 20000340 <_edata>
+ 8f2: 00c5fa63 bgeu a1,a2,906
+ 8f6: 00052283 lw t0,0(a0)
+ 8fa: 0055a023 sw t0,0(a1)
+ 8fe: 0511 addi a0,a0,4
+ 900: 0591 addi a1,a1,4
+ 902: fec5eae3 bltu a1,a2,8f6
+ 906: 20000517 auipc a0,0x20000
+ 90a: a3a50513 addi a0,a0,-1478 # 20000340 <_edata>
+ 90e: 2000b597 auipc a1,0x2000b
+ 912: 33258593 addi a1,a1,818 # 2000bc40 <_ebss>
+ 916: 00b57763 bgeu a0,a1,924
+ 91a: 00052023 sw zero,0(a0)
+ 91e: 0511 addi a0,a0,4
+ 920: feb56de3 bltu a0,a1,91a
+ 924: 42fd li t0,31
+ 926: bc029073 csrw 0xbc0,t0
+ 92a: 42fd li t0,31
+ 92c: 80429073 csrw 0x804,t0
+ 930: 000082b7 lui t0,0x8
+ 934: 80028293 addi t0,t0,-2048 # 7800
+ 938: 30029073 csrw mstatus,t0
+ 93c: fffff297 auipc t0,0xfffff
+ 940: 6c828293 addi t0,t0,1736 # 4 <_einit>
+ 944: 0032e293 ori t0,t0,3
+ 948: 30529073 csrw mtvec,t0
+ 94c: d59ff0ef jal ra,6a4
+ 950: 00000297 auipc t0,0x0
+ 954: cd828293 addi t0,t0,-808 # 628
+ 958: 34129073 csrw mepc,t0
+ 95c: 30200073 mret
-00000950 :
- 950: bc7ff2ef jal t0,516 <__riscv_save_0>
- 954: 400127b7 lui a5,0x40012
- 958: 40078793 addi a5,a5,1024 # 40012400 <__freertos_irq_stack_top+0x2000a400>
- 95c: 00f51b63 bne a0,a5,972
- 960: 4585 li a1,1
- 962: 20000513 li a0,512
- 966: 2f4d jal 1118
- 968: 4581 li a1,0
- 96a: 20000513 li a0,512
- 96e: 276d jal 1118
- 970: b6e9 j 53a <__riscv_restore_0>
- 972: 400137b7 lui a5,0x40013
- 976: 80078793 addi a5,a5,-2048 # 40012800 <__freertos_irq_stack_top+0x2000a800>
- 97a: fef51be3 bne a0,a5,970
- 97e: 4585 li a1,1
- 980: 40000513 li a0,1024
- 984: 2f51 jal 1118
- 986: 4581 li a1,0
- 988: 40000513 li a0,1024
- 98c: b7cd j 96e
+00000960 :
+ 960: bb7ff2ef jal t0,516 <__riscv_save_0>
+ 964: 400127b7 lui a5,0x40012
+ 968: 40078793 addi a5,a5,1024 # 40012400 <__freertos_irq_stack_top+0x20002400>
+ 96c: 00f51b63 bne a0,a5,982
+ 970: 4585 li a1,1
+ 972: 20000513 li a0,512
+ 976: 2f65 jal 112e
+ 978: 4581 li a1,0
+ 97a: 20000513 li a0,512
+ 97e: 2f45 jal 112e
+ 980: be6d j 53a <__riscv_restore_0>
+ 982: 400137b7 lui a5,0x40013
+ 986: 80078793 addi a5,a5,-2048 # 40012800 <__freertos_irq_stack_top+0x20002800>
+ 98a: fef51be3 bne a0,a5,980
+ 98e: 4585 li a1,1
+ 990: 40000513 li a0,1024
+ 994: 2f69 jal 112e
+ 996: 4581 li a1,0
+ 998: 40000513 li a0,1024
+ 99c: b7cd j 97e
-0000098e :
- 98e: 415c lw a5,4(a0)
- 990: e0f10737 lui a4,0xe0f10
- 994: eff70713 addi a4,a4,-257 # e0f0feff <__freertos_irq_stack_top+0xc0f07eff>
- 998: 4d94 lw a3,24(a1)
- 99a: 8f7d and a4,a4,a5
- 99c: 419c lw a5,0(a1)
- 99e: 8fd5 or a5,a5,a3
- 9a0: 4dd4 lw a3,28(a1)
- 9a2: 8fd5 or a5,a5,a3
- 9a4: 41d4 lw a3,4(a1)
- 9a6: 06a2 slli a3,a3,0x8
- 9a8: 8fd5 or a5,a5,a3
- 9aa: 8fd9 or a5,a5,a4
- 9ac: c15c sw a5,4(a0)
- 9ae: 451c lw a5,8(a0)
- 9b0: fff1f737 lui a4,0xfff1f
- 9b4: 7fd70713 addi a4,a4,2045 # fff1f7fd <__freertos_irq_stack_top+0xdff177fd>
- 9b8: 45d4 lw a3,12(a1)
- 9ba: 8f7d and a4,a4,a5
- 9bc: 499c lw a5,16(a1)
- 9be: 8fd5 or a5,a5,a3
- 9c0: 4594 lw a3,8(a1)
- 9c2: 0686 slli a3,a3,0x1
- 9c4: 8fd5 or a5,a5,a3
- 9c6: 8fd9 or a5,a5,a4
- 9c8: c51c sw a5,8(a0)
- 9ca: 555c lw a5,44(a0)
- 9cc: ff100737 lui a4,0xff100
- 9d0: 177d addi a4,a4,-1
- 9d2: 8f7d and a4,a4,a5
- 9d4: 29dc lbu a5,20(a1)
- 9d6: 17fd addi a5,a5,-1
- 9d8: 0ff7f793 andi a5,a5,255
- 9dc: 07d2 slli a5,a5,0x14
- 9de: 8fd9 or a5,a5,a4
- 9e0: d55c sw a5,44(a0)
- 9e2: 8082 ret
+0000099e :
+ 99e: 415c lw a5,4(a0)
+ 9a0: e0f10737 lui a4,0xe0f10
+ 9a4: eff70713 addi a4,a4,-257 # e0f0feff <__freertos_irq_stack_top+0xc0effeff>
+ 9a8: 4d94 lw a3,24(a1)
+ 9aa: 8f7d and a4,a4,a5
+ 9ac: 419c lw a5,0(a1)
+ 9ae: 8fd5 or a5,a5,a3
+ 9b0: 4dd4 lw a3,28(a1)
+ 9b2: 8fd5 or a5,a5,a3
+ 9b4: 41d4 lw a3,4(a1)
+ 9b6: 06a2 slli a3,a3,0x8
+ 9b8: 8fd5 or a5,a5,a3
+ 9ba: 8fd9 or a5,a5,a4
+ 9bc: c15c sw a5,4(a0)
+ 9be: 451c lw a5,8(a0)
+ 9c0: fff1f737 lui a4,0xfff1f
+ 9c4: 7fd70713 addi a4,a4,2045 # fff1f7fd <__freertos_irq_stack_top+0xdff0f7fd>
+ 9c8: 45d4 lw a3,12(a1)
+ 9ca: 8f7d and a4,a4,a5
+ 9cc: 499c lw a5,16(a1)
+ 9ce: 8fd5 or a5,a5,a3
+ 9d0: 4594 lw a3,8(a1)
+ 9d2: 0686 slli a3,a3,0x1
+ 9d4: 8fd5 or a5,a5,a3
+ 9d6: 8fd9 or a5,a5,a4
+ 9d8: c51c sw a5,8(a0)
+ 9da: 555c lw a5,44(a0)
+ 9dc: ff100737 lui a4,0xff100
+ 9e0: 177d addi a4,a4,-1
+ 9e2: 8f7d and a4,a4,a5
+ 9e4: 29dc lbu a5,20(a1)
+ 9e6: 17fd addi a5,a5,-1
+ 9e8: 0ff7f793 andi a5,a5,255
+ 9ec: 07d2 slli a5,a5,0x14
+ 9ee: 8fd9 or a5,a5,a4
+ 9f0: d55c sw a5,44(a0)
+ 9f2: 8082 ret
-000009e4 :
- 9e4: 451c lw a5,8(a0)
- 9e6: c589 beqz a1,9f0
- 9e8: 0017e793 ori a5,a5,1
- 9ec: c51c sw a5,8(a0)
- 9ee: 8082 ret
- 9f0: 9bf9 andi a5,a5,-2
- 9f2: bfed j 9ec
-
-000009f4 :
+000009f4 :
9f4: 451c lw a5,8(a0)
- 9f6: c589 beqz a1,a00
- 9f8: 1007e793 ori a5,a5,256
+ 9f6: c589 beqz a1,a00
+ 9f8: 0017e793 ori a5,a5,1
9fc: c51c sw a5,8(a0)
9fe: 8082 ret
- a00: eff7f793 andi a5,a5,-257
- a04: bfe5 j 9fc
+ a00: 9bf9 andi a5,a5,-2
+ a02: bfed j 9fc
-00000a06 :
- a06: 451c lw a5,8(a0)
- a08: 0087e793 ori a5,a5,8
+00000a04 :
+ a04: 451c lw a5,8(a0)
+ a06: c589 beqz a1,a10
+ a08: 1007e793 ori a5,a5,256
a0c: c51c sw a5,8(a0)
a0e: 8082 ret
+ a10: eff7f793 andi a5,a5,-257
+ a14: bfe5 j a0c
-00000a10 :
- a10: 4508 lw a0,8(a0)
- a12: 810d srli a0,a0,0x3
- a14: 8905 andi a0,a0,1
- a16: 8082 ret
+00000a16 :
+ a16: 451c lw a5,8(a0)
+ a18: 0087e793 ori a5,a5,8
+ a1c: c51c sw a5,8(a0)
+ a1e: 8082 ret
-00000a18 :
- a18: 451c lw a5,8(a0)
- a1a: 0047e793 ori a5,a5,4
- a1e: c51c sw a5,8(a0)
- a20: 8082 ret
+00000a20 :
+ a20: 4508 lw a0,8(a0)
+ a22: 810d srli a0,a0,0x3
+ a24: 8905 andi a0,a0,1
+ a26: 8082 ret
-00000a22 :
- a22: 4508 lw a0,8(a0)
- a24: 8109 srli a0,a0,0x2
- a26: 8905 andi a0,a0,1
- a28: 8082 ret
+00000a28 :
+ a28: 451c lw a5,8(a0)
+ a2a: 0047e793 ori a5,a5,4
+ a2e: c51c sw a5,8(a0)
+ a30: 8082 ret
-00000a2a :
- a2a: 451c lw a5,8(a0)
- a2c: c591 beqz a1,a38
- a2e: 00500737 lui a4,0x500
- a32: 8fd9 or a5,a5,a4
- a34: c51c sw a5,8(a0)
- a36: 8082 ret
- a38: ffb00737 lui a4,0xffb00
- a3c: 177d addi a4,a4,-1
- a3e: 8ff9 and a5,a5,a4
- a40: bfd5 j a34
+00000a32 :
+ a32: 4508 lw a0,8(a0)
+ a34: 8109 srli a0,a0,0x2
+ a36: 8905 andi a0,a0,1
+ a38: 8082 ret
-00000a42 :
- a42: 47a5 li a5,9
- a44: 04b7f763 bgeu a5,a1,a92
- a48: 478d li a5,3
- a4a: ff658713 addi a4,a1,-10
- a4e: 02f70733 mul a4,a4,a5
- a52: 00c52803 lw a6,12(a0)
- a56: 479d li a5,7
- a58: 00e797b3 sll a5,a5,a4
- a5c: fff7c793 not a5,a5
- a60: 0107f7b3 and a5,a5,a6
- a64: 00e696b3 sll a3,a3,a4
- a68: 8edd or a3,a3,a5
- a6a: c554 sw a3,12(a0)
- a6c: 4799 li a5,6
- a6e: 04c7e363 bltu a5,a2,ab4
- a72: 4795 li a5,5
- a74: 167d addi a2,a2,-1
- a76: 02f60633 mul a2,a2,a5
- a7a: 5958 lw a4,52(a0)
- a7c: 47fd li a5,31
- a7e: 00c797b3 sll a5,a5,a2
- a82: fff7c793 not a5,a5
- a86: 8ff9 and a5,a5,a4
- a88: 00c59633 sll a2,a1,a2
- a8c: 8e5d or a2,a2,a5
- a8e: d950 sw a2,52(a0)
- a90: 8082 ret
- a92: 470d li a4,3
- a94: 02e58733 mul a4,a1,a4
- a98: 01052803 lw a6,16(a0)
- a9c: 479d li a5,7
- a9e: 00e797b3 sll a5,a5,a4
- aa2: fff7c793 not a5,a5
- aa6: 0107f7b3 and a5,a5,a6
- aaa: 00e696b3 sll a3,a3,a4
- aae: 8edd or a3,a3,a5
- ab0: c914 sw a3,16(a0)
- ab2: bf6d j a6c
- ab4: 47b1 li a5,12
- ab6: 02c7e263 bltu a5,a2,ada
- aba: 4795 li a5,5
- abc: 1665 addi a2,a2,-7
- abe: 02f60633 mul a2,a2,a5
- ac2: 5918 lw a4,48(a0)
- ac4: 47fd li a5,31
- ac6: 00c797b3 sll a5,a5,a2
- aca: fff7c793 not a5,a5
- ace: 8ff9 and a5,a5,a4
- ad0: 00c59633 sll a2,a1,a2
- ad4: 8e5d or a2,a2,a5
- ad6: d910 sw a2,48(a0)
- ad8: 8082 ret
- ada: 4795 li a5,5
- adc: 164d addi a2,a2,-13
- ade: 02f60633 mul a2,a2,a5
- ae2: 5558 lw a4,44(a0)
- ae4: 47fd li a5,31
- ae6: 00c797b3 sll a5,a5,a2
- aea: fff7c793 not a5,a5
- aee: 8ff9 and a5,a5,a4
- af0: 00c595b3 sll a1,a1,a2
- af4: 8ddd or a1,a1,a5
- af6: d54c sw a1,44(a0)
- af8: 8082 ret
+00000a3a :
+ a3a: 451c lw a5,8(a0)
+ a3c: c591 beqz a1,a48
+ a3e: 00500737 lui a4,0x500
+ a42: 8fd9 or a5,a5,a4
+ a44: c51c sw a5,8(a0)
+ a46: 8082 ret
+ a48: ffb00737 lui a4,0xffb00
+ a4c: 177d addi a4,a4,-1
+ a4e: 8ff9 and a5,a5,a4
+ a50: bfd5 j a44
-00000afa :
- afa: 415c lw a5,4(a0)
- afc: c591 beqz a1,b08
- afe: 04000737 lui a4,0x4000
- b02: 8fd9 or a5,a5,a4
- b04: c15c sw a5,4(a0)
- b06: 8082 ret
- b08: fc000737 lui a4,0xfc000
- b0c: 177d addi a4,a4,-1
- b0e: 8ff9 and a5,a5,a4
- b10: bfd5 j b04
+00000a52 :
+ a52: 47a5 li a5,9
+ a54: 04b7f763 bgeu a5,a1,aa2
+ a58: 478d li a5,3
+ a5a: ff658713 addi a4,a1,-10
+ a5e: 02f70733 mul a4,a4,a5
+ a62: 00c52803 lw a6,12(a0)
+ a66: 479d li a5,7
+ a68: 00e797b3 sll a5,a5,a4
+ a6c: fff7c793 not a5,a5
+ a70: 0107f7b3 and a5,a5,a6
+ a74: 00e696b3 sll a3,a3,a4
+ a78: 8edd or a3,a3,a5
+ a7a: c554 sw a3,12(a0)
+ a7c: 4799 li a5,6
+ a7e: 04c7e363 bltu a5,a2,ac4
+ a82: 4795 li a5,5
+ a84: 167d addi a2,a2,-1
+ a86: 02f60633 mul a2,a2,a5
+ a8a: 5958 lw a4,52(a0)
+ a8c: 47fd li a5,31
+ a8e: 00c797b3 sll a5,a5,a2
+ a92: fff7c793 not a5,a5
+ a96: 8ff9 and a5,a5,a4
+ a98: 00c59633 sll a2,a1,a2
+ a9c: 8e5d or a2,a2,a5
+ a9e: d950 sw a2,52(a0)
+ aa0: 8082 ret
+ aa2: 470d li a4,3
+ aa4: 02e58733 mul a4,a1,a4
+ aa8: 01052803 lw a6,16(a0)
+ aac: 479d li a5,7
+ aae: 00e797b3 sll a5,a5,a4
+ ab2: fff7c793 not a5,a5
+ ab6: 0107f7b3 and a5,a5,a6
+ aba: 00e696b3 sll a3,a3,a4
+ abe: 8edd or a3,a3,a5
+ ac0: c914 sw a3,16(a0)
+ ac2: bf6d j a7c
+ ac4: 47b1 li a5,12
+ ac6: 02c7e263 bltu a5,a2,aea
+ aca: 4795 li a5,5
+ acc: 1665 addi a2,a2,-7
+ ace: 02f60633 mul a2,a2,a5
+ ad2: 5918 lw a4,48(a0)
+ ad4: 47fd li a5,31
+ ad6: 00c797b3 sll a5,a5,a2
+ ada: fff7c793 not a5,a5
+ ade: 8ff9 and a5,a5,a4
+ ae0: 00c59633 sll a2,a1,a2
+ ae4: 8e5d or a2,a2,a5
+ ae6: d910 sw a2,48(a0)
+ ae8: 8082 ret
+ aea: 4795 li a5,5
+ aec: 164d addi a2,a2,-13
+ aee: 02f60633 mul a2,a2,a5
+ af2: 5558 lw a4,44(a0)
+ af4: 47fd li a5,31
+ af6: 00c797b3 sll a5,a5,a2
+ afa: fff7c793 not a5,a5
+ afe: 8ff9 and a5,a5,a4
+ b00: 00c595b3 sll a1,a1,a2
+ b04: 8ddd or a1,a1,a5
+ b06: d54c sw a1,44(a0)
+ b08: 8082 ret
-00000b12 :
- b12: a05ff2ef jal t0,516 <__riscv_save_0>
- b16: 1101 addi sp,sp,-32
- b18: 842a mv s0,a0
- b1a: 00010423 sb zero,8(sp)
- b1e: 44a5 li s1,9
- b20: 841c lbu a5,8(sp)
- b22: 04f4f863 bgeu s1,a5,b72
- b26: 00010423 sb zero,8(sp)
- b2a: 46a5 li a3,9
- b2c: 4621 li a2,8
- b2e: 841c lbu a5,8(sp)
- b30: 06f6fc63 bgeu a3,a5,ba8
- b34: 00011523 sh zero,10(sp)
- b38: 00010423 sb zero,8(sp)
- b3c: 4695 li a3,5
+00000b0a :
+ b0a: 415c lw a5,4(a0)
+ b0c: c591 beqz a1,b18
+ b0e: 04000737 lui a4,0x4000
+ b12: 8fd9 or a5,a5,a4
+ b14: c15c sw a5,4(a0)
+ b16: 8082 ret
+ b18: fc000737 lui a4,0xfc000
+ b1c: 177d addi a4,a4,-1
+ b1e: 8ff9 and a5,a5,a4
+ b20: bfd5 j b14
+
+00000b22 :
+ b22: 9f5ff2ef jal t0,516 <__riscv_save_0>
+ b26: 1101 addi sp,sp,-32
+ b28: 842a mv s0,a0
+ b2a: 00010423 sb zero,8(sp)
+ b2e: 44a5 li s1,9
+ b30: 841c lbu a5,8(sp)
+ b32: 04f4f863 bgeu s1,a5,b82
+ b36: 00010423 sb zero,8(sp)
+ b3a: 46a5 li a3,9
+ b3c: 4621 li a2,8
b3e: 841c lbu a5,8(sp)
- b40: 0cf6fe63 bgeu a3,a5,c1c
- b44: 8538 lhu a4,10(sp)
- b46: 853c lhu a5,10(sp)
- b48: 4699 li a3,6
- b4a: 460d li a2,3
- b4c: 02d7f7b3 remu a5,a5,a3
- b50: 6505 lui a0,0x1
- b52: 80050513 addi a0,a0,-2048 # 800 <__stack_size>
- b56: 02c7d7b3 divu a5,a5,a2
- b5a: 02d75733 divu a4,a4,a3
- b5e: 97ba add a5,a5,a4
- b60: 07c2 slli a5,a5,0x10
- b62: 83c1 srli a5,a5,0x10
- b64: 857c sh a5,10(sp)
- b66: 853c lhu a5,10(sp)
- b68: 6105 addi sp,sp,32
- b6a: 8d1d sub a0,a0,a5
- b6c: 0542 slli a0,a0,0x10
- b6e: 8541 srai a0,a0,0x10
- b70: b2e9 j 53a <__riscv_restore_0>
- b72: 441c lw a5,8(s0)
- b74: 0087e793 ori a5,a5,8
- b78: c41c sw a5,8(s0)
- b7a: 8522 mv a0,s0
- b7c: 3d51 jal a10
- b7e: fd75 bnez a0,b7a
- b80: 441c lw a5,8(s0)
- b82: 0047e793 ori a5,a5,4
- b86: c41c sw a5,8(s0)
- b88: 8522 mv a0,s0
- b8a: 3d61 jal a22
- b8c: fd75 bnez a0,b88
- b8e: 4478 lw a4,76(s0)
- b90: 841c lbu a5,8(sp)
- b92: 1014 addi a3,sp,32
- b94: 0786 slli a5,a5,0x1
- b96: 97b6 add a5,a5,a3
- b98: fee79623 sh a4,-20(a5)
- b9c: 841c lbu a5,8(sp)
- b9e: 0785 addi a5,a5,1
- ba0: 0ff7f793 andi a5,a5,255
- ba4: 845c sb a5,8(sp)
- ba6: bfad j b20
- ba8: 000104a3 sb zero,9(sp)
- bac: 849c lbu a5,9(sp)
- bae: 00f67863 bgeu a2,a5,bbe
- bb2: 841c lbu a5,8(sp)
- bb4: 0785 addi a5,a5,1
- bb6: 0ff7f793 andi a5,a5,255
- bba: 845c sb a5,8(sp)
- bbc: bf8d j b2e
- bbe: 8498 lbu a4,9(sp)
- bc0: 849c lbu a5,9(sp)
- bc2: 100c addi a1,sp,32
- bc4: 0706 slli a4,a4,0x1
- bc6: 0785 addi a5,a5,1
- bc8: 0786 slli a5,a5,0x1
- bca: 972e add a4,a4,a1
- bcc: 97ae add a5,a5,a1
- bce: fec75703 lhu a4,-20(a4) # fbffffec <__freertos_irq_stack_top+0xdbff7fec>
- bd2: fec7d783 lhu a5,-20(a5)
- bd6: 02e7fd63 bgeu a5,a4,c10
- bda: 849c lbu a5,9(sp)
- bdc: 0786 slli a5,a5,0x1
- bde: 97ae add a5,a5,a1
- be0: fec7d783 lhu a5,-20(a5)
- be4: 857c sh a5,10(sp)
- be6: 849c lbu a5,9(sp)
- be8: 8498 lbu a4,9(sp)
- bea: 0785 addi a5,a5,1
+ b40: 06f6fc63 bgeu a3,a5,bb8
+ b44: 00011523 sh zero,10(sp)
+ b48: 00010423 sb zero,8(sp)
+ b4c: 4695 li a3,5
+ b4e: 841c lbu a5,8(sp)
+ b50: 0cf6fe63 bgeu a3,a5,c2c
+ b54: 8538 lhu a4,10(sp)
+ b56: 853c lhu a5,10(sp)
+ b58: 4699 li a3,6
+ b5a: 460d li a2,3
+ b5c: 02d7f7b3 remu a5,a5,a3
+ b60: 6505 lui a0,0x1
+ b62: 80050513 addi a0,a0,-2048 # 800 <__stack_size>
+ b66: 02c7d7b3 divu a5,a5,a2
+ b6a: 02d75733 divu a4,a4,a3
+ b6e: 97ba add a5,a5,a4
+ b70: 07c2 slli a5,a5,0x10
+ b72: 83c1 srli a5,a5,0x10
+ b74: 857c sh a5,10(sp)
+ b76: 853c lhu a5,10(sp)
+ b78: 6105 addi sp,sp,32
+ b7a: 8d1d sub a0,a0,a5
+ b7c: 0542 slli a0,a0,0x10
+ b7e: 8541 srai a0,a0,0x10
+ b80: ba6d j 53a <__riscv_restore_0>
+ b82: 441c lw a5,8(s0)
+ b84: 0087e793 ori a5,a5,8
+ b88: c41c sw a5,8(s0)
+ b8a: 8522 mv a0,s0
+ b8c: 3d51 jal a20
+ b8e: fd75 bnez a0,b8a
+ b90: 441c lw a5,8(s0)
+ b92: 0047e793 ori a5,a5,4
+ b96: c41c sw a5,8(s0)
+ b98: 8522 mv a0,s0
+ b9a: 3d61 jal a32
+ b9c: fd75 bnez a0,b98
+ b9e: 4478 lw a4,76(s0)
+ ba0: 841c lbu a5,8(sp)
+ ba2: 1014 addi a3,sp,32
+ ba4: 0786 slli a5,a5,0x1
+ ba6: 97b6 add a5,a5,a3
+ ba8: fee79623 sh a4,-20(a5)
+ bac: 841c lbu a5,8(sp)
+ bae: 0785 addi a5,a5,1
+ bb0: 0ff7f793 andi a5,a5,255
+ bb4: 845c sb a5,8(sp)
+ bb6: bfad j b30
+ bb8: 000104a3 sb zero,9(sp)
+ bbc: 849c lbu a5,9(sp)
+ bbe: 00f67863 bgeu a2,a5,bce
+ bc2: 841c lbu a5,8(sp)
+ bc4: 0785 addi a5,a5,1
+ bc6: 0ff7f793 andi a5,a5,255
+ bca: 845c sb a5,8(sp)
+ bcc: bf8d j b3e
+ bce: 8498 lbu a4,9(sp)
+ bd0: 849c lbu a5,9(sp)
+ bd2: 100c addi a1,sp,32
+ bd4: 0706 slli a4,a4,0x1
+ bd6: 0785 addi a5,a5,1
+ bd8: 0786 slli a5,a5,0x1
+ bda: 972e add a4,a4,a1
+ bdc: 97ae add a5,a5,a1
+ bde: fec75703 lhu a4,-20(a4) # fbffffec <__freertos_irq_stack_top+0xdbfeffec>
+ be2: fec7d783 lhu a5,-20(a5)
+ be6: 02e7fd63 bgeu a5,a4,c20
+ bea: 849c lbu a5,9(sp)
bec: 0786 slli a5,a5,0x1
bee: 97ae add a5,a5,a1
- bf0: fec7d583 lhu a1,-20(a5)
- bf4: 00171793 slli a5,a4,0x1
- bf8: 1018 addi a4,sp,32
- bfa: 97ba add a5,a5,a4
- bfc: feb79623 sh a1,-20(a5)
- c00: 849c lbu a5,9(sp)
- c02: 8538 lhu a4,10(sp)
- c04: 100c addi a1,sp,32
- c06: 0785 addi a5,a5,1
- c08: 0786 slli a5,a5,0x1
- c0a: 97ae add a5,a5,a1
- c0c: fee79623 sh a4,-20(a5)
+ bf0: fec7d783 lhu a5,-20(a5)
+ bf4: 857c sh a5,10(sp)
+ bf6: 849c lbu a5,9(sp)
+ bf8: 8498 lbu a4,9(sp)
+ bfa: 0785 addi a5,a5,1
+ bfc: 0786 slli a5,a5,0x1
+ bfe: 97ae add a5,a5,a1
+ c00: fec7d583 lhu a1,-20(a5)
+ c04: 00171793 slli a5,a4,0x1
+ c08: 1018 addi a4,sp,32
+ c0a: 97ba add a5,a5,a4
+ c0c: feb79623 sh a1,-20(a5)
c10: 849c lbu a5,9(sp)
- c12: 0785 addi a5,a5,1
- c14: 0ff7f793 andi a5,a5,255
- c18: 84dc sb a5,9(sp)
- c1a: bf49 j bac
- c1c: 841c lbu a5,8(sp)
- c1e: 1010 addi a2,sp,32
- c20: 8538 lhu a4,10(sp)
- c22: 0789 addi a5,a5,2
- c24: 0786 slli a5,a5,0x1
- c26: 97b2 add a5,a5,a2
- c28: fec7d783 lhu a5,-20(a5)
- c2c: 97ba add a5,a5,a4
- c2e: 07c2 slli a5,a5,0x10
- c30: 83c1 srli a5,a5,0x10
- c32: 857c sh a5,10(sp)
- c34: 841c lbu a5,8(sp)
- c36: 0785 addi a5,a5,1
- c38: 0ff7f793 andi a5,a5,255
- c3c: 845c sb a5,8(sp)
- c3e: b701 j b3e
+ c12: 8538 lhu a4,10(sp)
+ c14: 100c addi a1,sp,32
+ c16: 0785 addi a5,a5,1
+ c18: 0786 slli a5,a5,0x1
+ c1a: 97ae add a5,a5,a1
+ c1c: fee79623 sh a4,-20(a5)
+ c20: 849c lbu a5,9(sp)
+ c22: 0785 addi a5,a5,1
+ c24: 0ff7f793 andi a5,a5,255
+ c28: 84dc sb a5,9(sp)
+ c2a: bf49 j bbc
+ c2c: 841c lbu a5,8(sp)
+ c2e: 1010 addi a2,sp,32
+ c30: 8538 lhu a4,10(sp)
+ c32: 0789 addi a5,a5,2
+ c34: 0786 slli a5,a5,0x1
+ c36: 97b2 add a5,a5,a2
+ c38: fec7d783 lhu a5,-20(a5)
+ c3c: 97ba add a5,a5,a4
+ c3e: 07c2 slli a5,a5,0x10
+ c40: 83c1 srli a5,a5,0x10
+ c42: 857c sh a5,10(sp)
+ c44: 841c lbu a5,8(sp)
+ c46: 0785 addi a5,a5,1
+ c48: 0ff7f793 andi a5,a5,255
+ c4c: 845c sb a5,8(sp)
+ c4e: b701 j b4e
-00000c40 :
- c40: 1ffff7b7 lui a5,0x1ffff
- c44: 7047a503 lw a0,1796(a5) # 1ffff704 <_data_lma+0x1fff7220>
- c48: 8082 ret
+00000c50 :
+ c50: 1ffff7b7 lui a5,0x1ffff
+ c54: 7047a503 lw a0,1796(a5) # 1ffff704 <_data_lma+0x1fff555c>
+ c58: 8082 ret
-00000c4a :
- c4a: 411c lw a5,0(a0)
- c4c: 6741 lui a4,0x10
- c4e: 1779 addi a4,a4,-2
- c50: 8ff9 and a5,a5,a4
- c52: c11c sw a5,0(a0)
- c54: 00052023 sw zero,0(a0)
- c58: 00052223 sw zero,4(a0)
- c5c: 00052423 sw zero,8(a0)
- c60: 400207b7 lui a5,0x40020
- c64: 00052623 sw zero,12(a0)
- c68: 00878713 addi a4,a5,8 # 40020008 <__freertos_irq_stack_top+0x20018008>
- c6c: 00e51763 bne a0,a4,c7a
- c70: 43d8 lw a4,4(a5)
- c72: 00f76713 ori a4,a4,15
- c76: c3d8 sw a4,4(a5)
- c78: 8082 ret
- c7a: 01c78713 addi a4,a5,28
- c7e: 00e51663 bne a0,a4,c8a
- c82: 43d8 lw a4,4(a5)
- c84: 0f076713 ori a4,a4,240
- c88: b7fd j c76
- c8a: 03078713 addi a4,a5,48
- c8e: 00e51863 bne a0,a4,c9e
+00000c5a :
+ c5a: 411c lw a5,0(a0)
+ c5c: 6741 lui a4,0x10
+ c5e: 1779 addi a4,a4,-2
+ c60: 8ff9 and a5,a5,a4
+ c62: c11c sw a5,0(a0)
+ c64: 00052023 sw zero,0(a0)
+ c68: 00052223 sw zero,4(a0)
+ c6c: 00052423 sw zero,8(a0)
+ c70: 400207b7 lui a5,0x40020
+ c74: 00052623 sw zero,12(a0)
+ c78: 00878713 addi a4,a5,8 # 40020008 <__freertos_irq_stack_top+0x20010008>
+ c7c: 00e51763 bne a0,a4,c8a
+ c80: 43d8 lw a4,4(a5)
+ c82: 00f76713 ori a4,a4,15
+ c86: c3d8 sw a4,4(a5)
+ c88: 8082 ret
+ c8a: 01c78713 addi a4,a5,28
+ c8e: 00e51663 bne a0,a4,c9a
c92: 43d8 lw a4,4(a5)
- c94: 6685 lui a3,0x1
- c96: f0068693 addi a3,a3,-256 # f00
- c9a: 8f55 or a4,a4,a3
- c9c: bfe9 j c76
- c9e: 04478713 addi a4,a5,68
- ca2: 00e51563 bne a0,a4,cac
- ca6: 43d8 lw a4,4(a5)
- ca8: 66bd lui a3,0xf
- caa: bfc5 j c9a
- cac: 05878713 addi a4,a5,88
- cb0: 00e51663 bne a0,a4,cbc
- cb4: 43d8 lw a4,4(a5)
- cb6: 000f06b7 lui a3,0xf0
- cba: b7c5 j c9a
- cbc: 06c78713 addi a4,a5,108
- cc0: 00e51663 bne a0,a4,ccc
+ c94: 0f076713 ori a4,a4,240
+ c98: b7fd j c86
+ c9a: 03078713 addi a4,a5,48
+ c9e: 00e51863 bne a0,a4,cae
+ ca2: 43d8 lw a4,4(a5)
+ ca4: 6685 lui a3,0x1
+ ca6: f0068693 addi a3,a3,-256 # f00
+ caa: 8f55 or a4,a4,a3
+ cac: bfe9 j c86
+ cae: 04478713 addi a4,a5,68
+ cb2: 00e51563 bne a0,a4,cbc
+ cb6: 43d8 lw a4,4(a5)
+ cb8: 66bd lui a3,0xf
+ cba: bfc5 j caa
+ cbc: 05878713 addi a4,a5,88
+ cc0: 00e51663 bne a0,a4,ccc
cc4: 43d8 lw a4,4(a5)
- cc6: 00f006b7 lui a3,0xf00
- cca: bfc1 j c9a
- ccc: 08078713 addi a4,a5,128
- cd0: 00e51663 bne a0,a4,cdc
+ cc6: 000f06b7 lui a3,0xf0
+ cca: b7c5 j caa
+ ccc: 06c78713 addi a4,a5,108
+ cd0: 00e51663 bne a0,a4,cdc
cd4: 43d8 lw a4,4(a5)
- cd6: 0f0006b7 lui a3,0xf000
- cda: b7c1 j c9a
- cdc: 40878713 addi a4,a5,1032
- ce0: 00e51963 bne a0,a4,cf2
- ce4: 4047a703 lw a4,1028(a5)
- ce8: 00f76713 ori a4,a4,15
- cec: 40e7a223 sw a4,1028(a5)
- cf0: 8082 ret
- cf2: 41c78713 addi a4,a5,1052
- cf6: 00e51763 bne a0,a4,d04
- cfa: 4047a703 lw a4,1028(a5)
- cfe: 0f076713 ori a4,a4,240
- d02: b7ed j cec
- d04: 43078793 addi a5,a5,1072
- d08: 00f51b63 bne a0,a5,d1e
- d0c: 400207b7 lui a5,0x40020
- d10: 4047a703 lw a4,1028(a5) # 40020404 <__freertos_irq_stack_top+0x20018404>
- d14: 6685 lui a3,0x1
- d16: f0068693 addi a3,a3,-256 # f00
- d1a: 8f55 or a4,a4,a3
- d1c: bfc1 j cec
- d1e: 400207b7 lui a5,0x40020
- d22: 44478713 addi a4,a5,1092 # 40020444 <__freertos_irq_stack_top+0x20018444>
- d26: 00e51663 bne a0,a4,d32
- d2a: 4047a703 lw a4,1028(a5)
- d2e: 66bd lui a3,0xf
- d30: b7ed j d1a
- d32: 45878713 addi a4,a5,1112
- d36: 00e51763 bne a0,a4,d44
+ cd6: 00f006b7 lui a3,0xf00
+ cda: bfc1 j caa
+ cdc: 08078713 addi a4,a5,128
+ ce0: 00e51663 bne a0,a4,cec
+ ce4: 43d8 lw a4,4(a5)
+ ce6: 0f0006b7 lui a3,0xf000
+ cea: b7c1 j caa
+ cec: 40878713 addi a4,a5,1032
+ cf0: 00e51963 bne a0,a4,d02
+ cf4: 4047a703 lw a4,1028(a5)
+ cf8: 00f76713 ori a4,a4,15
+ cfc: 40e7a223 sw a4,1028(a5)
+ d00: 8082 ret
+ d02: 41c78713 addi a4,a5,1052
+ d06: 00e51763 bne a0,a4,d14
+ d0a: 4047a703 lw a4,1028(a5)
+ d0e: 0f076713 ori a4,a4,240
+ d12: b7ed j cfc
+ d14: 43078793 addi a5,a5,1072
+ d18: 00f51b63 bne a0,a5,d2e
+ d1c: 400207b7 lui a5,0x40020
+ d20: 4047a703 lw a4,1028(a5) # 40020404 <__freertos_irq_stack_top+0x20010404>
+ d24: 6685 lui a3,0x1
+ d26: f0068693 addi a3,a3,-256 # f00
+ d2a: 8f55 or a4,a4,a3
+ d2c: bfc1 j cfc
+ d2e: 400207b7 lui a5,0x40020
+ d32: 44478713 addi a4,a5,1092 # 40020444 <__freertos_irq_stack_top+0x20010444>
+ d36: 00e51663 bne a0,a4,d42
d3a: 4047a703 lw a4,1028(a5)
- d3e: 000f06b7 lui a3,0xf0
- d42: bfe1 j d1a
- d44: 46c78713 addi a4,a5,1132
- d48: 00e51763 bne a0,a4,d56
- d4c: 4047a703 lw a4,1028(a5)
- d50: 00f006b7 lui a3,0xf00
- d54: b7d9 j d1a
- d56: 48078713 addi a4,a5,1152
- d5a: 00e51763 bne a0,a4,d68