/*
* RT-Thread Application
*/
#include <time.h>
#include "rtthread.h"
//-------------------------------------------------------------------------------------------------
// BSP
//-------------------------------------------------------------------------------------------------
#include "bsp.h"
#include "ls1b_gpio.h"
//-------------------------------------------------------------------------------------------------
// Simple demo of task
//-------------------------------------------------------------------------------------------------
#define LED1 54
#define LED2 55
#define LED3 2
#define LED4 3
#define ON 0
#define OFF 1
//LED初始化
void LED_IO_Config(void)
{
gpio_enable(LED1,DIR_OUT);
gpio_enable(LED2,DIR_OUT);
gpio_enable(LED3,DIR_OUT);
gpio_enable(LED4,DIR_OUT);
}
//LED控制
void LED_Waterfall1(void)
{
gpio_write(LED1,ON);
gpio_write(LED2,OFF);
rt_thread_delay(500);
gpio_write(LED1,OFF);
gpio_write(LED2,ON);
rt_thread_delay(500);
}
//LED控制
void LED_Waterfall2(void)
{
gpio_write(LED3,ON);
gpio_write(LED4,OFF);
rt_thread_delay(200);
gpio_write(LED3,OFF);
gpio_write(LED4,ON);
rt_thread_delay(200);
}
static rt_thread_t m_demo_thread = NULL;
static rt_thread_t m_demo_thread2 = NULL;
static void demo_thread(void *arg)
{
unsigned int tickcount;
for ( ; ; )
{
LED_Waterfall1();
rt_thread_delay(500);
}
}
static void demo_thread2(void *arg)
{
unsigned int tickcount;
for ( ; ; )
{
LED_Waterfall2();
rt_thread_delay(500);
}
}
//-------------------------------------------------------------------------------------------------
int main(int argc, char** argv)
{
rt_kprintf("\r\nWelcome to RT-Thread.\r\n\r\n");
LED_IO_Config();
/*
* Task initializing...
*/
m_demo_thread = rt_thread_create("demothread",
demo_thread,
NULL, // arg
1024*4, // statck size
11, // priority
10); // slice ticks
if (m_demo_thread == NULL)
{
rt_kprintf("create demo thread fail!\r\n");
}
else
{
rt_thread_startup(m_demo_thread);
}
m_demo_thread2 = rt_thread_create("demothread2",
demo_thread2,
NULL, // arg
1024*4, // statck size
11, // priority
10); // slice ticks
if (m_demo_thread2 == NULL)
{
rt_kprintf("create demo thread fail!\r\n");
}
else
{
rt_thread_startup(m_demo_thread2);
}
/*
* Finsh as another thread...
*/
return 0;
}
这段代码是一个嵌入式系统中使用 RT-Thread 操作系统的示例代码,看起来是在配置两个线程,并分别运行 demo_thread 和 demo_thread2 函数。下面是对代码的详细解释:
1.static rt_thread_t m_demo_thread = NULL; 和 static rt_thread_t m_demo_thread2 = NULL;:
2.定义了两个线程句柄,m_demo_thread 和 m_demo_thread2,并初始化为 NULL。
3.static void demo_thread(void *arg) 和 static void demo_thread2(void *arg):
4.这两个函数是线程的入口函数。demo_thread 中执行 LED_Waterfall1() 函数,而 demo_thread2 中执行 LED_Waterfall2() 函数。
5.每个线程都在一个无限循环中运行,每次循环都调用相应的 LED 控制函数,并通过 rt_thread_delay(500) 函数让线程延迟 500 个时钟节拍。
6.int main(int argc, char** argv):
7.main 函数是程序的入口点。
8.rt_kprintf("\r\nWelcome to RT-Thread.\r\n\r\n"); 用于在终端输出欢迎信息。
9.LED_IO_Config(); 调用了一个 LED IO 配置的函数,可能是初始化 LED 控制的硬件设置。
10.创建和启动线程:
11.使用 rt_thread_create 函数创建两个线程,分别是 demothread 和 demothread2。
12.每个线程的配置包括线程名字、入口函数、传递给入口函数的参数(在这里是 NULL)、栈大小、优先级和时间片大小。
13.在创建线程后,通过判断线程句柄是否为 NULL 来检查线程是否创建成功,如果成功则调用 rt_thread_startup 函数启动线程。
14.return 0;:
15.main 函数返回 0,这是标准的 C 语言程序退出方式。
总体来说,这段代码通过 RT-Thread 操作系统创建了两个线程,每个线程执行一个 LED 控制函数,实现了 LED 灯的瀑布效果。这样的设计可以使 LED 的控制与其他任务并发执行,提高系统的响应性。在嵌入式系统中,使用多线程可以更充分地利用处理器的性能,同时处理多个任务。