在开始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;
}
这样就能挂起该线程。