阻塞与非阻塞 和 同步与异步的联系

以下是ChatGPT的回答:

在STM32等嵌入式系统中,阻塞与非阻塞同步与异步 的概念虽然有联系,但并不完全等同。以下是它们的区别与联系:

1. 阻塞 vs 非阻塞

  • 阻塞:当一个函数调用是阻塞的,意味着它会在执行期间阻止后续代码的运行,直到该函数完成任务。例如,当你调用某个函数等待数据接收完成时,程序将一直停留在这个调用处,直到数据接收完成才继续执行其他代码。
  • 非阻塞:非阻塞调用会立即返回,程序不会等待该任务完成,而是继续执行后续的代码。通常,非阻塞操作会通过中断或回调机制来通知任务的完成。

2. 同步 vs 异步

  • 同步:同步操作意味着调用方需要等待某个任务完成,整个流程按顺序执行。典型的同步操作是一个函数会在完成任务后返回,调用方阻塞,等待该函数结束。
  • 异步:异步操作则允许任务在后台运行,调用方无需等待任务完成,而是立即继续执行后续操作。任务完成后会通过回调函数或事件通知调用方。

联系:

  • 阻塞可以理解为同步的一种具体实现方式,因为在阻塞操作中,调用方被迫等待任务完成,这符合同步的定义。
  • 非阻塞常常与异步相关联,因为在非阻塞操作中,任务可以在后台完成,调用方无需等待,且在任务完成时使用回调或事件通知用户。

举例:

1. 阻塞(同步)操作

以STM32的UART通信为例,HAL_UART_Receive() 是阻塞函数,它会一直等待数据接收完成后才返回,程序在此期间无法做其他事情:

HAL_UART_Receive(&huart1, buffer, length, timeout); 
// 该函数在接收完成后才会返回,期间主程序是阻塞的
2. 非阻塞(异步)操作

使用 HAL_UART_Receive_IT() 进行异步操作,函数会立即返回,数据接收在后台通过中断进行。接收完成后,STM32会通过回调函数 HAL_UART_RxCpltCallback() 通知用户:

HAL_UART_Receive_IT(&huart1, buffer, length); 
// 该函数立即返回,数据接收在后台进行,主程序继续执行其他操作

数据接收完成后,系统会调用回调函数:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { 
// 数据接收完成后的处理逻辑 
}

结论:

  • 阻塞通常表现为同步,因为调用方需要等待任务完成。
  • 非阻塞通常表现为异步,因为调用方可以继续执行其他任务,而任务在后台进行,并通过回调或中断通知完成。

因此,在STM32中,阻塞操作一般可以理解为同步,非阻塞操作则可以理解为异步。这两者的本质区别在于:是否等待任务完成再继续执行程序。

回调函数在stm32中HAL库的调用:以UART接收回调函数为例

以下是个人思考:

        在程序设计的时候,往往需要思考:在使用一个函数的时候是需要用中断,还是轮询方式,作为经验不足、有选择困难的菜鸟,脑袋经常会被这个问题填满钢丝球。然后看见了很多阻塞、非阻塞、同步、异步的设计,然后总结了一点自我观点。在思考时,如果突然对“阻塞”(同步)这个词变得陌生,可以换成“等我拉完”,“非阻塞”(异步)换成“一起拉屎”

        不考虑操作系统,在裸机上的设计,有几种方法:轮询前后台(中断)基于状态机

        在我的理解是“轮询”和“状态机”都是阻塞的方式,不同的是,“状态机”是将一个动作拆分成多个细小动作,然后通过标志位来进行对应动作,比如“踢腿”这一个动作,我可以拆分成“抬腿”、“伸腿”,在此过程中我可以穿插一个“伸手”的动作,也可以不“伸手”,这取决于你的标志位。

        而中断中部分操作可以是阻塞、或者是非阻塞的。例如,中断服务程序函数的执行阻塞的,中断产生的过程非阻塞的。例如,我正在不停的朝别人“踢腿”中,别人也可以朝我“踢腿”,一但别人“踢中”我后,那我就停止“踢腿”,“痛”得“抱起腿”嗷嗷大哭,你得等我重新站起来,才能       继续战斗。
        在此示例中,我“踢腿”是主程序的循环,而别人“腿我”既是中断产生的过程,“痛”是中断标志,“抱起腿”既是中断服务程序。我踢你时你也可以踢我,这就是是非阻塞;需要等我站起来才能继续接下来的战斗,这就是阻塞,如果我没有知觉,那么既是关闭了中断,服务程序也不会进行,那我直接继续就是一脚。

        不讨论操作系统,stm32裸机可以进行的异步操作的:TIM的计时、DMA的搬运、ADC的采集等硬件外设的操作。反正主要不是用cpu的都是异步操作。
        
        另外标记一处地点:使用操作系统——多任务系统时,感觉本质上就是状态机,就是能控制更精确的时间来转变任务。


前人种树:

第2章 单片机程序设计模式 | 百问网 (100ask.net)

延迟性堵塞与非延迟性堵塞_delay 阻塞 非阻塞-CSDN博客

异步与同步示例图文:

        

图片来源:b站icon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1jH4y1M7th/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值