线程初始化
线程的初始化可以使用下面的函数接口完成:
rt_err_t rt_thread_init(struct rt_thread* thread,
const char* name,
void (entry)(void parameter), void* parameter,
void* stack_start, rt_uint32_t stack_size,
rt_uint8_t priority, rt_uint32_t tick);
rt_thread_init函数用来初始化静态线程对象。而线程句柄(或者说线程控制块指针),线程栈由用户提供。静态线程是指,线程控制块、线程运行栈一般都设置为全局变量,在编译时就被确定、被分配处理,内核不负责动态分配内存空间。需要注意的是,用户提供的栈首地址需做系统对齐(例如ARM上需要做4字节对齐)。
线程安全
安全
中断例程
可调用
函数参数
参数 描述
thread 线程句柄。线程句柄由用户提供出来,并指向对应的线程控制块内存地址。
name 线程的名称;线程名称的最大长度由rtconfig.h中定义的RT_NAME_MAX宏指定,多余部分会被自动截掉。
entry 线程入口函数;
parameter 线程入口函数参数;
stack_start 线程栈起始地址;
stack_size 线程栈大小,单位是字节。在大多数系统中需要做栈空间地址对齐(例如ARM体系结构中需要向4字节地址对齐)。
priority 线程的优先级。优先级范围根据系统配置情况(rtconfig.h中的RT_THREAD_PRIORITY_MAX宏定义),如果支持的是256级优先级,那么范围是从0 ~ 255,数值越小优先级越高,0代表最高优先级。
tick 线程的时间片大小。时间片(tick)的单位是操作系统的时钟节拍。当系统中存在相同优先级线程时,这个参数指定线程一次调度能够运行的最大时间长度。这个时间片运行结束时,调度器自动选择下一个就绪态的同优先级线程进行运行。
函数返回
返回值:返回RT_EOK;
下面给出一个线程初始化的例子,如下代码:
#include <rtthread.h>
#define THREAD_PRIORITY 25
#define THREAD_STACK_SIZE 512
#define THREAD_TIMESLICE 5
static struct rt_thread thread1;
/* 线程1栈 /
ALIGN(4)
static rt_uint8_t thread1_stack[THREAD_STACK_SIZE];
/ 线程2控制块 /
static struct rt_thread thread2;
/ 线程2栈 */
ALIGN(4)
static rt_uint8_t thread2_stack[THREAD_STACK_SIZE];
static void thread_entry(void* parameter)
{
rt_uint32_t count = 0;
rt_uint32_t no = (rt_uint32_t) parameter; /* 获得正确的入口参数 */
while (1)
{
/* 打印线程计数值输出 */
rt_kprintf("thread%d count: %d\n", no, count ++);
rt_thread_delay(10);
}
}
int rt_application_init()
{
rt_err_t result;
/* 初始化线程1 /
result = rt_thread_init(&thread1, "t1", / 线程名:t1 /
thread_entry, (void)1, /* 线程的入口是thread_entry,入口参数是1 /
&thread1_stack[0], sizeof(thread1_stack), / 线程栈是thread1_stack /
THREAD_PRIORITY, 10);
if (result == RT_EOK) / 如果返回正确,启动线程1 */
rt_thread_startup(&thread1);
else
return -1;
/* 初始化线程2 /
result = rt_thread_init(&thread2, "t2", / 线程名:t2 /
thread_entry, (void)2, /* 线程的入口是thread_entry,入口参数是2 /
&thread2_stack[0], sizeof(thread2_stack), / 线程栈是thread2_stack /
THREAD_PRIORITY + 1, 10);
if (result == RT_EOK) / 如果返回正确,启动线程2 */
rt_thread_startup(&thread2);
else
return -1;
return 0;
}
原作者:文江博客