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移植教程

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

1.FreeRTOS簡(jiǎn)介

Free 即免費(fèi)的,RTOS 全稱是 Real Time Operating System,中文就是實(shí)時(shí)操作系統(tǒng)。注意,RTOS 不是指某一個(gè)確定的系統(tǒng),而是指一類系統(tǒng)。比如 uC/OS,F(xiàn)reeRTOS,RTX,RT-Thread 等這些都是 RTOS 類操作系統(tǒng)。
FreeRTOS 是 RTOS 系統(tǒng)的一種,F(xiàn)reeRTOS 十分的小巧,可以在資源有限的微控制器中運(yùn)行,當(dāng)然,F(xiàn)reeRTOS 不僅局限于在微控制器中使用。但從文件數(shù)量上來看 FreeRTOS 要比uC/OSII 和 uC/OSIII 小的多。
FreeRTOS特點(diǎn)

  • FreeRTOS 的內(nèi)核支持搶占式,合作式和時(shí)間片調(diào)度。
  • 提供了一個(gè)用于低功耗的 Tickless 模式。
  • 系統(tǒng)的組件在創(chuàng)建時(shí)可以選擇動(dòng)態(tài)或者靜態(tài)的 RAM,比如任務(wù)、消息隊(duì)列、信號(hào)量、軟件定時(shí)器等等。
  • FreeRTOS 系統(tǒng)簡(jiǎn)單、小巧、易用,通常情況下內(nèi)核占用 4k-9k 字節(jié)的空間。
  • 高可移植性,代碼主要 C 語言編寫。
  • 高效的軟件定時(shí)器、強(qiáng)大的跟蹤執(zhí)行功能、堆棧溢出檢測(cè)功能。
  • 任務(wù)數(shù)量不限。

FreeRTOS源碼下載:FreeTOS源碼下載地址

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

2.FreeRTOS移植

1.打開下載好的FreeRTOS文件夾,我們發(fā)現(xiàn)會(huì)有兩個(gè)FreeRTOS的文件夾,我們這里以最基本的源碼作為移植示例。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

2.打開FreeRTOS/Source,此文件夾中保存的即為FreeRTOS源碼,接下來我們找一個(gè)簡(jiǎn)潔的工程移植FreeRTOS系統(tǒng)。將Source復(fù)制到我們要移植的工程中。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

3.在要移植的工程中創(chuàng)建FreeRTOS文件夾。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

4.將源碼復(fù)位到該文件夾中。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

5.刪除不需要的文件:在portable中只保留下面兩個(gè)文件夾即可。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

RVDS中只保留ARM_CM3文件

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

6.打開工程,添加.c文件到工程中,添加頭文件路徑。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

在官方的參考例程里面我們發(fā)現(xiàn)有這個(gè),將這個(gè)文件拷貝到我們要移植的工程下。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

存放路徑可以隨便選擇,只要在KEIL中添加好相應(yīng)路徑即可。重新編譯工程。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70pYYBAGKW5TeAcmWDAACm8hFxmyM000.png

7.提供系統(tǒng)心跳值函數(shù)。

#include "FreeRTOS.h"					//FreeRTOS使用		  
#include "task.h" 
extern void xPortSysTickHandler(void);
/*****************滴答定時(shí)器初始化******************/
void SysTick_Init(void)
{
	SysTick->CTRL&=~(1<<2);//外部時(shí)鐘源9MHZ
	SysTick->CTRL|=1<<1;//開中斷
	SysTick->VAL=0;
	SysTick->LOAD=9000*configTICK_RATE_HZ;//1s
	SysTick->CTRL|=1<<0;//使能定時(shí)器
}
/*滴答定時(shí)器中斷,為FreeRTOS提供節(jié)拍數(shù)*/
void SysTick_Handler(void)
{
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)
	{
		xPortSysTickHandler();
	}
}
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

在FreeRTOSconfig.h中設(shè)置相應(yīng)的宏

/*FreeRTOS與軟件定時(shí)器相關(guān)配置*/
#define configUSE_TIMERS	 1       //為1時(shí)啟用軟件定時(shí)器
#define configTIMER_TASK_PRIORITY	 (configMAX_PRIORITIES-1)  //軟件定時(shí)器優(yōu)先級(jí)
#define configTIMER_QUEUE_LENGTH		 5   //軟件定時(shí)器隊(duì)列長(zhǎng)度
#define configTIMER_TASK_STACK_DEPTH	 (configMINIMAL_STACK_SIZE*2)    //軟件定時(shí)器任務(wù)堆棧大小
#define INCLUDE_xTaskGetSchedulerState     1   
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

8.延時(shí)函數(shù)修改

(1)可以直接調(diào)用FreeRTOS中提供的延時(shí)函數(shù),不過調(diào)用該函數(shù)會(huì)在延時(shí)時(shí)會(huì)進(jìn)行任務(wù)切換,若不想在延時(shí)中進(jìn)行任務(wù)切換,則可調(diào)用下面的模擬延時(shí)函數(shù)。通過設(shè)置宏FreeRTOS_OS。

/**************微妙延時(shí)函數(shù)*************/
void Delay_Us(int time)
{
	#ifdef FreeRTOS_OS
	u32 ticks;
	u32 told,tnow,tcnt=0;
	u32 reload=SysTick->LOAD;				//LOAD的值	    	 
	ticks=time*9; 						//需要的節(jié)拍數(shù) 
	told=SysTick->VAL;        //剛進(jìn)入時(shí)的計(jì)數(shù)器值
	while(1)
	{
		tnow=SysTick->VAL;
		if(tnow!=told)	
		{
			if(tnow=ticks)break;			//時(shí)間超過/等于要延遲的時(shí)間,則退出.
		}
	}
	#else
	int i,j;
	for(i=0;i

(2)微妙延時(shí)函數(shù)

/**************微妙延時(shí)函數(shù)*************/
void Delay_Us(int time)
{
	#ifdef FreeRTOS_OS
	u32 ticks;
	u32 told,tnow,tcnt=0;
	u32 reload=SysTick->LOAD;				//LOAD的值	    	 
	ticks=time*9; 						//需要的節(jié)拍數(shù) 
	told=SysTick->VAL;        //剛進(jìn)入時(shí)的計(jì)數(shù)器值
	while(1)
	{
		tnow=SysTick->VAL;
		if(tnow!=told)	
		{
			if(tnow=ticks)break;			//時(shí)間超過/等于要延遲的時(shí)間,則退出.
		}
	}
	#else
	int i,j;
	for(i=0;i

9.任務(wù)設(shè)置模板

#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 3     //任務(wù)優(yōu)先級(jí)
#define LED0_STK_SIZE 50     //任務(wù)堆棧大小
TaskHandle_t LED0Task_Handler; //任務(wù)句柄
void LED0_task(void);         //任務(wù)函數(shù)

#define key_TASK_PRIO 2     //任務(wù)優(yōu)先級(jí)
#define key_STK_SIZE 50      //任務(wù)堆棧大小
TaskHandle_t keyTask_Handler; //任務(wù)句柄
void key_task(void);          //任務(wù)函數(shù)

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");
	
	//創(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)度
}

10.任務(wù)函數(shù)

/*開始任務(wù)函數(shù)*/
void start_task(void *pvParameters)
{
	taskENTER_CRITICAL();  //進(jìn)入臨界區(qū)
	//創(chuàng)建LED0任務(wù)
	xTaskCreate( (TaskFunction_t  )LED0_task,//任務(wù)函數(shù)
								(const char    *)"start_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 )key_task,//任務(wù)函數(shù)
								(const char    *)"KEYt_task",//任務(wù)名稱
								(uint16_t )key_STK_SIZE,//堆棧大小
								NULL,           //傳遞給任務(wù)函數(shù)的參數(shù)
								(UBaseType_t    )key_TASK_PRIO,//任務(wù)優(yōu)先級(jí)
								(TaskHandle_t  *)&keyTask_Handler);//任務(wù)句柄
	vTaskDelete(StartTask_Handler); //刪除開始任務(wù)	
	taskEXIT_CRITICAL();            //退出臨界區(qū)						
}

11.任務(wù)執(zhí)行

void LED0_task(void)
{
	while(1)
	{
		LED1=!LED1;
		vTaskDelay(500);
	}
}
void key_task(void)//任務(wù)函數(shù)
{
	u8 key=0;
	while(1)
	{
		key=Key_Scan();
		if(key)
		{
			printf("key=%d\n",key);
		}
		vTaskDelay(10);
	}
}


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

    關(guān)注

    2258

    文章

    10828

    瀏覽量

    352483
  • RTOS
    +關(guān)注

    關(guān)注

    20

    文章

    804

    瀏覽量

    119113
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61724
  • 實(shí)時(shí)操作系統(tǒng)

    關(guān)注

    1

    文章

    194

    瀏覽量

    30682
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    SDCC編譯器和FreeRTOS實(shí)時(shí)操作系統(tǒng)的優(yōu)缺點(diǎn)及應(yīng)用研究

    FreeRTOS是為小型嵌入式系統(tǒng)開發(fā)的一個(gè)開放源代碼、免費(fèi)的實(shí)時(shí)操作系統(tǒng)內(nèi)核。其內(nèi)核大部分使用C語言編程,具有高度的可移植性,目前已經(jīng)被
    的頭像 發(fā)表于 09-05 12:16 ?6659次閱讀
    SDCC編譯器和<b class='flag-5'>FreeRTOS</b><b class='flag-5'>實(shí)時(shí)</b><b class='flag-5'>操作系統(tǒng)</b>的優(yōu)缺點(diǎn)及應(yīng)用研究

    嵌入式操作系統(tǒng)上的FreeRTOS操作系統(tǒng)分析

    。由于rtos需占用一定的系統(tǒng)資源(尤其是ram資源),只有μc/os-ii、embos、salvo、freertos等少數(shù)實(shí)時(shí)操作系統(tǒng)能在小ram單片機(jī)上運(yùn)行。相對(duì)于c/os-ii、
    發(fā)表于 07-01 08:19

    請(qǐng)問freertos是硬實(shí)時(shí)操作系統(tǒng)嗎?

    freertos是硬實(shí)時(shí)操作系統(tǒng)嗎?都有哪些硬實(shí)時(shí)操作系統(tǒng)啊?
    發(fā)表于 06-13 09:00

    FreeRTOS實(shí)時(shí)操作系統(tǒng)是如何進(jìn)行移植的呢

    FreeRTOS 是什么?FreeRTOS實(shí)時(shí)操作系統(tǒng)是如何進(jìn)行移植的呢?有哪些步驟?
    發(fā)表于 10-27 06:25

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

    嵌入式實(shí)時(shí)操作系統(tǒng)FreeRTOS基本概述在嵌入式領(lǐng)域當(dāng)中,實(shí)時(shí)操作系統(tǒng)的應(yīng)用越來越廣泛了,目前嵌入式
    發(fā)表于 02-16 07:12

    基于FreeRTOS的嵌入式實(shí)時(shí)操作系統(tǒng)的原理和實(shí)現(xiàn)

    FreeRTOS是一個(gè)源碼公開的免費(fèi)的嵌入式實(shí)時(shí)操作系統(tǒng),通過研究其內(nèi)核可以更好地理解嵌入式操作系統(tǒng)的實(shí)現(xiàn)原理.本文主要闡述FreeRTOS
    發(fā)表于 11-18 03:34 ?6567次閱讀

    嵌入式操作系統(tǒng)FreeRTOS的原理以及如何實(shí)現(xiàn)移植的方法說明

    針對(duì)嵌入式FreeRTOS操作系統(tǒng)進(jìn)行介紹與分析,并結(jié)合時(shí)下流行的uC/OS-Ⅱ操作系統(tǒng)進(jìn)行類比。在移植上,詳細(xì)分析了FreeRTOS
    發(fā)表于 01-14 15:49 ?23次下載
    嵌入式<b class='flag-5'>操作系統(tǒng)</b><b class='flag-5'>FreeRTOS</b>的原理以及如何實(shí)現(xiàn)<b class='flag-5'>移植</b>的方法說明

    STM32芯片移植FreeRTOS操作系統(tǒng)的教程

    的設(shè)計(jì),縮短應(yīng)用的開發(fā)周期,保證系統(tǒng)的可靠性和實(shí)時(shí)性。本文主要研究基于STM32芯片的硬件平臺(tái),由于RAM資源的限制,只能使用占用資源少的小型操作系統(tǒng),常見的主要有uC/os-Il eCos,
    發(fā)表于 03-29 12:01 ?36次下載
    STM32芯片<b class='flag-5'>移植</b><b class='flag-5'>FreeRTOS</b><b class='flag-5'>操作系統(tǒng)</b>的教程

    嵌入式操作系統(tǒng)FREERTOS移植.

    嵌入式操作系統(tǒng)FREERTOS移植.(濟(jì)南嵌入式開發(fā)招聘)-嵌入式操作系統(tǒng)FREERTOS移植
    發(fā)表于 07-30 12:01 ?15次下載
    嵌入式<b class='flag-5'>操作系統(tǒng)</b><b class='flag-5'>FREERTOS</b>的<b class='flag-5'>移植</b>.

    嵌入式實(shí)時(shí)操作系統(tǒng)FreeRTOS在ARM7上移植實(shí)現(xiàn)

    嵌入式實(shí)時(shí)操作系統(tǒng)FreeRTOS在ARM7上移植實(shí)現(xiàn)(嵌入式開發(fā)工程師待遇)-嵌入式實(shí)時(shí)操作系統(tǒng)
    發(fā)表于 07-30 12:05 ?18次下載
    嵌入式<b class='flag-5'>實(shí)時(shí)</b><b class='flag-5'>操作系統(tǒng)</b><b class='flag-5'>FreeRTOS</b>在ARM7上<b class='flag-5'>移植</b>實(shí)現(xiàn)

    嵌入式操作系統(tǒng)FreeRTOS的原理與移植實(shí)現(xiàn)

    的小型操作系統(tǒng),常見的主要有uC/os-Il eCos,FreeRTOS等,與uC/Os-1 eCcos等商業(yè)收費(fèi)的操作系統(tǒng)不同,FreeRTOS
    發(fā)表于 08-04 13:50 ?16次下載
    嵌入式<b class='flag-5'>操作系統(tǒng)</b><b class='flag-5'>FreeRTOS</b>的原理與<b class='flag-5'>移植</b>實(shí)現(xiàn)

    FreeRTOS操作系統(tǒng)移植教程

    本章教程將為大家介紹基于 MDK 的 FreeRTOS 操作系統(tǒng)移植。移植工作比較簡(jiǎn)單,只需要用戶添加 需要的源碼文件,不需要做任何的底層工作,再添加三個(gè)宏定義即可。
    發(fā)表于 08-28 14:59 ?2次下載

    FreeRTOS操作系統(tǒng)移植文件

    FreeRTOS操作系統(tǒng)移植文件,不會(huì)官網(wǎng)下載的,可以這里下載
    發(fā)表于 08-28 14:58 ?1次下載

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

    ** 1、FreeRTOS** FreeRTOS是一個(gè)迷你的實(shí)時(shí)操作系統(tǒng)內(nèi)核。作為一個(gè)輕量級(jí)的操作系統(tǒng),功能包括:任務(wù)管理、時(shí)間管理、信號(hào)量
    的頭像 發(fā)表于 06-29 17:15 ?835次閱讀
    <b class='flag-5'>FreeRTOS</b>:一個(gè)迷你的<b class='flag-5'>實(shí)時(shí)</b><b class='flag-5'>操作系統(tǒng)</b>內(nèi)核

    FreeRTOS實(shí)時(shí)操作系統(tǒng)簡(jiǎn)述

    FreeRTOS是一個(gè)為嵌入式系統(tǒng)設(shè)計(jì)的開源實(shí)時(shí)操作系統(tǒng)。它提供了一個(gè)多任務(wù)內(nèi)核和一系列組件功能,適合在資源受限的設(shè)備上管理實(shí)時(shí)任務(wù)和應(yīng)用程
    發(fā)表于 09-19 12:37 ?1492次閱讀
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>實(shí)時(shí)</b><b class='flag-5'>操作系統(tǒng)</b>簡(jiǎn)述