20190928 (9)RT-Thread 线程管理的实际应用案例 (6) 线程管理最后一篇

目的:
  1. 掌握线程自动创建/手动创建/主动延时/主动挂起/主动恢复/主动删除

正文
说明

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);


在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值