RT-Thread操作系统学习(2)

在开始RT_Thread操作系统的学习,我们首先要学会创建线程,线程有动态和静态两种,比如:

    tid1 = rt_thread_create("t1",thread1_entry,RT_NULL,250,4,20);
    if(tid1!=RT_NULL)
    {
        rt_thread_startup(tid1);
    }

这是动态创建,个人是比较喜欢动态创建,因为可以在Finsh控制台输入list_thread观察所消耗的最大内存消耗,然后自己重新分配。

    
static rt_uint8_t   rt_led1_thread_stack[1024];

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);

这一种就属于静态创建线程。

对于笔者使用的是正点原子的水星STM32F767开发板,但是考虑RT_Thread官方并没有根据这款板子的硬件而编写相关外设,但是勇敢牛牛,不怕困难,我直接引用的STM32F767阿波罗开发板的专门例程,对于例程下载进去,会出现一点点小小的问题,根据问题提示,我直接把阿波罗的LCD外设功能关闭,然后就可以运行RT_Thread操作系统了。

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

#define LED0_PIN    GET_PIN(B, 1)

int main(void)
{
    /* set LED0 pin mode to output */
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);

    while (1)
    {
        rt_pin_write(LED0_PIN, PIN_HIGH);
        rt_thread_mdelay(500);
        rt_pin_write(LED0_PIN, PIN_LOW);
        rt_thread_mdelay(500);
    }
}

我们可以看见下载的工程里面已经写好了一个点灯例程,下载就能看见我们的LED灯亮起来了。

为了使自己更加专业,我们已经开始学习这个操作系统。

#define LED0_PIN    GET_PIN(B, 1)
#define LED1_PIN    GET_PIN(B, 0)

static rt_thread_t led0_thread=RT_NULL;
static rt_thread_t led1_thread=RT_NULL;
static void led0_thread_entry(void* parameter)
{
    while (1)
    {
        rt_pin_write(LED0_PIN, PIN_HIGH);
        rt_thread_delay(500);
        rt_pin_write(LED0_PIN, PIN_LOW);
        rt_thread_delay(500);
    }
    
}

static void led1_thread_entry(void* parameter)
{
    while (1)
    {
        rt_pin_write(LED1_PIN, PIN_HIGH);
        rt_thread_delay(300);
        rt_pin_write(LED1_PIN, PIN_LOW);
        rt_thread_delay(300);
    }
    
}
int main(void)
{
    rt_pin_mode(LED0_PIN,PIN_MODE_OUTPUT);
    rt_pin_mode(LED1_PIN,PIN_MODE_OUTPUT);
    led0_thread =rt_thread_create("led0",led0_thread_entry,RT_NULL,250,6,20);
    if(led0_thread!=RT_NULL)
    {
        rt_thread_startup(led0_thread);
    }else
    {
        return -1;
    }
    key_thread=rt_thread_create("led1",led1_thread_entry,RT_NULL,250,5,20);
    if(key_thread!=RT_NULL)
    {
        rt_thread_startup(led1_thread);
    }else
    {
        return -1;
    }
    // return 0;
}

这样我们就可以看见两个灯以不同的速度进行闪烁,我们已经能够使用多线程了。

当然能创建,就能删除,但是我先不删除,我可以使他挂起来。

rt_thread_suspend(led0_thread);

这样我们就能将线程挂起来,等待线程恢复。

rt_thread_resume(led0_thread);

这个就是恢复线程的函数。

当然在使用的时候会发现一个问题,就是使用这个函数还是无法挂起。

static rt_thread_t tid1 = RT_NULL;
static rt_thread_t tid2 = RT_NULL;

static void thread1_entry(void* parameter)
{
    rt_uint32_t count =0;
    while (1)
    {
        rt_kprintf("thread count :%d\r\n",count++);
    }
    
}

static void thread2_entry(void* parameter)
{
    rt_thread_delay(10);
    rt_thread_suspend(tid1);
    rt_thread_delay(10);
}
int main(void)
{
    tid1 = rt_thread_create("t1",thread1_entry,RT_NULL,250,4,20);
    if(tid1!=RT_NULL)
    {
        rt_thread_startup(tid1);
    }
    tid2 =rt_thread_create("t2",thread2_entry,RT_NULL,250,3,20);
    if(tid2!=RT_NULL)
    {
        rt_thread_startup(tid2);
    }
		return 0;
}

会处于一个一直线程运行的状态。但是我们在线程里面加一个延时,让出CPU,就能挂起这个线程,比如:

static rt_thread_t tid1 = RT_NULL;
static rt_thread_t tid2 = RT_NULL;

static void thread1_entry(void* parameter)
{
    rt_uint32_t count =0;
    while (1)
    {
        rt_kprintf("thread count :%d\r\n",count++);
        rt_thread_delay(10);
    }
    
}

static void thread2_entry(void* parameter)
{
    rt_thread_delay(10);
    rt_thread_suspend(tid1);
    rt_thread_delay(10);
}
int main(void)
{
    tid1 = rt_thread_create("t1",thread1_entry,RT_NULL,250,4,20);
    if(tid1!=RT_NULL)
    {
        rt_thread_startup(tid1);
    }
    tid2 =rt_thread_create("t2",thread2_entry,RT_NULL,250,3,20);
    if(tid2!=RT_NULL)
    {
        rt_thread_startup(tid2);
    }
		return 0;
}

这样就能挂起该线程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
RT-Thread操作系统资料包是为了方便开发者了解和使用RT-Thread操作系统而提供的一系列资料资源。 首先,RT-Thread操作系统资料包包含了操作系统的详细介绍和架构说明,让开发者能够了解RT-Thread的基本原理和设计思想。这对于初次接触RT-Thread的开发者来说是非常有价值的,可以帮助他们更好地理解操作系统的工作机制。 其次,RT-Thread操作系统资料包还提供了丰富的应用实例和案例分析,这些案例涵盖了不同领域的项目,如嵌入式系统、物联网设备等。这些实例可以帮助开发者更加直观地了解RT-Thread的功能和特性,以及如何在实际项目中使用RT-Thread进行开发。 此外,RT-Thread操作系统资料包还包含了详细的开发文档和API参考手册,这些文档可以为开发者提供操作系统的使用方法和开发技巧。开发者可以根据文档中的指导来进行基于RT-Thread的应用开发,从而提高开发效率和减少开发难度。 最后,RT-Thread操作系统资料包还提供了相关的开发工具和驱动程序,这些工具和驱动可以帮助开发者更好地进行开发和调试工作。开发者可以通过这些工具和驱动来实现硬件与操作系统的有效交互,加快项目的开发进度。 总的来说,RT-Thread操作系统资料包是一套全面而实用的开发资源,可以帮助开发者更好地理解和使用RT-Thread操作系统,提高开发效率和项目的成功率。无论是新手还是有经验的开发者,都能从中获得帮助和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GD32开发者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值