From 7b764c34b96fb560fed1ea1afd74d633a2409d69 Mon Sep 17 00:00:00 2001 From: wmano Date: Wed, 3 Sep 2025 22:00:08 +0800 Subject: [PATCH] tty use mq --- apps/chrg/.config | 12 ++-- apps/chrg/applications/bsp/chrg_tty.c | 60 +++++++++---------- apps/chrg/applications/bsp/chrg_tty.h | 7 +++ apps/chrg/applications/thread/chrg_north.c | 40 +++++++++---- apps/chrg/applications/thread/chrg_north.h | 2 +- apps/chrg/applications/thread/chrg_south.c | 42 +++++++++---- apps/chrg/applications/thread/chrg_south.h | 2 +- apps/chrg/applications/utils/chrg_source.c | 2 +- apps/chrg/rtconfig.h | 6 ++ .../libraries/HAL_Drivers/drivers/drv_can.c | 4 +- rt-thread/components/drivers/ipc/condvar.c | 2 +- rt-thread/src/object.c | 2 +- rt-thread/src/scheduler_comm.c | 4 +- rt-thread/src/scheduler_up.c | 3 +- 14 files changed, 117 insertions(+), 71 deletions(-) diff --git a/apps/chrg/.config b/apps/chrg/.config index a9e5159..40e44b7 100644 --- a/apps/chrg/.config +++ b/apps/chrg/.config @@ -1459,21 +1459,21 @@ CONFIG_BSP_USING_GPIO=y CONFIG_BSP_USING_UART=y CONFIG_BSP_STM32_UART_V1_TX_TIMEOUT=2000 CONFIG_BSP_USING_UART1=y -# CONFIG_BSP_UART1_RX_USING_DMA is not set -# CONFIG_BSP_UART1_TX_USING_DMA is not set +CONFIG_BSP_UART1_RX_USING_DMA=y +CONFIG_BSP_UART1_TX_USING_DMA=y CONFIG_BSP_USING_UART2=y # CONFIG_BSP_UART2_RX_USING_DMA is not set # CONFIG_BSP_UART2_TX_USING_DMA is not set CONFIG_BSP_USING_UART3=y -# CONFIG_BSP_UART3_RX_USING_DMA is not set -# CONFIG_BSP_UART3_TX_USING_DMA is not set +CONFIG_BSP_UART3_RX_USING_DMA=y +CONFIG_BSP_UART3_TX_USING_DMA=y # CONFIG_BSP_USING_UART4 is not set CONFIG_BSP_USING_UART5=y # CONFIG_BSP_UART5_RX_USING_DMA is not set # CONFIG_BSP_UART5_TX_USING_DMA is not set CONFIG_BSP_USING_UART6=y -# CONFIG_BSP_UART6_RX_USING_DMA is not set -# CONFIG_BSP_UART6_TX_USING_DMA is not set +CONFIG_BSP_UART6_RX_USING_DMA=y +CONFIG_BSP_UART6_TX_USING_DMA=y CONFIG_BSP_USING_I2C=y CONFIG_BSP_USING_I2C1=y CONFIG_BSP_USING_I2C2=y diff --git a/apps/chrg/applications/bsp/chrg_tty.c b/apps/chrg/applications/bsp/chrg_tty.c index 89f26a8..241cc8e 100644 --- a/apps/chrg/applications/bsp/chrg_tty.c +++ b/apps/chrg/applications/bsp/chrg_tty.c @@ -47,14 +47,14 @@ struct chrg_tty_t chrgtty[TOTAL_TTY] = { static rt_err_t chrg_rs485_tty_input (rt_device_t dev, rt_size_t size) { rt_err_t ret; - rt_uint8_t ch; - rt_size_t i; struct chrg_tty_t *pTTY = &chrgtty[IDX_TTY_RS485]; - for (i = 0; i < size; i++) { - if (rt_device_read(dev, 0, &ch, 1)) { - rt_ringbuffer_put_force(pTTY->rb, &ch, 1); - ret = rt_sem_release(&pTTY->sem_rx); + if ((RT_NULL != dev) && (RT_NULL != pTTY->mq) && (size > 0)) { + pTTY->msg_mq.dev = dev; + pTTY->msg_mq.size = size; + ret = rt_mq_send(pTTY->mq, &pTTY->msg_mq, sizeof(struct mq_msg_t)); + if (RT_EOK != ret) { + LOG_E("send mq '%s' failed.", pTTY->name); } } @@ -64,14 +64,14 @@ static rt_err_t chrg_rs485_tty_input (rt_device_t dev, rt_size_t size) static rt_err_t chrg_lcd_tty_input (rt_device_t dev, rt_size_t size) { rt_err_t ret; - rt_uint8_t ch; - rt_size_t i; struct chrg_tty_t *pTTY = &chrgtty[IDX_TTY_LCD]; - for (i = 0; i < size; i++) { - if (rt_device_read(dev, 0, &ch, 1)) { - rt_ringbuffer_put_force(pTTY->rb, &ch, 1); - ret = rt_sem_release(&pTTY->sem_rx); + if ((RT_NULL != dev) && (RT_NULL != pTTY->mq) && (size > 0)) { + pTTY->msg_mq.dev = dev; + pTTY->msg_mq.size = size; + ret = rt_mq_send(pTTY->mq, &pTTY->msg_mq, sizeof(struct mq_msg_t)); + if (RT_EOK != ret) { + LOG_E("send mq '%s' failed.", pTTY->name); } } @@ -81,14 +81,14 @@ static rt_err_t chrg_lcd_tty_input (rt_device_t dev, rt_size_t size) static rt_err_t chrg_north_tty_input (rt_device_t dev, rt_size_t size) { rt_err_t ret; - rt_uint8_t ch; - rt_size_t i; struct chrg_tty_t *pTTY = &chrgtty[IDX_TTY_NORTH]; - for (i = 0; i < size; i++) { - if (rt_device_read(dev, 0, &ch, 1)) { - rt_ringbuffer_put_force(pTTY->rb, &ch, 1); - ret = rt_sem_release(&pTTY->sem_rx); + if ((RT_NULL != dev) && (RT_NULL != pTTY->mq) && (size > 0)) { + pTTY->msg_mq.dev = dev; + pTTY->msg_mq.size = size; + ret = rt_mq_send(pTTY->mq, &pTTY->msg_mq, sizeof(struct mq_msg_t)); + if (RT_EOK != ret) { + LOG_E("send mq '%s' failed.", pTTY->name); } } @@ -98,14 +98,14 @@ static rt_err_t chrg_north_tty_input (rt_device_t dev, rt_size_t size) static rt_err_t chrg_south_tty_input (rt_device_t dev, rt_size_t size) { rt_err_t ret; - rt_uint8_t ch; - rt_size_t i; struct chrg_tty_t *pTTY = &chrgtty[IDX_TTY_SOUTH]; - for (i = 0; i < size; i++) { - if (rt_device_read(dev, 0, &ch, 1)) { - rt_ringbuffer_put_force(pTTY->rb, &ch, 1); - ret = rt_sem_release(&pTTY->sem_rx); + if ((RT_NULL != dev) && (RT_NULL != pTTY->mq) && (size > 0)) { + pTTY->msg_mq.dev = dev; + pTTY->msg_mq.size = size; + ret = rt_mq_send(pTTY->mq, &pTTY->msg_mq, sizeof(struct mq_msg_t)); + if (RT_EOK != ret) { + LOG_E("send mq '%s' failed.", pTTY->name); } } @@ -166,15 +166,9 @@ rt_err_t chrg_tty_open (struct chrg_tty_t *pTTY) return RT_ERROR; } - ret = rt_sem_init(&pTTY->sem_rx, pTTY->name, 0, RT_IPC_FLAG_FIFO); - if (ret != RT_EOK) { - LOG_E("sem init '%s' failed.", pTTY->name); - return ret; - } - - pTTY->rb = rt_ringbuffer_create(64); - if (RT_NULL == pTTY->rb) { - rt_kprintf("create rb failed.\r\n"); + pTTY->mq = rt_mq_create(pTTY->name, sizeof(struct mq_msg_t), 16, RT_IPC_FLAG_FIFO); + if (RT_NULL == pTTY->mq) { + LOG_E("create mq '%s' failed.", pTTY->name); return RT_ERROR; } diff --git a/apps/chrg/applications/bsp/chrg_tty.h b/apps/chrg/applications/bsp/chrg_tty.h index a28ced7..87ee559 100644 --- a/apps/chrg/applications/bsp/chrg_tty.h +++ b/apps/chrg/applications/bsp/chrg_tty.h @@ -20,6 +20,10 @@ typedef enum { TOTAL_TTY } eIDX_TTY; +struct mq_msg_t { + rt_device_t dev; + rt_size_t size; +}; struct chrg_tty_t { rt_device_t dev; @@ -28,6 +32,9 @@ struct chrg_tty_t { rt_uint32_t baudrate; eIDX_TTY index; + rt_mq_t mq; + struct mq_msg_t msg_mq; + struct rt_ringbuffer *rb; struct rt_semaphore sem_rx; diff --git a/apps/chrg/applications/thread/chrg_north.c b/apps/chrg/applications/thread/chrg_north.c index 1dd02ce..61afa2e 100644 --- a/apps/chrg/applications/thread/chrg_north.c +++ b/apps/chrg/applications/thread/chrg_north.c @@ -3,6 +3,8 @@ #include "chrg_north.h" +#include "chrg_utils.h" + #define LOG_TAG "chrg.nor" #define DBG_LEVEL DBG_LOG #include @@ -29,32 +31,48 @@ int chrg_north_send (rt_uint8_t *data, rt_size_t length) static void chrg_north_thread_entry (void *data) { - rt_err_t ret = RT_EOK; struct chrg_north_t *pNOR = (struct chrg_north_t *)data; if ((RT_NULL == pNOR)||(RT_NULL == pNOR->tty)) { return ; } - rt_uint8_t ch; + rt_uint8_t crc8 = 0; + rt_size_t len_mq = 0, len_get = 0, len_msg = 0; struct chrg_tty_t *pTTY = pNOR->tty; + struct mq_msg_t *pMQ = &pTTY->msg_mq; while (1) { - ret = rt_sem_take(&pTTY->sem_rx, RT_WAITING_FOREVER); - if (RT_EOK != ret) { - LOG_E("sem take failed. %d", ret); + rt_memset(pMQ, 0, sizeof(struct mq_msg_t)); + len_mq = rt_mq_recv(pTTY->mq, pMQ, sizeof(struct mq_msg_t), RT_WAITING_FOREVER); + if (len_mq <= 0) { continue; } - rt_ringbuffer_getchar(pTTY->rb, &ch); - if (pNOR->rx_len < SIZE_BUF_UART) { - pNOR->rx_buf[pNOR->rx_len++] = ch; - rt_kprintf("%c", ch); + len_get = rt_device_read(pMQ->dev, 0, &pNOR->rx_buf[0], 1); + if (1 != len_get) { + continue; } - if (pNOR->rx_len >= 32) { - pNOR->rx_len = 0; + pNOR->rx_len = 1; + + len_msg = rt_device_read(pMQ->dev, 0, &pNOR->rx_buf[1], len_get-1); + if (len_msg <= 0) { + continue; } + + pNOR->rx_len += len_msg; + + if (len_msg == len_get-1) { + crc8 = calc_crc8(pNOR->rx_buf, len_msg); + + if (crc8 == pNOR->rx_buf[len_msg]) { + + + pNOR->rx_len = 0; + } + } + } } diff --git a/apps/chrg/applications/thread/chrg_north.h b/apps/chrg/applications/thread/chrg_north.h index f22eaad..2ab7964 100644 --- a/apps/chrg/applications/thread/chrg_north.h +++ b/apps/chrg/applications/thread/chrg_north.h @@ -7,7 +7,7 @@ #include "chrg_switch.h" -#define THR_NAME_NORTH "thr_nor" +#define THR_NAME_NORTH "thr.nor" struct chrg_north_t { const char *name; diff --git a/apps/chrg/applications/thread/chrg_south.c b/apps/chrg/applications/thread/chrg_south.c index fe36bdc..5cef180 100644 --- a/apps/chrg/applications/thread/chrg_south.c +++ b/apps/chrg/applications/thread/chrg_south.c @@ -3,6 +3,8 @@ #include "chrg_south.h" +#include "chrg_utils.h" + #define LOG_TAG "chrg.sou" #define DBG_LEVEL DBG_LOG #include @@ -16,32 +18,48 @@ struct chrg_south_t chrgsouth = { static void chrg_south_thread_entry (void *data) { - rt_err_t ret = RT_EOK; struct chrg_south_t *pSOU = (struct chrg_south_t *)data; if ((RT_NULL == pSOU)||(RT_NULL == pSOU->tty)) { return ; } - rt_uint8_t ch; + rt_uint8_t crc8 = 0; + rt_size_t len_mq = 0, len_get = 0, len_msg = 0; struct chrg_tty_t *pTTY = pSOU->tty; + struct mq_msg_t *pMQ = &pTTY->msg_mq; while (1) { - ret = rt_sem_take(&pTTY->sem_rx, RT_WAITING_FOREVER); - if (RT_EOK != ret) { - LOG_E("sem take failed. %d", ret); + rt_memset(pMQ, 0, sizeof(struct mq_msg_t)); + len_mq = rt_mq_recv(pTTY->mq, pMQ, sizeof(struct mq_msg_t), RT_WAITING_FOREVER); + if (len_mq <= 0) { continue; } - rt_ringbuffer_getchar(pTTY->rb, &ch); - if (pSOU->rx_len < SIZE_BUF_UART) { - pSOU->rx_buf[pSOU->rx_len++] = ch; - rt_kprintf("%c", ch); + len_get = rt_device_read(pMQ->dev, 0, &pSOU->rx_buf[0], 1); + if (1 != len_get) { + continue; } - if (pSOU->rx_len >= 32) { - pSOU->rx_len = 0; + pSOU->rx_len = 1; + + len_msg = rt_device_read(pMQ->dev, 0, &pSOU->rx_buf[1], len_get-1); + if (len_msg <= 0) { + continue; } + + pSOU->rx_len += len_msg; + + if (len_msg == len_get-1) { + crc8 = calc_crc8(pSOU->rx_buf, len_msg); + + if (crc8 == pSOU->rx_buf[len_msg]) { + + + pSOU->rx_len = 0; + } + } + } } @@ -51,7 +69,7 @@ static int chrg_south_init (void) rt_err_t ret; struct chrg_south_t *pSOU = &chrgsouth; - pSOU->tty = &chrgtty[IDX_TTY_NORTH]; + pSOU->tty = &chrgtty[IDX_TTY_SOUTH]; rt_memset(pSOU->rx_buf, 0, SIZE_BUF_UART); ret = rt_mutex_init(&pSOU->lock, pSOU->name, RT_IPC_FLAG_FIFO); diff --git a/apps/chrg/applications/thread/chrg_south.h b/apps/chrg/applications/thread/chrg_south.h index 5193520..31d2178 100644 --- a/apps/chrg/applications/thread/chrg_south.h +++ b/apps/chrg/applications/thread/chrg_south.h @@ -6,7 +6,7 @@ #include "chrg_tty.h" #include "chrg_switch.h" -#define THR_NAME_SOUTH "thr_sou" +#define THR_NAME_SOUTH "thr.sou" struct chrg_south_t { const char *name; diff --git a/apps/chrg/applications/utils/chrg_source.c b/apps/chrg/applications/utils/chrg_source.c index 107497f..6e378e1 100644 --- a/apps/chrg/applications/utils/chrg_source.c +++ b/apps/chrg/applications/utils/chrg_source.c @@ -65,7 +65,7 @@ void source_set_pd (rt_uint8_t pro, rt_uint8_t src, rt_uint8_t pps, rt_uint16_t vmax, rt_uint16_t vmin, rt_int16_t max_cur) { rt_size_t len = 0; - rt_uint8_t data[12] = {0}; + rt_uint8_t data[16] = {0}; data[0] = 0x0B; data[1] = 0x00; diff --git a/apps/chrg/rtconfig.h b/apps/chrg/rtconfig.h index fe150a1..b4871c9 100644 --- a/apps/chrg/rtconfig.h +++ b/apps/chrg/rtconfig.h @@ -449,10 +449,16 @@ #define BSP_USING_UART #define BSP_STM32_UART_V1_TX_TIMEOUT 2000 #define BSP_USING_UART1 +#define BSP_UART1_RX_USING_DMA +#define BSP_UART1_TX_USING_DMA #define BSP_USING_UART2 #define BSP_USING_UART3 +#define BSP_UART3_RX_USING_DMA +#define BSP_UART3_TX_USING_DMA #define BSP_USING_UART5 #define BSP_USING_UART6 +#define BSP_UART6_RX_USING_DMA +#define BSP_UART6_TX_USING_DMA #define BSP_USING_I2C #define BSP_USING_I2C1 #define BSP_USING_I2C2 diff --git a/rt-thread/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c b/rt-thread/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c index da74859..79d9158 100644 --- a/rt-thread/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c +++ b/rt-thread/bsp/stm32/libraries/HAL_Drivers/drivers/drv_can.c @@ -484,7 +484,7 @@ static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg) return RT_EOK; } -static int _can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t box_num) +static rt_ssize_t _can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t box_num) { CAN_HandleTypeDef *hcan; hcan = &((struct stm32_can *) can->parent.user_data)->CanHandle; @@ -586,7 +586,7 @@ static int _can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t } } -static int _can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t fifo) +static rt_ssize_t _can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t fifo) { HAL_StatusTypeDef status; CAN_HandleTypeDef *hcan; diff --git a/rt-thread/components/drivers/ipc/condvar.c b/rt-thread/components/drivers/ipc/condvar.c index 1eb42dc..75222d8 100644 --- a/rt-thread/components/drivers/ipc/condvar.c +++ b/rt-thread/components/drivers/ipc/condvar.c @@ -47,7 +47,7 @@ static int _waitq_inqueue(rt_wqueue_t *queue, struct rt_wqueue_node *node, if (ret == RT_EOK) { rt_wqueue_add(queue, node); - if (timeout != RT_WAITING_FOREVER) + if ((int)timeout != RT_WAITING_FOREVER) { rt_timer_control(timer, RT_TIMER_CTRL_SET_TIME, &timeout); diff --git a/rt-thread/src/object.c b/rt-thread/src/object.c index f924f37..2b8158e 100644 --- a/rt-thread/src/object.c +++ b/rt-thread/src/object.c @@ -723,7 +723,7 @@ rt_object_t rt_object_find(const char *name, rt_uint8_t type) }; /* parameter check */ - if (name == RT_NULL || rt_object_get_information(type) == RT_NULL) + if (name == RT_NULL || rt_object_get_information((enum rt_object_class_type)type) == RT_NULL) return RT_NULL; /* which is invoke in interrupt status */ diff --git a/rt-thread/src/scheduler_comm.c b/rt-thread/src/scheduler_comm.c index 3a9332d..b4a6c2d 100644 --- a/rt-thread/src/scheduler_comm.c +++ b/rt-thread/src/scheduler_comm.c @@ -481,4 +481,6 @@ void rt_scheduler_stack_check(struct rt_thread *thread) #endif /* ARCH_CPU_STACK_GROWS_UPWARD */ } -#endif /* RT_USING_OVERFLOW_CHECK */ \ No newline at end of file +#endif /* RT_USING_OVERFLOW_CHECK */ + + diff --git a/rt-thread/src/scheduler_up.c b/rt-thread/src/scheduler_up.c index 5dedb33..11cb08b 100644 --- a/rt-thread/src/scheduler_up.c +++ b/rt-thread/src/scheduler_up.c @@ -720,4 +720,5 @@ rt_err_t rt_sched_thread_bind_cpu(struct rt_thread *thread, int cpu) } /**@}*/ -/**@endcond*/ \ No newline at end of file +/**@endcond*/ +