苏州建设网站的网络公司,万网上传wordpress,做微信图文推送的网站,wordpress添加账户余额上一课#xff1a; 【小黑嵌入式系统第十三课】PSoC 5LP第二个实验——中断控制实验 前些天发现了一个巨牛的人工智能学习网站#xff0c;通俗易懂#xff0c;风趣幽默#xff0c;忍不住分享一下给大家。点击跳转到网站#xff1a;人工智能 文章目录 1 信号量1.1 简介1.2… 上一课 【小黑嵌入式系统第十三课】PSoC 5LP第二个实验——中断控制实验 前些天发现了一个巨牛的人工智能学习网站通俗易懂风趣幽默忍不住分享一下给大家。点击跳转到网站人工智能 文章目录 1 信号量1.1 简介1.2 任务间同步1.3 ISR与任务同步1.4 资源同步例银行柜台 1.5 任务信号量 2 事件标志组2.1 简介2.2 标志“与”2.3 标志“或”2.4 同步多个任务 1 信号量
1.1 简介
在实时多任务系统中信号量semaphore被广泛用于任务间对共享资源的互斥但更多地是用于任务和中断服务程序之间的同步、任务之间的同步。 N为信号量值表示发布信号量的次数累计值。 信号量用于任务-任务或任务-ISR间同步时N表示事件已发生了多少次。 信号量用于资源共享时N表示资源还可被多少个任务同时使用。 当任务或ISR调用OSSemPost()函数发送信号量时 任务或ISR可以多次调用OSSemPost()函数发送信号量。 当信号量值大于0任务调用OSSemPend()函数接收信号量时 当信号量值等于0任务调用OSSemPend()函数接收信号量时 注意μC/OS-III不允许在中断服务程序中等待信号量。 前面章节我们学习了互斥信号量下面对计数型信号量与互斥信号量做一个对比。 1.2 任务间同步
在实际的应用中常用信号量实现任务间的同步OSSemPend()和OSSemPost()会出现在不同任务中但不一定成对出现。 注意在实际的应用中还有多对多、一对多信号量操作的情况但很不常见建议不要设计出这样的操作方式这样会带来很多的麻烦。 用来实现任务间同步的信号量在创建时赋给初始值一般为0表示事件还未发生初始值在OSSemCreate()函数中指定。 让一个LED以0.5Hz的频率闪烁每按键一次LED闪烁一次。
我们通过此例来说明如何使用信号量实现任务间同步两个任务处理流程如下。 TaskKEY任务主要代码如下。 TaskLED任务主要代码如下。 1.3 ISR与任务同步
下面以示例来说明如何现实ISR与任务间同步。假设定时器1中断服务程序发送信号量任务完成了信号量的创建并在接收到信号量后让蜂鸣器响一声。处理流程如下。 中断服务程序ISR示例代码如下。 蜂鸣器报警任务示例代码如下。 1.4 资源同步
在嵌入式系统中可以使用信号量访问共享资源来实现资源同步。在使用时注意发送信号量函数OSSemPost()与等待信号量函数OSSemPend()必须成对出现在同一个任务调用的函数中才能实现资源同步这与互斥信号量使用方式一致。 在使用信号量做资源共享时只有任务才能使用信号量而中断服务程序则不可以。注意对照前面所述在使用信号量做ISR与任务间同步时ISR可以给任务发送信号量但不能做其它的信号量操作
计数型信号量用于某共享资源可以同时为几个任务所用时这是互斥型信号量不能处理的互斥信号量是二值的。 例银行柜台
某银行有N个柜台可以为客户服务设置信号量值为N或者银行同时可以为N个用户服务 为了说明使用信号量访问共享资源实现资源同步设计两个任务它们以不同的频率让LED点亮30个时钟节拍然后熄灭60个时钟节拍要求这两个任务不会互相干扰。下面是两个任务的处理流程。 为了实现资源同步我们需要保证OSSemPost()与OSSemPend()成对在同一个任务函数中调用所以我们可以编写一个函数LED()供两个任务调用代码如下。 下面给出两个LED任务的主要处理代码。 1.5 任务信号量
在μC/OS-III中每个任务都有它自己的内嵌信号量称为任务信号量。任务信号量是在任务创建OSTaskCreate()时创建的因此任务创建之后便可以直接使用。
任务信号量使用起来更方便且速度比一般信号量要快。
当事件发生时用户若明确知道该给哪个任务发信号此时就可以使用任务信号量。 μC/OS-III中的任务信号量服务函数以OSTaskSem???()命名。 如OSTaskSemPend()它在任务信号量所属任务中调用。无任务控制块参数需传递 如OSTaskSemPost()它在另一任务或ISR中调用。需指定任务信号量所属任务的任务控制块参数即发送(给)哪个任务的任务信号量 2 事件标志组
2.1 简介
当任务要与多个事件的发生同步时可以使用事件标志组。一个事件标志就是一个二值信号事件标志组是若干二值信号的组合。
用事件标志组来做任务同步分为独立型同步“或”同步和关联型同步“与”同步。设一个任务与3个事件标志有关如下图。 可以用多个事件的组合发信号给多个任务典型的有8个、16个或32个事件可以组合在一起由os_type.h中的OS_FLAGS数据类型定义事件标志位数。 注意系统在一组新事件发生后判断是否有任务接收到需求的标志在收到标志后进行任务状态切换。 2.2 标志“与”
为了说明如何使用标志事件组实现任务与若干个事件同步我们设计一个系统当时间到且独立按健被按下后让LED1闪烁一下。三个任务的处理流程如图。 TaskKEY任务主要代码如下。 TaskDly任务主要代码如下。 TaskLED任务主要代码如下。 2.3 标志“或”
为了说明如何使用标志事件组实现任务与任何事件之一同步我们设计一个系统当时间到或独立按健被按下后让LED1闪烁一下。三个任务的处理流程如图。 注意标志“或”和标志“与”操作只在等待标志的LED任务有所不同其余都相同。
由于发送标志的两个任务代码和标志“与”操作的相同这里不做重复。标志“或”中的 TaskLED任务主要代码如下。 2.4 同步多个任务
有些时候需要使多个任务“同时”开始执行将它们执行的起点同步到同一时刻通过广播信号量来同步多个任务是一种常用的技术。
但当进行广播操作时一些要同步的任务可能没有在等待信号量解决该问题的方法是将信号量和事件标志组联合起来使用。 (1) 每个待同步的任务都需要先将一个事件标志位置位 (2) 然后等待信号量的发布。 (3) 进行信号量广播的任务必须在所有事件标志位都被置位后 (4) 才能发布信号量。
该方法要求左边任务优先级比右边任务优先级都低。否则对于右边的最后一个执行OSFlagPost()的任务在它尚未执行OSSemPend()之前左边任务就将发送信号量。