编写控制一个灯的闪烁的函数。和正常函数区别就是多了void *parameter
static void led1_entry(void *parameter)
{
while(1)
{
LED0 = 0;
rt_thread_mdelay(300);
LED0 = 1;
rt_thread_mdelay(300);
}
}
利用rt_thread_create创建一个线程,led1_id是一个全局变量,用来接收线程创建成功后的句柄
static rt_thread_t led1_id = RT_NULL;
led1_id = rt_thread_create("LED1_Thread",//线程名字
led1_entry, RT_NULL,//线程入口函数,参数
512,//线程栈的大小
25,//优先级
5);//时间片的大小
参数 | 描述 |
---|---|
name | 线程的名称;线程名称的最大长度由 rtconfig.h 中的宏 RT_NAME_MAX 指定,多余部分会被自动截掉 |
entry | 线程入口函数 |
parameter | 线程入口函数参数 |
stack_size | 线程栈大小,单位是字节 |
priority | 线程的优先级。优先级范围根据系统配置情况(rtconfig.h 中的 RT_THREAD_PRIORITY_MAX 宏定义),如果支持的是 256 级优先级,那么范围是从 0~255,数值越小优先级越高,0 代表最高优先级 |
tick | 线程的时间片大小。时间片(tick)的单位是操作系统的时钟节拍。当系统中存在相同优先级线程时,这个参数指定线程一次调度能够运行的最大时间长度。这个时间片运行结束时,调度器自动选择下一个就绪态的同优先级线程进行运行 |
返回 | —— |
thread | 线程创建成功,返回线程句柄 |
RT_NULL | 线程创建失败 |
启动一个线程 rt_thread_startup
如果创建成果,就启动线程
if(led1_id != RT_NULL)
rt_thread_startup(led1_id);
同理创建第二个灯的线程,所有代码如下
在main里面调用thread_sample初始化线程就可以实现2个灯以不同的频率闪闪灯了
#include <task.h>
#include <rtthread.h>
#include "led.h"
static rt_thread_t led1_id = RT_NULL;
static void led1_entry(void *parameter)
{
while(1)
{
LED0 = 0;
rt_thread_mdelay(300);
LED0 = 1;
rt_thread_mdelay(300);
}
}
static rt_thread_t led2_id = RT_NULL;
static void led2_entry(void *parameter)
{
while(1)
{
LED1 = 0;
rt_thread_mdelay(1500);
LED1 = 1;
rt_thread_mdelay(1500);
}
}
int thread_sample()
{
led1_id = rt_thread_create("LED1_Thread",
ed1_entry, RT_NULL,
512,
25,
5);
led2_id = rt_thread_create("LED2_Thread",
led2_entry, RT_NULL,
512,
25,
5);
if(led1_id != RT_NULL)
rt_thread_startup(led1_id);
if(led2_id != RT_NULL)
rt_thread_startup(led2_id);
return 0;
}