一、RT-Thread 开发方式
当嵌入式程序员使用一款MCU开发一个功能时,程序都涉及到外设的初始化和程序逻辑,以流水灯为例,首先需要初始化对应的 IO 口,接着使用延时语句,不断的切换 IO 口的导通情况。在RTT中,外设称为设备
,而实现功能的代码称为应用
。所以,RTT有两种开发方式:
- 设备开发
- 应用开发
1. 应用开发
应用开发需要根据具体的需求而定,RTT可以通过创建多个线程(任务),来实现多个功能同时运行。
1.1 创建一个线程
可以通过一下示例程序创建一个线程:
#define THREAD_PRIORITY 25 //优先级别
#define THREAD_STACK_SIZE 512 //堆栈大小
#define THREAD_TIMESLICE 5
/* 使用静态线程时,线程的栈需要设置字节对齐 */
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t thread_stack[THREAD_STACK_SIZE];
static struct rt_thread tid1;
/* 线程 1 的入口函数 */
static void thread1_entry(void *parameter)
{
rt_uint32_t count = 0;
while (1)
{
rt_kprintf("thread1 count: %d\n", count ++);
rt_thread_mdelay(500);
}
}
/* 线程示例 */
int thread_sample(void)
{
/* 初始化线程 1,名称是 thread1,入口是 thread1_entry*/
rt_thread_init(&tid1,
"thread1",
thread1_entry,
RT_NULL,
thread_stack,
THREAD_STACK_SIZE,
THREAD_PRIORITY,
THREAD_TIMESLICE);
/* 启动线程 */
rt_thread_startup(&tid1);
return 0;
}
1.2 程序设计
将 thread_sample()
函数添加到main()
函数即可:
int main(void)
{
thread_sample();
int count = 1;
while (count++)
{
LOG_D("Hello RT-Thread!");
rt_thread_mdelay(1000);
}
return RT_EOK;
}
1.3 验证
在终端中,可以发现数据打印正常:
2. 设备开发
在裸机工程中,设这部分备的开发需要用户初始化设备,在RTT中,初始化设备的程序已经包含在系统中,所以用户只需要调用即可,非常的方便,以初始化IO为例:
#include <rtthread.h>
#include <board.h> //添加头文件
#include <rtdevice.h> //否则不能正常使用API
#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#define LED0_PIN GET_PIN(B, 8) //定义 LED 口
int main(void)
{
int count = 1;
/* set LED0 pin mode to output */
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
while (count++)
{
/* set LED0 pin level to high or low */
rt_pin_write(LED0_PIN, count % 2); //1s 翻转一次
LOG_D("Hello RT-Thread!");
rt_thread_mdelay(1000);
}
return RT_EOK;
}
由于本文使用的开发板板载的led灯连接PB8,所以此处定义了PB8位 LED0_PIN,需要注意要加入头文件,否则编译出错。这点在目前的教程中没有体现出来。