当前位置: 首页 > news >正文

(XMODEM协议)自旋锁异常报错

互斥锁:

        如果说当前拿不到锁,释放CPU资源,阻塞等待,直到锁被释放之后,在去重新拿到锁,同时可以设置阻塞时间,,只等待指定的时间;如果在这段时间内仍未获取到锁,就会停止等待并返回失败,而不是无限期阻塞。

自旋锁:

        如果说当前拿不到,不会释放当前CPU资源,循环等待,死等直到拿到锁,有点像是一个while死循环。所以一般使用的时候都会设置添加额外超时逻辑来实现结束死循环,原始自旋锁的最大风险是:如果持有锁的线程因异常(如崩溃、死锁)未释放锁,等待的线程会一直自旋(持续占用 CPU),导致 “CPU 空转”。超时机制能解决这一问题 —— 超过设定时间后,线程可以放弃等待,进行错误处理(如记录日志、重试或切换策略)。

        如果等待时间较少,就使用自旋锁,如果等待时间较长就使用互斥锁,自旋锁一般使用在微秒级的等待

并且如果超时等待不了锁,就会出现断言错误。

看一个实际的例子:

esp_err_t esp_xmodem_transport_close(esp_xmodem_handle_t handle)
{if (handle){esp_xmodem_transport_t *p = (esp_xmodem_transport_t *)(handle->transport);if (p->uart_task_handle){vTaskDelete(p->uart_task_handle);p->uart_task_handle = NULL;}if (p->uart_queue){ESP_ERROR_CHECK(uart_driver_delete(p->uart_num));xQueueReset(p->uart_queue);p->uart_queue = NULL;}}return ESP_OK;
}

当我进行XMODEM结束之后,会清理掉串口当中的数据,但是这里这个函数就会出现下面的报错

assert failed: spinlock_acquire spinlock.h:142 (lock->count == 0)

问题出现在xQueueReset(p->uart_queue);这个函数的调用上面,在清理串口资源art_driver_delete(p->uart_num)的时候,已经将清楚串口队列的操作执行了,并且清除串口队列任务使用了自旋锁,当自旋锁没有被释放掉的时候,等待其他任务释放自旋锁,如果超过了等待时间,程序崩溃。像这样的更改方法最好就是将多余的重置队列任务清除掉。

esp_err_t esp_xmodem_transport_close(esp_xmodem_handle_t handle)
{if (handle){esp_xmodem_transport_t *p = (esp_xmodem_transport_t *)(handle->transport);if (p->uart_task_handle){vTaskDelete(p->uart_task_handle);p->uart_task_handle = NULL;}if (p->uart_queue){ESP_ERROR_CHECK(uart_driver_delete(p->uart_num));p->uart_queue = NULL;}}return ESP_OK;
}

http://www.dtcms.com/a/549982.html

相关文章:

  • 关于光照探针的实验和疑问
  • 校园网站建设的优点wordpress最新文章链接插件
  • 南城网站建设公司策划山东省建设执业资格注册中心网站
  • 【机器学习】模型持久化与部署
  • 「用Python来学微积分」21. 玩转高阶导数
  • 不谈AI模型,只谈系统:SmartMediaKit低延迟音视频技术现实主义路线
  • 哪些证书对学历没硬性要求?高职生必看
  • 公司网站做推广做商城型网站
  • PyQt5 QSet完全指南:深入理解Qt的高性能集合容器
  • 乡村旅游电子商务网站建设有网站怎么做淘宝客
  • 狭小空间难嵌入?这款寻北仪重新定义新标准!
  • 成华区网站建设公司软件工程最好的出路
  • 网站的关键词怎么选择工信部网站登陆
  • Rust 复合类型深度解析:从元组与数组看内存安全与抽象设计
  • ASTMD4169对于医疗冷链包装在空陆联运中的测试验证
  • g++/gcc编译器与自动化构建make/Makefile
  • 高性能人工智能目标检测开山篇----YOLO v1算法详解(上篇)
  • 【文字库】新华字典部分年份出版汇总
  • 个体工商户备案网站备案wordpress推广
  • 设计师网站推荐wordpress换域名安装
  • 搭建 k8s
  • 【MCU控制 初级手札】1.5 化学键(离子键、共价键、金属键)与化合价 【化学基础】
  • Rust与Python完全指南:从零开始理解两门语言的区别与关系
  • 服务器硬盘的作用都有哪些?
  • flash网站源码48快装旧房翻新公司电话
  • 【PID】连续PID和数字PID chapter1(补充) 学习笔记
  • 哈希——unordered_map以及unordered_set的封装
  • Java 的演进与现代应用:从经典语言到云时代中坚力量
  • Slicer中启动器的生成过程
  • html5手机网站开发工具响应式网站和自适应