freertos移植stm32(freertos篇-2)

其主要就是代码的添加和freertos_config文件的配置修改

  • 首先准备一个裸机的工程文件
    在这里插入图片描述
  • 在里面建一个FreeRTOS文件夹
    在这里插入图片描述
  • 在刚刚建立的FreeRTOS文件夹添加源码,
    网盘链接:
    https://pan.baidu.com/s/1ROMz2Bj3J1SgKTY3MGLbIw?pwd=5qg9
    提取码:5qg9
    在这里插入图片描述
  • 为了减小容量需要在portable下删除一些文件,只保留以下文件
    在这里插入图片描述
  • 在裸机工程里面建两两个分组,并添加rtos源码里面的文件
    在这里插入图片描述
  • 添加RTOS的头文件路径

在这里插入图片描述

  • 添加freertos_config文件(rtos的配置和裁剪都在这个文件)
    在这里插入图片描述

  • 给他复制到我们的freertos源码include文件下面
    在这里插入图片描述

  • 修改一下条件编译,主要与系统时钟有关
    在这里插入图片描述

  • 屏蔽重复的函数
    在这里插入图片描述

  • 关闭钩子函数
    在这里插入图片描述

  • 修改sys.h文件
    在这里插入图片描述

  • 修改usart.c文件
    在这里插入图片描述
    去掉ucos时用的OSIntEnter和OSIntExit函数在这里插入图片描述

  • 修改delay.c文件
    在这里插入图片描述
    在滴答定时器里面使用Rtos的API函数xPortSysTickHandler(),
    下面的函数的目的用来初始化滴答定时器和延时函数
    在这里插入图片描述
    rtos的时钟是由滴答定时器提供的,系统的时钟节拍频率由宏configTICK_RATE_HZ来设置,这个值由我们自己自由的设置
    为了兼容FreeRTOS将滴答定时器的时钟频率改为了AHB,也就是168MHz
    在这里插入图片描述

  • 屏蔽掉宏定义
    在这里插入图片描述
    此时就将rtos加进工程中
    下面就看你在main文件里的骚操作了。。。。

假设现在有三个任务

#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;
//任务函数0
void start_task(void *pvParameters);

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

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

//任务优先级
#define FLOAT_TASK_PRIO		4
//任务堆栈大小	
#define FLOAT_STK_SIZE 		128
//任务句柄
TaskHandle_t FLOATTask_Handler;
//任务函数3
void float_task(void *pvParameters);

int main(void)
{ 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
	delay_init(168);		//初始化延时函数
	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();          //开启任务调度
}
 
//开始任务任务函数0
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);        
    //浮点测试任务
    xTaskCreate((TaskFunction_t )float_task,     
                (const char*    )"float_task",   
                (uint16_t       )FLOAT_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )FLOAT_TASK_PRIO,
                (TaskHandle_t*  )&FLOATTask_Handler);  
    vTaskDelete(StartTask_Handler); //删除开始任务
    taskEXIT_CRITICAL();            //退出临界区
}

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

//LED1任务函数2
void led1_task(void *pvParameters)
{
    while(1)
    {
        LED1=0;
        vTaskDelay(200);
        LED1=1;
        vTaskDelay(800);
    }
}
//任务3
void float_task(void *pvParameters)
{
	static float float_num=0.00;
	while(1)
	{
		float_num+=0.01f;
		printf("float_num的值为: %.4f\r\n",float_num);
        vTaskDelay(1000);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栋哥爱做饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值