目的:
- 掌握线程自动创建/手动创建/主动延时/主动挂起/主动恢复/主动删除
正文
说明
1 手动创建和自动创建
2 两种主动让出 CPU 的区别
3 主动挂起及恢复
4 主动删除
#include <rtthread.h>
#define THREAD_PRIORITY 5
#define THREAD_STACK_SIZE 512
#define THREAD_TIMESLICE 5
static rt_thread_t tid1 = RT_NULL;
static rt_thread_t tid3 = RT_NULL;
//1
用于说明自动创建函数以及无限循环类型的函数的使用方法
//2
用于说明任务结束后自动删除(只要离开while这种,自动删)
//3 用于 delay 进行主动挂起/自动恢复
static void thread1_entry (void *parameter) {
rt_uint32_t count = 0;
while (1) {
rt_kprintf("thread1 count: %d \n", ++count);
rt_thread_mdelay(30); //目的保证该线程运行的基础之上,适度让出 CPU 使用权限
if (100 < count) {
break;
}
}
rt_kprintf(" thread1 exit \n");
//同时,如果 count 能够持续增加说明该函数一直被保留没有被丢弃
}
//用于说明让出 CPU 的方式一自动移到队尾
//手动创建
static void thread2_entry (void *parameter) {
while (1) {
rt_kprintf(" 1:I am thread2_entry \n");
rt_thread_yield();
rt_kprintf(" 2:I am thread2_entry \n");
rt_thread_mdelay(200);
}
}
//用于说明让出 CPU
的方式二没有比我优先级高的就继续执行
static void thread3_entry (void *parameter) {
while (1) {
rt_kprintf(" 1. I am thread3_entry \n");
rt_schedule();
rt_kprintf(" 2. I am thread3_entry \n");
rt_thread_mdelay(100);
}
}
//线程调度器钩子
static void hook_of_scheduler(struct rt_thread* from, struct rt_thread* to)
{
rt_kprintf("from: %s --> to: %s \n", from->name , to->name);
}
//空闲钩子
/*
rt_err_t rt_thread_idle_sethook(void (*hook)(void));
rt_err_t rt_thread_idle_delhook(void (*hook)(void));
*/
static void hook_normal (void) {
int temp_count = 0;
rt_kprintf("I am a idle hook \r\n");
rt_kprintf("count: %d \n", temp_count);
rt_thread_mdelay(2000);
}
//修改 线程3 的优先级,重新查看 rt_schedule() 让渡效果
//使用 control
int changePriority(void) {
int a = THREAD_PRIORITY + 1;
rt_thread_control(tid3, RT_THREAD_CTRL_CHANGE_PRIORITY, &a);
return 0;
}
ALIGN(RT_ALIGN_SIZE) //
进行栈对齐,自定义栈之前最好都对齐一下
static char thread2_stack[1024];
static struct rt_thread thread2;
int main_thread (void) {
/* 设置调度器钩子 */
//rt_scheduler_sethook(hook_of_scheduler); //可自行打开
///设置空闲钩子
//rt_thread_idle_sethook(hook_normal); //可自行打开
tid1 = rt_thread_create("thread1",
thread1_entry, RT_NULL,
THREAD_STACK_SIZE, THREAD_PRIORITY,
THREAD_PRIORITY);
if (tid1 != RT_NULL) {
rt_thread_startup(tid1);
}
rt_thread_init(&thread2, "thread2", thread2_entry, RT_NULL,
&thread2_stack, sizeof(thread2_stack), THREAD_PRIORITY,
THREAD_PRIORITY);
rt_thread_startup(&thread2);
tid3 = rt_thread_create("thread3",
thread3_entry, RT_NULL,
THREAD_STACK_SIZE, THREAD_PRIORITY,
THREAD_PRIORITY);
if (tid3 != RT_NULL) {
rt_thread_startup(tid3);
}
changePriority();
return 0;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(main_thread, thread sample);