MDK移植freeRTOS及多任務創建

MDK移植freeRTOS及多任務創建

本文所使用的硬件爲野火的指南者開發板,購買後,商家會提供已經移植好freeRTOS的工程可以直接使用進行開發。
但如果沒有現成的框架,就需要自己移植,ST公司開發了集成了freeROTS可視化操作的stm32cubeIDE,可方便快捷的進行開發,但使用的是HAL庫,在之後的文章中會進行介紹。
本文主要講在keil中完成stm32標準庫裏freeRTOS操作系統的手動移植,並簡單的創建兩個不同頻率的led閃爍和串口數據發送這3個任務

一、移植前準備

  • 在freeROTS官網下載freeROTS源碼,下載後解壓
    在這裏插入圖片描述
  • 新建一個文件夾freeRTOS,將剛纔解壓文件夾中的 FreeROTS\Source\ 目錄下的所有文件複製到新建文件夾中
    在這裏插入圖片描述
  • portable/RVDS中的CM3複製到keil文件夾中
    在這裏插入圖片描述
    在這裏插入圖片描述

  • 將解壓的源碼文件夾中的FreeRTOS\Demo\CORTEX_stm32f103_keil中的FreeRTOSConfig.h複製到自己新建的文件夾中
    在這裏插入圖片描述
    在這裏插入圖片描述

二、freeRTOS移植

  • 打開商家提供的一個例程,在例程目錄中,將剛纔自己新建的文件夾freeRTOS複製進去
    在這裏插入圖片描述
  • 打開工程,在工程中新建組FreeRTOS
    在這裏插入圖片描述
    在這裏插入圖片描述

  • 向組FreeRTOS添加文件
    在這裏插入圖片描述
    需要添加的文件都在剛纔複製到工程目錄的文件夾中,路徑如下:
    freeRTOS\tasks.c
    freeRTOS\list.c
    freeRTOS\portable\Keil\ARM_CM3\port.c
    freeRTOS\portable\MemMang\heap_4.c





  • 添加頭文件路徑,右鍵工程,按照以下步驟,添加freeRTOS的頭文件所在路徑
    在這裏插入圖片描述
    在這裏插入圖片描述
    添加完成後進行編譯,編譯成功即說明移植已經基本完成了
    在這裏插入圖片描述



  • 想要進行實時操作系統下的編程,還需要對FreeRTOSConfig.h和stm32f10x_it.c兩個文件進行修改,在左邊工程欄中找到文件,打開進行修改,下面分別是兩個文件中需要進行修改的部分,如果沒有則自己添加
    FreeRTOS.h
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
    stm32f10x_it.c
    在這裏插入圖片描述
    在這裏插入圖片描述






修改完成後,編譯成功即可進行主程序的編寫。

三、創建任務

  • main.c輸入以下代碼
/* FreeRTOS頭文件*/
#include "FreeRTOS.h"
#include "task.h"
/*stm32頭文件*/
#include "bsp_led.h"
#include "bsp_usart.h"
#include "stm32f10x.h"


void Task1_led1()     //任務一
{
   
   
	while(1)
	{
   
   
		LED1_ON;
		vTaskDelay(500);	 //延時500ms
		LED1_OFF;
		vTaskDelay(500);	//延時500ms
	}
}
 
void Task2_uart()     //任務二

	while(1)
	{
   
   
		Usart_SendString( DEBUG_USARTx,"賈哥你好帥\n");
		vTaskDelay(2000);	//延時2000ms
	}
}

void Task3_led2()    //任務二
{
   
   
	while(1)
	{
   
   
	LED2_ON;
	vTaskDelay(1000);	 //延時1000ms
	LED2_OFF;
	vTaskDelay(1000);	//延時1000ms
	}
}

 int main(void)
 {
   
   	
	 
	 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);   //中斷優先級設置爲組4
	  
	 LED_GPIO_Config();		  	//LED初始化
	 USART_Config();            //串口初始化
	 xTaskCreate(Task1_led1,   //任務一函數指針
	           "TASK1_led1",   //任務一名稱
	                    40,   //堆棧深度(字節)
	                  NULL,   //任務參數爲空
	                     1,   //任務優先級設置,數字越大優先級越高
	                 NULL);   //任務句柄爲空
	 
	 xTaskCreate(Task2_uart,"TASK2_uart",40,NULL,2,NULL);  //同上
	 xTaskCreate(Task3_led2,"TASK3_led2",40,NULL,3,NULL);  //同上
	 
	 vTaskStartScheduler();  //啓動任務調度器,系統運行
	 
  while(1)
	{
   
   	
	}
 }

注意中斷優先級的設置,需設置爲 組4 ,在串口初始化函數中也要將其設置爲 4
所有用到的頭文件以及對應的C文件都要放到工程目錄中,並添加到工程中
運行後,可以看到3個任務是幾乎同步運行的。

  • 效果圖,Y因爲指南者板子的燈是複合燈,程序控制紅燈間隔500ms,綠燈間隔1000ms,所以中間會出現紅綠混合色。
    在這裏插入圖片描述
    在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章