FreeRTOS系列一:FreeRTOS移植实验

到正点原子官网里面下载对应的资料,看到这个的应该都会,这里主要补充自己学习的细节

在D:\探索者F4 资料盘(A盘)\【正点原子】STM32F103最小系统板资料\4,程序源码\4,扩展例程\5,FreeRTOS例程\5,FreeRTOS例程\FreeRTOS实验2-1 FreeRTOS移植实验\USER打开

 里面的文件对应从哪里移植,作用怎么样的开发手册里面有

对应目录:D:\探索者F4 资料盘(A盘)\【正点原子】STM32F103最小系统板资料\STM32F1 FreeRTOS开发手册_V1.1\STM32F1 FreeRTOS开发手册_V1.1

 FreeRTOSConfig.h里面的理解

对应网址:FreeRTOS - 免费的实时操作系统配置常量和配置选项 - 适用于小型实时嵌入式系统的免费开源实时操作系统

直接点开对应头文件也可以看到

然后修改例程中对应的led.c和led.h,我这里时最小系统板只有一个ledPA8

所以

#include "led.h"

//初始化PA8为输出口.并使能这个口的时钟		    
//LED IO初始化

void LED_Init(void)
{
 
  GPIO_InitTypeDef GPIO_InitStruct;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStruct);
  GPIO_SetBits(GPIOA,GPIO_Pin_8);
		
}
#ifndef __LED_H
#define __LED_H	 
#include "sys.h"


#define LED0 PAout(8)// PA8


void LED_Init(void);//初始化

		 				    
#endif

 主函数不需要修改

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
/************************************************
 ALIENTEK 战舰STM32F103开发板 FreeRTOS实验2-1
 FreeRTOS移植实验-库函数版本
 技术支持:www.openedv.com
 淘宝店铺:http://eboard.taobao.com 
 关注微信公众平台微信号:"正点原子",免费获取STM32资料。
 广州市星翼电子科技有限公司  
 作者:正点原子 @ALIENTEK
************************************************/

//任务优先级
#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	 
	delay_init();	    				//延时函数初始化	  
	uart_init(115200);					//初始化串口
	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)
{
    static float float_num=0.01;
    while(1)
    {
        float_num+=0.01f;
        taskENTER_CRITICAL();           //进入临界区
			printf("111\r\n"); 
        printf("float_num的值为: %.4f\r\n",float_num);   /*串口打印结果*/
        taskEXIT_CRITICAL();            //退出临界区
			printf("222\r\n"); 
        vTaskDelay(1000);
		
			 
    }
}   

//LED1任务函数
void led1_task(void *pvParameters)
{
    while(1)
    {   printf("333\r\n");
        LED0=0;
        vTaskDelay(200);
        LED0=1;
        vTaskDelay(800);
    }

}

实现现象时led闪烁,并且串口可以看到

 就可以了。所用开发板为绿深电子的是STM32F103RCT6

おすすめ

転載: blog.csdn.net/qq_51519091/article/details/131361077