串口的深入思考,待整理

参考:https://blog.csdn.net/yuanhk88/article/details/7846726

在设计串口驱动的过程中,要遵循的两条准则是:

1:尽量的减少程序运行的时间。
2:尽量的减少程序所占用的内存。

譬如,下面的一段程序(充电桩发送函数)

void Uart_data_send(ENUM_USART port,uint8_t *data,u16 len)
{
    USART_TypeDef *sendport = get_uart_port(port);

    if(NULL== sendport) return;
    
    USART_GetFlagStatus(sendport, USART_FLAG_TC);
    while(len--)
    {
        USART_SendData(sendport, *data++);
        while(USART_GetFlagStatus(sendport, USART_FLAG_TC)==RESET);   
    }  
}

很明显,这段程序在实际应用中将会产生灾难性的后果,

首先,当发送数据送到发送寄存器,启动发送以后,CPU 就一直在等待这个数据发送完成,

然后进入下一个数据的发送,这样,直到所有要发送的数据完成,CPU 才能做其他的事情。

相对于 CPU 内核运行的速度而言,串口外设的运行速度是非常快的,

让一个速度非常快的设备去等待相对很慢的设备,程序的效率是非常低下的。

所以必须采用中断的方式发送数据。

猜你喜欢

转载自blog.csdn.net/weixin_42381351/article/details/80989692