【星汇极客】手把手教学STM32 HAL库+FreeRTOS之创建任务(1-1)

前言

        本人是一名嵌入式学习者,在大学期间也参加了不少的竞赛并获奖,包括:江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三等

        暑假的时候参加了太多的比赛,作为队长要写代码、材料文档,几乎是比完赛过几天又要去其他比赛了,前段时间都在休息,现在才有时间来记录一下。后面会经常写一下博客分享一下,如果想了解其他项目、技术,可以去B站搜:星汇极客,主页链接:星汇极客B站

此外,还开发了个人网站,里面有一些资料和源码供下载:星汇极客

一、任务管理

1-1创建任务

说明:FreeRTOS工程不在main函数里面写功能代码,它需要我们创建、配置一个任务,在任务函数里面写功能代码。比如我们让LED闪烁、串口输出。

(0)配置CubeMX

在之前的工程基础上,配置PC13引脚输出,串口1,生成工程。

CubeMX更新生成工程后,keil出现这个,默认YES就行。

(1)在keil里添加头文件

#include "FreeRTOS.h"
#include "task.h"
#include "stdio.h"

(2)定义函数

//printf重定向函数
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

需要用到一个函数xTaskCreate();它需要输入6个参数。

BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数
                        const char * const pcName, // 任务的名字
                        const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位
为word,10表示40字节
                        void * const pvParameters, // 调用任务函数时传入的参数
                        UBaseType_t uxPriority,    // 优先级
                        TaskHandle_t * const pxCreatedTask ); // 任务句柄, 以后使用
它来操作这个任务

示例:

//任务1
void task1(void *pvParameters)
{ 
    while(1)
    {
       HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);  
       vTaskDelay(500);    /* 延时500ms */
    }
}
         //任务函数 任务名字 栈大小 任务参数 优先级  句柄
xTaskCreate(task1, "Task 1", 128,  NULL,    1,     NULL);、

创建完任务需要开启调度器 osKernelStart();函数是CubeMX生成的。

可能有人疑惑为什么不用vTaskStartScheduler();,因为 osKernelStart()里包含了vTaskStartScheduler()函数,所以只需要执行osKernelStart()函数就行了。

把代码写上去,烧录可以看到最小系统上的LED每隔500ms闪烁。

(1)严谨的创建任务模版

USER CODE BEGIN 0、USER CODE BEGIN 2里的代码重写

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

/* Task1 任务配置*/
#define TASK1_PRIO      1                   /* 任务优先级 */
#define TASK1_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            Task1Task_Handler;  /* 任务句柄 */
void task1(void *pvParameters);             /* 任务函数 */

/* Task2 任务配置*/
#define TASK2_PRIO      1                   /* 任务优先级 */
#define TASK2_STK_SIZE  128                 /* 任务堆栈大小 */
TaskHandle_t            Task2Task_Handler;  /* 任务句柄 */
void task2(void *pvParameters);             /* 任务函数 */

void task1(void *pvParameters)
{ 
    while(1)
    {
       HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);  
       vTaskDelay(500);    /* 延时1000ticks */
    }
}
void task2(void *pvParameters)
{ 
    while(1)
    {
       printf("hello world\r\n");
       vTaskDelay(1000);    /* 延时1000ticks */
    }
}

void start_task(void *pvParameters)
{
    taskENTER_CRITICAL();           /* 进入临界区,关闭中断,此时停止任务调度*/
    /* 创建任务1 */
    xTaskCreate((TaskFunction_t )task1,
                (const char*    )"task1",
                (uint16_t       )TASK1_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )TASK1_PRIO,
                (TaskHandle_t*  )&Task1Task_Handler);	
    /* 创建任务2 */
    xTaskCreate((TaskFunction_t )task2,
                (const char*    )"task2",
                (uint16_t       )TASK2_STK_SIZE,
                (void*          )NULL,
                (UBaseType_t    )TASK2_PRIO,
                (TaskHandle_t*  )&Task2Task_Handler);	

    vTaskDelete(StartTask_Handler); /* 删除开始任务 */
    taskEXIT_CRITICAL();            /* 退出临界区,重新开启中断,开启任务调度 */
}
/* USER CODE END 0 */
/* USER CODE BEGIN 2 */
//在main函数里执行这个就行了
//start_task函数,在里面创建任务1、2、3...
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);   /* 任务句柄 */											
/* USER CODE END 2 */

烧录代码,可以看到LED闪烁、串口输出了字符串。

至此,创建任务完成。下一篇:【星汇极客】手把手教学STM32 HAL库+FreeRTOS之删除任务(1-2)-CSDN博客

关注下方获取源码、资料:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星汇极客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值