From caeea1f89335bc093e3eaf319ad459337d9b1889 Mon Sep 17 00:00:00 2001 From: boxuesong <545934173@qq.com> Date: Thu, 18 Aug 2022 15:41:39 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=8E=A7=E5=88=B6=E5=8F=B0?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E8=BE=93=E5=85=A5bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rt_uint16_t old_flag = _console_device->open_flag; _console_device->open_flag |= RT_DEVICE_FLAG_STREAM; rt_device_write(_console_device, 0, str, rt_strlen(str)); _console_device->open_flag = old_flag; 当一个线程正在执行 rt_device_write(_console_device, 0, str, rt_strlen(str));函数时,一个高优先级线程 抢占当前线程并修改 _console_device->open_flag(修改为RT_DEVICE_FLAG_INT_RX,之前不是中断接收), 高优先级线程执行完后,继续执行以前线程,此时old_flag与_console_device->open_flag不一致,执行 _console_device->open_flag = old_flag;后_console_device->open_flag新的值被覆盖。控制台串口实际配置 成硬件中断接收,因为_console_device->open_flag值被修改为不是中断,最后导致控制台串口无法接收任何数据 输入。 --- src/kservice.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/kservice.c b/src/kservice.c index ea9bd87b45..4c85af0bba 100644 --- a/src/kservice.c +++ b/src/kservice.c @@ -1175,7 +1175,7 @@ void rt_kputs(const char *str) _console_device->open_flag |= RT_DEVICE_FLAG_STREAM; rt_device_write(_console_device, 0, str, rt_strlen(str)); - _console_device->open_flag = old_flag; + _console_device->open_flag ^= (~old_flag & RT_DEVICE_FLAG_STREAM); } #else rt_hw_console_output(str); @@ -1213,7 +1213,7 @@ void rt_kprintf(const char *fmt, ...) _console_device->open_flag |= RT_DEVICE_FLAG_STREAM; rt_device_write(_console_device, 0, rt_log_buf, length); - _console_device->open_flag = old_flag; + _console_device->open_flag ^= (~old_flag & RT_DEVICE_FLAG_STREAM); } #else rt_hw_console_output(rt_log_buf);