RT-Thread Nano初识(3)-线程管理

线程管理

下图描述了线程的相关操作,包含:创建 / 初始化线程、启动线程、运行线程、删除 / 脱离线程。可以使用 rt_thread_create() 创建一个动态线程,使用 rt_thread_init() 初始化一个静态线程,动态线程与静态线程的区别是:动态线程是系统自动从动态内存堆上分配栈空间与线程句柄(初始化 heap 之后才能使用 create 创建动态线程),静态线程是由用户分配栈空间与线程句柄。
只有#define RT_USING_HEAP才能实现动态分配内存
image

创建线程

一个线程要成为可执行的对象,就必须由操作系统的内核来为它创建一个线程。可以通过如下的接口创建一个动态线程:

点击查看代码
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);
	}
}

实验现象:

image

posted @ 2022-09-06 11:31  IC小菜叶  阅读(211)  评论(0编辑  收藏  举报