FreeRTOS軟件定時器

軟件定時器允許設置一段時間,當設置的時間達到后就執行指定的功能函數,被軟件定時器調用的功能函數叫做定時器的回調函數。軟件定時器的回調函數是在定時器服務任務中執行的,所以一定不能在回調函數中調用任何阻塞任務的API函數,比如VTaskDelay。
軟件定時器分為兩種,單次定時器和周期定時器,單次定時器就執行一次,然后停止運行,不能自動重啟,但我們可以手動重新啟動,周期定時器就是執行完回調函數以后自動的重新啟動,這樣回調函數就會周期性的執行。

0x01 定時器相關配置

定時器的配置在FreeRTOSConfig.h中

  1. configUSE_TIMES
    如果要使用軟件定時器,configUSE_TIMES要設置為1。

  2. configTIMER_TASK_PRIORITY
    設置軟件定時器服務任務的任務優先級

  3. configTIMER_QUEUE_LENGTH
    設置定時器命令隊列的隊列長度

  4. configTIMER_TASK_STACK_DEPTH
    設置定時器任務的任務堆棧大小,單位為字,對于STM32來說一個字是4字節

0x02 創建定時器

使用軟件定時器首先要創建,創建定時器分為動態和靜態兩種創建方法。

  • xTimerCreate():使用動態方法創建軟件定時器
  • xTimerCreateStatic():使用靜態方法創建軟件定時器
	TimerHandle_t xTimerCreate(	const char * const pcTimerName,const TickType_t xTimerPeriodInTicks,const UBaseType_t uxAutoReload,void * const pvTimerID,TimerCallbackFunction_t pxCallbackFunction ) 
  • const char * const pcTimerName:軟件定時器名字
  • const TickType_t xTimerPeriodInTicks:軟件定時器的定時周期,單位是時鐘節拍數,可以借助portTICK_PERIOD_MS將ms單位轉換為時鐘節拍數,比如定時器的周期為100個時鐘節拍的話,那么xTimerPeriodInTicks=100,當定時器周期為500ms的時候,xTimerPeriodInTicks =(500/portTICK_PERIOD_MS)
  • const UBaseType_t uxAutoReload:設置定時器模式,但是定時器還是周期定時器,當uxAutoReload=pdTRUE的時候創建的是周期定時器,uxAutoReload=pdFALSE是單次定時器。
  • void * const pvTimerID:定時器ID號。
  • TimerCallbackFunction_t pxCallbackFunction :定時器回調函數,當定時器周期到了以后就會調用這個函數。
	TimerHandle_t xTimerCreateStatic(	const char * const pcTimerName,const TickType_t xTimerPeriodInTicks,const UBaseType_t uxAutoReload,void * const pvTimerID,TimerCallbackFunction_t pxCallbackFunction,StaticTimer_t *pxTimerBuffer )
  • const char * const pcTimerName:軟件定時器名字
  • const TickType_t xTimerPeriodInTicks:軟件定時器的定時周期,單位是時鐘節拍數,可以借助portTICK_PERIOD_MS將ms單位轉換為時鐘節拍數,比如定時器的周期為100個時鐘節拍的話,那么xTimerPeriodInTicks=100,當定時器周期為500ms的時候,xTimerPeriodInTicks =(500/portTICK_PERIOD_MS)
  • const UBaseType_t uxAutoReload:設置定時器模式,但是定時器還是周期定時器,當uxAutoReload=pdTRUE的時候創建的是周期定時器,uxAutoReload=pdFALSE是單次定時器。
  • void * const pvTimerID:定時器ID號。
  • TimerCallbackFunction_t pxCallbackFunction :定時器回調函數,當定時器周期到了以后就會調用這個函數。
  • StaticTimer_t *pxTimerBuffer:參數指向一個StaticTimer_t類型的變量,用來保存定時器結構體

0x03 開啟軟件定時器

如果軟件定時器停止運行的話可以使用FreeRTOS提供的兩個開啟函數來重新啟動軟件定時器

  • xTimerStart():開啟軟件定時器,用于任務中
  • xTimerStartFromISR():開啟軟件定時器,用于中斷中
BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait )
  • TimerHandle_t xTimer:要開啟的軟件定時器的句柄
  • TickType_t xTicksToWait :設置阻塞時間
BaseType_t xTimerStartFromISR( 	TimerHandle_t xTimer,BaseType_t *pxHigherPriorityTaskWoken );
  • TimerHandle_t xTimer:開啟的軟件定時器的句柄
  • BaseType_t *pxHigherPriorityTaskWoken :標記退出此函數以后是否進行任務切換,這個變量的值函數會自動設置的,用戶不用進行設置,當此值為pdTURE的時候,在退出中斷服務函數之前一定要進行一次任務切換。

0x04 復位軟件定時器

復位一個軟件定時器會重新計算定時周期達到的時間點,這個新的時間點是相對于復位定時器的那個時刻開始的,比如說,我們有個timer1單次定時器,定時周期是5s,從0s到5s,如果沒有干預的話,timer1在5s會停止運行,如果我們在3s時刻進行復位,則timer1會從3s開始,中間如果沒有干預的話,會到8s停止運行,有復位的話,會從復位時刻繼續運行5s。復位相關函數如下:

  • xTimerReset:復位軟件定時器,用在任務中
  • xTimerResetFromISR:復位軟件定時器,用在中斷服務函數中
BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait )
  • TimerHandle_t xTimer:要復位的軟件定時器句柄
  • TickType_t xTicksToWait:設置阻塞時間
BaseType_t xTimerResetFromISR( 	TimerHandle_t xTimer,BaseType_t *pxHigherPriorityTaskWoken );
  • TimerHandle_t xTimer:要復位的軟件定時器句柄
  • BaseType_t *pxHigherPriorityTaskWoken:設置退出此函數是否進行任務切換

0x05 停止軟件定時器

停止軟件定時器相關中斷如下:

  • xTimerStop():停止軟件定時器,用于任務中
  • xTimerStopFromISR():停止軟件定時器,用在中斷服務函數中
BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait )
  • TimerHandle_t xTimer:要停止的軟件定時器句柄
  • TickType_t xTicksToWait:設置阻塞時間
BaseType_t xTimerStopFromISR( 	TimerHandle_t xTimer,BaseType_t *pxHigherPriorityTaskWoken )
  • TimerHandle_t xTimer:要停止的軟件定時器句柄
  • BaseType_t *pxHigherPriorityTaskWoken :標志退出此函數是否要進行任務切換

實驗

設計兩個任務:

  1. start_task:用來創建timercontrol_task和兩個軟件定時器,這兩個定時器分別為周期定時器和單次定時器,定時周期一個為1s,另一個為2s
  2. timercontrol_task:控制兩個軟件定時器的開啟和停止

main函數中創建start_task任務

int main(void)
{HAL_Init();                     //初始化HAL庫   Stm32_Clock_Init(360,25,2,8);   //設置時鐘,180Mhzdelay_init(180);                //初始化延時函數uart_init(115200);              //初始化串口LED_Init();                     //初始化LED KEY_Init();                     //初始化按鍵BEEP_Init();                 	//初始化蜂鳴器SDRAM_Init();                   //初始化SDRAMLCD_Init();                     //初始化LCDmy_mem_init(SRAMIN);            //初始化內部內存池POINT_COLOR = RED;LCD_ShowString(30,10,200,16,16,"Apollo STM32F4/F7");	LCD_ShowString(30,30,200,16,16,"FreeRTOS Examp 15-1");LCD_ShowString(30,50,200,16,16,"KEY_UP:Start Tmr1");LCD_ShowString(30,70,200,16,16,"KEY0:Start Tmr2");LCD_ShowString(30,90,200,16,16,"KEY1:Stop Tmr1 and Tmr2");LCD_DrawLine(0,108,239,108);		//畫線LCD_DrawLine(119,108,119,319);		//畫線POINT_COLOR = BLACK;LCD_DrawRectangle(5,110,115,314); 	//畫一個矩形	LCD_DrawLine(5,130,115,130);		//畫線LCD_DrawRectangle(125,110,234,314); //畫一個矩形	LCD_DrawLine(125,130,234,130);		//畫線POINT_COLOR = BLUE;LCD_ShowString(6,111,110,16,16,	 "AutoTim:000");LCD_ShowString(126,111,110,16,16,"OneTim: 000");//創建開始任務xTaskCreate(start_task,"start_task",256,NULL,1,&StartTask_Handler);//啟動任務調度器vTaskStartScheduler();
}

start_task來創建timercontrol_task和兩個軟件定時器

void start_task(void *pvParameters)
{taskENTER_CRITICAL();//創建軟件周期定時器,周期定時器,周期為1s(1000個時鐘節拍)AutoReloadTimer_Handler=xTimerCreate("AutoReloadTimer",1000,pdTRUE,(void *)1,AutoReloadCallback);//創建單詞定時器OneShotTimer_Handler = xTimerCreate("OneShotTimer",2000,pdFALSE,(void*)2,OneShotCallback);xTaskCreate(timercontrol_task,"timercontrol_task",256,NULL,2,&TimerControlTask_Handler);taskEXIT_CRITICAL();vTaskDelete(StartTask_Handler);
}

AutoReloadCallback和OneShotCallback是兩個定時器的回調函數,內容為:

void AutoReloadCallback(TimerHandle_t xTYimer)
{static u8 tmr1_num=0;tmr1_num++;LCD_ShowxNum(70,111,tmr1_num,3,16,0x80);	//顯示執行次數LCD_Fill(6,131,114,313,lcd_discolor[tmr1_num%14]);
}
void OneShotCallback(TimerHandle_t xTYimer)
{static u8 tmr2_num =0;tmr2_num++;LCD_ShowxNum(190,111,tmr2_num,3,16,0x80);LCD_Fill(126,131,233,313,lcd_discolor[tmr2_num%14]);LED1 = !LED1;printf("定時器2運行結束\r\n");
}

timercontrol_task內容

void timercontrol_task(void *pvParameter)
{u8 key,num;while(1){if((AutoReloadTimer_Handler!=NULL)&&(OneShotTimer_Handler!=NULL)){key = KEY_Scan(0);switch(key){case WKUP_PRES:xTimerStart(AutoReloadTimer_Handler,0);printf("開啟定時器1\r\n");break;case KEY0_PRES:xTimerStart(OneShotTimer_Handler,0);printf("開始定時器2\r\n");break;case KEY1_PRES:xTimerStop(AutoReloadTimer_Handler,0);xTimerStop(OneShotTimer_Handler,0);printf("關閉定時器1和2\r\n");break;}}num++;if(num==50){num =0;LED0 = !LED0;}vTaskDelay(10);//延時10ms}
}

start_task只是創建了定時器,并沒有開啟,在timercontrol_task中,如果按下KEY_UP按鍵,就會開啟AutoReloadTimer_Handler定時器,按下KEY0就會啟動OneShotTimer_Handler定時器,按下KEY1停止兩個定時器

串口輸出內容
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379730.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379730.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379730.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java類class isAssignableFrom()方法及示例

類class isAssignableFrom()方法 (Class class isAssignableFrom() method) isAssignableFrom() method is available in java.lang package. isAssignableFrom()方法在java.lang包中可用。 isAssignableFrom() method is used to check whether the class or an interface den…

關于 列表實例

wss3.0工具中有個列表實例項目。此項目的作用是在自定義網站或自定義字段時使用默認值。也就是定義其默認的數據。 格式詳見微軟msdn:http://msdn.microsoft.com/zh-cn/library/ms478860.aspx轉載于:https://www.cnblogs.com/heavencloud/archive/2009/03/20/141793…

WP7之Application Bar控件

Microsoft.Phone.Shell命名空間中定義了ApplicationBar及其相關類(ApplicationBarIconButton和ApplicationBarMenuItem),這些類派生自Object,并完全獨立于常規Silverlight編程中的DependencyObject,UIElement和FrameworkElement類層次結構。A…

TomCat使用以及端口號被占用的處理方法

一.HTTP協議 什么是HTTP協議 HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是因特網上應用最為廣泛的一種網絡傳輸協議,所有的WWW文件都必須遵守這個標準。 HTTP請求 HTTP響應 2.如何處理端口被占用 方法一&#xff…

FreeRTOS事件標志組

使用信號量來同步的話,任務只能與單個事務或任務進行同步,有時候某個任務可能會需要與多個事件或任務進行同步,此時信號量就無能為力了,FreeRTOS為此提供了一個可選的解決方法,那就是事件標志組。 0x01 事件標志組 事…

FusionCharts等產品簡介

以前做柱狀圖、餅形圖等圖表都是根據數據繪制出來的靜態圖,偶然看到別人的一套系統,居然可以讓柱狀圖的柱子動畫般的逐個出現,效果還是很不錯的。不要跟我抬杠說不就是展現數據嘛,靜態圖表有什么不好,要知道用戶一般可…

c#foreach循環_C#| 使用foreach循環打印整數數組

c#foreach循環Given an integer array and we have to print its elements using "foreach loop" in C#. 給定一個整數數組,我們必須在C#中使用“ foreach循環”打印其元素 。 Syntax for foreach loop: foreach循環的語法: fore…

Eclipse和Tomcat綁定并且將上傳資源到Tomcat上

步驟如下: 創建一個Dynamic Web Project(圖一) Target runtime 選擇Apache Tomcat v7.0版本(圖二) 切記要選擇 v7.0 和2.5 (若沒有圖二選項見圖三) 然后,點擊window --> Prefer…

淺析.NET平臺編程語言的未來走向

在去年的PDC2008召開期間,微軟逐步公開了圍繞.NET和編程語言的很多想法,據此我們可以饒有興趣地對.NET的未來預測一番。 .NET平臺以運行在通用語言運行時(Common Language Runtime,CLR)上的C#和VB.NET作為開端。CLR是通用語言架構(Common Lan…

FreeRTOS任務通知

從v8.2.0版本開始,FreeRTOS新增了任務通知這個功能,可以使用任務通知來代替信號量、消息隊列、事件標志組等這些東西,使用任務通知的話效率會更高。 任務通知在FreeRTOS是一個可選的選項,要使用任務通知的話就需要將宏configUSE_T…

kinect在openni下也能玩摳出人物換背景

之前想了個很拉風的名字《用kinect玩穿越》,但是現在功能還不是很完善,細節處理也不是很好,臉皮沒有足夠的厚,所以呢還是叫換背景吧。 這里面包含兩個技術要點: 一、摳出活動人物 在微軟的SDK里深度圖像的前3位即0-2位…

物聯網基礎知識_聯網| 基礎知識能力問答 套裝1

物聯網基礎知識1) There are the following statements that are given below, which of them are correct about the computer network? A computer network is an interconnection between multiple devices to share hardware resources and information.A computer networ…

Emit學習-基礎篇-基本概念介紹

之前的Hello World例子應該已經讓我們對Emit有了一個模糊的了解,那么Emit到底是什么樣一個東西,他又能實現些什么功能呢?昨天查了點資料,大致總結了下,由于才開始學習肯定有不完善的地方,希望大家能夠批評指…

The FreeRTOS Distribution(介紹、移植、類型定義)

1 Understand the FreeRTOS Distribution 1.1 Definition :FreeRTOS Port FreeRTOS目前可以在20種不同的編譯器構建,并且可以在30多種不同的處理器架構上運行,每個受支持的編譯器和處理器組合被認為是一個單獨的FreeRTOS Port。 1.2 Build…

notepad++節點_在C ++中刪除鏈接列表的中間節點

notepad節點Given a single Linked List and we have to delete the middle the element of the Linked List. 給定一個鏈表,我們必須刪除鏈表中間的元素。 If the length of the linked list is odd then delete (( n1)/2)th term of the linked list and if the…

SET ANSI_NULLS ON

指定在與 Null 值一起使用等于 () 和不等于 (<>) 比較運算符時采用符合 ISO 標準的行為。 當 SET ANSI_NULLS 為 ON 時&#xff0c;即使 column_name 中包含空值&#xff0c;使用 WHERE column_name NULL 的 SELECT 語句仍返回零行。即使 column_name 中包含非空值&…

Eclipse項目左上角出現大紅色感嘆號怎么辦?

出現大紅色感嘆號是因為環境不匹配 解決方法&#xff1a; 右擊出現大紅色感嘆號的項目 點擊 Libraries&#xff0c;將有叉號的給Remove掉 然后再點擊 Add Library —> JRE System Library —> Next 勾選第二個即可 之后&#xff0c;就不會出現大紅色感嘆號了。

PCB---STM32最小系統制作過程

PCB 制作過程STM32核心模塊連接外部電源晶振OSC_IN(8MHz)OSC32_IN(32.768MHz&#xff09;復位下載口BOOT模式電源模塊添加功能UARTWKUPSTM32核心模塊 這里我們以STM32F103C8T6為列&#xff0c;先將芯片的原理圖放到原理圖中 對于STM32&#xff0c;有幾個模塊是核心&#xff0…

scala 隨機生成整數_如何在Scala中以整數形式獲取當前年份?

scala 隨機生成整數In Scala programming language, there is an option for the programmer to use libraries of java because of its interoperability with java. 在Scala編程語言中&#xff0c;程序員可以選擇使用Java庫&#xff0c;因為它可以與Java互操作。 There are …

轉載:glut.h 與 stdlib.h中 的exit()重定義問題的解決

遇到的問題&#xff0c;來自&#xff1a;http://blog.sina.com.cn/s/blog_629c53bd0100f5li.html 出現&#xff1a; c:\codeprogram\microsoft visual studio 10.0\vc\include\stdlib.h(353): error C2381: “exit”: 重定義&#xff1b;__declspec(noreturn) 不同1> c:\pro…