创建rt_thread线程

Posted 旭日初扬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建rt_thread线程相关的知识,希望对你有一定的参考价值。

目录

系列文章目录

一、SRAM静态内存

1、定义线程函数

2、创建线程栈

3.主函数

二、SRAM 动态内存

1、动态内存来源

2、动态创建线程

总结


系列文章目录

第一章:将rt_thread移植到stm32

第二章:创建rt_thread线程


前言

本章学习如何使用rt_thread创建线程


一、SRAM静态内存

创建一个线程,线程使用的栈和线程控制块都使用静态内存,即 预先定义好的全局变量 ,这些预先定义好的全局变量都存在内部的 SRAM 中。

1、定义线程函数

/*******************************************************************************
* 函 数 名         : led1_thread_entry(void *parameter)
* 函数功能		     :线程函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
static void  led1_thread_entry(void *parameter)

    while(1)
		
		   LED1=0;
			rt_thread_delay(200);   /* 延时 200 个 tick */
			  LED1=1;
			rt_thread_delay(500);   /* 延时  500 个 tick */
		

2、创建线程栈

  • 线程的栈是一个全局数组。
  • 线程的栈占用的是 MCU 内部的 RAM,当线程越多的时候,需要使用的 栈空间就越大,即需要使用的 RAM 空间就越多。
  • MCU支持多少个线程取决于RAM的大小。
/*大多数系统中需要做栈空间地址对齐,例如在 ARM 体系结构中需要向 4 字节地址对齐。
实现栈对齐的方法为,在定义栈之前,放置一条 ALIGN(RT_ALIGN_SIZE)语句.*/
// 定义线程控栈时要求 RT_ALIGN_SIZE 个字节对齐 
ALIGN(RT_ALIGN_SIZE)

//  定义线程栈
static rt_uint8_t rt_led1_thread_stack[1024];

3.主函数

int main()

	//  LED1线程初始化
	rt_thread_init(&led1_thread,      //  线程控制块
	               "led1",            //  线程名字
	                led1_thread_entry, //  线程入口函数
	                RT_NULL,          //  线程入口函数
	               &rt_led1_thread_stack[0], // 线程栈起始地址
	               sizeof(rt_led1_thread_stack), //  线程栈大小,
									3,                           //  线程优先级
								  20                           //  线程时间片
								);
								rt_thread_startup(&led1_thread); /* 启动线程,开启调度 */

二、SRAM 动态内存

创建一个线程,线程使用的 栈和线程控制块是在创建线程的时候 RT-Thread 动态分配的 ,并不是预先定义好的全局变量。

1、动态内存来源

#ifdef __CC_ARM
//如果同时定义了 RT_USING_USER_MAIN 和 RT_USING_HEAP 这两个宏,表示 RT-Thread 里面创建内核对象时使用动态内存 分配方案
//堆可以是内部的 SRAM 也可以是外部的 SRAM 或 SDRAM,目前的方法 是从内部 SRAM 里面分配一部分静态内存来作为堆空间,这里配置为 4KB

// RT_USING_USER_MAIN 默认使能,通过使能或者失能 RT_USING_HEAP 这个宏来选择使用静态或者动态内存
//  动态内存与静态内存的区别:区别是使用的内存是在程序编译的时候分配还是在运行的时候分配
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
#define RT_HEAP_SIZE 1024
//从内部SRAM里面分配一部分静态内存来作为rtt的堆空间,这里配置为4KB
static uint32_t rt_heap[RT_HEAP_SIZE];
// 堆的起始地址
RT_WEAK void *rt_heap_begin_get(void)

    return rt_heap;

// 堆的结束地址
RT_WEAK void *rt_heap_end_get(void)

    return rt_heap + RT_HEAP_SIZE;

#endif
#endif

2、动态创建线程

#include "board.h"
#include "rtthread.h"

// 定义线程控栈时要求 RT_ALIGN_SIZE 个字节对齐 

//  定义线程栈

//  定义线程控制块

 static  rt_thread_t led2_thread = RT_NULL;

//  线程函数

static void  led2_thread_entry(void *parameter);

/*******************************************************************************
* 函 数 名         : main
* 函数功能		   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
int main()

	
								 
			//创建LED1线程
	led2_thread = rt_thread_create( 
					           "led1",              /* 线程名字 */
                     led2_thread_entry,   /* 线程入口函数 */
                     RT_NULL,             /* 线程入口函数参数 */
                     512,                 /* 线程栈大小 */
                     3,                   /* 线程的优先级 */
                     20);    
	
	            //  启动线程
	     if(led2_thread!=RT_NULL)
			    rt_thread_startup(led2_thread);
			 else
			    return -1;
			 






static void  led2_thread_entry(void *parameter)

    while(1)
		
		   LED2=0;
			rt_thread_delay(200);   /* 延时 200 个 tick */
			  LED2=1;
			rt_thread_delay(500);   /* 延时  500 个 tick */
		


总结

创建线程分为两种方式,分别为动态的创建线程与静态的创建线程

以上是关于创建rt_thread线程的主要内容,如果未能解决你的问题,请参考以下文章

rt_thread的消息队列

rt_thread的消息队列

rt_thread线程间通讯

rt_thread线程管理

rt_thread线程管理

RT_THREAD之工具学习