1.FreeRTOS簡介
Free 即免費的,RTOS 全稱是 Real Time Operating System,中文就是實時操作系統。注意,RTOS 不是指某一個確定的系統,而是指一類系統。比如 uC/OS,FreeRTOS,RTX,RT-Thread 等這些都是 RTOS 類操作系統。
FreeRTOS 是 RTOS 系統的一種,FreeRTOS 十分的小巧,可以在資源有限的微控制器中運行,當然,FreeRTOS 不僅局限于在微控制器中使用。但從文件數量上來看 FreeRTOS 要比uC/OSII 和 uC/OSIII 小的多。
FreeRTOS特點
- FreeRTOS 的內核支持搶占式,合作式和時間片調度。
- 提供了一個用于低功耗的 Tickless 模式。
- 系統的組件在創建時可以選擇動態或者靜態的 RAM,比如任務、消息隊列、信號量、軟件定時器等等。
- FreeRTOS 系統簡單、小巧、易用,通常情況下內核占用 4k-9k 字節的空間。
- 高可移植性,代碼主要 C 語言編寫。
- 高效的軟件定時器、強大的跟蹤執行功能、堆棧溢出檢測功能。
- 任務數量不限。
FreeRTOS源碼下載:FreeTOS源碼下載地址
2.FreeRTOS移植
1.打開下載好的FreeRTOS文件夾,我們發現會有兩個FreeRTOS的文件夾,我們這里以最基本的源碼作為移植示例。
2.打開FreeRTOS/Source,此文件夾中保存的即為FreeRTOS源碼,接下來我們找一個簡潔的工程移植FreeRTOS系統。將Source復制到我們要移植的工程中。
3.在要移植的工程中創建FreeRTOS文件夾。
4.將源碼復位到該文件夾中。
5.刪除不需要的文件:在portable中只保留下面兩個文件夾即可。
RVDS中只保留ARM_CM3文件
6.打開工程,添加.c文件到工程中,添加頭文件路徑。
在官方的參考例程里面我們發現有這個,將這個文件拷貝到我們要移植的工程下。
存放路徑可以隨便選擇,只要在KEIL中添加好相應路徑即可。重新編譯工程。
7.提供系統心跳值函數。
#include "FreeRTOS.h" //FreeRTOS使用
#include "task.h"
extern void xPortSysTickHandler(void);
/*****************滴答定時器初始化******************/
void SysTick_Init(void)
{
SysTick->CTRL&=~(1<<2);//外部時鐘源9MHZ
SysTick->CTRL|=1<<1;//開中斷
SysTick->VAL=0;
SysTick->LOAD=9000*configTICK_RATE_HZ;//1s
SysTick->CTRL|=1<<0;//使能定時器
}
/*滴答定時器中斷,為FreeRTOS提供節拍數*/
void SysTick_Handler(void)
{
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)
{
xPortSysTickHandler();
}
}
在FreeRTOSconfig.h中設置相應的宏
/*FreeRTOS與軟件定時器相關配置*/
#define configUSE_TIMERS 1 //為1時啟用軟件定時器
#define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-1) //軟件定時器優先級
#define configTIMER_QUEUE_LENGTH 5 //軟件定時器隊列長度
#define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE*2) //軟件定時器任務堆棧大小
#define INCLUDE_xTaskGetSchedulerState 1
8.延時函數修改
(1)可以直接調用FreeRTOS中提供的延時函數,不過調用該函數會在延時時會進行任務切換,若不想在延時中進行任務切換,則可調用下面的模擬延時函數。通過設置宏FreeRTOS_OS。
/**************微妙延時函數*************/
void Delay_Us(int time)
{
#ifdef FreeRTOS_OS
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD; //LOAD的值
ticks=time*9; //需要的節拍數
told=SysTick->VAL; //剛進入時的計數器值
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{
if(tnow=ticks)break; //時間超過/等于要延遲的時間,則退出.
}
}
#else
int i,j;
for(i=0;i
(2)微妙延時函數
/**************微妙延時函數*************/
void Delay_Us(int time)
{
#ifdef FreeRTOS_OS
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD; //LOAD的值
ticks=time*9; //需要的節拍數
told=SysTick->VAL; //剛進入時的計數器值
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{
if(tnow=ticks)break; //時間超過/等于要延遲的時間,則退出.
}
}
#else
int i,j;
for(i=0;i
9.任務設置模板
#define START_TASK_PRIO 1 //任務優先級
#define START_STK_SIZE 128 //任務堆棧大小
TaskHandle_t StartTask_Handler; //任務句柄
void start_task(void *pvParameters);//任務函數
#define LED0_TASK_PRIO 3 //任務優先級
#define LED0_STK_SIZE 50 //任務堆棧大小
TaskHandle_t LED0Task_Handler; //任務句柄
void LED0_task(void); //任務函數
#define key_TASK_PRIO 2 //任務優先級
#define key_STK_SIZE 50 //任務堆棧大小
TaskHandle_t keyTask_Handler; //任務句柄
void key_task(void); //任務函數
int main()
{
SysTick_Init();
Beep_Init();
Led_Init();
Key_Init();
Usartx_Init(USART1,115200,72);
TIMx_Init(TIM2,72,20*1000);
printf("USART1初始化完成\r\n");
//創建任務
xTaskCreate( (TaskFunction_t)start_task,//任務函數
(const char *)"start_task",//任務名稱
(uint16_t)START_STK_SIZE,//堆棧大小
NULL, //傳遞給任務函數的參數
(UBaseType_t)START_TASK_PRIO,//任務優先級
(TaskHandle_t *)&StartTask_Handler);//任務句柄
vTaskStartScheduler(); //開啟任務調度
}
10.任務函數
/*開始任務函數*/
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); //進入臨界區
//創建LED0任務
xTaskCreate( (TaskFunction_t )LED0_task,//任務函數
(const char *)"start_task",//任務名稱
(uint16_t)LED0_STK_SIZE,//堆棧大小
NULL, //傳遞給任務函數的參數
(UBaseType_t )LED0_TASK_PRIO,//任務優先級
(TaskHandle_t *)&LED0Task_Handler);//任務句柄
xTaskCreate( (TaskFunction_t )key_task,//任務函數
(const char *)"KEYt_task",//任務名稱
(uint16_t )key_STK_SIZE,//堆棧大小
NULL, //傳遞給任務函數的參數
(UBaseType_t )key_TASK_PRIO,//任務優先級
(TaskHandle_t *)&keyTask_Handler);//任務句柄
vTaskDelete(StartTask_Handler); //刪除開始任務
taskEXIT_CRITICAL(); //退出臨界區
}
11.任務執行
void LED0_task(void)
{
while(1)
{
LED1=!LED1;
vTaskDelay(500);
}
}
void key_task(void)//任務函數
{
u8 key=0;
while(1)
{
key=Key_Scan();
if(key)
{
printf("key=%d\n",key);
}
vTaskDelay(10);
}
}
-
STM32
+關注
關注
2270文章
10895瀏覽量
355728 -
RTOS
+關注
關注
22文章
811瀏覽量
119593 -
FreeRTOS
+關注
關注
12文章
484瀏覽量
62139 -
實時操作系統
+關注
關注
1文章
197瀏覽量
30753
發布評論請先 登錄
相關推薦
評論