[FreeRTOS學習] 移植到STM32F1

準備工作

  1. 下載 FreeRTOSv9.0.0 源碼
  2. STM32F1相關環境和文件

創建工程

  1. 創建stm32f1工程


    template
  2. 新建文件夾 FreeRTOS并將 FreeRTOSv9.0.0\surce\的所有文件復制到 FreeRTOS下,
    將 G:\7-FreeRTOS資料\FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil 下的FreeRTOSConfig.h 復制到 FreeRTOS\include 下;

  3. 在工程里創建一個文件夾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
  4. 修改工程路徑


    工程路徑
  5. 修改啟動文件 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
  1. 配置基本完成,下面寫主函數 測試;
#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函數,只要添加相應的頭文件即可
下載運行

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容