OpenHarmony开发者论坛

标题: 设备串口发送消息正常,但接收串口消息时程序挂起 [打印本页]

作者: tianhel    时间: 2025-1-14 17:21
标题: 设备串口发送消息正常,但接收串口消息时程序挂起
### 【问题描述】

1. 介绍问题现象和发生的背景
   现象:产品功能涉及串口通信,测试发现调用芯片函数的串口发送正常,但如果芯片串口收到消息,程序就卡死
   背景:项目运行在GD32W51x系列MCU,之前使用FreeRTOS进行任务调度,正在尝试移植到OpenHarmony LiteOS-m,Debug打印使用的是先前沿用的ARM仿真器和Segger RTT Log。目前下载了3.0.0 LTS的全量代码,按照仓库文档建立了device、vendor文件树,在wsl中使用hb编译,在任务系统中建立了包括点灯、传感器I2C通信、调度在内的几个基本任务,功能正常。在移植串口通信任务时,发现了该问题
2. 相关的代码(请勿使用截图)
   卡死串口的初始化函数:

   ```
   void usart0_init(void)
   {

           gpio_af_set(GPIOB, GPIO_AF_8, USART0_TX_PIN);
           gpio_af_set(GPIOA, GPIO_AF_2, USART0_RX_PIN);
           gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, USART0_TX_PIN);
           gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, USART0_RX_PIN);
           gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, USART0_TX_PIN);
           gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, USART0_RX_PIN);

           usart_deinit(USART0);

           usart_baudrate_set(USART0, 115200);
           usart_word_length_set(USART0, USART_WL_8BIT);
           usart_stop_bit_set(USART0, USART_STB_1BIT);
           usart_parity_config(USART0, USART_PM_NONE);
           usart_receive_config(USART0, USART_RECEIVE_ENABLE);
           usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);

           usart_enable(USART0);
           usart_interrupt_enable(USART0, USART_INT_RBNE);
           nvic_irq_enable(USART0_IRQn, 1, 2);
   }
   ```

   vendor中的config.json:

   ```
   {
     "product_name": "gd32w51x",
     "ohos_version": "OpenHarmony 3.0 LTS",
     "device_company": "gd",
     "board": "gd32w51x",
     "kernel_type": "liteos_m",
     "kernel_version": "",
     "subsystems": [
       {
         "subsystem": "kernel",
         "components": [
           {
             "component": "liteos_m",
             "features": [
               "enable_ohos_kernel_liteos_m_cppsupport = false",
               "enable_ohos_kernel_liteos_m_fs = false",
               "enable_ohos_kernel_liteos_m_kal = false"
             ]
           }
         ]
       }
     ],
     "vendor_adapter_dir": "//device/gd/gd32w51x",
     "third_party_dir": "",
     "product_adapter_dir": ""
   }
   ```

   子系统只运行了liteos_m的kernel

   device下配置的target_config.h:

   ```
   #include "gd32w51x.h"

   #ifndef _TARGET_CONFIG_H
   #define _TARGET_CONFIG_H

   /*=============================================================================
                                           System clock module configuration
   =============================================================================*/
   #define OS_SYS_CLOCK SystemCoreClock
   #define LOSCFG_BASE_CORE_TICK_PER_SECOND (100UL)
   #define LOSCFG_BASE_CORE_TICK_HW_TIME 0
   #define LOSCFG_BASE_CORE_TICK_WTIMER 0
   #define LOSCFG_BASE_CORE_TICK_RESPONSE_MAX 0xFFFFFFUL

   /*=============================================================================
                                           Hardware interrupt module configuration
   =============================================================================*/
   #define LOSCFG_PLATFORM_HWI 1
   #define LOSCFG_USE_SYSTEM_DEFINED_INTERRUPT 1
   #define LOSCFG_PLATFORM_HWI_LIMIT 128
   /*=============================================================================
                                          Task module configuration
   =============================================================================*/
   #define LOSCFG_BASE_CORE_TSK_LIMIT 24
   #define LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE (0x180U)
   #define LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE (0x400U)
   #define LOSCFG_BASE_CORE_TSK_MIN_STACK_SIZE (0x180U)
   #define LOSCFG_BASE_CORE_TIMESLICE 1
   #define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 20000

   /*=============================================================================
                                          Semaphore module configuration
   =============================================================================*/
   #define LOSCFG_BASE_IPC_SEM 0
   #define LOSCFG_BASE_IPC_SEM_LIMIT 48
   /*=============================================================================
                                          Mutex module configuration
   =============================================================================*/
   #define LOSCFG_BASE_IPC_MUX 0
   #define LOSCFG_BASE_IPC_MUX_LIMIT 24
   /*=============================================================================
                                          Queue module configuration
   =============================================================================*/
   #define LOSCFG_BASE_IPC_QUEUE 0
   #define LOSCFG_BASE_IPC_QUEUE_LIMIT 24
   /*=============================================================================
                                          Software timer module configuration
   =============================================================================*/
   #define LOSCFG_BASE_CORE_SWTMR 0
   #define LOSCFG_BASE_CORE_SWTMR_ALIGN 0
   #define LOSCFG_BASE_CORE_SWTMR_LIMIT 48
   /*=============================================================================
                                          Memory module configuration
   =============================================================================*/
   // extern unsigned int __heap_start;
   // extern unsigned int __heap_size;
   // #define LOSCFG_SYS_EXTERNAL_HEAP                            1
   // #define LOSCFG_SYS_HEAP_ADDR                                (void *)&__heap_start
   // #define LOSCFG_SYS_HEAP_SIZE                                (unsigned int)&__heap_size
   #define LOSCFG_MEM_MUL_POOL 1
   #define OS_SYS_MEM_NUM 20
   #define LOSCFG_MEM_FREE_BY_TASKID 1
   #define LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK 1
   #define LOSCFG_MEM_LEAKCHECK 0
   #define LOSCFG_MEMORY_BESTFIT 1

   /*=============================================================================
                                          Exception module configuration
   =============================================================================*/
   #define LOSCFG_PLATFORM_EXC 0
   /* =============================================================================
                                          printf module configuration
   ============================================================================= */
   #define LOSCFG_KERNEL_PRINTF 0

   #define LOSCFG_BACKTRACE_TYPE 0

   #define LOSCFG_DEBUG_HOOK 0

   #define LOSCFG_KERNEL_PM 0

   #define LOS_KERNEL_TEST_NOT_SMOKE 0

   /*=============================================================================
                                          shell module configuration
   =============================================================================*/
   #define LOSCFG_USE_SHELL 0
   #define LOSCFG_SHELL_PRIO 3

   #endif /* _TARGET_CONFIG_H */
   ```

   考虑到要使用Liteos-m的任务系统,选择了使用Liteos-m接管中断
3. 运行结果、错误截图

   程序在接收到串口消息后,立刻卡死,其余任务打印的Log全部停止
4. 我尝试过的解决方法和结果

   项目启动时会需要进行串口收发,在注释掉启动时的通信动作后,其余任务正常运行,直到收到手动发送的串口消息时,卡死,该现象可以稳定反复复现
5. 我想要达到的结果

   项目中的串口能够正常接收消息

### 【运行环境】

硬件:MCU为GD32W515PIQ6,调试使用J-Link
ROM版本:无
DevEvoStudio版本:无
SDK版本:OpenHarmony 3.0.0 LTS





欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5