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

嵌入式人工智能ESP32(6-多线程)

嵌入式人工智能(29-基于树莓派4B的按键中断--多线程实现)_树莓派使用按钮控制程序终止进行-CSDN博客

嵌入式人工智能ESP32(3-定时器与外部中断)-CSDN博客

 1、多线程

多线程我们已经做过一次实验了,通过按键中断呼吸灯的运行。如果不用多线程,那么在实验中发现按键不灵敏,有时按下并不能中断呼吸灯的运行。为什么?因为按键按下触发的低电平判断只是一瞬间,而这一瞬间CPU在呼吸灯的time.sleep里面,没有腾出时间去判断,而等到CPU有时间判断了,发现按键已经抬起了。说着说着,突然有种伤感,人生总是由于错过而充满遗憾,令人嗟嘘。

但有了多线程就不一样了,它并不是等一个线程执行完了,再去执行另一个线程,而是采用并发执行的操作,同时执行2个线程,就是说同时做2个事情。在呼吸灯sleep里,CPU在另一个线程里面一直等待按键的按下,只要按键按下,立刻中断呼吸灯的线程。这个很像中断,在ESP32里面,我们也通过中断实现按键中断LED灯闪烁的效果,中断是硬件,也是解决问题的一种方式。

在micropython的官方文档里面显示出该多线程模块是高度实验的,没有相关案例参考。我们自己写点意思下。

import _thread
import timedef test1(*args, **kwargs):for i in range(10):print("任务1...%d" % i)time.sleep(0.1)def test2(*args, **kwargs):for i in range(5):print("任务2...%d" % i)time.sleep(0.2)t1 = _thread.start_new_thread(test1,(1,))
t2 = _thread.start_new_thread(test2,(2,))

(1)可以看出和标准的Python库还有有一些不一样的,它导入的库名为_thread。

(2)多线程的执行是随机的,但CPU执行分配同样的时间片,那么耗时短的程序会先执行完。

 如果是一直循环执行,那么每个线程CPU分配的时间是一样的,这样占用CPU时间少,但又比较重要的事情就会频繁的去做,可以达到软实时监控的要求,但相比较硬件中断还是要实时性差点。(线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度。 )

(3)补充 python中*args和**kwargs的解释,这个具体用法不在本文赘述。

*args和**kwargs:属于可变参数
*args会将传入的参数放入名为args的元组中
**kwargs会将传入的关键字参数放入名为kwargs的字典中

如果函数没有参数可以这样写。如果有参数的情况可以参考:

import _thread
import timedef test1(num):for i in range(num):print("任务1...%d" % i)time.sleep(0.1)def test2(num):for i in range(num):print("任务2...%d" % i)time.sleep(0.2)t1 = _thread.start_new_thread(test1,(3,))
t2 = _thread.start_new_thread(test2,(6,))

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python | Leetcode Python题解之第367题有效的完全平方数
  • 为什么互联网上要设立防火墙?WAF又是什么?
  • Unity实现棋盘方格
  • 如何快速建30个文件夹
  • 【给女朋友讲C++】C++的编译
  • [数据集][目标检测]停车场空位检测数据集VOC+YOLO格式7959张2类别
  • 【mysql】mysql的卸载和安装
  • 【区块链 + 智慧文旅】城商行旅游金融联盟:旅游金融联盟平台 | FISCO BCOS应用案例
  • 知识图谱问答召回机制-llm-graph-builder
  • BCLinux Euler 21.10 安装mysql 8.0.37 (二进制安装)
  • 数组、向量与矩阵
  • 常见的数据库面试题分享
  • 解决 mfc140.dll 文件丢失的问题,5种mfc140.dll解决方法
  • C++初学者指南-5.标准库(第二部分)–特殊容器
  • 构建并升级openssh至OpenSSH_9.8p1
  • [译] 怎样写一个基础的编译器
  • 【知识碎片】第三方登录弹窗效果
  • Angular4 模板式表单用法以及验证
  • CSS 三角实现
  • Logstash 参考指南(目录)
  • Mac转Windows的拯救指南
  • PHP变量
  • Sublime text 3 3103 注册码
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • vue-router的history模式发布配置
  • 观察者模式实现非直接耦合
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 入口文件开始,分析Vue源码实现
  • 突破自己的技术思维
  • 学习ES6 变量的解构赋值
  • 一些css基础学习笔记
  • 硬币翻转问题,区间操作
  • 积累各种好的链接
  • ​zookeeper集群配置与启动
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • #define,static,const,三种常量的区别
  • #ubuntu# #git# repository git config --global --add safe.directory
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (1) caustics\
  • (2)(2.10) LTM telemetry
  • (2)STL算法之元素计数
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (C语言)逆序输出字符串
  • (苍穹外卖)day03菜品管理
  • (回溯) LeetCode 40. 组合总和II
  • (六)Flink 窗口计算
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转) 深度模型优化性能 调参
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转载)Linux网络编程入门
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl