美文网首页
STM32F103移植FreeRTOSv10.1.0

STM32F103移植FreeRTOSv10.1.0

作者: xuezimu | 来源:发表于2018-09-02 14:12 被阅读0次
  • 正点原子战舰战舰开发板(STM32F103ZET6)
  • FreeRTOSv10.1.0

1.下载源码

FreeRTOS官网:FreeRTOS
下载后是一个FreeRTOSv10.1.0.exe文件,它才是真正下载源码的东西,双击以后选择保存目录就可以开始下载了。

2.添加源码到STM32工程

1.复制一份库函数版本的跑马灯工程,新建文件夹FreeRTOS


2.复制下载的源码中的 FreeRTOSv10.1.0\FreeRTOS\Source文件夹下的所有文件到刚才的STM32工程FreeRTOS文件夹下

3.portable文件夹下可以只保留keil下编译STM32F1相关的文件夹


3.修改工程

工程下新建FreeRTOS目录,添加源码中的7个.文件和FreeRTOS\portable\MenMang\heap_4.cFreeRTOS\portable\RVDS\ARM_CM3\port.c


工程中添加头文件:

从源码中复制一份FreeRTOSConfig.h(FreeRTOSv10.1.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil\FreeRTOSConfig.h),这里选择STM32F103_keil工程下的该文件,放到工程下的FreeRTOS\include文件夹

修改FreeRTOS.h下的两个宏定义,从0改为1

现在编译工程应该0 Error(s), 0 Warning(s)

4.修改startup_stm32f10x_hd.s

在第56行开始的地方

; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size
/******************************change****************************/
                IMPORT  vPortSVCHandler
                IMPORT  xPortPendSVHandler
                IMPORT  xPortSysTickHandler
/****************************************************************/

__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                DCD     UsageFault_Handler         ; Usage Fault Handler
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
                DCD     0                          ; Reserved
/**************************************change****************************************/
;                DCD     SVC_Handler                ; SVCall Handler
                DCD     vPortSVCHandler
                DCD     DebugMon_Handler           ; Debug Monitor Handler
                DCD     0                          ; Reserved
;                DCD     PendSV_Handler             ; PendSV Handler
                DCD     xPortPendSVHandler
;                DCD     SysTick_Handler            ; SysTick Handler
                DCD     xPortSysTickHandler
/**************************************************************************************/

5.main.c中新建任务

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"


//任务优先级
#define START_TASK_PRIO     1
//任务堆栈大小    
#define START_STK_SIZE      128  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);

//任务优先级
#define LED0_TASK_PRIO      2
//任务堆栈大小    
#define LED0_STK_SIZE       50  
//任务句柄
TaskHandle_t LED0Task_Handler;
//任务函数
void led0_task(void *pvParameters);

//任务优先级
#define LED1_TASK_PRIO      3
//任务堆栈大小    
#define LED1_STK_SIZE       50  
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void led1_task(void *pvParameters);


int main(void)
{ 
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
    LED_Init();             //初始化LED端口
    
    //创建开始任务
    xTaskCreate((TaskFunction_t )start_task,            //任务函数
                (const char*    )"start_task",          //任务名称
                (uint16_t       )START_STK_SIZE,        //任务堆栈大小
                (void*          )NULL,                  //传递给任务函数的参数
                (UBaseType_t    )START_TASK_PRIO,       //任务优先级
                (TaskHandle_t*  )&StartTask_Handler);   //任务句柄              
    vTaskStartScheduler();          //开启任务调度
}
 
//开始任务任务函数
void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           //进入临界区
    //创建LED0任务
    xTaskCreate((TaskFunction_t )led0_task,         
                (const char*    )"led0_task",       
                (uint16_t       )LED0_STK_SIZE, 
                (void*          )NULL,              
                (UBaseType_t    )LED0_TASK_PRIO,    
                (TaskHandle_t*  )&LED0Task_Handler);   
    //创建LED1任务
    xTaskCreate((TaskFunction_t )led1_task,     
                (const char*    )"led1_task",   
                (uint16_t       )LED1_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )LED1_TASK_PRIO,
                (TaskHandle_t*  )&LED1Task_Handler);        
   
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}

//LED0任务函数 
void led0_task(void *pvParameters)
{
    while(1)
    {
        LED0=~LED0;
        vTaskDelay(500);
    }
}   

//LED1任务函数
void led1_task(void *pvParameters)
{
    while(1)
    {
        LED1=0;
        vTaskDelay(200);
        LED1=1;
        vTaskDelay(800);
    }
}

6.验证

下载代码到战舰开发板上,发现LED0和LED1都闪烁,一个亮0.5s灭0.5s,一个亮0.2s灭0.8s

相关文章

网友评论

      本文标题:STM32F103移植FreeRTOSv10.1.0

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