Bootstrap

老李的RT-THREAD学习05--线程

函数介绍

用到的函数有2个,分别是 “rt_thread_init”“rt_thread_startup”,很显然第1个是线程初始化,第2个是线程启动。

函数说明 rt_thread_init

rt_err_t rt_thread_init(struct rt_thread *thread,
                        const char       *name,
                        void (*entry)(void *parameter),
                        void             *parameter,
                        void             *stack_start,
                        rt_uint32_t       stack_size,
                        rt_uint8_t        priority,
                        rt_uint32_t       tick)

说明如下:
*thread: 线程结构体指针,后续对线程的操作通过它来进行
*name: 线程名,是一个字符串
*parameter: 线程的入口参数,没有的话,就是RT_NULL
*stack_start:线程栈的起始地址,为本线程分配内存的起始地址
stack_size: 线程栈的空间,为本线程分配多大的内存
priority:线程优先级,数字越小,优先级越高
tick:线程占用的时间长度,单位毫秒

函数说明 rt_thread_startup

rt_err_t rt_thread_startup(rt_thread_t thread)

这个简单,就一个参数,线程结构体

在工程中增加线程文件

新建一个文件夹,并增加2个文件,一个是C文件,一个是头文件,如下图,在applications上点右键,新建文件夹,即可。Studio会在硬盘相应的位置,同步的创建文件夹。

在这里插入图片描述
头文件需要指定路径
在这里插入图片描述

完整代码

/*
 * Copyright (c) 2006-2020, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2021-02-10     Administrator       the first version
 */
#ifndef APPLICATIONS_LL_LIB_LL_THREAD_C_
#define APPLICATIONS_LL_LIB_LL_THREAD_C_

#include <rtthread.h>
#include <rtdevice.h>
#include "board.h"

#include "LL_thread.h"


#define THREAD_PRIORITY     25      //线程优先级
#define THREAD_STACK_SIZE   512     //栈的大小
#define THREAD_TIME_SLICE   5       //时间片的长度,单位是毫秒

#define LED0_PIN    GET_PIN(A, 7)

ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t thread_stack[THREAD_STACK_SIZE];
static struct rt_thread thread1;


static void thread_led1_flash(void *parameter)  //线程主体
{
    uint32_t i;
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);

    while(1)
    {
        //LED闪灯
        rt_pin_write(LED0_PIN, 0);
        rt_kprintf("LED1 Flash\r\n");

        if(i%2 == 0)
            rt_pin_write(LED0_PIN, 1);
        else
            rt_pin_write(LED0_PIN, 0);

        i++;
        rt_thread_mdelay(300);
    }
}


void thread_led1_flash_start(void)   //启动线程
{
    rt_thread_init(&thread1,            //线程结构体
                    "led1_flash",       //线程名
                    thread_led1_flash,  //线程函数
                    RT_NULL,
                    thread_stack,
                    THREAD_STACK_SIZE,
                    THREAD_PRIORITY,
                    THREAD_TIME_SLICE);
    rt_thread_startup(&thread1);

//    rt_thread_init(thread, name, entry, parameter, stack_start, stack_size, priority, tick)
}


#endif /* APPLICATIONS_LL_LIB_LL_THREAD_C_ */

注意2点

1 初始化后一定要启动线程
2 线程函数里面是一个死循环,否则线程只运行一次就退出了

;