人若无名 便可潜心练剑.|

hazy1k

园龄:7个月粉丝:14关注:0

2025-03-03 13:23阅读: 2评论: 0推荐: 0

第4章 创建多任务-SRAM动态内存

第四章 创建多任务-SRAM动态内存

创建多任务只需要按照创建单任务的套路依葫芦画瓢即可,接下来我们创建两个任务,任务 1 让一个 LED 灯闪烁,任务 2 让另外一个 LED 闪烁,两个 LED 闪烁的频率不一样

#include "FreeRTOS.h"
#include "task.h"
#include "uart.h"
#include "led.h"

/* 任务句柄 */
static TaskHandle_t AppTaskCreate_Handle = NULL; // 创建任务句柄
static TaskHandle_t LED1_Task_Handler = NULL; // LED1任务句柄
static TaskHandle_t LED2_Task_Handler = NULL; // LED2任务句柄

/* 内核对象句柄 */
/* 全局变量声明 */

/* 任务函数声明 */
static void AppTaskCreate(void); // 创建任务函数
static void LED1_Task(void* pvParameters); // LED1任务函数
static void LED2_Task(void* pvParameters); // LED2任务函数
static void BSP_Init(void); // 板级初始化函数

// 主函数启动流程
/*
    1.BSP初始化
    2.创建APP任务
    3.启动FreeRTOS,开启调度
*/
int main(void)
{
    BaseType_t xReturn = pdPASS; // 定义一个创建信息返回值,默认为pdPASS
    BSP_Init(); // 板级初始化
    printf("FreeRTOS SRAM Dynamic Create Multi Task Example\r\n");
    // 创建AppTaskCreate任务   
    xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,
                        (const char*    )"AppTaskCreate",
                        (uint16_t       )512,  
                        (void*          )NULL,
                        (UBaseType_t    )1, 
                        (TaskHandle_t*)&AppTaskCreate_Handle); 
    if(xReturn == pdPASS)
    {
        vTaskStartScheduler(); // 启动FreeRTOS
        printf("FreeRTOS Start Success\r\n");
    }
    else
    {
        return -1;
    }
    while(1);
}

// 为了方便管理,所有任务创建函数都在AppTaskCreate中实现
static void AppTaskCreate(void)
{
    BaseType_t xReturn = pdPASS;
    taskENTER_CRITICAL(); // 进入临界区
    xReturn = xTaskCreate((TaskFunction_t)LED1_Task, // 任务入口函数
                         (const char*)"LED1_Task",   // 任务名称
                         (uint16_t)512,             // 任务堆栈大小
                         (void*)NULL,              // 任务入口函数参数
                         (UBaseType_t)2,            // 任务优先级
                         (TaskHandle_t*)&LED1_Task_Handler);// 任务控制块指针                           
    if(xReturn == pdPASS)
    {
        printf("Create LED1_Task Success\r\n");
    }
    xReturn = xTaskCreate((TaskFunction_t)LED2_Task, // 任务入口函数
                         (const char*)"LED2_Task",   // 任务名称
                         (uint16_t)512,             // 任务堆栈大小
                         (void*)NULL,              // 任务入口函数参数
                         (UBaseType_t)3,            // 任务优先级
                         (TaskHandle_t*)&LED2_Task_Handler);// 任务控制块指针                           
    if(xReturn == pdPASS)
    {
        printf("Create LED2_Task Success\r\n");
    }
    vTaskDelete(AppTaskCreate_Handle);
    taskEXIT_CRITICAL(); // 退出临界区
}

// LED1任务函数
static void LED1_Task(void* pvParameters)
{
    while(1)
    {
        LED1_ON();
        printf("LED1 ON\r\n");
        vTaskDelay(500);
        LED1_OFF();
        printf("LED2 OFF\r\n");
        vTaskDelay(500);
    }
}

// LED2任务函数
static void LED2_Task(void* pvParameters)
{
    while(1)
    {
        LED2_ON();
        printf("LED2 ON\r\n");
        vTaskDelay(1000);
        LED2_OFF();
        printf("LED2 OFF\r\n");
    }
}

// 板级初始化函数
static void BSP_Init(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); // 设置中断优先级分组4
    LED_Init();
    USART_Config();
}

目前多任务我们只创建了两个,如果要创建 3 个、 4 个甚至更多都是同样的套路,容易忽略的地方是任务栈的大小,每个任务的优先级。大的任务,栈空间要设置大一点,重要的任务优先级要设置的高一点。

本文作者:hazy1k

本文链接:https://www.cnblogs.com/hazy1k/p/18748025

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   hazy1k  阅读(2)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起