FreeRTOS

[FreeRTOS学习] 移植到STM32F1

2017-02-26  本文已影响0人  EleZtian

准备工作

  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 ();       // Ãð     
        vTaskDelay( 5000 );
    }
    
}


void vTaskLed2( void * pvParameters )
{
    while(1)
    {
        macLED2_ON ();            // ÁÁ
        vTaskDelay( 5000 );
        macLED2_OFF ();       // Ãð     
        vTaskDelay( 5000 );
    }
    
}


void vTaskLed3( void * pvParameters )
{
    while(1)
    {
        macLED3_ON ();            // ÁÁ
        vTaskDelay( 5000 );
        macLED3_OFF ();       // Ãð     
        vTaskDelay( 5000 );
    }
    
}


void vTaskStart( void * pvParameters )
{
    LED_Init ();              //³õʼ»¯ 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  Ö÷º¯Êý
  * @param  ÎÞ  
  * @retval ÎÞ
  */
int main ( void )
{   
    xTaskCreate( vTaskStart, "Task Start", 512, NULL, 1, NULL );
    
    
  vTaskStartScheduler();
    

}

具体可自行修改main函数,只要添加相应的头文件即可
下载运行

上一篇下一篇

猜你喜欢

热点阅读