【RT-Thread】rtt初体验——工程模板+创建线程+FINSH命令

概括

本章介绍基于固件库的rtt工程模板,并且实现线程的创建,使用FINSH命令语句查看线程任务的的信息。

添加rtt到固件库工程模板

我们首先要有一个固件库的工程模板,详细请看博主的这篇文章:固件库工程模板
相比于固件库的工程,我们的rtt工程只添加了一个文件夹:
在这里插入图片描述
我们先来看一下添加的rtt文件夹里面有什么:
在这里插入图片描述
这些是我们需要的文件,我们需要从官网下载的rtt中找到这些文件夹,然后添加进我们的工程中。
我们从官网下载此文件:
在这里插入图片描述
这是rtt的内核,对于我们使用单片机开发只需要此内核就足够了。
我们打开该文件夹,发现里面有很多文件:
在这里插入图片描述
找到我们上面提到的文件,然后添加到工程里。
我们还需要两个特别重要的文件,在bsp文件夹里:
在这里插入图片描述
直接将这两个文件复制到我们工程的USER文件里:
在这里插入图片描述
这里我们还需要自行添加一个board.h文件。
现在我们打开工程,在工程目录里添加三个分组并且在USER里添加新的文件:
在这里插入图片描述
rtt/source分组里包含rtt的源文件,就在我们添加的src文件夹里,将此文件夹里的文件全部添加到该分组里:
在这里插入图片描述
rtt/ports分组是对接我们单片机架构的接口函数,我们先打开libcup文件夹:
在这里插入图片描述
博主使用的是stm32单片机,所以是arm架构:
在这里插入图片描述
相信看到这么大家就明白了,我们只需要添加我们单片机对应的系列就行了,这里博主选择m3:
在这里插入图片描述

上面三个汇编文件是对应不同的编译软件,博主使用的是keil软件,所以只需要添加最后两个文件:
在这里插入图片描述
rtt/finsh分组是添加finsh命令语言函数文件,我们在components文件夹里找到finsh文件,添加以下文件到分组:
在这里插入图片描述
然后在小锤子里添加rtt相应的头文件:
在这里插入图片描述
下面就是进行rtt的配置了,我们先来配置board.h文件:
在这里插入图片描述
我们今后所有的用户文件都添加在这里即可,然后是board.c文件:
在这里插入图片描述
我们更改成这样,今后所有的外设初始化都在这里。
开启FINSH命令语句,我们只需要定义一个宏即可:
在这里插入图片描述
在board.c文件最后面重新两个函数:

void rt_hw_console_output( const char *str )
{
    rt_enter_critical();
	
    while ( *str != '\0' )
    {      
		
        if ( *str == '\n' )
        {
            USART_SendData( DEBUG_USARTx, '\r' );
            while ( USART_GetFlagStatus( DEBUG_USARTx, USART_FLAG_TXE ) == RESET );
        }
 
        USART_SendData( DEBUG_USARTx, *str++ );
        while ( USART_GetFlagStatus( DEBUG_USARTx, USART_FLAG_TXE ) == RESET );
    }
 
    rt_exit_critical();
}

char rt_hw_console_getchar( void )
{
    int ch = -1;
	
    if( USART_GetFlagStatus( DEBUG_USARTx, USART_FLAG_RXNE ) != RESET )
    {
        ch = (int)USART_ReceiveData( DEBUG_USARTx );
        USART_ClearFlag( DEBUG_USARTx, USART_FLAG_RXNE );
    }
    else
    {
        if( USART_GetFlagStatus( DEBUG_USARTx, USART_FLAG_ORE ) != RESET )
        {
            USART_ClearFlag( DEBUG_USARTx, USART_FLAG_TC );
        }
        rt_thread_mdelay(10);
    }
    return ch;
}

注:串口要改为自己的串口名
main.c文件内容:

/* 包含的头文件	*/ 
#include "board.h"

/* led_thread线程的静态配置 */
static struct rt_thread led_thread;
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t rt_led_thread_stack[256];
static void led_thread_entry(void* parameter);

/* print_thread线程的静态配置 */
static struct rt_thread print_thread;
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t rt_print_thread_stack[256];
static void print_thread_entry(void* parameter);

/* 函数声明 */
static void led_thread_entry(void* parameter)
{
	 while (1)
	 {
		 LED(1);
		 rt_thread_mdelay(500); 

		 LED(0);
		 rt_thread_mdelay(500); 
	 }
}

static void print_thread_entry(void* parameter)
{
	 while (1)
	 {
		 rt_kprintf("led on!\r\n");
		 rt_thread_mdelay(600); 

		 rt_kprintf("led off!\r\n");
		 rt_thread_mdelay(600); 
	 }
}

/* 提交一个任务 */
void test(void)
{
    rt_kprintf("hello RT-Thread!\n");
}
MSH_CMD_EXPORT(test , it is a test);

/* 主函数 */
int main(void)
{	
	rt_thread_init(&led_thread, 
						 "led",
						 led_thread_entry, 
						 RT_NULL, 
						 &rt_led_thread_stack[0], 
						 sizeof(rt_led_thread_stack), 
						 3, 
						 20); 
	rt_thread_startup(&led_thread); 
						 
	rt_thread_init(&print_thread, 
						 "print",
						 print_thread_entry, 
						 RT_NULL, 
						 &rt_print_thread_stack[0], 
						 sizeof(rt_print_thread_stack), 
						 5, 
						 20); 
	 rt_thread_startup(&led_thread); 
}

/********************************END OF FILE****************************/

软件仿真配置:
在这里插入图片描述
开始仿真:
在这里插入图片描述
查看线程信息:
在这里插入图片描述
提交任务:
在这里插入图片描述
至此,rtt的添加和实现就完成了,本篇文章只是让大家感受一下rtt,关于rtt几个重要的文件介绍和线程的创建博主将会在该专栏往后的文章里介绍。
例附工程模板链接:rtt工程模板

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值