本文在第一篇文章的基础上,即移植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 运行的。