FreeRTOS学习笔记 2 - 任务

目录

1. 创建任务

2. 任务睡眠

3. 开始任务

4. 实例


FreeRTOS的任务和RT Thread的进程应该是同一个概念。

1. 创建任务

#define rtosCreateThread(                               \
    handle,     /*Thread Handle*/                       \
    name,       /*Thread Name*/                         \
    entry,      /*Thread Entry*/                        \
    parameter,  /*Thread Entry Parameter*/              \
    stack,      /*the pointer of stack*/                \
    stackSize,  /*the size of stack*/                   \
    priority,   /*Thread priority*/                     \
    tick        /*The total tick of thread running*/    \
    )                                                   \
    {                                                   \
        xTaskCreate(entry, name, stackSize,             \
            parameter, priority, &handle);              \
    }

FreeRTOS也可以支持动态创建和静态创建,静态的方式通过宏定义configSUPPORT_STATIC_ALLOCATION控制开关,默认关闭,所以这里只保留动态的方式。

另外,FreeRTOS的任务不支持设定时间片属性,虽然FreeRTOS也支持同优先级按时间片执行,但是它的时间片是固定的,和系统时钟同步,即设置configTICK_RATE_HZ的参数就是时间片大小,比如设置configTICK_RATE_HZ = 1000,即1ms的时钟,那么任务也是1ms的时钟片。

其他参数的含义与RT Thread一样。

2. 任务睡眠

#define rtosThreadSleep(                                \
    tick                                                \
    )                                                   \
    {                                                   \
        vTaskDelay(tick);                               \
    }

FreeRTOS支持2个延时函数,相对延时函数vTaskDelay()和绝对延时函数vTaskDelayUntil()。vTaskDelay是在调用这个函数后延时参数tick的时间,而vTaskDelayUntil则是保证tick时间是周期的,尽管这个周期内任务可能会被其他因素影响。

3. 开始任务

FreeRTOS不能像RT Thread一样单独启动任务,只能统一启动调度器。

#define rtosThreadStartScheduler()                      \
    {                                                   \
        vTaskStartScheduler();                          \
    }

4. 实例

先创建2个同优先级的任务,由于接口一致,其实是和RT Thread例子是一样的,区别是部分参数没用到,例如tick参数是无效的。

    rtosCreateThread(
        handle1, 
        "thread1",
        thread1Entry, 
        (void *)0,
        NULL,
        256,
        RTOS_PRIORITY_MAX - 1, 
        1200);
        
    if(handle1 != NULL)
        Printf("Create Thread 1 OK\n");
        
    rtosCreateThread(
        handle2, 
        "thread2",
        thread2Entry, 
        (void *)0,
        NULL,
        256,
        RTOS_PRIORITY_MAX - 1, 
        600);

    if(handle2 != NULL)
        Printf("Create Thread 2 OK\n");

2个任务打印信息看任务切换,因为FreeRTOS的时间片是固定的,所以要把系统的tick设置大一些,configTICK_RATE_HZ设置为100,即10ms的tick。

static RTOS_THREAD_HANDLE handle1 = NULL;
static RTOS_THREAD_HANDLE handle2 = NULL;

static void thread1Entry(void *parameter)
{
    uint32_t count = 0;

    while (1)
    {
        Printf("1:%d\n", count++);
        rtosThreadYield();
    }
}

static void thread2Entry(void *parameter)
{
    uint32_t count = 0;

    while (1)
    {
        Printf("2:%d\n", count++);
        delayms(300);
    }
}

任务1打印结束后直接退出控制,任务2则是延时300ms(delayms只是单纯的延时,且不准,不涉及任务切换)。打印结果如下:

2:0
1:0
1:1
1:2
1:3
1:4
1:5
1:6
1:7
1:8
1:9

任务1打印多次后会打印一次2,一直循环这种情况,因为任务2打印一次会delay 300ms,实际任务2也是和任务1一直以10ms交替运行的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值