• Lv1
    粉丝0

积分0 / 贡献0

提问1答案被采纳0文章0

作者动态

    设备串口发送消息正常,但接收串口消息时程序挂起

    tianhel 显示全部楼层 发表于 2025-1-14 17:21:49
    ### 【问题描述】

    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

    您尚未登录,无法参与评论,登录后可以:
    参与开源共建问题交流
    认同或收藏高质量问答
    获取积分成为开源共建先驱

    Copyright   ©2025  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

    返回顶部