




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、OH操作系统基础:Thread多线程未来已来 远方不远2021年12月本示例将演示如何在Niobe WiFi IoT开发板上使用cmsis 2.0 接口进行多线程开发。简介CMSIS是Cortex微控制器软件接口标准(Cortex Microcontroller Software Interface Standard)是ARM和一些编译器厂家以及半导体厂家共同遵循的一套标准,是由ARM专门针对Cortex-M系列提出的标准。在该标准的约定下,ARM和芯片厂商会提供一些通用的API接口来访问Cortex内核以及一些专用外设,以减少更换芯片以及开发工具等移植工作所带来的金钱以及时间上的消耗。CMS
2、IS-RTOS2(CMSIS-RTOS API Version 2)是Arm Cortex-M 处理器的通用的RTOS接口。为需要RTOS功能的软件组件提供了标准化的API。CMSIS-RTOS2是一个通用的API,它与底层的RTOS内核无关,写应用程序的程序员在用户代码中调用CMSIS RTOS2 API函数,可以更方便地将应用程序从一个RTOS到另一个RTOS,使用CMSIS-RTOS2 API的中间件也可以避免很多不必要的移植工作。鸿蒙在CMSIS-RTOS2接口中封装了LiteOS-m的内核代码cmsis 2.0接口 1. 线程的基本概念2. 线程的状态3. 创建线程目录从系统角度看,
3、线程是竞争系统资源的最小运行单元。线程可以使用或等待CPU、使用内存空间等系统资源,并独立于其它线程运行。OpenHarmony LiteOS可以给用户提供多个线程,实现线程间的切换,帮助用户管理业务程序流程。具有如下特性:支持多线程。一个线程代表一个任务抢占式调度机制,高优先级的线程可打断低优先级线程,低优先级线程必须在高优先级线程阻塞或结束后才能得到调度。相同优先级线程支持时间片轮转调度方式。共有32个优先级0-31,最高优先级为0,最低优先级为31。用户进程可配置的优先级有22个 (1031)。基本概念线程有多种运行状态。系统初始化完成后,创建的线程就可以在系统中竞争一定的资源,由内核进
4、行调度。线程状态通常分为以下四种:就绪(Ready):该线程在就绪队列中,只等待CPU。运行(Running):该线程正在执行。阻塞(Blocked):该线程不在就绪队列中。包含线程被挂起(suspend状态)、线程被延时(delay状态)、线程正在等待信号量、读写队列或者等待事件等。退出态(Dead):该线程运行结束,等待系统回收资源。线程状态就绪态运行态: 任务创建后进入就绪态,发生任务切换时,就绪队列中最高优先级的任务被执行,从而进入运行态,同时该任务从就绪队列中移出。运行态阻塞态 :正在运行的任务发生阻塞(挂起、延时、读信号量等)时,将该任务插入到对应的阻塞队列中,任务状态由运行态变成
5、阻塞态,然后发生任务切换,运行就绪队列中最高优先级任务。阻塞态就绪态(阻塞态运行态):阻塞的任务被恢复后(任务恢复、延时时间超时、读信号量超时或读到信号量等),此时被恢复的任务会被加入就绪队列,从而由阻塞态变成就绪态;此时如果被恢复任务的优先级高于正在运行任务的优先级,则会发生任务切换,该任务由就绪态变成运行态。线程状态迁移就绪态阻塞态 : 任务也有可能在就绪态时被阻塞(挂起),此时任务状态由就绪态变为阻塞态,该任务从就绪队列中删除,不会参与任务调度,直到该任务被恢复。运行态就绪态 : 有更高优先级任务创建或者恢复后,会发生任务调度,此刻就绪队列中最高优先级任务变为运行态,那么原先运行的任务由
6、运行态变为就绪态,依然在就绪队列中。运行态退出态 : 运行中的任务运行结束,任务状态由运行态变为退出态。退出态包含任务运行结束的正常退出状态以及Invalid状态。例如,任务运行结束但是没有自删除,对外呈现的就是Invalid状态,即退出态。阻塞态退出态 : 阻塞的任务调用删除接口,任务状态由阻塞态变为退出态。对于多线程的场景,HarmonyOS内核管理线程靠任务池和就绪队列,执行靠调度算法。调度算法:HarmonyOS内核中的线程采用抢占式调度机制,同时支持SCHED_RR和SCHED_FIFO调度策略线程管理RR策略能基本保证我们每个任务都能够得到有效的执行,不会有一些任务进行长时间等待F
7、IFO策略优点在于任务的切换比较简单,而且对于一些时间片不好把握的任务来说,FIFO能偶更有效的利用我们的cpu。头文件:”/third_party/cmsis/CMSIS/RTOS2/Include/cmsis_os2.h”线程创建-API介绍API功能描述osThreadNew创建线程osThreadTerminate删除某个线程(一般是对非自线程操作)osThreadYield挂起当前线程osThreadSuspend挂起指定线程osThreadResume恢复指定线程osThreadExit终止当前线程osThreadTerminate终止指定线程函数osThreadNew通过将线程添
8、加到活动线程列表并将其设置为就绪状态来启动线程函数。线程函数的参数使用参数指针*argument传递。当创建的thread函数的优先级高于当前运行的线程时,创建的thread函数立即启动并成为新的运行线程。线程属性是用参数指针attr定义的。属性包括线程优先级、堆栈大小或内存分配的设置。可以在RTOS启动(调用 osKernelStart)之前安全地调用该函数,但不能在内核初始化 (调用 osKernelInitialize)之前调用该函数。线程创建名称描述func线程函数argument作为启动参数传递给线程函数的指针attr线程属性返回值线程ID,如果出错,返回NULLosThreadId
9、_t osThreadNew (osThreadFunc_t func, void *argument, const osThreadAttr_t *attr);线程创建-线程属性osThreadAttr_t名称数据类型描述nameconst char*线程名称attr_bitsuint32_t线程属性位cb_memvoid*线程控制块的内存每个线程都含有一个线程控制块(TCB)。TCB包含了线程上下文栈指针(stack pointer)、线程状态、线程优先级、线程ID、线程名、线程栈大小等信息。TCB可以反映出每个线程运行情况。cb_sizeuint32_t线程控制块的内存大小stack_m
10、emvoid*栈的内存每个线程都拥有一个独立的栈空间,我们称为线程栈。栈空间里保存的信息包含局部变量、寄存器、函数参数、函数返回地址等。stack_sizeuint32_t栈的大小priorityosPriority_t优先级优先级表示任务执行的优先顺序。线程的优先级决定了在发生线程切换时即将要执行的线程,就绪队列中最高优先级的线程将得到执行。线程创建-实例在OS_Thread_example函数中,通过osThreadNew()函数创建了thread1和thread2两个进程,thread1和thread2启动后会输出打印日志。/*任务一*/void thread_entry1(void)
11、int sum = 0; while (1) printf(This is Niobe Thread1-%drn, sum+); usleep(500000); /*任务二*/void thread_entry2(void) int sum = 0; while (1) printf(This is Niobe Thread2-%drn, sum+); usleep(500000); /*任务创建*/static void OS_Thread_example(void) osThreadAttr_t attr; = thread1; attr.attr_bits = 0U;
12、 attr.cb_mem = NULL; attr.cb_size = 0U; attr.stack_mem = NULL; attr.stack_size = 1024*4; attr.priority = 25; if (osThreadNew(osThreadFunc_t)thread_entry1, NULL, &attr) = NULL) printf(Falied to create thread1!n); = thread2; if (osThreadNew(osThreadFunc_t)thread_entry2, NULL, &attr) = NULL) printf(Falied to create thread2!n)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 内购房转让合同范本
- 个人转让德文合同范本
- 分包混凝土合同范本
- 买卖车位转让合同范本
- 包子工用工合同范本
- 创业加盟合同范本
- 广西买房合同范本
- 出国劳务外派合同范本
- 劳动合同范本工资
- 出租包车合同范本
- 2022-2023学年湖南省长沙市统招专升本语文模拟练习题三及答案
- 社会救助法课件
- 1.装配式建筑概述(装配式混凝土结构施工技术)
- 第七讲+汉字字音
- 新零件的成熟保障MLA
- 【基于杜邦分析法的企业盈利能力研究国内外文献综述4000字】
- 初中语文七下-上下句默写
- 《董存瑞舍身炸碉堡》PPT课件新
- 新川教版信息技术六年级下册全册教案
- 第20章补充芯片粘接技术
- 旅行社运营实务电子课件 5.1 旅行社电子商务概念
评论
0/150
提交评论