本文在第一篇文章的基础上,即移植RT-Thread Nano后创建一个动态线程,实现LED4间隔500毫秒的亮灭。
开发平台:Keil MDK 5.24
硬件平台:XNUCLEO-F103RB 链接地址
移植系统:RT-Thread Nano V3.1.3 下载链接
这部分并不复杂,直接上代码
-
#include <rtthread.h>
-
#include "stm32f10x.h"
-
#include "gpio.h"
-
-
-
static void led_thread_init(void);
-
static void led_thread_entry(void);
-
-
int main(void)
-
{
-
GpioInit();
-
-
led_thread_init();
-
-
while(
1)
-
{
-
/* LED3间隔2秒亮灭 */
-
GPIO_WriteBit(LED3_GPIO_Port, LED3_GPIO_Pin, Bit_SET);
-
rt_thread_mdelay(
2000);
-
GPIO_WriteBit(LED3_GPIO_Port, LED3_GPIO_Pin, Bit_RESET);
-
rt_thread_mdelay(
2000);
-
}
-
-
return
0;
-
}
-
-
-
/* led4线程初始化 */
-
static void led_thread_init(void)
-
{
-
/* 创建线程 */
-
rt_thread_t led_task_tid = rt_thread_create(
"led4",
/* 线程名称 */
-
led_thread_entry, RT_NULL,
-
1024,
3,
10);
//
-
if(led_task_tid != RT_NULL)
-
{
-
/* 启动线程 */
-
rt_thread_startup(led_task_tid);
-
rt_kprintf(
"LED4 thread is already started\n");
-
}
-
else
-
{
-
rt_kprintf(
"LED4 thread is not started\n");
-
}
-
}
-
-
-
static void led_thread_entry(void)
-
{
-
while(
1)
-
{
-
/* LED4间隔500ms亮灭 */
-
GPIO_WriteBit(LED4_GPIO_Port, LED4_GPIO_Pin, Bit_SET);
-
rt_thread_mdelay(
500);
-
GPIO_WriteBit(LED4_GPIO_Port, LED4_GPIO_Pin, Bit_RESET);
-
rt_thread_mdelay(
500);
-
}
-
}
下载程序后,通过控制台可以看到(关于控制台在第三篇介绍)可以看到闪烁LED4的线程的信息,下图中led4即为我们创建线程时写入的名称。
rt_thread_t led_task_tid = rt_thread_create("led4",/* 线程名称 */
led_thread_entry, RT_NULL,1024, 3, 10);
实现现象:
从上面程序和实验可以看出,LED3间隔2秒亮灭,LED4间隔500毫秒亮灭,主程序程序上的rt_thread_mdelay(2000)并有没有影响到线程上的LED4的闪烁。RT-Thread 提供的 rt_thread_mdelay()
函数可以引起操作系统进行调度,当调用该函数进行延时时,本线程将不占用 CPU,调度器切换到系统的其他线程开始运行。而裸机的 delay 函数是一直占用 CPU 运行的。