目录
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交替运行的。