diff --git "a/docs/advanced_tutorial/zh/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/README.md" "b/docs/advanced_tutorial/zh/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/README.md" index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2b0c674371e68866ea906b283f0b1d236fdaa746 100644 --- "a/docs/advanced_tutorial/zh/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/README.md" +++ "b/docs/advanced_tutorial/zh/\344\272\221\345\271\263\345\217\260\345\257\271\346\216\245/README.md" @@ -0,0 +1,11 @@ +# 云平台对接应用开发 + +云平台对接应用开发主要介绍模组连接各个云平台的步骤和通信测试结果,本部分内容主要介绍基本概念和理论,实际操作验证通过文章最后的链接跳转到应用文档。 + +# 云平台对接应用开发文档目录 + +- [云平台对接-移远云连接教程](云平台对接-移远云连接教程.md) +- [云平台对接-阿里云连接教程](云平台对接-阿里云连接教程.md) +- [云平台对接-腾讯云连接教程](云平台对接-腾讯云连接教程.md) +- [云平台对接-华为云](云平台对接-华为云.md) +- [云平台对接-AWS](云平台对接-AWS.md) diff --git "a/docs/development_guide/zh/media/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/_thread-Queue.png" "b/docs/development_guide/zh/media/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/_thread-Queue.png" new file mode 100644 index 0000000000000000000000000000000000000000..9896a301f381c4843277fdf012debb71d5f451f5 Binary files /dev/null and "b/docs/development_guide/zh/media/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/_thread-Queue.png" differ diff --git "a/docs/development_guide/zh/media/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/_thread-allocate_lock.png" "b/docs/development_guide/zh/media/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/_thread-allocate_lock.png" new file mode 100644 index 0000000000000000000000000000000000000000..05f76571f08c16fa8c36e966b0a7c849fb7a168d Binary files /dev/null and "b/docs/development_guide/zh/media/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/_thread-allocate_lock.png" differ diff --git "a/docs/development_guide/zh/media/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/_thread-start_new_thread.png" "b/docs/development_guide/zh/media/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/_thread-start_new_thread.png" new file mode 100644 index 0000000000000000000000000000000000000000..e84107a49481f4e822eea1652a84180e6342b125 Binary files /dev/null and "b/docs/development_guide/zh/media/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/_thread-start_new_thread.png" differ diff --git "a/docs/development_guide/zh/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276-\345\244\226\346\214\202WiFi\345\272\224\347\224\250\345\274\200\345\217\221.md" "b/docs/development_guide/zh/\345\244\226\350\256\276\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\226\350\256\276-\345\244\226\346\214\202WiFi\345\272\224\347\224\250\345\274\200\345\217\221.md" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/README.md" "b/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/README.md" index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..1dd2c0bb319f61e96e5dbd831252fe3dd4429f49 100644 --- "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/README.md" +++ "b/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/README.md" @@ -0,0 +1,9 @@ +# 多线程应用开发 + +多线程应用开发主要介绍模组支持的多线程功能,学习了多线程后,使读者在做项目时更加灵活编写代码,本部分内容主要介绍基本概念和理论,实际操作验证通过文章最后的链接跳转到应用文档。 + +# 多线程应用开发文档目录 + +- [多线程-创建线程应用开发](多线程-创建线程.md) +- [多线程-互斥锁应用开发](多线程-互斥锁应用.md) +- [多线程-消息队列应用开发](多线程-消息队列应用.md) diff --git "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\344\272\222\346\226\245\351\224\201\345\272\224\347\224\250.md" "b/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\344\272\222\346\226\245\351\224\201\345\272\224\347\224\250.md" index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b1a4fd30c82ecd918c06e42ae277e3d5ffebe522 100644 --- "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\344\272\222\346\226\245\351\224\201\345\272\224\347\224\250.md" +++ "b/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\344\272\222\346\226\245\351\224\201\345\272\224\347\224\250.md" @@ -0,0 +1,44 @@ +# 多线程-互斥锁应用 +## 什么是多线程-互斥锁 + +本文介绍如何使用QuecPython的多线程-互斥锁功能,互斥锁可以资源不会冲突,通常用于保护硬件接口通信的完整性,如SPI、I2C通信命令要严格的指令顺序才能正确通信。 + +## 怎么使用多线程-互斥锁 + +### 软件应用 + +使用QuecPython开发的模组,调用\_thread模块中的_thread.allocate_lock()可以创建互斥锁,具体参数参考[_thread功能的API介绍文档](/../../API_reference/zh/QuecPython标准库/_thread-多线程.html),互斥锁必须成对使用。 + +```python +import utime +import _thread + +def thread_1(): + while True: + for i in range(3): + lock.acquire() + print('thread_1', i) + utime.sleep_ms(2000) + lock.release() + +def thread_2(): + while True: + for i in range(3): + lock.acquire() + print('thread_2', i) + utime.sleep_ms(2000) + lock.release() + +lock = _thread.allocate_lock() +_thread.start_new_thread(thread_1, ()) +_thread.start_new_thread(thread_2, ()) +``` +注意:线程里调用lock.acquire后进入阻塞并切换上下文,直到系统获得锁立即往下执行,lock.release()释放锁,有等待锁的线程会立即执行。 + + +## _thread功能测试 + +使用QPYcom工具执行代码,可以看出两条线程在打印信息,值得注意的是执行到utime.sleep_ms(2000)的时候并没有切换线程,是因为锁还没释放。 + +![](../media\多线程应用开发/_thread-allocate_lock.png) + diff --git "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\345\210\233\345\273\272\347\272\277\347\250\213.md" "b/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\345\210\233\345\273\272\347\272\277\347\250\213.md" index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4f143a9440cf91531d30df7aa07dbfba01583a78 100644 --- "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\345\210\233\345\273\272\347\272\277\347\250\213.md" +++ "b/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\345\210\233\345\273\272\347\272\277\347\250\213.md" @@ -0,0 +1,39 @@ +# 多线程-创建线程 +## 什么是多线程 + +本文介绍如何使用QuecPython的多线程功能,多线程可以让应用程序的多个功能看起来在同时运行。 + +## 怎么使用多线程 + +### 软件应用 + +使用QuecPython开发的模组,调用\_thread模块中的_thread.start_new_thread()可以创建新线程,具体参数参考[_thread功能的API介绍文档](/../../API_reference/zh/QuecPython标准库/_thread-多线程.html),创建线程不会阻塞当前代码往下执行。 + +```python +import utime +import _thread + +def thread_1(): + while True: + for i in range(10): + print('thread_1', i) + utime.sleep_ms(1000) + +def thread_2(): + while True: + for i in range(10): + print('thread_2', i) + utime.sleep_ms(1000) + +_thread.start_new_thread(thread_1, ()) +_thread.start_new_thread(thread_2, ()) +``` +注意:线程里需要调用utime.sleep代码才能上下文切换。 + + +## _thread功能测试 + +使用QPYcom工具执行代码,可以看出两条线程在打印信息。 + +![](../media/多线程应用开发/_thread-start_new_thread.png) + diff --git "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\346\266\210\346\201\257\351\230\237\345\210\227\345\272\224\347\224\250.md" "b/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\346\266\210\346\201\257\351\230\237\345\210\227\345\272\224\347\224\250.md" index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4fe77fceae34873db2f347613b1447cc42b4074f 100644 --- "a/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\346\266\210\346\201\257\351\230\237\345\210\227\345\272\224\347\224\250.md" +++ "b/docs/development_guide/zh/\345\244\232\347\272\277\347\250\213\345\272\224\347\224\250\345\274\200\345\217\221/\345\244\232\347\272\277\347\250\213-\346\266\210\346\201\257\351\230\237\345\210\227\345\272\224\347\224\250.md" @@ -0,0 +1,44 @@ +# 多线程-消息队列 +## 什么是多线程-消息队列 + +本文介绍如何使用QuecPython的多线程-消息队列功能,消息队列用于线程间通信,如A是中断回调线程接收数据,B是普通线程处理数据,A线程把接收到的数据通过Queue发送到B线程后立即结束A线程,从而减少A线程占用CPU的时间。 + +## 怎么使用多线程-消息队列 + +### 软件应用 + +使用QuecPython开发的模组,调用queue模块中的queue.Queue()可以创建消息队列,具体参数参考[queue功能的API介绍文档](/../../API_reference/zh/QuecPython标准库/Queue - 普通队列.html),获取队列数据时,若队列有数据则立即返回,否则进入阻塞并切换上下文,直到队列有数据才继续往下执行。 + +```python +import _thread +from queue import Queue +import utime + +# 初始化队列 +q = Queue(maxsize=100) + +def thread_get(): + while True: + # q.get 会阻塞等待消息过来,每当有q.put()执行完后 q.get()会收到数据,解除阻塞往下执行 + item = q.get() + print("q.get:", item) + +# 开启线程在哪等待消息 +_thread.start_new_thread(thread_get, ()) +# put消息到队列 +q.put(1) +utime.sleep(1) +q.put() # 空数据默认 None +utime.sleep(1) +q.put(None) # 空数据默认 None +utime.sleep(1) +q.put(3) +``` + + +## queue功能测试 + +使用QPYcom工具执行代码,可以看出每当q.put()数据后,等待消息的线程立即执行打印数据。 + +![](../media\多线程应用开发/_thread-Queue.png) +