嵌入式软件异步编程:同步转为异步
来源:互联网 发布:java成员变量是什么 编辑:程序博客网 时间:2024/05/17 01:50
在现有同步实现的基础上进行异步实现,需要将同步代码转换成异步代码。
http://blog.csdn.net/zoomdy/article/details/64125084
mingdu.zheng at gmail dot com
基本方法:分开请求和结果
I/O的基本操作可以细分为两个部分:
- 发起请求
- 检查结果
同步编程模型中,这两部分是在一个函数中的,在没有操作系统的情况下,检查结果部分可能是一个繁忙等待式的轮询,在有操作系统的情况下,检查结果部分可能首先是一个等待信号量的操作,该操作会将线程挂起直到得到I/O的通知。要将同步编程转换成异步编程就要将这两个基本部分分开,若采用轮询式异步编程,只要系统空闲就会调用检查结果部分,若采用回调式异步编程,检查结果部分则可以作为回调函数。
以轮询异步串口发送为例
同步发送
HAL_StatusTypeDef syncUART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size){ huart->TxXferCount = Size; while (huart->TxXferCount > 0U) { huart->TxXferCount--; huart->Instance->TDR = *pData++; while(__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) == RESET){} } return HAL_OK;}
异步发送
异步发送将syncUART_Transmit分割为两个函数:asyncUART_Transmit和asyncUART_Process。asyncUART_Transmit是I/O请求发起函数,asyncUART_Process检查I/O请求的完成情况。asyncUART_Transmit函数在需要发送数据时调用一次,而asyncUART_Process则需要在主函数循环中不断地调用以检查I/O完成请求。
发起请求
- asyncUART_Transmit发起I/O请求成功后立即返回,并不会等待I/O完成。
HAL_StatusTypeDef asyncUART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size){ if(huart->gState != HAL_UART_STATE_READY) { return HAL_BUSY; } huart->TxXferCount = Size; huart->pTxBuffPtr = pData; if (huart->TxXferCount > 0U) { huart->TxXferCount--; huart->Instance->TDR = *huart->pTxBuffPtr++; huart->gState = HAL_UART_STATE_BUSY_TX; } return HAL_OK;}
检查结果
- asyncUART_Process检查I/O的完成情况,如果I/O未完成,那么立即退出,等下一次主循环再次调用。
- 这个例子在检查到上一个I/O请求已经完成的情况下会发起下一个I/O请求。
- asyncUART_Process使用了状态机,因为asyncUART_Process不停地被调用,需要根据外设的状态执行不同的检查或者什么都不做。
void asyncUART_Process(UART_HandleTypeDef *huart){ switch(huart->gState) { case HAL_UART_STATE_BUSY_TX: if(__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) == SET) { if (huart->TxXferCount > 0U) { huart->TxXferCount--; huart->Instance->TDR = *huart->pTxBuffPtr++; } else { huart->gState = HAL_UART_STATE_READY; } } break; default: break; }}
0 0
- 嵌入式软件异步编程:同步转为异步
- 嵌入式软件异步编程(5):同步还是异步?
- 同步转为异步设计
- 嵌入式软件异步编程(1):冥想
- 嵌入式软件异步编程(3):应用案例
- 嵌入式软件异步编程:异步带来的性能提升
- 嵌入式软件:异步编程模型和传统编程模型
- 同步转为异步的OO解决之道
- 嵌入式软件异步编程(2):思维导图
- 编程中的同步、异步概念
- win32串口同步、异步编程
- 同步与异步通信编程
- win32串口同步、异步编程
- win32串口同步、异步编程
- win32串口同步、异步编程
- js同步和异步编程
- 嵌入式 何谓同步与异步经典讲解
- UIday1604:get同步/异步 和 post同步/异步 编程实现
- Java排序总结
- mysql 格式化日期
- zabbix_配置
- MySQL索引原理
- 容器学习list
- 嵌入式软件异步编程:同步转为异步
- Qt核心机制与原理
- 算法
- 简单读懂人工智能:机器学习与深度学习是什么关系
- C#中关键字ref和out的区别
- C++协程之(上下文切换)
- DBA,SYSDBA,SYSOPER三者的区别
- 【C#串口编程计划】C#通讯类库构建
- RandomAccessFile