準備工作
- 下載 FreeRTOSv9.0.0 源碼
- STM32F1相關環境和文件
創建工程
-
創建stm32f1工程
template 新建文件夾 FreeRTOS并將 FreeRTOSv9.0.0\surce\的所有文件復制到 FreeRTOS下,
將 G:\7-FreeRTOS資料\FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil 下的FreeRTOSConfig.h 復制到 FreeRTOS\include 下;-
在工程里創建一個文件夾FreeRTOS,
并導入 FreeRTOSv9.0.0\surce的croutine.c, timers.c, list.c, queue.c, tasks.c,FreeRTOSv9.0.0\FreeRTOS\Source\portable\RVDS\ARM_CM3 下的port.h
FreeRTOSv9.0.0\FreeRTOS\Source\portable\MemMang 下的heap_2.h導入。
like this -
修改工程路徑
工程路徑 修改啟動文件 startup_stm32f10x_hd.s 在Cortex-M3硬件下,FreeRTOS使用SysTick作為系統節拍時鐘,使用SVC和PendSVC進行上下文切換。異常中斷服務代碼位于port.c文件中,FreeRTOS的作者已經為各種架構的CPU寫好了這些代碼,可以直接拿來用,需要用戶做的,僅僅是將這些異常中斷入口地址掛接到啟動代碼中。
在__heap_limit下面添加:
PRESERVE8
THUMB
IMPORT xPortPendSVHandler
IMPORT xPortSysTickHandler
IMPORT vPortSVCHandler
找到DCD SVC_Handler 將其屏蔽掉,改成DCD vPortSVCHandler。找到DCD PendSV_Handler將其屏蔽掉,改成DCD xPortPendSVHandler。找到DCD SysTick_Handler將其屏蔽掉,改成DCD xPortSysTickHandler。
DCD vPortSVCHandler ;DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ;Debug Monitor Handler
DCD xPortPendSVHandler ;DCD PendSV_Handler ; PendSV Handler
DCD xPortSysTickHandler ;DCD SysTick_Handler ; SysTick Handler
- 配置基本完成,下面寫主函數 測試;
#include "stm32f10x.h"
#include "bsp_led.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
void vTaskLed1( void * pvParameters )
{
while(1)
{
macLED1_ON (); // áá
vTaskDelay( 5000 );
macLED1_OFF (); // ?e
vTaskDelay( 5000 );
}
}
void vTaskLed2( void * pvParameters )
{
while(1)
{
macLED2_ON (); // áá
vTaskDelay( 5000 );
macLED2_OFF (); // ?e
vTaskDelay( 5000 );
}
}
void vTaskLed3( void * pvParameters )
{
while(1)
{
macLED3_ON (); // áá
vTaskDelay( 5000 );
macLED3_OFF (); // ?e
vTaskDelay( 5000 );
}
}
void vTaskStart( void * pvParameters )
{
LED_Init (); //3?ê??ˉ LED
xTaskCreate( vTaskLed1, "Task Led1", 512, NULL, 1, NULL );
xTaskCreate( vTaskLed2, "Task Led2", 512, NULL, 1, NULL );
xTaskCreate( vTaskLed3, "Task Led3", 512, NULL, 1, NULL );
vTaskDelete( NULL );
}
/**
* @brief ?÷oˉêy
* @param ?T
* @retval ?T
*/
int main ( void )
{
xTaskCreate( vTaskStart, "Task Start", 512, NULL, 1, NULL );
vTaskStartScheduler();
}
具體可自行修改main函數,只要添加相應的頭文件即可
下載運行