如题。
因为官方使用cubemx生成后需要在board.c等写自定义代码,这样每次通过cubemx重新生成后会被覆盖。使用sub$$main 及super$$关键字使得在rtt在初始化之前可以通过外部进行相关配置,可以不改动rtt内核代码,即cubemx可以随意覆盖。
移植了finSH。
第一部分-安装RTT
- 安装RTT固件包
https://www.rt-thread.org/download/cube/RealThread.RT-Thread.pdsc - 安装3.1.3版本的RTT。(实测3.1.5不能部署在F1)
第二部分-CubeMX配置
我一般会把任务名长度限制改长。这样可以避免显示问题。
全开。这样可以动态创建线程。
可开可不开。我是在创建任务的时候就降低main函数优先级,把main当idle线程在用。
console的buffer我给提高了(记得对齐写256)。
finsh线程stack提高
剩下的就是按需配置外设
注意中断配置跟官方介绍不一样
重新定义HAL库时钟源(RTOS默认使用Systick)
按照如下配置(注意这个不能取消勾选!否则OS TICK或HAK_TICK不递增!)
第三部分 项目结构
包含如下两个文件:
rttinit.c
#include "rtthread.h"
#include "rttinit.h"
#include "usart.h"
#define UartHandle huart1
extern UART_HandleTypeDef huart1;
void $Sub$$rt_hw_board_init()
{
extern void rt_hw_board_init(void);
extern void $Super$$rt_hw_board_init(void);
extern void SystemClock_Config();
HAL_Init();
SystemClock_Config();
MX_USART1_UART_Init();
$Super$$rt_hw_board_init();
}
void rt_hw_console_output(const char *str)
{
rt_size_t i = 0, size = 0;
char a = '\r';
__HAL_UNLOCK(&UartHandle);
size = rt_strlen(str);
for (i = 0; i < size; i++)
{
if (*(str + i) == '\n')
{
HAL_UART_Transmit(&UartHandle, (uint8_t *)&a, 1, 1);
}
HAL_UART_Transmit(&UartHandle, (uint8_t *)(str + i), 1, 1);
}
}
char rt_hw_console_getchar()
{
int ch = -1;
if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) != RESET)
{
ch = UartHandle.Instance->DR & 0xff;
}
else
{
if(__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_ORE) != RESET)
{
__HAL_UART_CLEAR_OREFLAG(&UartHandle);
}
rt_thread_mdelay(10);
}
return ch;
}
注意更该几系固件包
rttinit.h
#include "rtthread.h"
#include "stm32f1xx_hal.h"
void $Sub$$rt_hw_board_init(void);
void rt_hw_console_output(const char *str);
char rt_hw_console_getchar(void);
默认串口1为终端串口
完毕。直接main.c下include rttinit.h就可以。
注意当while(1)中有代码,finSH才能正常交互。不知道啥问题。