rt-thread线程的创建以及点灯

本文介绍了如何在STM32F103C8T6平台上使用rtthread库创建动态线程,通过LED点灯操作演示线程的基本概念,包括线程创建、参数设置以及线程间的时间片管理。
摘要由CSDN通过智能技术生成

一、线程的理解

        裸机和操作系统最大的区别就是实时性和CPU的利用率。使用RTOS可以让你能够及时的响应,但是它是单一进程的,只不过不停地在切换线程,线程是可以多个的。CPU利用率的提高,在外看就好像是同时进行的。其实线程就是任务,都是一个说法。动态线程比较灵活,可以动态创建和释放,静态线程创建的时候就已经分配好内存空间了,后期不能释放。此系列是rtthread搭载STM32标准库来实现,芯片是STM32F103C8T6,一步一步来学习。

二、线程创建与点灯

        下面LED初始化是不是很熟悉,就是PC13的常规LED初始化,推挽输出,默认低电平,看原理图就知道低电平就能点灯。

rt_thread_t被重命名过了,实际撒上它是typedef struct rt_thread *rt_thread_t;就是一个结构体指针。

rtthread接口rt_thread_create()就是创建动态线程,返回值也是rt_thread_t,所以我们要用rt_thread_t类型去定义一个结构体指针接收rt_thread_create()的返回值,这样我们就可以通过这个指针去访问线程了。

rt_thread_create()五个参数,也很好理解。第一个是线程名,你要用人家,总得给人家起个名吧;第二个是线程入口函数,填自定义函数的名字即可,因为函数名是地址,这是一个回调,线程创建成功就出触发回调函数执行。第三个是入口函数的形参,这里没用到,填空就行。第四个是创建线程要用的空间,就是栈空间。一般给512就够用了。第四个是优先级,STM32有32个优先级,从0开始到31,这里点灯随便给个值3就行。最后一个是时间片,就是允许你这个线程可以执行的最大时间。注意main()也是一个线程,因为函数总要有个入口,所以都是从main()开始的。       在入口函数中加延时rt_thread_delay(500);   /*500tick */的作用就是延时时把CPU使用权给别的线程,不然你就一直循环执行在这,别的线程就不能执行了,这是我们不允许的。现成创建成功,就会返回个地址,失败就是默认RT_NULL。延时500tick它其实去执行主线程了就是main(),执行完就返回线程继续执行。所以出来的效果就是LED交替闪烁。

#include "board.h"               //头文件合集

static rt_thread_t led1_thread = RT_NULL;

void LED_GPIO_Config(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	GPIO_ResetBits(GPIOC, GPIO_Pin_13);
} 
static void led1_thread_entry(void* parameter)
{	
	while (1)
	{
		GPIO_ResetBits(GPIOC, GPIO_Pin_13);
		rt_thread_delay(500);   /* ??500?tick */
		GPIO_SetBits(GPIOC, GPIO_Pin_13);
		rt_thread_delay(500);   /* ??500?tick */		 		
	}
}int main( void )
{
    /*LED初始化*/
    LED_GPIO_Config();
	 led1_thread =                          
    rt_thread_create( "thread1",           /*线程名*/
                      led1_thread_entry,   /*线程入口函数*/
                      RT_NULL,             /*给入口函数传递参数*/
                      512,                 /*栈的大小*/
                      3,                   /*优先级*/
                      20);                 /*时间片*/
   if (led1_thread != RT_NULL)
	{
        rt_thread_startup(led1_thread);
	}
	else
	{
		return -1;
	}  
}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RT-Thread 是一个实时操作系统,支持多线程操作。线程RT-Thread 中的基本执行单元,可以通过 RT-Thread 的 API 来创建和管理线程RT-Thread 线程创建 API 主要有以下几个: 1. rt_thread_t rt_thread_create(const char *name, void (*entry)(void *parameter), void *parameter, size_t stack_size, rt_uint8_t priority, rt_uint32_t tick); 该函数用于创建一个线程,参数如下: - name:线程的名称(必填)。 - entry:线程的入口函数(必填)。 - parameter:传递给线程入口函数的参数。 - stack_size:线程栈的大小,以字节为单位。 - priority:线程的优先级,取值范围是 0~31,数值越小优先级越高。 - tick:线程的时间片长度,以系统时钟节拍为单位。 2. void rt_thread_startup(rt_thread_t thread); 该函数用于启动一个线程,参数是线程句柄。 3. rt_thread_t rt_thread_self(void); 该函数返回当前线程的句柄。 4. rt_err_t rt_thread_delete(rt_thread_t thread); 该函数用于删除一个线程,参数是线程句柄。 5. rt_err_t rt_thread_yield(void); 该函数用于让出当前线程的时间片,让其他线程执行。 6. rt_err_t rt_thread_suspend(rt_thread_t thread); 该函数用于挂起一个线程,使其暂停执行。 7. rt_err_t rt_thread_resume(rt_thread_t thread); 该函数用于恢复一个被挂起的线程,使其继续执行。 以上是 RT-Thread 线程创建的几个基本 API,可以根据实际需求选择使用。需要注意的是,线程的优先级和时间片长度是影响线程执行顺序的重要因素,需要根据实际情况进行设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蛋骗鸡~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值