Niobe开发板中基于OpenHarmony操作系统的多线程(多任务)开发ost.51cto.comNiobe开发套件详解:Niobe工业物联网开发板及套件详解线程的基本概念从系统角度,线程是竞争系统资源的最小运行单元。线程可以使用或等待CPU等系统资源,使用内存空间,独立于其他线程运行。OpenHarmonyLiteOS可以为用户提供多线程,实现线程间的切换,帮助用户管理业务程序流程。具有以下特点:支持多线程。一个线程代表一个任务。抢占式调度机制,高优先级线程可以打断低优先级线程,必须先阻塞或终止低优先级线程,才能调度高优先级线程。相同优先级的线程支持时间片循环调度。共有32个优先级[0-31],最高优先级为0,最低优先级为31。用户进程共有22个可配置优先级(10~31)。1、线程状态线程有多种运行状态。系统初始化完成后,创建的线程可以在系统中竞争一定的资源,并被内核调度。线程状态通常分为以下四种:就绪(Ready):线程在就绪队列中,只等待CPU。运行中(Running):线程正在执行。阻塞(Blocked):线程不在就绪队列中。包括线程被挂起(suspendstate)、线程被延迟(delaystate)、线程在等待信号量、读写队列或等待事件等。退出状态(Dead):线程结束运行,等待系统回收资源。2、线程状态从就绪态到运行态的转换:任务创建后,进入就绪态。当发生任务切换时,执行就绪队列中优先级最高的任务,从而进入运行状态。同时,任务从就绪队列中移除。运行态→阻塞态:当一个运行中的任务被阻塞(suspended、delayed、readsemaphore等)时,任务被插入到相应的阻塞队列中,任务状态由运行态变为阻塞态,然后任务发生Toggle,运行就绪队列中优先级最高的任务。阻塞态→就绪态(blockingstate→runningstate):被阻塞的任务恢复后(任务恢复、延迟时间超时、读信号量超时或读信号量等),恢复的任务会被加入到就绪态队列中从阻塞状态变为就绪状态;此时,如果恢复任务的优先级高于运行任务的优先级,就会发生任务切换,任务从就绪状态变为运行状态。就绪态→阻塞态:任务在就绪态也可能被阻塞(挂起)。此时任务状态由就绪状态变为阻塞状态。任务从就绪队列中删除,直到任务被阻塞后才参与任务调度。恢复。运行状态→就绪状态:更高优先级的任务创建或恢复后,会发生任务调度。此时,就绪队列中优先级最高的任务变为运行状态,则原来运行状态的任务由运行状态变为就绪状态,仍处于就绪队列中。运行状态→退出状态:运行任务结束,任务状态由运行状态变为退出状态。退出状态包括正常退出状态和任务运行的无效状态。比如task运行结束但没有自删除,对外显示Invalid状态,即退出状态。阻塞态→退出态:阻塞任务调用删除接口,任务状态由阻塞态变为退出态。3、线程管理针对多线程场景,HarmonyOS内核通过任务池和就绪队列来管理线程,通过调度算法执行。调度算法:HarmonyOS内核中的线程采用抢占式调度机制,同时支持SCHED_RR和SCHED_FIFO两种调度策略。RR策略基本可以保证我们的每一个任务都能得到有效的执行,不会出现一些任务长时间等待的情况。FIFO策略的好处是任务切换比较简单,对于一些时间片很难把握的任务,FIFO甚至可以更有效的利用我们的cpu。线程相关API这里介绍cmsis2.0的线程接口,头文件:“//third_party/cmsis/CMSIS/RTOS2/Include/cmsis_os2.h”创建线程osThreadId_tosThreadNew(osThreadFunc_tfunc,void*argument,constosThreadAttr_t*属性);函数osThreadNew通过将线程添加到活动线程列表并将其设置为就绪状态来启动线程函数。线程函数的参数使用参数指针*argument传递。当创建的线程函数的优先级高于当前运行的线程时,创建的线程函数立即启动,成为新的运行线程。线程属性使用参数指针attr定义。属性包括线程优先级、堆栈大小或内存分配的设置。该函数可以在RTOS启动之前安全调用(调用osKernelStart),但不能在内核初始化之前调用(调用osKernelInitialize)。开发示例1.确定目录结构首先在./applications/app路径下新建一个目录,用于存放业务源代码文件。在哪里”。”表示OpenHarmony源代码的根目录。例如:在app下新增业务NIOBE_OS_helloworld,其中hello_world.c为业务代码,BUILD.gn为编译脚本,其目录结构如下:.└──applications└──app│──TW002_OS_thread││──os_thread_example.c│└──BUILD.gn└──BUILD.gn2,编写业务代码#include
