老李的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 线程函数里面是一个死循环,否则线程只运行一次就退出了