OpenThreads库学习
在看STM32资料中看到STM32WB系列“双核无线微控制器配备双核无线微控制器(MCU)配备Bluetooth® 5、OpenThread和ZigBee®3.0连接技术,同时兼备超低功耗性能“不知道这个OpenThread是啥东东:
OpenThread库:提供了一个Thread类,供用户创建自己的线程。其使用非常方便,用户只需要继承自OpenThreads::Thread类,#include <OpenThreads/Thread>。然后自己重写run接口即可。参考https://blog.csdn.net/snail_hunan/article/details/69791641
https://www.threadgroup.org/cn
https://openthread.io/
https://www.st.com/zh/applications/connectivity/802-15-4-openthread.html
一 创建线程类重写run/cancle函数:
class MyThread : public OpenThreads::Thread { public: MyThread(){} ~MyThread(){} virtual void run() { pass; } virtual int cancel() { pass; } };
二在主线程中创建新线程对象,并指明新线程对象以什么方式建立和创建它的主线程关系:join和detach到创建它的线程,如果使用join的方式,那么创建它的线程必须等待直到这个线程完成,如果是detach的方式,那么创建线程的线程和被创建的线程二者之间没有任何关系,被创建的线程相当于完全独立出来了。在OpenThread中默认使用的就是detach的模式
int main() { MyThread thread1; thread.start(); // thread.join(); /*注释打开是join方式,否则是detach方式*/ //主线程休眠一会,让hread1运行一会 OpenThreads::Thread ::microSleep(3000); thread1.cancel(); //取消线程1运行 //等待Thread1处理完善后工作,然后再让主线程往下运行 while(Thread1.isRunning()) OpenThreads::Thread::YieldCurrentThread(); /*main thread task*/ pass; return 0; }
三 线程任务让出控制的方法:延时、主动让出
-
static int YieldCurrentThread(); 挂起当前执行的线程
-
static int microSleep(unsigned int microsec); 使得当前线程进入睡眠
四 资源介绍:
4.1ReadWriteMutex:多读单写保护锁,读优先级高,写操作需要等所有的读操作线程完成才可写入。
4.2条件变量(Condition Variable)详解 :以互斥量为基础,进行线程的阻塞、同步信号等
- wait(Mutex *mutex)
- wait(Mutex *mutex, unsigned long int ms)
- signal 其它线程通过该函数操作某个信号量/互斥量等,让等待该资源的获得该资源
- broadcast 其他线程通过调用这个函数来唤醒所有被阻塞的线程