分享一下我参加rtt培训的内容吧

rt-thread nano版移植

让内核运转起来

移植选用的是rt-thread nano版,这次的移植的乞丐版,rt-thread的组件都没有移植,只有最基本的内核。

为了简单,参考了rtt提供的模板移植。我这块板是stm32f767的,和提供的模板使用的m4不一样,所以要做一些修改。

首先是创建工程,按照模板添加工程文件,配置好魔法棒中的c/c++参数,之后就开始移植了。

  1. 将下载好的rt-thread nano版的src添加到工程中,由于这里不使用rtt的组件,所以rt-thread
  2. 修改时钟,找到SystemClock_Config的实现,按照自己板子的实际情况对时钟进行修改,这里的需要用到uasrt1,所以我就在这里初始化了uasrt1的时钟。
  3. 按照板子的实际情况,在board.c中实现led、uart的bsp

实现OS Tick

此时main中使用的delay还是通过空循环实现的,为了使用内核的rt_thread_delay,还需要实现OS Tick来给RTOS提供时间节拍,ARM Cortex-M提供了一个定时器Systick,这个定时器的时钟来源于系统时钟,会周期性的溢出,一般RTOS都是使用Systick来提供OS Tick

  1. 实现SysTick_Handler,让mcu在Systick定时器溢出时给os tick的值加1,在加os tick时需要关闭中断
  2. rt_hw_board_init中给Systick初始化
  3. 更换main.c中的_delay为rt_thread_delay

效果和前面相同

实现控制台打印

调试设备少不了串口打印设备信息,rt-thread中提供了rt_kprintf来打印设备信息。进入到rt_kprintf的实现中看看

1
2
3
4
5
6
7
8
9
10
void rt_kprintf(const char *fmt, ...)
{

#ifdef RT_USING_DEVICE

#else
rt_hw_console_output(rt_log_buf);
#endif

}

可以看出rt_kprintf的实现有分情况的,如果有显示设备就在显示设备上输出,没有就通过rt_hw_console_output在控制台输出

rt_thread的rt_hw_console_output是弱定义,所以需要用户自己实现

前面实现了串口输出,因此可以直接使用bsp_uart_send作为控制台输出

此时效果如下:

实现动态内存

线程的创建是需要动态内存的,rt-thread使用rtconfig.h来控制RTOS的各个功能的开关;要想使用动态内存首先需要在rtconfig.h中打开动态内存

1
2
#define RT_USING_HEAP 
#define RT_USING_SMALL_MEM

然后需要在rt_hw_board_init中使用rt_system_heap_init对动态内存堆初始化

在main.c中创建一个线程测试rt_kprintf

效果如下:

此工程的代码地址

使用env

我的板子是stm32f767,在bsp中找到了一个stm32f7-disco的移植,就拿来用了。修改了一下工程配置,发现串口管脚都相同,就关掉sdram直接用了

效果如下:

此工程的代码地址