手把手建立一个线程
大家如果从RTthread的官方文档看,可能无法很清楚的完成自己的一个线程。接下来我们来一步一步开始建设自己的线程。
顺带一提,这里运用的文档来自于野火的官方文档,如果大家用的是其他品牌的板子可以去找一下自己的板子的官方网站的文档。下附野火官方历程的链接。
野火产品资料下载中心 — 野火产品资料下载中心 文档 (embedfire.com)
一,声明自己的线程
在官方文档的main.c函数里定义线程控制块(下面的操作同样处于main.c文件中),位于定义全局变量的位置。格式为
/* 定义线程控制块 */
static rt_thread_t led1_thread = RT_NULL;//静态 线程(类别) 控制块名(内容为空)
static rt_thread_t led2_thread = RT_NULL;
上面显示的是定义了两个线程控制块指针。其中led1(2)_thread的部分可以更改。
函数声明
* 函数声明
*************************************************************************
*/
static void led1_thread_entry(void* parameter);
static void led2_thread_entry(void* parameter);
二,在主函数中创建线程。
在main函数里面写下面的内容,有几个线程建立几次。
//静态内存创建,大小为512
led2_thread = /* 线程控制块指针 */
rt_thread_create( "led2", /* 线程名字 */
led2_thread_entry, /* 线程入口函数 */
RT_NULL, /* 线程入口函数参数 */
512, /* 线程栈大小 */
4, /* 线程的优先级 */
20); /* 线程时间片 */
//动态内存创建大小为sizeof(rt_led1_thread_stack)
rt_thread_init(&led1_thread, /* 线程控制块 */
"led1", /* 线程名字 */
led1_thread_entry, /* 线程入口函数 */
RT_NULL, /* 线程入口函数参数 */
&rt_led1_thread_stack[0], /* 线程栈起始地址 */
sizeof(rt_led1_thread_stack), /* 线程栈大小 */
3, /* 线程的优先级 */
20); /* 线程时间片 */
if (rt_thread_t != RT_NULL)
rt_err_t rt_thread_startup(rt_thread_t thread);/* 启动线程,开启调度 */
/*else
return -1;*/ /*(一般我们后面还会写一个返回值,用于处理未成功创建线程的问题)*/
三,编写线程的函数实现功能
线程函数实现的结构基本和main函数的结构一致。
/* 线程 1 的入口函数 */
static void led1_thread_entry(void* parameter)
{
while (1)
{
//实现的函数
LED1_ON;
rt_thread_delay(500); /* 延时500个tick */
LED1_OFF;
rt_thread_delay(500); /* 延时500个tick */
//到这里可以修改
}
}