发帖
16 0 0

【Freertos】xTaskCreate创建任务

noonezero
论坛元老

27

主题

472

回帖

7626

积分

论坛元老

积分
7626
小安派&M61基本系统教程 1615 16 2024-2-27 20:48:17

[i=s] 本帖最后由 noonezero 于 2024-2-28 08:50 编辑 [/i]<br /> <br />

本帖最后由 noonezero 于 2024-2-27 20:58 编辑

用法

BaseType_t xTaskCreate(    TaskFunction_t pvTaskCode,
                            const char * const pcName,
                            const configSTACK_DEPTH_TYPE uxStackDepth,
                            void *pvParameters,
                            UBaseType_t uxPriority,
                            TaskHandle_t *pxCreatedTask
                          );
parameter description
pvTaskCode 永不退出的 C 函数,实现常通常是一个死循环。填要执行的函数名
pcName Task名称,自定义
uxStackDepth 用于告诉内核为它分配多大的栈空间
pvParameters 要传递的参数,为空指针
uxPriority 是一个无符号的整形数,表示优先级的大小,数值越大优先级越大
pxCreatedTask 用于传出任务的句柄

示例

#include <FreeRTOS.h>
#include <task.h>
#include "board.h"
#include "bflb_gpio.h"      //gpio头文件
#include "log.h"


#define DBG_TAG "MAIN"

void task_led0(void){
    struct bflb_device_s *gpio;             // 初始化一个结构体指针作为外设句柄命名为gpio,
    gpio = bflb_device_get_by_name("gpio");
    // gpio初始化,第一个参数为句柄,第二个参数为pin,第三个为GPIO的配置,这里配置为输出、上拉、滤波打开、驱动等级0
    bflb_gpio_init(gpio, GPIO_PIN_0, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_3);
    LOG_I("Hello task_led0\r\n");
    while(1){
        bflb_gpio_set(gpio, GPIO_PIN_0);    // 将pin0设置为高电平
        LOG_I("GPIO0 -> HIGH");
        vTaskDelay(3000/portTICK_RATE_MS);  // 总时间/单次tick时间
        bflb_gpio_reset(gpio, GPIO_PIN_0);
        LOG_I("GPIO0 -> LOW");
        vTaskDelay(3000/portTICK_RATE_MS);  // 总时间/单次tick时间
    }
}

void task_led1(void){
    struct bflb_device_s *gpio;             // 初始化一个结构体指针作为外设句柄命名为gpio,
    gpio = bflb_device_get_by_name("gpio");
    // gpio初始化,第一个参数为句柄,第二个参数为pin,第三个为GPIO的配置,这里配置为输出、上拉、滤波打开、驱动等级0
    bflb_gpio_init(gpio, GPIO_PIN_1, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_3);
    LOG_I("Hello task_led1\r\n");
    while(1){
        bflb_gpio_set(gpio, GPIO_PIN_1);    // 将pin0设置为高电平
        LOG_I("GPIO1 -> HIGH");
        vTaskDelay(1000/portTICK_RATE_MS);  // 总时间/单次tick时间
        bflb_gpio_reset(gpio, GPIO_PIN_1);
        LOG_I("GPIO1 -> LOW");
        vTaskDelay(1000/portTICK_RATE_MS);  // 总时间/单次tick时间
    }
}


int main(void)
{
    board_init();
    LOG_I("FreeRTOS begin!\r\n");

    // 创建任务
    xTaskCreate(task_led0, (char*)"blink0", 1024, NULL, 1, NULL);
    xTaskCreate(task_led1, (char*)"blink1", 1024, NULL, 1, NULL);

    // 启动调度器  
    vTaskStartScheduler();  
}

小安派S1引脚

接口图.png

执行效果

image.png

总结

点灯演示视频没法上传,贴LOG日志,效果一样

本次例程创建两个点灯任务,任务优先级为1,任务对应小安派的IO1和IO0,

IO0,3s亮,3s灭

IO1,1s亮,1s灭

实现了两个io不同频率点灯

本次例程中延时使用vTaskDelay,用来延时,

具体用法见下篇帖子

如果有代码问题,请留言,工程文件会放在评论区,大家自取

──── 0人觉得很赞 ────

使用道具 举报

2024-2-27 20:56:58

代码
上传的附件: Project_basic.zip (13.25 KB, 下载次数: 1)

2024-2-27 21:49:17
2024-2-28 08:34:44
2024-2-28 08:37:28
2024-2-28 08:39:54
2024-2-28 09:16:08
2024-2-28 09:26:50
2024-2-28 10:55:21
2024-2-28 11:19:16
赞一下
您需要登录后才可以回帖 立即登录
高级模式
12下一页
统计信息
  • 会员数: 28296 个
  • 话题数: 40290 篇