在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

實(shí)時(shí)操作系統(tǒng)FreeRTOS信號(hào)量應(yīng)用

嵌入式技術(shù) ? 來(lái)源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-06-08 09:24 ? 次閱讀

1.信號(hào)量簡(jiǎn)介

信號(hào)量常用于控制對(duì)共享資源的訪問(wèn)與任務(wù)同步。資源共享例如火車票售賣,所有用戶都可以進(jìn)行買票和退票操作,對(duì)于所用用戶來(lái)說(shuō)火車票就是共享資源,當(dāng)賣出一張票信號(hào)量減一、有人退一張票信號(hào)量加一,這種案例就屬于計(jì)數(shù)型信號(hào)量。常用的信號(hào)量還有二值信號(hào)量。例如使用公共電話,同一時(shí)間只能一個(gè)人使用,此時(shí)電話就只有兩種狀態(tài):使用或者未使用,若將電話這兩個(gè)狀態(tài)作為信號(hào)量的話則就是二值信號(hào)量。
信號(hào)量的另一應(yīng)用場(chǎng)合就是任務(wù)同步。用于任務(wù)與任務(wù)間或任務(wù)與中斷間同步。在執(zhí)行中斷服務(wù)函數(shù)時(shí)可以向任務(wù)發(fā)送信號(hào)量通知任務(wù)該事件發(fā)生了,在退出中斷服務(wù)函數(shù)以后任務(wù)調(diào)度器的調(diào)度下同步的任務(wù)就會(huì)執(zhí)行。因?yàn)橹袛喾?wù)函數(shù)需要快進(jìn)快出,代碼簡(jiǎn)潔,一般在中斷服務(wù)函數(shù)中設(shè)置標(biāo)志位,然后在其它地方根據(jù)標(biāo)志位來(lái)實(shí)現(xiàn)具體功能,在FreeRTOS中就可使用信號(hào)量來(lái)完成此功能。

2.二值信號(hào)量

二值信號(hào)量通常用于互斥訪問(wèn)或同步,二值信號(hào)量和互斥信號(hào)量非常相似,但還是有細(xì)微差別,互斥信號(hào)量擁有優(yōu)先級(jí)繼承機(jī)制,二值信號(hào)沒(méi)有。因此二值信量適合于同步(任務(wù)與任務(wù)、任務(wù)與中斷同步),而互斥信號(hào)量適合于簡(jiǎn)單的互斥訪問(wèn)。
二值信號(hào)量其實(shí)就是一個(gè)只有一個(gè)隊(duì)列項(xiàng)的隊(duì)列,這個(gè)特殊的隊(duì)列要么是滿的,要么是空的。使用二值信號(hào)量必須包含semphr.h頭文件。

函數(shù)名 功能
vSemaphoreCreateBinary() 動(dòng)態(tài)創(chuàng)建二值信號(hào)量,老版FreeRTOS創(chuàng)建二值信號(hào)量函數(shù)
xSemaphoreCreateBinary() 動(dòng)態(tài)創(chuàng)建二值信號(hào)量,新版FreeRTOS創(chuàng)建二值信號(hào)量函數(shù)
xSemaphoreCreateBinaryStatic() 靜態(tài)創(chuàng)建二值信號(hào)量

3.二值信號(hào)量應(yīng)用示例

此示例通過(guò)創(chuàng)建3個(gè)任務(wù),start_task、LED0_task、Semaphore_task。通過(guò)任務(wù)start_task創(chuàng)建另外兩個(gè)任務(wù)。

#include "freeRTOS.h"
#include "task.h"http://創(chuàng)建相關(guān)頭文件
#include "queue.h"http://消息隊(duì)列相關(guān)頭文件
#include "semphr.h"http://信號(hào)量相關(guān)頭文件

#define START_TASK_PRIO 1        //任務(wù)優(yōu)先級(jí)
#define START_STK_SIZE 128       //任務(wù)堆棧大小
TaskHandle_t StartTask_Handler;   //任務(wù)句柄
void start_task(void *pvParameters);//任務(wù)函數(shù)

#define LED0_TASK_PRIO 2     //任務(wù)優(yōu)先級(jí),數(shù)字越大優(yōu)先級(jí)越高
#define LED0_STK_SIZE 128     //任務(wù)堆棧大小
TaskHandle_t LED0Task_Handler; //任務(wù)句柄
void LED0_task(void);         //任務(wù)函數(shù)

#define Semaphore_TASK_PRIO 2     //任務(wù)優(yōu)先級(jí)
#define Semaphore_STK_SIZE 128      //任務(wù)堆棧大小
TaskHandle_t SemaphoreTask_Handler; //任務(wù)句柄
void Semaphore_task(void);          //任務(wù)函數(shù)

主函數(shù)

int main()
{
	Beep_Init();//蜂鳴器初始化
	LED_Init();//LED初始化
	KEY_Init();
	Usart1_Init(115200);//串口1初始化
	TIMx_Init(TIM2,72,20000);//20ms
	TIMx_Init(TIM3,7200,5000);//500ms
	TIM3->CR1|=1<<0;
	/*創(chuàng)建任務(wù)*/
	xTaskCreate((TaskFunction_t)start_task,//任務(wù)函數(shù)
							(const char *)"start_task",//任務(wù)名稱	
							(uint16_t)START_STK_SIZE,//堆棧大小
							NULL,           //傳遞給任務(wù)函數(shù)的參數(shù)
							(UBaseType_t)START_TASK_PRIO,//任務(wù)優(yōu)先級(jí)
							(TaskHandle_t *)&StartTask_Handler//任務(wù)句柄
							);
	vTaskStartScheduler();     //開啟任務(wù)調(diào)度		
}	

開始任務(wù)

SemaphoreHandle_t BinarySemaphore;	//二值信號(hào)量句柄
/*開始任務(wù)函數(shù)*/
void start_task(void *pvParameters)
{
	taskENTER_CRITICAL();  //進(jìn)入臨界區(qū)
	/*創(chuàng)建二值信號(hào)量*/
	BinarySemaphore=xSemaphoreCreateBinary();//創(chuàng)建二值信號(hào)量
	//創(chuàng)建LED0任務(wù)
	xTaskCreate( (TaskFunction_t  )LED0_task,//任務(wù)函數(shù)
							(const char    *)"LED0_task",//任務(wù)名稱
							 (uint16_t)LED0_STK_SIZE,//堆棧大小
								NULL,           //傳遞給任務(wù)函數(shù)的參數(shù)
							 (UBaseType_t   )LED0_TASK_PRIO,//任務(wù)優(yōu)先級(jí)
							 (TaskHandle_t *)&LED0Task_Handler);//任務(wù)句柄

	xTaskCreate(  (TaskFunction_t )Semaphore_task,//任務(wù)函數(shù)
							(const char    *)"Semaphore_task",//任務(wù)名稱
							(uint16_t )Semaphore_STK_SIZE,//堆棧大小
								NULL,           //傳遞給任務(wù)函數(shù)的參數(shù)
							(UBaseType_t    )Semaphore_TASK_PRIO,//任務(wù)優(yōu)先級(jí)
		                   (TaskHandle_t  *)&SemaphoreTask_Handler);//任務(wù)句柄

	vTaskDelete(StartTask_Handler); //刪除開始任務(wù)	
	taskEXIT_CRITICAL();    //退出臨界區(qū)					
}

LED0任務(wù),此任務(wù)1000ms進(jìn)行LED翻轉(zhuǎn)

void LED0_task(void)
{
	while(1)
	{
		LED1=!LED1;
		Delay_Ms(1000);	
	}
}

Semaphore函數(shù),此任務(wù)函數(shù)獲取信號(hào)量,處理串口1中斷接收數(shù)據(jù)。

void Semaphore_task(void)//任務(wù)函數(shù)
{
	BaseType_t err=pdFALSE;
	while(1)
	{
		if(BinarySemaphore!=NULL)
		{
			err=xSemaphoreTake(BinarySemaphore,portMAX_DELAY);	//獲取信號(hào)量
			if(err==pdTRUE)
			{
				usart1_rx_buff[usart1_cnt]='\0';
				printf("rx=%s\r\n",usart1_rx_buff);
				usart1_cnt=0;
			}
		}
	}
}

串口中斷服務(wù)函數(shù)

#include "FreeRTOS.h"					//FreeRTOS使用
#include "task.h" 
#include "queue.h"	 //消息隊(duì)列
#include "semphr.h"http://信號(hào)量
u8 usart1_rx_buff[1024];//串口1接收數(shù)據(jù)緩沖區(qū)
u16 usart1_cnt=0;//保存數(shù)組下班
u8 usart1_flag;//接收完成標(biāo)志符
extern SemaphoreHandle_t BinarySemaphore;	//二值信號(hào)量句柄
void USART1_IRQHandler(void)
{
	u8 c;
	BaseType_t pxHigherPriorityTaskWoken;//保存任務(wù)是否需要切換的值
	if(USART1->SR&1<<5)
	{
		c=USART1->DR;
		if(usart1_flag==0)//判斷上一次數(shù)據(jù)是否處理完成
		{
			if(usart1_cnt<1024)	
			{
				usart1_rx_buff[usart1_cnt++]=c;
				TIM2->CNT=0;//清空計(jì)數(shù)器值
				TIM2->CR1|=1<<0;//開啟定時(shí)
			}
			else usart1_flag=1;
		}
	}
	if( usart1_flag && (BinarySemaphore!=NULL))
	{
//釋放信號(hào)量
	xSemaphoreGiveFromISR(BinarySemaphore,&pxHigherPriorityTaskWoken);	
//如果需要的話,進(jìn)行一次上下文切換
	portYIELD_FROM_ISR(pxHigherPriorityTaskWoken);
		usart1_flag=0;
	}
}

定時(shí)器中斷服務(wù)函數(shù)

#include "FreeRTOS.h"					//FreeRTOS使用
#include "semphr.h"
extern SemaphoreHandle_t BinarySemaphore;	//二值信號(hào)量句柄//消息隊(duì)列句柄
void TIM2_IRQHandler(void)
{
	BaseType_t pxHigherPriorityTaskWoken;//保存任務(wù)是否需要切換的值
	if(TIM2->SR&1<<0)//判斷是否為更新中斷
	{
		TIM2->CR1&=~(1<<0);//關(guān)閉定時(shí)器2
		usart1_flag=1;
		if( usart1_flag && (BinarySemaphore!=NULL))
		{
             //釋放信號(hào)量
			xSemaphoreGiveFromISR(BinarySemaphore,&pxHigherPriorityTaskWoken);
            //如果需要的話,進(jìn)行一次上下文切換
			portYIELD_FROM_ISR(pxHigherPriorityTaskWoken);		
	usart1_flag=0;
		}
	}
	TIM2->SR=0;//清除標(biāo)志位
}

實(shí)現(xiàn)效果

poYBAGKXEqmAaxw_AABsyvIK1BQ061.png
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6892

    瀏覽量

    123742
  • STM32
    +關(guān)注

    關(guān)注

    2272

    文章

    10923

    瀏覽量

    357565
  • RTOS
    +關(guān)注

    關(guān)注

    22

    文章

    819

    瀏覽量

    119887
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    484

    瀏覽量

    62395
  • 信號(hào)量
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    8373
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FreeRTOS嵌入式實(shí)時(shí)操作系統(tǒng)

      1 FreeRTOS操作系統(tǒng)功能   作為一個(gè)輕量級(jí)的操作系統(tǒng)FreeRTOS提供的功能包括:任務(wù)管理、時(shí)間管理、信號(hào)量、消息隊(duì)列、
    發(fā)表于 07-06 11:07 ?6602次閱讀
    <b class='flag-5'>FreeRTOS</b>嵌入式<b class='flag-5'>實(shí)時(shí)</b><b class='flag-5'>操作系統(tǒng)</b>

    FreeRTOS信號(hào)量使用教程

    信號(hào)量操作系統(tǒng)中重要的一部分,信號(hào)量一般用來(lái)進(jìn)行資源管理和任務(wù)同步, FreeRTOS信號(hào)量又分為二值
    的頭像 發(fā)表于 12-19 09:22 ?3281次閱讀
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>信號(hào)量</b>使用教程

    FreeRTOS信號(hào)量的使用與實(shí)例

    在嵌入式系統(tǒng)中,任務(wù)管理是一個(gè)重要的部分,它涉及到任務(wù)之間的通信和同步,信號(hào)量,隊(duì)列,互斥鎖和事件標(biāo)志組等概念。本文將以 FreeRTOS 為例,詳細(xì)講解這些內(nèi)容。
    的頭像 發(fā)表于 12-12 15:25 ?2769次閱讀

    Mindows操作系統(tǒng)更新到4.8節(jié),增加計(jì)數(shù)信號(hào)量功能

    。/***************************************************************************/Wanlix是一個(gè)內(nèi)核非常小的嵌入式操作系統(tǒng),只有幾百個(gè)字節(jié),但功能少,只提供任務(wù)切換功能,非常適合資源特別少但又需要任務(wù)切換的小項(xiàng)目。Mindows可提供多種
    發(fā)表于 12-07 16:55

    Mindows操作系統(tǒng)更新到4.9節(jié),增加互斥信號(hào)量功能

    Mindows操作系統(tǒng)更新到4.9節(jié),增加互斥信號(hào)量功能,更多資料請(qǐng)登陸www.ifreecoding.com下載。前面2節(jié)我們實(shí)現(xiàn)了二進(jìn)制信號(hào)量和計(jì)數(shù)信號(hào)量,本節(jié)我們將實(shí)現(xiàn)最后一種
    發(fā)表于 12-12 17:21

    FreeRTOS信號(hào)量介紹

    FreeRTOS信號(hào)量 & ESP32實(shí)戰(zhàn)閱讀建議:有一定操作系統(tǒng)基礎(chǔ)知識(shí)。FreeRTOS信號(hào)量1. 二值
    發(fā)表于 01-27 07:28

    Linux操作系統(tǒng)信號(hào)量機(jī)制的實(shí)時(shí)化改造

    為了提高Linux操作系統(tǒng)實(shí)時(shí)性,研究了Linux操作系統(tǒng)System V信號(hào)量機(jī)制在內(nèi)核中的實(shí)現(xiàn),發(fā)現(xiàn)其在實(shí)時(shí)應(yīng)用中存在的不足,提出并實(shí)
    發(fā)表于 06-25 16:41 ?18次下載

    華為物聯(lián)網(wǎng)操作系統(tǒng) LiteOS內(nèi)核教程04-信號(hào)量

    1. LiteOS內(nèi)核的信號(hào)量 1.1.信號(hào)量 在多任務(wù)操作系統(tǒng)中,不同的任務(wù)之間需要同步運(yùn)行,信號(hào)量功能可以為用戶提供這方面的支持。信號(hào)量
    發(fā)表于 03-12 17:06 ?1755次閱讀

    FreeRTOS信號(hào)量 & ESP32實(shí)戰(zhàn)

    FreeRTOS信號(hào)量 & ESP32實(shí)戰(zhàn)閱讀建議:有一定操作系統(tǒng)基礎(chǔ)知識(shí)。FreeRTOS信號(hào)量1. 二值
    發(fā)表于 12-03 18:06 ?1次下載
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>信號(hào)量</b> & ESP32實(shí)戰(zhàn)

    FreeRTOS 隊(duì)列 信號(hào)量 互斥

    文章目錄前言Queue 隊(duì)列semaphore 信號(hào)量Mutex 互斥微信公眾號(hào)前言FreeRTOS STM32CubeMX配置 內(nèi)存管理 任務(wù)管理上節(jié)介紹了用STM32CubeMX生成帶
    發(fā)表于 12-09 09:51 ?0次下載
    <b class='flag-5'>FreeRTOS</b> 隊(duì)列 <b class='flag-5'>信號(hào)量</b> 互斥<b class='flag-5'>量</b>

    FreeRTOS高級(jí)篇6---FreeRTOS信號(hào)量分析

    FreeRTOS信號(hào)量包括二進(jìn)制信號(hào)量、計(jì)數(shù)信號(hào)量、互斥信號(hào)量(以后簡(jiǎn)稱互斥)和遞歸互斥
    發(fā)表于 01-26 17:39 ?7次下載
    <b class='flag-5'>FreeRTOS</b>高級(jí)篇6---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>信號(hào)量</b>分析

    FreeRTOS系列第20篇---FreeRTOS信號(hào)量API函數(shù)

    FreeRTOS信號(hào)量包括二進(jìn)制信號(hào)量、計(jì)數(shù)信號(hào)量、互斥信號(hào)量(以后簡(jiǎn)稱互斥)和遞歸互斥
    發(fā)表于 01-26 17:44 ?4次下載
    <b class='flag-5'>FreeRTOS</b>系列第20篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>信號(hào)量</b>API函數(shù)

    freeRTOS中最常用到的信號(hào)量有哪些

    操作系統(tǒng)系統(tǒng)中,信號(hào)量通常用于控制對(duì)共享資源的訪問(wèn)和任務(wù)之間進(jìn)行同步,信號(hào)量操作系統(tǒng)中是很常用的,也是學(xué)習(xí)
    的頭像 發(fā)表于 02-10 11:04 ?2268次閱讀
    <b class='flag-5'>freeRTOS</b>中最常用到的<b class='flag-5'>信號(hào)量</b>有哪些

    FreeRTOS的二值信號(hào)量

    FreeRTOS中的信號(hào)量是一種任務(wù)間通信的方式,信號(hào)量包括:二值信號(hào)量、互斥信號(hào)量、計(jì)數(shù)信號(hào)量
    的頭像 發(fā)表于 02-10 15:07 ?1553次閱讀

    FreeRTOS:一個(gè)迷你的實(shí)時(shí)操作系統(tǒng)內(nèi)核

    ** 1、FreeRTOS** FreeRTOS是一個(gè)迷你的實(shí)時(shí)操作系統(tǒng)內(nèi)核。作為一個(gè)輕量級(jí)的操作系統(tǒng),功能包括:任務(wù)管理、時(shí)間管理、
    的頭像 發(fā)表于 06-29 17:15 ?1042次閱讀
    <b class='flag-5'>FreeRTOS</b>:一個(gè)迷你的<b class='flag-5'>實(shí)時(shí)</b><b class='flag-5'>操作系統(tǒng)</b>內(nèi)核
    主站蜘蛛池模板: 伊人黄色 | 久久久这里有精品999 | 99热成人精品热久久669 | 亚洲免费一级片 | 天堂bt资源www在线 | 五月丁五月丁开行停停乱 | 天堂网www最新版在线资源 | 国产精品久久久久久久免费 | 天天看a | 免费精品99久久国产综合精品 | 成人午夜精品久久久久久久小说 | 天天干天天干天天干天天 | 日本三级456 | 国产欧美日韩综合精品一区二区 | 国产高清视频在线免费观看 | 成人xxxxx| 亚洲午夜顶级嘿嘿嘿影院 | 四虎影视入口 | 自偷自拍亚洲欧美清纯唯美 | 成人午夜性a一级毛片美女 成人午夜性视频欧美成人 成人小视频在线 | 一二三区乱码一区二区三区码 | 久久99综合| 在线视频网址免费播放 | 一区二区三区视频在线观看 | 夜夜春宵翁熄性放纵古代 | 一级高清| 乱小说录目伦200篇将曲勒 | 婷色| 天天天天做夜夜夜夜做 | 久久青草视频 | 啪啪网免费 | 爱爱永久免费视频网站 | 伊人久久大香线蕉综合爱婷婷 | 夜夜爽天天操 | 天堂中文在线最新版地址 | 天堂激情 | 国产成人乱码一区二区三区 | 国产特黄 | 精品一区二区三区视频 | 色噜噜狠狠狠色综合久 | 波多野结衣在线网址 |