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,所以中間會出現紅綠混合色。