【ride 源码解析】【密码控件 源码】【打车 支付源码】久久源码资源_99源码站
1.网络推广的久久主要方法是什么?
2.FreeRTOS系列教程(四):如何使用信号量
3.å¦ä½ç¨C++ç¼å软件
网络推广的主要方法是什么?
网络推广的方法有:
1.搜索引擎优化。大多数消费者都会使用某些搜索引擎来获取他们能联系到的源码源码品牌的相关信息,以获取他们所需要的资源站信息。所以,久久企业一定要注意自己在每个搜索引擎上的源码源码具体排名,这样才能更好,资源站ride 源码解析让内容更有竞争力。久久试想,源码源码如果消费者在可靠的资源站搜索引擎上知道某一品牌,他们就会发现很少的久久信息,而其中大部分都是源码源码负面的。那么,资源站消费者当然会放弃对购买该产品没有兴趣。久久
2.新媒体销售。源码源码当今最受欢迎的资源站新媒体只是一两款手机社交软件。尤其是,不能忽略某些帐户。商家可通过一些优质公众号发布一些短文,也可自行开通相关公众号。提高产品用户间的黏性,虽然过程很简单,密码控件 源码但后期的网络推广维护需要大量的思考。
3.邮件数量。发送邮件。到各种分类信息网站上公布相关的产品信息,推广产品。第三种方法明显不如前两种方法,但是这两种方法都流行起来之后才开始流行起来。第三种方法被广泛使用。或称其为网络推广的开端。
FreeRTOS系列教程(四):如何使用信号量
大家好,我是旭辉君,一个智能硬件领域深度探索的技术博主。
在上篇文章中,我们理解了在FreeRTOS中如何使用消息队列进行任务间的数据传递,链接如下:
本文我们就一起来探索信号量的使用。所谓信号量,可以简单的理解为就是一个状态标志,我们可以用这个状态标志来进行任务间的同步,有序访问,或者互斥访问。打车 支付源码从这些对于信号量不同的应用,常用的信号量可以分为:
本文我们将重点讲述二值信号量与计数信号量的使用。互斥信号量放在下一篇文章讲解。通过本文,我们将会知道:
接下来让我们一起,进入信号量的探索之旅!
如前文所述,信号量可以提供任务间数据的同步机制。我们假设有两个任务TaskA和TaskB,其中TaskB等待TaskA产生的数据并进行处理,按照之前我们在裸机编程时候的思路,一般都是设置一个全局变量,然后在while1中轮流执行这两个任务,若TaskA产生的数据让这个全局变量发生改变,TaskB在轮询到之后就能处理这些数据,但是,如果TaskA里面的数据久久不发生改变,那么一直轮询TaskB就是无效的,CPU做了许多的无用功。
所以应该怎么优化呢?
假若在TaskA数据发生不改变的staruml源码下载时候,TaskB进入阻塞态不执行,当TaskA数据发生改变的时候才去执行TaskB,这样就不会浪费CPU的资源。为此,FreeRTOS引入了信号量(Semaphore)概念,通过信号量的同步机制可以使任务在数据还没到达的时候进入阻塞状态,在数据到达之后才得以执行,提高系统资源利用率。
二进制信号量只有两个状态,只能用于两个任务间的同步;计数信号量中信号量的数目可以自定义设定为多个,可用于多个任务间的同步。
创建信号量时, 系统会为创建的信号量对象分配内存, 二值信号量的最大可用信号量个数为 1。创建成功后,任何任务都可以从创建的二值信号量资源中获取这个二值信号量,获取成功则任务继续运行, 否则任务会根据用户指定的阻塞超时时间来等待其它任务或者中断释放信号量。在等待这段时间,系统将任务变成阻塞态,优化下料 源码 任务将被挂到该信号量的阻塞等待列表中。下图为任务获取信号量时的示意图:获取信号量无效时任务进入阻塞,其他任务释放信号量后,信号量有效,该任务恢复为就绪态。
相比于二值信号量,计数信号量允许多个任务获取同一个信号量,这多个任务的数目可以由我们设定。比如我们设定,某个资源只能有 3 个任务访问,那么第 4 个任务访问的时候,会因为获取不到信号量而进入阻塞,等到有任务(比如任务 1)释放掉该资源的时候,第 4 个任务才能获取到信号量从而进行资源的访问,其运作的机制具体见下图:
观察信号量控制块结构体以及信号量创建函数的源码,我们就会惊奇的发现:FreeRTOS 的信号量控制块结构体与消息队列结构体是一模一样的!信 号 量 的 创 造 实 际 调 用 的 函 数 xQueueGenericCreate()也与消息队列一样!只是参数或者其代表的意义有一些差异。
所以我们可以理解为:信号量就是一种特殊的消息队列!由于我们只关注信号状态,不关注消息内容,这个队列就没有设置消息存储空间。
其中,xSemaphoreCreateBinary()是一个宏定义,展开后调用xQueueGenericCreate(),也就是上一篇文章我们创建队列时候使用的函数,只是传递的参数不同。
与二值信号量一样,xSemaphoreCreateCounting()展开后也是调用xQueueGenericCreate(),创建的计数信号量只有消息队列控制块结构体存储空间而没有消息存储空间 。
删除信号量函数vSemaphoreDelete()是一个宏定义,其调用的是vQueueDelete()函数。删除信号量过程其实就是删除消息队列过程, 因为信号量其实就是特殊的,无法存储消息的消息队列。
xSemaphoreGive()是一个用于释放信号量的宏, 真正的实现该过程是调用消息队列通用发送函数xQueueGenericSend()。释放信号量实际上是一次入队操作,并且阻塞时间为0,也就是释放信号量时,如果信号量计数值已满,就返回信号量释放错误。
xSemaphoreTake()是一个用于获取信号量的宏, 真正的实现该过程是调用消息队列通用接收函数xQueueGenericReceive()。信号量获取实际上就是一次消息出队操作,所以我们也可以按照消息队列的接收机制来理解信号量的获取:当有任务试图获取信号量的时候,当且仅当信号量有效,也就是队列中存在可用信号量的时候,任务才能获取到信号量。
如果信号量无效,在用户指定的阻塞超时时间中,该任务将保持阻塞状态以等待信号量有效。在阻塞超时等待的时间内,如果有其它任务或中断释放了有效的信号量,该任务将自动由阻塞态转移为就绪态。如果任务等待的时间超过了指定的阻塞时间,即使信号量中还是没有可用信号量,任务也会自动从阻塞态转移为就绪态。
创建三个任务,task_example_1,task_example_2和task_example_3。其中task_example_1用于计时,每3s让task_example_2释放二值信号量,task_example_3用于信号量获取,在获取不到信号量的时候一直死等。主体代码如下:
下图为运行后的串口输出结果:可以看到,cnt计数的时候,每3s释放一个二值信号量,然后立即就能被获取到,实现了Task2与Task3两个任务间的同步。
创建计数信号量xSemaphoreCreateCounting(5,3),其中参数5表示最大可容纳五个状态,任务每获取一个信号量,信号量计数减一,每释放一个信号量,信号量计数加一。初始值为3,表示初始里面已经有了三个信号量。同样三个任务,task_example_3每ms获取一个信号量, task_example_2每2s释放一个信号量,task_example_1用于每1s的计时显示。程序主体代码如下:
运行程序后串口输出如下:可以看到,初始计数信号量有3个,随着不断获取,计数信号量为空,之后就获取失败,只有计数信号量释放后才能继续获取。
本文主要探索了二值信号量与计数信号量的原理及其使用方法,包括信号量的原理,信号量的运行机制,信号量与消息队列的比较,信号量的相关API函数,以及信号量的使用实验等。通过本文,不知道大家对第一节的几个问题,有没有自己的答案。有疑问的同学,欢迎评论区留言交流。原创不易,大家的点赞和关注是对我持续更新最大的鼓励,谢谢!也为坚持看到系列文章此处的你点赞!
想要文中工程源码的同学,可以关注我的微信公众号:硬件电子与嵌入式小栈,留言:freertos源码 即可获取。同时我还整理了一些学习FreeRTOS实用的书籍资料,公众号留言:freertos资料 即可获取。公众号里也会不定期更新干货文章哦。
å¦ä½ç¨C++ç¼å软件
1ï¼æçäºä¸äºç¼åæ¨é©¬çç¨åºä»£ç ï¼ä¸ºä»ä¹åå¦æ ¡éé¢å¦çå·®å«é£ä¹å¤ã
æé½çä¸æç =.=ï¼é£äºç¼åæ¨é©¬ï¼è½¯ä»¶çé«æï¼æ¯æä¹è®°ä½å¹¶ä¸åºç¨è¿äºä»£ç çåï¼ææ³ç¥éï¼ï¼ä»ä»¬æ¯æä¹å¦ç
å ³äºè¿ä¸ªé®é¢, æåªè½è¯´æ¯ä¸æä¸æ», æ¯åé½æå¾ç²¾éç人, ä»ä»¬ä¹è®¸å¯¹ç½ç»ææ¯, ç¼å²åºæº¢åº, åæ±ç¼çææ¯æ¯è¾ç²¾é, ä½ä¸æ¢ä¿è¯ä»ä»¬æ¯ä¸ªæ¹é¢é½å¾ç²¾é, æ¯ç«äººçç²¾åæ¯æéç, ä½ å¦æ对æ个æ¹é¢å¾æå ´è¶£, è±ä¸å ¨é¨çç²¾åå»ç 究å¦ä¹ , ä¹è®¸ä½ ä¹ä¼è¢«ååè¿å ¥è¿ä¸é¢åç人羡æ ...
2ï¼å¦ä¹ äºæ°æ®ç»ææä¹åºç¨å°ç¼åç¨åºéå»ï¼æä¸ä¼ãå¦æ ¡é没æå¦å°è¿æ ·çï¼å¯ä»¥ç»æ举个ä¾åä¹ï¼
è¿ä¸ªç¨çä¾åè¿æ¯å¾å¤ç,åæ°æ®ç»æä¸çé¾è¡¨, ç¾åº¦ä¸å°±æå¾å¤äººé®å¦ä½å»åä¸ä¸ªå¦çä¿¡æ¯ç®¡çç¨åº, å ¶å®ä½ å¦æå¦è¿é¾è¡¨,å°±å¯ä»¥ä½¿ç¨é¾è¡¨æ¥å, æ¯ä¸ªå¦çæ¯ä¸ä¸ªèç¹, å¯ä»¥åé¾è¡¨ä¸æ·»å ,å é¤,å¦çä¿¡æ¯ç...
3ï¼é»å®¢ä»¬æ¯æä¹å©ç¨äºèç½å¦ä¹ çï¼æçé£äºå害çé»å®¢é½æ¯ä¸äºåä¸å¦åï¼ä½æ¯ææ¯å´é常çï¼è³å°ä»ä»¬å¦åæ¯æä½åï¼ä½æ¯ä»ä»¬æ¯å¦ä½è¾¾å°å¾é«çå¢ççï¼
é¦å å¦åé«å¹¶ä¸ä»£è¡¨ææ¯ç, å ³é®è¿æ¯çå®è·µ...å ¶æ¬¡å°±æ¯çè¿ä¸ªäººå¯¹æä¸ææ¯æ¯å¦æå ´è¶£, å¦æä»å¯¹æä¸é¨ææ¯æ¯å¦ç½ç»ææ¯å¾æå ´è¶£, è¯å®ä¼è±å°½éå¤çæ¶é´å»ç 究å®è·µè¿ä¸ææ¯, ä¹ èä¹ ä¹, 就对è¿ä¸ææ¯å¾ç²¾éäº...
4ï¼å¯ä»¥çè¯æ¨èæ¬æç¨ï¼å ³äºç¼åå°è½¯ä»¶çï¼æ就差è¿ä¸ªåè¿ä¸å»ï¼ççï¼
éåå ¥é¨ç ï¼ä»å代ç ï¼å°å®å ¨ç¼æä¸ä¸ªè½¯ä»¶çé£ç§ï¼
é¦å ä»ä¸äºå°çä¾åä¸å¦ä¹ , ä¸è¦ä¸æ¥å°±æ³åä¸ä¸ªå®æ´ç软件, ä¸æ¥ä¸æ¥æ¥, ä¸äºå¼æºçç½ç«ä¸æå¾å¤c++çæºç , å¯ä»¥å®ä¸æ¥çç...