> 文档中心 > 华为鸿蒙2.0设备开发内核开发:中

华为鸿蒙2.0设备开发内核开发:中

学习视频

https://education.huaweicloud.com/courses/course-v1:HuaweiX+CBUCNXTX003+Self-paced/courseware/bd738f669ae94fd7ab14d1c535651eba/1b1416521b6a44188941e77b3ea2e9dd/

参与活动:

鸿蒙设备开发实战。

本节内容harmonyos内核开发————信号量

主要内容:

信号量的相关概念

信号量的运作机制
如何利用信号量实现任务之间同步或临界资源的互斥访问

操作步骤:

1.信号量基本概念

2.信号量运作机制

3.实现信号量功能

4.信号量扩展实验
信号量基本概念:

信号量的概念
1、信号量(Semaphore)是一种实现任务间通信的机制,实现任务之间同步或临界资源的互斥访问。常用于协助一组相互竞争的任务来访问临界资源。
2、在多任务系统中,各任务之间需要同步或互斥实现临界资源的保护,信号量功能可以为用户提供这方面的支持。3、通常一个信号量的计数值用于对应有效的资源数,表示剩下的可被占用的互斥资源数。其值的含义分两种情况:
1)0,表示没有积累下来的Post信号量操作,且有可能有在此信号量上阻塞的任务。
2)正值,表示有一个或多个Post信号量操作。
4、以同步为目的的信号量和以互斥为目的的信号量在使用有如下不同:
1)用作互斥时,信号量创建后记数是满的,在需要使用临界资源时,先取信号量,使其变空,这样其他任务需要使用临界资源时就会因为无法取到信号量而阻塞,从而保证了临界资源的安全。
2)用作同步时,信号量在创建后被置为空,任务1取信号量而阻塞,任务2在某种条件发生后,释放信号量
于是任务
1得以进入READY或RUNNING态,从而达到了两个任务间的同步。
信号量的运作机制:

运作原理
1、信号量初始化,为配置的N个信号量申请内存((N值可以由用户自行配置,受内存限制),并把所有的信号量初始化成未使用,并加入到未使用链表中供系统使用。
2、信号量创建,从未使用的信号量链表中获取一个信号量资源,并设定初值。
3、信号量申请,若其计数器值大于0,则直接减1返回成功。否则任务阻塞,等待其它任务释放该信号量,等待的超时时间可设定。当任务被一个信号量阻塞时,将该任务挂到信号量等待任务队列的队尾。
4、信号量释放,若没有任务等待该信号量,则直接将计数器加1返回。否则唤醒该信号量等待任务队列上的第一个任务。

5、信号量删除,将正在使用的信号量置为未使用信号量,并挂回到未使用链表。
6、信号量允许多个任务在同一时刻访问同一资源,但会限制同一时刻访问此资源的最大任务数目。访问同一资源的任务数达到该资源的最大数量时,会阻塞其他试图获取该资源的任务,直到有任务释放该信号量。
信号量运作示意图:
公共资源有四个任务数,信号量都分别被线程1、2、3、4获取后,此时此资源就会锁定而不让线程5进入,线程5及后面的线程都进入阻塞模式,当线程1工作完成而释放出信号量,线程5立即获得信号而得到执行。如此往复。

 实现信号量功能:

cmsis_os2的API信号量接口简介:

 创建互斥锁: osSemaphoreNew (uint32_t max_ count, uint32_t initial_count, const osSemaphoreAttr t *attr);获取互斥锁: osSemaphoreAcquire (osSemaphoreld_t semaphore_id, uint32_t timeout);
释放互斥锁: osSemaphoreRelease (osSemaphoreld_t semaphore_id);
删除互斥锁:osMutexDelete (osMutexld_t mutex_id);

代码实操:

任务运行顺序如图:

 

 编译烧录成功后:

 在修改该处代码后

 我们会发现编译烧录结果如下:

 本节小结:

1、了解信号量的概念
2、掌握如何创建和删除信号量
3、如何利用信号量实现任务之间同步或临界资源的互斥访问

拓展实验我未进行分步骤收录,过程较为复杂,收录效果不佳,但是总体概念和原本一样,在代码上进行增删改减,达到所需要的效果。具体内容我认为进行观看视频效果更好。
HarmonyOS内核开发—事件管理

本节主要介绍:

事件的相关概念

事件的运作机制
如何利用事件进行任务间同步

事件基本概念:
事件是一种实现任务间通信的机制,可用于实现任务间的同步,但事件通信只能是事件类型的通信,无数据传
输。一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件处理。事件集合用32位无符号整型变量来表示,每一位代表一个事件。
多任务环境下,任务之间往往需要同步操作。事件可以提供一对多、多对多的同步操作。一对多同步模型:-个任务等待多个事件的触发;多对多同步模型:多个任务等待多个事件的触发。
任务可以通过创建事件控制块来实现对事件的触发和等待操作。LiteOS的事件仅用于任务间的同步,
事件运作机制

读事件时,可以根据入参事件掩码类型uwEventMask读取事件的单个或者多个事件类型。事件读取成功后,如果设置LOS_WAITMODE_CLR会清除已读取到的事件类型,反之不会清除已读到的事件类型,需显式清除。可以通过入参选择读取模式,读取事件掩码类型中所有事件还是读取事件掩码类型中任意事件。
写事件时,对指定事件写入指定的事件类型,可以一次同时写多个事件类型。写事件会触发任务调度。
清除事件时,根据入参事件和待清除的事件类型,对事件对应位进行清O操作。

 实现事件功能:

cmsis_os2的API事件接口简介:

..:
创建事件标记对象: osEventFlagsNew (const osEventFlagsAttr_t *attr);
设置事件标记:osEventFlagsSet (osEventFlagsld_t ef_id, uint32_t flags);
等待事件标记触发: osEventFlagsWait (osEventFlagsld_t ef_id, uint32_t flags, uint32_t options, uint32_t
timeout);
删除事件标记对象:osEventFlagsDelete (osEventFlagsld_t ef_id);
 代码实现:

修改下build,gn

 编译成功过后,进行烧录。

 未打印。问题所在没事由于代码逻辑问题。

 同时出发才可以触发,判断逻辑为or、、

解决办法

 

改变代码后,效果改变

 

 本节总结。

1、了解事件的概念
2、掌握如何创建和设置事件标记
3、掌握如何使用多个事件同步一个任务
本节内容时间较短,内容较少,主要操作和前几张大致相同,但是知识内容较为偏于逻辑理解,需要掌握学会。