1.thread线程创建 //依据RT-Thread内核编程的学习记录(非内核实现)

1.thread线程的创建

/*静态线程的创建启动删除的注意点*/

在创建静态线程时,要注意分配线程控制块大小,以及线程结构体 threadx_statck[XX],

static char threadx_statck[xx];
static struct rt_thread threadx;


静态线程的创建需要使用rt_thread_init()函数

rt_thread_init()的函数返回的数据类型为rt_err_t

rt_err_t result;

result = rt_thread_init("&线程结构体的地址",                                      one
                        "名称"                                                   two
                        "线程入口函数",                                           three
                        "RT_NULL",                                               four
                        "&线程控制块首地址",                                       five
                        "线程控制块大小    sizeof()",                              six
                        "优先级",                                                 seven
                        "时间片大小"                                               eight
                        );

if(result == RT_EOK)
{
    rt_thread_startup(&threadx);
}


线程删除使用        rt_rhread_detach(&xxx);


/*动态线程的创建启动删除的注意点*/

在创建动态线程时,只需要申请一个rt_thread_t的指针,指针指为RT_NULL

static rt_thread_t tidx = RT_NULL;

动态线程的创建使用rt_thread_creat()即可,函数返回的指针使用指针tid就可以

tidx = rt_thread_creat("名称",                                                     one
                        "线程入口函数",                                             two
                        "RT_NULL",                                                three
                        "线程控制块大小        512",                                four
                        "优先级",                                                 five
                        "时间片大小"                                                six
                        );

if(tidx != RT_NULL)
{
    rt_thread_startup(tidx);
}

动态线程的删除使用 rt_thread_delete(tidx);


/*入口函数的写法*/

函数入口部分,需要添加void *parameter <该处为指针即可>

static threadx_entry(void *parameter)
{
    XXXXX
}


如果不添加将会报参数的警告


增加:线程创建中参数RT_NULL的意义,入口函数threadx_entry(void *parameter)参数的使用。

#include <rtthread.h>

#define THREAD_STACK_SIZE	1024
#define THREAD_PRIORITY	    20
#define THREAD_TIMESLICE    10

/* 线程入口 */
static void thread_entry(void* parameter)
{
    rt_uint32_t value;
    rt_uint32_t count = 0;

    value = (rt_uint32_t)parameter;
    while (1)
    {
        if(0 == (count % 5))
        {           
 rt_kprintf("thread %d is running ,thread %d count = %d\n", value ,value ,count);
            if(count > 200)
                return;            
        }
         count++;
     }  
}

int timeslice_sample(void)
{
    rt_thread_t tid;
    /* 创建线程1 */
    tid = rt_thread_create("thread1", 
                            thread_entry, (void*)1, 
                            THREAD_STACK_SIZE, 
                            THREAD_PRIORITY, THREAD_TIMESLICE); 
    if (tid != RT_NULL) 
        rt_thread_startup(tid);


    /* 创建线程2 */
    tid = rt_thread_create("thread2", 
                            thread_entry, (void*)2,
                            THREAD_STACK_SIZE, 
                            THREAD_PRIORITY, THREAD_TIMESLICE-5);
    if (tid != RT_NULL) 
        rt_thread_startup(tid);
    return 0;
}

通过这种方式,可以通过利用入口参数的不同来实现不同的功能。

猜你喜欢

转载自blog.csdn.net/xiangxistu/article/details/82753136