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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GD32开发者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值