RT-Thread Nano初识(3)-线程管理
线程管理
下图描述了线程的相关操作,包含:创建 / 初始化线程、启动线程、运行线程、删除 / 脱离线程。可以使用 rt_thread_create() 创建一个动态线程,使用 rt_thread_init() 初始化一个静态线程,动态线程与静态线程的区别是:动态线程是系统自动从动态内存堆上分配栈空间与线程句柄(初始化 heap 之后才能使用 create 创建动态线程),静态线程是由用户分配栈空间与线程句柄。
只有#define RT_USING_HEAP
才能实现动态分配内存
创建线程
一个线程要成为可执行的对象,就必须由操作系统的内核来为它创建一个线程。可以通过如下的接口创建一个动态线程:
点击查看代码
rt_thread_t rt_thread_create(const char* name,
void (*entry)(void* parameter),
void* parameter,
rt_uint32_t stack_size,
rt_uint8_t priority,
rt_uint32_t tick);
参数 | 描述 |
---|---|
name | 线程的名称,最大长度由RT_NAME_MAX决定 |
entry | 入口函数 |
parameter | 入口函数参数 |
stack_size | 线程栈大小 |
priority | 线程优先级RT_THREAD_PRIORITY_MAX 定义,最大256级 |
tick | 线程的时间片大小 一般用于同一优先级 |
返回值 | --- |
thread | 线程创建成功,返回线程句柄 |
RT_NULL | 线程创建失败 |
线程创建完毕后,调用rt_thread_startup函数使线程进入就绪列表中。
rt_err_t rt_thread_startup(rt_thread_t thread);
关于线程管理的更多介绍,可参考官方文档线程管理
MDK创建线程模拟
我们计划让PA0引脚1s反转一次,PA1引脚2s反转一次。
主线程
在系统启动时,系统会创建 main 线程,它的入口函数为 main_thread_entry(),用户的应用入口函数 main() 就是从这里真正开始的,系统调度器启动后,main 线程就开始运行,用户可以在 main() 函数里添加自己的应用程序初始化代码。
点击查看代码
int main()
{
while(1)
{
LedToggle(GPIOA,GPIO_Pin_0);
rt_thread_mdelay(1000);
}
}
LED线程
点击查看代码
void TaskInit(void)
{
led_thread = rt_thread_create("led",
led_thread_entry,
RT_NULL,
256,
2,
10);
if(led_thread != RT_NULL)
rt_thread_startup(led_thread);
}
void led_thread_entry(void *parameter)
{
for(;;)
{
LedToggle(GPIOA,GPIO_Pin_1);
rt_thread_mdelay(2000);
rt_kprintf("System Running: %d s\n",rt_tick_get()/RT_TICK_PER_SECOND);
}
}