创建rt_thread线程
Posted 旭日初扬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建rt_thread线程相关的知识,希望对你有一定的参考价值。
目录
系列文章目录
第一章:将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线程的主要内容,如果未能解决你的问题,请参考以下文章