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