当前位置: 首页 > news >正文

RT-Thread之创建线程

一、静态线程创建

1、thread_task.c文件

#include "thread_task.h"
#include "main.h"
#include <stdio.h>      
#include "rtthread.h"/******************************************** 线程 1 ******************************************************/
#define THREAD_1_PRIORITY  		5           /* 进程优先级 */
#define THREAD_1_STACK_SIZE		512         /* 进程栈空间大小 */
#define THREAD_1_TIMESLICE		1           /* 进程执行时间片个数 */
static char thread_1_stack[THREAD_1_STACK_SIZE];   /* 进程栈 */
static struct rt_thread thread_1_handle;        /* 进程句柄 *//******************************************** 线程 2 ******************************************************/
#define THREAD_2_PRIORITY  		5           /* 进程优先级 */
#define THREAD_2_STACK_SIZE		512         /* 进程栈空间大小 */
#define THREAD_2_TIMESLICE		1           /* 进程执行时间片个数 */
static char thread_2_stack[THREAD_1_STACK_SIZE];    /* 进程栈 */
static struct rt_thread thread_2_handle;    /* 进程句柄 */uint8_t count_1 = 0;
uint8_t count_2 = 0;/*** @brief   线程1入口函数* @param   无* @retval  无*/
void thread_1_entry(void* param)
{while(1){rt_tick_t now_tick = rt_tick_get();     /* 获取当前时间 */HAL_GPIO_TogglePin(GPIOC, LED1_Pin);rt_thread_delay_until(&now_tick, 1000);     /* 精准延时1000时间片 */}
}/*** @brief   线程2入口函数* @param   无* @retval  无*/
void thread_2_entry(void* param)
{while(1){rt_tick_t now_tick = rt_tick_get();     /* 获取当前时间 */HAL_GPIO_TogglePin(GPIOC, LED2_Pin);rt_thread_delay_until(&now_tick, 1000);     /* 精准延时1000时间片 */}}/*** @brief   创建线程任务并启动* @param   无* @retval  无*/
void ThreadStart(void)
{/* 初始化静态线程*/rt_thread_init(&thread_1_handle,		/* 线程句柄*/"thread_1",				/* 线程句柄名称*/thread_1_entry,			/* 函数入口 */RT_NULL,				/* 入口函数参数 */&thread_1_stack[0],		/* 线程栈地址 */THREAD_1_STACK_SIZE,	/* 线程栈大小 */THREAD_1_PRIORITY,		/* 线程优先级 */THREAD_1_TIMESLICE);	/* 线程时间片大小 */rt_thread_startup(&thread_1_handle); /* 启动线程 *//* 初始化静态线程*/rt_thread_init(&thread_2_handle,		/* 线程句柄*/"thread_2",				/* 线程句柄名称*/thread_2_entry,			/* 函数入口 */RT_NULL,				/* 入口函数参数 */&thread_2_stack[0],		/* 线程栈地址 */THREAD_2_STACK_SIZE,	/* 线程栈大小 */THREAD_2_PRIORITY,		/* 线程优先级 */THREAD_2_TIMESLICE);	/* 线程时间片大小 */rt_thread_startup(&thread_2_handle); /* 启动线程 */
}

2、thread_task.h文件

#ifndef __THREAD_TASK_H
#define __THREAD_TASK_H#ifdef __cplusplus
extern "C" {
#endifvoid ThreadStart(void);#ifdef __cplusplus
}
#endif#endif /* __THREAD_TASK_H */

二、静态创建线程(自定义实现调度)

1、thread_task.c文件

#include "thread_task.h"
#include "main.h"
#include <stdio.h>      
#include "rtthread.h"/******************************************** 线程 1 ******************************************************/
#define THREAD_1_CYCLE          1000        /* 进程执行周期 */
#define THREAD_1_PRIORITY  		5           /* 进程优先级 */
#define THREAD_1_STACK_SIZE		512         /* 进程栈空间大小 */
#define THREAD_1_TIMESLICE		1           /* 进程执行时间片个数 */
static char thread_1_stack[THREAD_1_STACK_SIZE];   /* 进程栈 */
static struct rt_thread thread_1_handle;        /* 进程句柄 *//******************************************** 线程 2 ******************************************************/
#define THREAD_2_CYCLE          1000        /* 进程执行周期 */
#define THREAD_2_PRIORITY  		5           /* 进程优先级 */
#define THREAD_2_STACK_SIZE		512         /* 进程栈空间大小 */
#define THREAD_2_TIMESLICE		1           /* 进程执行时间片个数 */
static char thread_2_stack[THREAD_1_STACK_SIZE];    /* 进程栈 */
static struct rt_thread thread_2_handle;    /* 进程句柄 */uint8_t count_1 = 0;
uint8_t count_2 = 0;/*** @brief   线程1入口函数* @param   无* @retval  无*/
void thread_1_entry(void* param)
{while(1){HAL_GPIO_TogglePin(GPIOC, LED1_Pin);rt_thread_suspend(&thread_1_handle);  //挂起线程rt_schedule();              //启动调度器}
}/*** @brief   线程2入口函数* @param   无* @retval  无*/
void thread_2_entry(void* param)
{while(1){HAL_GPIO_TogglePin(GPIOC, LED2_Pin);rt_thread_suspend(&thread_2_handle);  //挂起线程rt_schedule();              //启动调度器}}/*** @brief   创建线程任务并启动* @param   无* @retval  无*/
void ThreadStart(void)
{/* 初始化静态线程*/rt_thread_init(&thread_1_handle,		/* 线程句柄*/"thread_1",				/* 线程句柄名称*/thread_1_entry,			/* 函数入口 */RT_NULL,				/* 入口函数参数 */&thread_1_stack[0],		/* 线程栈其实地址 */THREAD_1_STACK_SIZE,	/* 线程栈大小 */THREAD_1_PRIORITY,		/* 线程优先级 */THREAD_1_TIMESLICE);	/* 线程时间片大小 */rt_thread_startup(&thread_1_handle); /* 启动线程 *//* 初始化静态线程*/rt_thread_init(&thread_2_handle,		/* 线程句柄*/"thread_2",				/* 线程句柄名称*/thread_2_entry,			/* 函数入口 */RT_NULL,				/* 入口函数参数 */&thread_2_stack[0],		/* 线程栈其实地址 */THREAD_2_STACK_SIZE,	/* 线程栈大小 */THREAD_2_PRIORITY,		/* 线程优先级 */THREAD_2_TIMESLICE);	/* 线程时间片大小 */rt_thread_startup(&thread_2_handle); /* 启动线程 */
}/*任务调度*/
void Task_Schedule(void)
{static uint32_t task_count = 0;if(task_count%1000 == 0)   rt_thread_resume(&thread_1_handle);if(task_count%2000 == 0)   rt_thread_resume(&thread_2_handle);rt_schedule();task_count++;//计数值达到一定值后清零,防止任务调度错乱if(task_count == 200000)	task_count = 0; 
}

2、thread_task.h文件

#ifndef __THREAD_TASK_H
#define __THREAD_TASK_H#ifdef __cplusplus
extern "C" {
#endifvoid ThreadStart(void);
void Task_Schedule(void);#ifdef __cplusplus
}
#endif#endif /* __THREAD_TASK_H */

2、修改board.c中的SysTick_Handler()函数

extern void Task_Schedule(void);void SysTick_Handler(void)
{/* 进入中断 */rt_interrupt_enter();/* 更新时基 */rt_tick_increase();/* 自定义调度函数 */Task_Schedule();/* 离开中断 */rt_interrupt_leave();
}

三、动态创建线程

1、thread_task.c文件

#include "thread_task.h"
#include "main.h"
#include <stdio.h>      
#include "rtthread.h"/******************************************** 线程 1 ******************************************************/
#define THREAD_1_PRIORITY  		5           /* 进程优先级 */
#define THREAD_1_STACK_SIZE		512         /* 进程栈空间大小 */
#define THREAD_1_TIMESLICE		1           /* 进程执行时间片个数 */
static struct rt_thread *thread_1_handle;        /* 进程句柄 *//******************************************** 线程 2 ******************************************************/
#define THREAD_2_PRIORITY  		5           /* 进程优先级 */
#define THREAD_2_STACK_SIZE		512         /* 进程栈空间大小 */
#define THREAD_2_TIMESLICE		1           /* 进程执行时间片个数 */
static struct rt_thread *thread_2_handle;    /* 进程句柄 *//*** @brief   线程1入口函数* @param   无* @retval  无*/
void thread_1_entry(void* param)
{while(1){rt_tick_t now_tick = rt_tick_get();     /* 获取当前时间 */HAL_GPIO_TogglePin(GPIOC, LED1_Pin);rt_thread_delay_until(&now_tick, 1000);     /* 精准延时1000时间片 */}
}/*** @brief   线程2入口函数* @param   无* @retval  无*/
void thread_2_entry(void* param)
{while(1){rt_tick_t now_tick = rt_tick_get();     /* 获取当前时间 */HAL_GPIO_TogglePin(GPIOC, LED2_Pin);rt_thread_delay_until(&now_tick, 1000);     /* 精准延时1000时间片 */}}/*** @brief   动态创建线程任务并启动* @param   无* @retval  无*/
void ThreadStart(void)
{/* 动态创建线程 */thread_1_handle = rt_thread_create("thread_1",				/* 线程句柄名称*/thread_1_entry,			/* 函数入口 */RT_NULL,				/* 入口函数参数 */THREAD_1_STACK_SIZE,	/* 线程栈大小 */THREAD_1_PRIORITY,		/* 线程优先级 */THREAD_1_TIMESLICE  	/* 线程时间片大小 */);rt_thread_startup(thread_1_handle); /* 启动线程 */thread_2_handle = rt_thread_create("thread_2",				/* 线程句柄名称*/thread_2_entry,			/* 函数入口 */RT_NULL,				/* 入口函数参数 */THREAD_2_STACK_SIZE,	/* 线程栈大小 */THREAD_2_PRIORITY,		/* 线程优先级 */THREAD_2_TIMESLICE  	/* 线程时间片大小 */);rt_thread_startup(thread_2_handle); /* 启动线程 */
}

2、thread_task.h文件

#ifndef __THREAD_TASK_H
#define __THREAD_TASK_H#ifdef __cplusplus
extern "C" {
#endifvoid ThreadStart(void);
void Task_Schedule(void);#ifdef __cplusplus
}
#endif#endif /* __THREAD_TASK_H */

欢迎关注个人微信公众号:比特向阳;
您也可以通过邮箱 lsk0358@163.com与我进行交流;

http://www.rkmt.cn/news/31196.html

相关文章:

  • cias_voice_plyer_handle.c 解析
  • VirtualBox共享文件夹完全指南:实现Windows与Ubuntu无缝文件共享
  • WampServer下载安装教程(附安装包,图文并茂) - 指南
  • 《从 “被动听” 到 “主动学”:课堂听讲助力大学生思维成长》
  • 用AI批量生成产品视频!Python+Google Veo 3.1 API让电商转化率飙升
  • 251019 NOIP 模拟赛 T2 | dp 及其优化、调整法最优解性质、数形结合
  • 常见问题解决 --- 未识别函数
  • 小作业 14(2018 北京高考文科)
  • AI元人文:从战略能力到价值对话的实现框架
  • Loneliness
  • Java流程控制——用户交互Scanner
  • 2025.10.26总结
  • Python实现验证码识别的完整流程解析
  • ADB命令手册 - Android Debug Bridge命令参考
  • 昨天 今天 明天
  • 刻意练习的重要性
  • 联发科技 Genio 物联网高效的平台,引领 IoT 智能新时代
  • 第6天(简单题中等题 不定长滑动窗口)
  • 详细介绍:深入理解 Scikit-learn:Python 中最常用的机器学习库
  • 主动求索:大学生应掌控学习与时间
  • 沉入 遗忘 海底 躲进 存在感的盲区 kill my memory 请把项上垃圾移去
  • 关于莫队算法
  • 2025年东莞环评公司权威推荐榜:环评手续/环评报告/环评验收一站式服务,专业高效合规首选厂家
  • 变盲从为探索:专注听课
  • 以听为基,以做为翼
  • 【ArcMap】按属性表复制字段并上移一段距离
  • WPF 关闭程序 Aforge摄像头关闭不了 问题
  • 102302139 尚子骐 数据采集与融合作业1
  • CF1152F2 Neko Rules the Catniverse (Large Version) 题解
  • 20232319 2025-2026-1 《网络与系统攻防技术》实验三实验报告