概括
本章介绍基于固件库的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工程模板