尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

RT-Thread之创建线程

RT-Thread之创建线程
📅 发布时间:2026/6/22 5:41:06
使用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与我进行交流;

相关新闻

  • cias_voice_plyer_handle.c 解析
  • VirtualBox共享文件夹完全指南:实现Windows与Ubuntu无缝文件共享
  • WampServer下载安装教程(附安装包,图文并茂) - 指南

最新新闻

  • 金华渗漏维修靠谱机构盘点 2026、全屋防水堵漏正规企业实力排名一览 - 宅安选房屋修缮
  • GroupDPO:内存高效的组级直接偏好优化方法解析与实践
  • WebVM:浏览器内安全运行x86程序的革命性虚拟化技术
  • Web安全实战:FCKeditor文件上传、BlueCMS注入与RCE漏洞复现
  • 如何在98秒内转录2.5小时音频?Insanely Fast Whisper性能优化实战
  • 惠州渗漏维修靠谱机构盘点 2026、全屋防水堵漏正规企业实力排名一览 - 宅安选房屋修缮

日新闻

  • 2026速览惠州叛逆青少年学校前十大排名名单出炉 - 武汉中职最新信息发布
  • 2026上饶白蚁消杀哪家好?15年本土2大权威白蚁防治公司推荐(金盾虫控/青蚁卫士) - 我叫一
  • 天龙八部单机版终极数据管理工具:5个技巧快速掌握游戏数据编辑

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号