Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

commit the serial branch [serial & usart] #199

Merged
merged 2 commits into from
Apr 30, 2021

Conversation

KyleChenjh
Copy link

No description provided.

@KyleChenjh
Copy link
Author

文档后续整理出来一并附上

@mysterywolf
Copy link
Contributor

@loogg
Copy link
Collaborator

loogg commented Apr 28, 2021

之前开会讨论的?

@@ -86,7 +91,8 @@
PARITY_NONE, /* No parity */ \
BIT_ORDER_LSB, /* LSB first sent */ \
NRZ_NORMAL, /* Normal mode */ \
RT_SERIAL_RB_BUFSZ, /* Buffer size */ \
RT_SERIAL_RB_BUFSZ, /* rxBuf size */ \
0, /* txBuf size */ \
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TX Buffer size
RX Buffer size

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

是的,默认两个buffer size,这个只是默认参数,两个buffer size的值具体多少,需要根据串口注册时候的具体值决定。

@loogg
Copy link
Collaborator

loogg commented Apr 28, 2021

之前开会讨论的?

我把我的链接也附上
https://github.com/loogg/RT-Thread_403_private/tree/master/components/drivers/serial

@KyleChenjh
Copy link
Author

Add test case (uart_testcase.c) for uart

该提交新增uart_testcase,默认开启的是uart1。
测试方法:短接uart1的tx和rx,系统启动之后命令行输入 utest_run回车即可。
image

测试内容:串口设置波特率为3Mbps,随机发送[1 ,1000]个数据,判断发送数据是否和接收的数据一致。测试10万次均正常,则测试通过。
image

@Guozhanxin
Copy link
Collaborator

具体做了哪些优化,解决了哪些问题,在哪里能看到啊?

@KyleChenjh KyleChenjh closed this Apr 29, 2021
@KyleChenjh KyleChenjh reopened this Apr 29, 2021
@KyleChenjh
Copy link
Author

具体做了哪些优化,解决了哪些问题,在哪里能看到啊?

文档还在写。稍后会更新上来

@KyleChenjh
Copy link
Author

KyleChenjh commented Apr 29, 2021

下面链接是关于应用层使用串口的文档说明:

串口应用文档

@whj4674672
Copy link
Collaborator

@Guozhanxin 这个是提交在分支上的,如果没有冲突,就先合了吧

@Guozhanxin Guozhanxin merged commit 450fb40 into RT-Thread-Studio:lab_serial Apr 30, 2021
@KyleChenjh
Copy link
Author

具体做了哪些优化,解决了哪些问题,在哪里能看到啊?

旧版本串口框架(以及驱动)主要有以下几类问题:

  • 选择不同模式时,影响应用层执行逻辑:

    • 当写数据为轮询或者中断时,调用rt_device_write正确返回后即代表数据发送完成,而使用DMA时,调用rt_device_write返回后仅仅代表数据准备完毕,并不能代表数据发送完成,如果用户在正确返回后再次调用rt_device_write,将有可能出现上次数据未发送完成,数据又被修改的发送数据错误的问题。简而言之,即使用中断和轮询时,发送模式为阻塞模式,使用DMA时,发送模式为非阻塞模式,且未对数据块进行保护。
  • 发送模式不够完善:

    • 串口框架中,中断和轮询模式实质上均是轮询模式,造成使用中断时,仍然需要浪费大量CPU时间,影响系统整体性能。
  • 框架职能 不够清晰,并导致性能不足:

    • 串口框架对串口外设进行模式选择、读写接口配置、中断配置等,条件分类太多,造成执行效率低而这部分内容更倾向于让底层驱动去关心,另外框架层应该更多关心同步异步的操作模式,使得应用层执行流程能够统一。

新版本的串口框架(以及驱动)主要改动点:

  • 取消了硬件工作模式 的判断,硬件工作模式由驱动层支持,使得框架层与 硬件工作模式 无关;

  • 统一操作接口,应用层不再关心 硬件工作模式,

  • 统一使用 阻塞/非阻塞 操作模式,使得应用层开发更加便捷;

  • 增加发送缓冲区功能,保证应用层数据的一致性,解决丢包率;

  • 完善工作模式,分工明确,轮询、中断、DMA都能按照正确的工作模式执行。

用户使用上基本完全兼容

新版本的串口使用上 基本完全兼容老版本的串口使用方式,即统一使用rt_device的设备驱动框架。

唯一的区别在于旧版本的串口打开标志是:

/* 接收模式参数 */
#define RT_DEVICE_FLAG_INT_RX       0x100     /* 中断接收模式 */
#define RT_DEVICE_FLAG_DMA_RX       0x200     /* DMA 接收模式 */
/* 发送模式参数 */
#define RT_DEVICE_FLAG_INT_TX       0x400     /* 中断发送模式 */
#define RT_DEVICE_FLAG_DMA_TX       0x800     /* DMA 发送模式 */

新版本的串口打开标志是:

/* 接收模式参数 */
#define RT_DEVICE_FLAG_RX_BLOCKING        0x1000   /* 接收阻塞模式*/
#define RT_DEVICE_FLAG_RX_NON_BLOCKING    0x2000   /* 接收非阻塞模式*/
/* 发送模式参数 */
#define RT_DEVICE_FLAG_TX_BLOCKING        0x4000   /* 发送阻塞模式*/
#define RT_DEVICE_FLAG_TX_NON_BLOCKING    0x8000   /* 发送非阻塞模式*/

其他

另外新版本串口框架暂未对POSIX接口进行适配,后续将进行适配与完善。

@@ -145,27 +151,34 @@ struct rt_serial_device
void *serial_rx;
void *serial_tx;
};
typedef struct rt_serial_device rt_serial_t;
typedef struct rt_serial_device *rt_serial_t;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个地方为什么要改?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

系统内有个约定成俗的习惯,用 typedef 为结构体声明别名为指针类型时,一般是*xxx_t,所以这里改为 *rt_serial_t。不过暂时没有使用这个类型 ,只是防止后边使用时出现数据类型混淆误用的情况发生。

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

一些接口、定义还是尽量不要动的,要不然后面往主分支上合的时候,就费劲了,还要再改回来。

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

我就是担心往主分支合并,这个声明的别名还没按照规范去走才改的,不希望历史遗留的问题继续保留下来。大家都是 xxx_t是指针,这个xxx_t是结构体,以后用起来肯定会混淆的,只是好在现在系统里面都没用这个。或者是干脆删掉也行。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants