tty use mq

This commit is contained in:
wmano
2025-09-03 22:00:08 +08:00
parent 5409d3a614
commit 7b764c34b9
14 changed files with 117 additions and 71 deletions
+6 -6
View File
@@ -1459,21 +1459,21 @@ CONFIG_BSP_USING_GPIO=y
CONFIG_BSP_USING_UART=y CONFIG_BSP_USING_UART=y
CONFIG_BSP_STM32_UART_V1_TX_TIMEOUT=2000 CONFIG_BSP_STM32_UART_V1_TX_TIMEOUT=2000
CONFIG_BSP_USING_UART1=y CONFIG_BSP_USING_UART1=y
# CONFIG_BSP_UART1_RX_USING_DMA is not set CONFIG_BSP_UART1_RX_USING_DMA=y
# CONFIG_BSP_UART1_TX_USING_DMA is not set CONFIG_BSP_UART1_TX_USING_DMA=y
CONFIG_BSP_USING_UART2=y CONFIG_BSP_USING_UART2=y
# CONFIG_BSP_UART2_RX_USING_DMA is not set # CONFIG_BSP_UART2_RX_USING_DMA is not set
# CONFIG_BSP_UART2_TX_USING_DMA is not set # CONFIG_BSP_UART2_TX_USING_DMA is not set
CONFIG_BSP_USING_UART3=y CONFIG_BSP_USING_UART3=y
# CONFIG_BSP_UART3_RX_USING_DMA is not set CONFIG_BSP_UART3_RX_USING_DMA=y
# CONFIG_BSP_UART3_TX_USING_DMA is not set CONFIG_BSP_UART3_TX_USING_DMA=y
# CONFIG_BSP_USING_UART4 is not set # CONFIG_BSP_USING_UART4 is not set
CONFIG_BSP_USING_UART5=y CONFIG_BSP_USING_UART5=y
# CONFIG_BSP_UART5_RX_USING_DMA is not set # CONFIG_BSP_UART5_RX_USING_DMA is not set
# CONFIG_BSP_UART5_TX_USING_DMA is not set # CONFIG_BSP_UART5_TX_USING_DMA is not set
CONFIG_BSP_USING_UART6=y CONFIG_BSP_USING_UART6=y
# CONFIG_BSP_UART6_RX_USING_DMA is not set CONFIG_BSP_UART6_RX_USING_DMA=y
# CONFIG_BSP_UART6_TX_USING_DMA is not set CONFIG_BSP_UART6_TX_USING_DMA=y
CONFIG_BSP_USING_I2C=y CONFIG_BSP_USING_I2C=y
CONFIG_BSP_USING_I2C1=y CONFIG_BSP_USING_I2C1=y
CONFIG_BSP_USING_I2C2=y CONFIG_BSP_USING_I2C2=y
+27 -33
View File
@@ -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) static rt_err_t chrg_rs485_tty_input (rt_device_t dev, rt_size_t size)
{ {
rt_err_t ret; rt_err_t ret;
rt_uint8_t ch;
rt_size_t i;
struct chrg_tty_t *pTTY = &chrgtty[IDX_TTY_RS485]; struct chrg_tty_t *pTTY = &chrgtty[IDX_TTY_RS485];
for (i = 0; i < size; i++) { if ((RT_NULL != dev) && (RT_NULL != pTTY->mq) && (size > 0)) {
if (rt_device_read(dev, 0, &ch, 1)) { pTTY->msg_mq.dev = dev;
rt_ringbuffer_put_force(pTTY->rb, &ch, 1); pTTY->msg_mq.size = size;
ret = rt_sem_release(&pTTY->sem_rx); 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) static rt_err_t chrg_lcd_tty_input (rt_device_t dev, rt_size_t size)
{ {
rt_err_t ret; rt_err_t ret;
rt_uint8_t ch;
rt_size_t i;
struct chrg_tty_t *pTTY = &chrgtty[IDX_TTY_LCD]; struct chrg_tty_t *pTTY = &chrgtty[IDX_TTY_LCD];
for (i = 0; i < size; i++) { if ((RT_NULL != dev) && (RT_NULL != pTTY->mq) && (size > 0)) {
if (rt_device_read(dev, 0, &ch, 1)) { pTTY->msg_mq.dev = dev;
rt_ringbuffer_put_force(pTTY->rb, &ch, 1); pTTY->msg_mq.size = size;
ret = rt_sem_release(&pTTY->sem_rx); 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) static rt_err_t chrg_north_tty_input (rt_device_t dev, rt_size_t size)
{ {
rt_err_t ret; rt_err_t ret;
rt_uint8_t ch;
rt_size_t i;
struct chrg_tty_t *pTTY = &chrgtty[IDX_TTY_NORTH]; struct chrg_tty_t *pTTY = &chrgtty[IDX_TTY_NORTH];
for (i = 0; i < size; i++) { if ((RT_NULL != dev) && (RT_NULL != pTTY->mq) && (size > 0)) {
if (rt_device_read(dev, 0, &ch, 1)) { pTTY->msg_mq.dev = dev;
rt_ringbuffer_put_force(pTTY->rb, &ch, 1); pTTY->msg_mq.size = size;
ret = rt_sem_release(&pTTY->sem_rx); 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) static rt_err_t chrg_south_tty_input (rt_device_t dev, rt_size_t size)
{ {
rt_err_t ret; rt_err_t ret;
rt_uint8_t ch;
rt_size_t i;
struct chrg_tty_t *pTTY = &chrgtty[IDX_TTY_SOUTH]; struct chrg_tty_t *pTTY = &chrgtty[IDX_TTY_SOUTH];
for (i = 0; i < size; i++) { if ((RT_NULL != dev) && (RT_NULL != pTTY->mq) && (size > 0)) {
if (rt_device_read(dev, 0, &ch, 1)) { pTTY->msg_mq.dev = dev;
rt_ringbuffer_put_force(pTTY->rb, &ch, 1); pTTY->msg_mq.size = size;
ret = rt_sem_release(&pTTY->sem_rx); 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; return RT_ERROR;
} }
ret = rt_sem_init(&pTTY->sem_rx, pTTY->name, 0, RT_IPC_FLAG_FIFO); pTTY->mq = rt_mq_create(pTTY->name, sizeof(struct mq_msg_t), 16, RT_IPC_FLAG_FIFO);
if (ret != RT_EOK) { if (RT_NULL == pTTY->mq) {
LOG_E("sem init '%s' failed.", pTTY->name); LOG_E("create mq '%s' failed.", pTTY->name);
return ret;
}
pTTY->rb = rt_ringbuffer_create(64);
if (RT_NULL == pTTY->rb) {
rt_kprintf("create rb failed.\r\n");
return RT_ERROR; return RT_ERROR;
} }
+7
View File
@@ -20,6 +20,10 @@ typedef enum {
TOTAL_TTY TOTAL_TTY
} eIDX_TTY; } eIDX_TTY;
struct mq_msg_t {
rt_device_t dev;
rt_size_t size;
};
struct chrg_tty_t { struct chrg_tty_t {
rt_device_t dev; rt_device_t dev;
@@ -28,6 +32,9 @@ struct chrg_tty_t {
rt_uint32_t baudrate; rt_uint32_t baudrate;
eIDX_TTY index; eIDX_TTY index;
rt_mq_t mq;
struct mq_msg_t msg_mq;
struct rt_ringbuffer *rb; struct rt_ringbuffer *rb;
struct rt_semaphore sem_rx; struct rt_semaphore sem_rx;
+29 -11
View File
@@ -3,6 +3,8 @@
#include "chrg_north.h" #include "chrg_north.h"
#include "chrg_utils.h"
#define LOG_TAG "chrg.nor" #define LOG_TAG "chrg.nor"
#define DBG_LEVEL DBG_LOG #define DBG_LEVEL DBG_LOG
#include <rtdbg.h> #include <rtdbg.h>
@@ -29,32 +31,48 @@ int chrg_north_send (rt_uint8_t *data, rt_size_t length)
static void chrg_north_thread_entry (void *data) static void chrg_north_thread_entry (void *data)
{ {
rt_err_t ret = RT_EOK;
struct chrg_north_t *pNOR = (struct chrg_north_t *)data; struct chrg_north_t *pNOR = (struct chrg_north_t *)data;
if ((RT_NULL == pNOR)||(RT_NULL == pNOR->tty)) { if ((RT_NULL == pNOR)||(RT_NULL == pNOR->tty)) {
return ; 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 chrg_tty_t *pTTY = pNOR->tty;
struct mq_msg_t *pMQ = &pTTY->msg_mq;
while (1) { while (1) {
ret = rt_sem_take(&pTTY->sem_rx, RT_WAITING_FOREVER); rt_memset(pMQ, 0, sizeof(struct mq_msg_t));
if (RT_EOK != ret) { len_mq = rt_mq_recv(pTTY->mq, pMQ, sizeof(struct mq_msg_t), RT_WAITING_FOREVER);
LOG_E("sem take failed. %d", ret); if (len_mq <= 0) {
continue; continue;
} }
rt_ringbuffer_getchar(pTTY->rb, &ch); len_get = rt_device_read(pMQ->dev, 0, &pNOR->rx_buf[0], 1);
if (pNOR->rx_len < SIZE_BUF_UART) { if (1 != len_get) {
pNOR->rx_buf[pNOR->rx_len++] = ch; continue;
rt_kprintf("%c", ch);
} }
if (pNOR->rx_len >= 32) { pNOR->rx_len = 1;
pNOR->rx_len = 0;
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;
}
}
} }
} }
+1 -1
View File
@@ -7,7 +7,7 @@
#include "chrg_switch.h" #include "chrg_switch.h"
#define THR_NAME_NORTH "thr_nor" #define THR_NAME_NORTH "thr.nor"
struct chrg_north_t { struct chrg_north_t {
const char *name; const char *name;
+30 -12
View File
@@ -3,6 +3,8 @@
#include "chrg_south.h" #include "chrg_south.h"
#include "chrg_utils.h"
#define LOG_TAG "chrg.sou" #define LOG_TAG "chrg.sou"
#define DBG_LEVEL DBG_LOG #define DBG_LEVEL DBG_LOG
#include <rtdbg.h> #include <rtdbg.h>
@@ -16,32 +18,48 @@ struct chrg_south_t chrgsouth = {
static void chrg_south_thread_entry (void *data) static void chrg_south_thread_entry (void *data)
{ {
rt_err_t ret = RT_EOK;
struct chrg_south_t *pSOU = (struct chrg_south_t *)data; struct chrg_south_t *pSOU = (struct chrg_south_t *)data;
if ((RT_NULL == pSOU)||(RT_NULL == pSOU->tty)) { if ((RT_NULL == pSOU)||(RT_NULL == pSOU->tty)) {
return ; 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 chrg_tty_t *pTTY = pSOU->tty;
struct mq_msg_t *pMQ = &pTTY->msg_mq;
while (1) { while (1) {
ret = rt_sem_take(&pTTY->sem_rx, RT_WAITING_FOREVER); rt_memset(pMQ, 0, sizeof(struct mq_msg_t));
if (RT_EOK != ret) { len_mq = rt_mq_recv(pTTY->mq, pMQ, sizeof(struct mq_msg_t), RT_WAITING_FOREVER);
LOG_E("sem take failed. %d", ret); if (len_mq <= 0) {
continue; continue;
} }
rt_ringbuffer_getchar(pTTY->rb, &ch); len_get = rt_device_read(pMQ->dev, 0, &pSOU->rx_buf[0], 1);
if (pSOU->rx_len < SIZE_BUF_UART) { if (1 != len_get) {
pSOU->rx_buf[pSOU->rx_len++] = ch; continue;
rt_kprintf("%c", ch);
} }
if (pSOU->rx_len >= 32) { pSOU->rx_len = 1;
pSOU->rx_len = 0;
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; rt_err_t ret;
struct chrg_south_t *pSOU = &chrgsouth; 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); rt_memset(pSOU->rx_buf, 0, SIZE_BUF_UART);
ret = rt_mutex_init(&pSOU->lock, pSOU->name, RT_IPC_FLAG_FIFO); ret = rt_mutex_init(&pSOU->lock, pSOU->name, RT_IPC_FLAG_FIFO);
+1 -1
View File
@@ -6,7 +6,7 @@
#include "chrg_tty.h" #include "chrg_tty.h"
#include "chrg_switch.h" #include "chrg_switch.h"
#define THR_NAME_SOUTH "thr_sou" #define THR_NAME_SOUTH "thr.sou"
struct chrg_south_t { struct chrg_south_t {
const char *name; const char *name;
+1 -1
View File
@@ -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_uint16_t vmax, rt_uint16_t vmin, rt_int16_t max_cur)
{ {
rt_size_t len = 0; rt_size_t len = 0;
rt_uint8_t data[12] = {0}; rt_uint8_t data[16] = {0};
data[0] = 0x0B; data[0] = 0x0B;
data[1] = 0x00; data[1] = 0x00;
+6
View File
@@ -449,10 +449,16 @@
#define BSP_USING_UART #define BSP_USING_UART
#define BSP_STM32_UART_V1_TX_TIMEOUT 2000 #define BSP_STM32_UART_V1_TX_TIMEOUT 2000
#define BSP_USING_UART1 #define BSP_USING_UART1
#define BSP_UART1_RX_USING_DMA
#define BSP_UART1_TX_USING_DMA
#define BSP_USING_UART2 #define BSP_USING_UART2
#define BSP_USING_UART3 #define BSP_USING_UART3
#define BSP_UART3_RX_USING_DMA
#define BSP_UART3_TX_USING_DMA
#define BSP_USING_UART5 #define BSP_USING_UART5
#define BSP_USING_UART6 #define BSP_USING_UART6
#define BSP_UART6_RX_USING_DMA
#define BSP_UART6_TX_USING_DMA
#define BSP_USING_I2C #define BSP_USING_I2C
#define BSP_USING_I2C1 #define BSP_USING_I2C1
#define BSP_USING_I2C2 #define BSP_USING_I2C2
@@ -484,7 +484,7 @@ static rt_err_t _can_control(struct rt_can_device *can, int cmd, void *arg)
return RT_EOK; 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; CAN_HandleTypeDef *hcan;
hcan = &((struct stm32_can *) can->parent.user_data)->CanHandle; 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; HAL_StatusTypeDef status;
CAN_HandleTypeDef *hcan; CAN_HandleTypeDef *hcan;
+1 -1
View File
@@ -47,7 +47,7 @@ static int _waitq_inqueue(rt_wqueue_t *queue, struct rt_wqueue_node *node,
if (ret == RT_EOK) if (ret == RT_EOK)
{ {
rt_wqueue_add(queue, node); 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); rt_timer_control(timer, RT_TIMER_CTRL_SET_TIME, &timeout);
+1 -1
View File
@@ -723,7 +723,7 @@ rt_object_t rt_object_find(const char *name, rt_uint8_t type)
}; };
/* parameter check */ /* 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; return RT_NULL;
/* which is invoke in interrupt status */ /* which is invoke in interrupt status */
+2
View File
@@ -482,3 +482,5 @@ void rt_scheduler_stack_check(struct rt_thread *thread)
} }
#endif /* RT_USING_OVERFLOW_CHECK */ #endif /* RT_USING_OVERFLOW_CHECK */
+1
View File
@@ -721,3 +721,4 @@ rt_err_t rt_sched_thread_bind_cpu(struct rt_thread *thread, int cpu)
/**@}*/ /**@}*/
/**@endcond*/ /**@endcond*/