RT

您所在的位置:网站首页 shell:startup无法打开 RT

RT

2024-01-08 09:26| 来源: 网络整理| 查看: 265

现象:FinSH线程卡死,明显的发现就是,使用调试模式时,可以正常接收指令,但是正常运行时,就无任何响应。

原因:深入分析后,会在 shell.c 文件中的 finsh_getchar 函数中看到信号量的使用,如下图所示:

现在原因找到了,那么我们只需要在适当的时候释放信号量即可,那我们在找找看看有么有信号释放的函数,接下来我们会发现在 shell.c 文件中 finsh_rx_ind 函数就是释放信号量的,如图所示:

那么新的问题又来了,怎么调用这个函数了,因为在shell.h文件中也没有这个函数的定义, 不要怕我们接着找,最后在shell.c 文件中的 finsh_set_device 函数中,会将释放信号量的函数指针放入 rt_device 结构体中,如下图所示:

那么问题就变得简单了,解决办法如下

解决办法:我们已经知道怎么释放信号量了,所以只需要在 数据接收函数(stm32_getc)中,完成数据接收后,释放信号量即可,如下所示:

/** * 接收一个字符数据 */ static int stm32_getc(struct rt_serial_device *serial) { int ch; struct stm32_uart *uart; RT_ASSERT(serial != RT_NULL); uart = rt_container_of(serial, struct stm32_uart, serial); ch = -1; if (USART_GetFlagStatus(uart->handle.Instance, USART_FLAG_RXNE) != RESET) { #if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32F0) \ || defined(SOC_SERIES_STM32L0) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32H7) \ || defined(SOC_SERIES_STM32G4) ch = uart->handle.Instance->RDR & 0xff; #else // ch = (uint16_t)uart->handle.Instance->DR & (uint16_t)0x00ff; ch = (char)USART_ReceiveData(uart->handle.Instance); #endif } /* 调用设备接收数据回调,释放信号量 */ uart->serial.parent.rx_indicate(&serial->parent, 0); return ch; }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3