美文网首页FreeRTOS
[FreeRTOS学习] 移植到STM32F1

[FreeRTOS学习] 移植到STM32F1

作者: EleZtian | 来源:发表于2017-02-26 14:02 被阅读0次

    准备工作

    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函数,只要添加相应的头文件即可
    下载运行

    相关文章

      网友评论

        本文标题:[FreeRTOS学习] 移植到STM32F1

        本文链接:https://www.haomeiwen.com/subject/cdmowttx.html