色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

實時操作系統FreeRTOS移植教程

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

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源碼下載地址

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文件夾,我們發現會有兩個FreeRTOS的文件夾,我們這里以最基本的源碼作為移植示例。

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

2.打開FreeRTOS/Source,此文件夾中保存的即為FreeRTOS源碼,接下來我們找一個簡潔的工程移植FreeRTOS系統。將Source復制到我們要移植的工程中。

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

3.在要移植的工程中創建FreeRTOS文件夾。

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

4.將源碼復位到該文件夾中。

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

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

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

在官方的參考例程里面我們發現有這個,將這個文件拷貝到我們要移植的工程下。

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

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

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

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();
	}
}
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

在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   
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1MzY5NA==,size_16,color_FFFFFF,t_70

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
收藏 人收藏

    評論

    相關推薦

    SDCC編譯器和FreeRTOS實時操作系統的優缺點及應用研究

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

    嵌入式操作系統上的FreeRTOS操作系統分析

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

    請問freertos是硬實時操作系統嗎?

    freertos是硬實時操作系統嗎?都有哪些硬實時操作系統啊?
    發表于 06-13 09:00

    FreeRTOS實時操作系統是如何進行移植的呢

    FreeRTOS 是什么?FreeRTOS實時操作系統是如何進行移植的呢?有哪些步驟?
    發表于 10-27 06:25

    嵌入式實時操作系統FreeRTOS基本概述

    嵌入式實時操作系統FreeRTOS基本概述在嵌入式領域當中,實時操作系統的應用越來越廣泛了,目前嵌入式
    發表于 02-16 07:12

    基于FreeRTOS的嵌入式實時操作系統的原理和實現

    FreeRTOS是一個源碼公開的免費的嵌入式實時操作系統,通過研究其內核可以更好地理解嵌入式操作系統的實現原理.本文主要闡述FreeRTOS
    發表于 11-18 03:34 ?6669次閱讀

    嵌入式操作系統FreeRTOS的原理以及如何實現移植的方法說明

    針對嵌入式FreeRTOS操作系統進行介紹與分析,并結合時下流行的uC/OS-Ⅱ操作系統進行類比。在移植上,詳細分析了FreeRTOS
    發表于 01-14 15:49 ?24次下載
    嵌入式<b class='flag-5'>操作系統</b><b class='flag-5'>FreeRTOS</b>的原理以及如何實現<b class='flag-5'>移植</b>的方法說明

    STM32芯片移植FreeRTOS操作系統的教程

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

    嵌入式操作系統FREERTOS移植.

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

    嵌入式實時操作系統FreeRTOS在ARM7上移植實現

    嵌入式實時操作系統FreeRTOS在ARM7上移植實現(嵌入式開發工程師待遇)-嵌入式實時操作系統
    發表于 07-30 12:05 ?21次下載
    嵌入式<b class='flag-5'>實時</b><b class='flag-5'>操作系統</b><b class='flag-5'>FreeRTOS</b>在ARM7上<b class='flag-5'>移植</b>實現

    嵌入式操作系統FreeRTOS的原理與移植實現

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

    FreeRTOS操作系統移植教程

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

    FreeRTOS操作系統移植文件

    FreeRTOS操作系統移植文件,不會官網下載的,可以這里下載
    發表于 08-28 14:58 ?1次下載

    FreeRTOS:一個迷你的實時操作系統內核

    ** 1、FreeRTOS** FreeRTOS是一個迷你的實時操作系統內核。作為一個輕量級的操作系統,功能包括:任務管理、時間管理、信號量
    的頭像 發表于 06-29 17:15 ?988次閱讀
    <b class='flag-5'>FreeRTOS</b>:一個迷你的<b class='flag-5'>實時</b><b class='flag-5'>操作系統</b>內核

    FreeRTOS實時操作系統簡述

    FreeRTOS是一個為嵌入式系統設計的開源實時操作系統。它提供了一個多任務內核和一系列組件功能,適合在資源受限的設備上管理實時任務和應用程
    發表于 09-19 12:37 ?1793次閱讀
    <b class='flag-5'>FreeRTOS</b><b class='flag-5'>實時</b><b class='flag-5'>操作系統</b>簡述
    主站蜘蛛池模板: 中文字幕亚洲欧美日韩2019| 亚洲免费视频日本一区二区| 亚洲精品视频在线免费| 一个人免费观看完整视频日本| 99精品成人无码A片观看金桔| 国产叼嘿久久精品久久| 两个人的视频免费| 色综合伊人色综合网站| 在线涩涩免费观看国产精品| 持田香织abc| 久热这里在线精品| 甜性涩爱快播| 97精品国偷拍自产在线| 国产小视频在线高清播放| 妈妈的职业3完整版在线播放| 思思re热免费精品视频66| 中文字幕在线永久| 国产精品女上位好爽在线短片| 巨大乳hdbbw| 亚洲AV色香蕉一区二区三区 | 99热这里只有精品9| 国产午夜精品一区二区三区| 披黑人猛躁10次高潮| 野花韩国中文版免费观看| 成人小视频免费在线观看| 久久精品国产亚洲AV妓女不卡| 玩两个少妇女邻居| 99精品AV无码一区二区| 久久精品视在线观看2| 性按摩AAAAAAA片| 超碰在线97av视频免费| 久久在精品线影院| 亚洲成AV人片一区二区不卡| 成人中文在线| 欧美成人精品高清在线观看| 亚洲色欲色欲综合网站| 国产黄片毛片| adc影院在线| 久久久中日AB精品综合| 胸太大被男同桌吃好爽| 成人片在线播放|