电子说
以 bsp>stm32f407-robomaster-c 为例
RT-Thread 下的 BSP 里适配了非常丰富的工具,但有的时候既想直接使用这些便捷的工具,又想缩减代码体量。这个时候可以选择不使用 Nano 而是对标准版的 BSP 工程进行裁剪。并且由于 STM32 已经封装了 HAL 库,裁剪掉 RTT 的设备框架后也能保留一定的兼容性和开发的便捷性。
配置 menuconfig
RT-Thread Kernel
关闭钩子函数相关;
软件定时器功能在此我选择保留使能;
debugging 功能在此我选择保留使能;
线程通信相关,如信号量、邮箱等,按需使能;
RT-Thread Components
关闭设备框架;
Hardware Drivers Config
不使用其设备框架,全部关闭;
代码修改
由于裁剪后不再使用设备驱动框架,各个使用到的外设模块需要自行初始化,于是 applications 目录下的 main.c 文件使用 STM32CubeMX 重新生成后的替换。并需要进一步的修改:不在 main 函数中进行初始化,而是使用 INIT_XXX_EXPORT 初始化,例如:
INIT_BOARD_EXPORT(MX_USART1_UART_Init);
SConscript 文件中也需要进一步的修改,添加必要的库文件
由于不再使用设备驱动框架,在 rt-threadcomponentsdriversipcSConscript 中也需要添加以下代码:
if not GetDepend('RT_USING_DEVICE'):
SrcRemove(src, 'waitqueue.c')
SrcRemove(src, 'pipe.c')
MSH 功能是保留并且需要使用的,但是由于不再使用 RT-Thread 的设备框架改为 Using console for rt_kprintf ,需要实现以下两个函数实现输入输出:rt_hw_console_output , rt_hw_console_getchar
首先实现 rt_hw_console_output
注意:RT-Thread 系统中已有的打印均以 n 结尾,而并非 rn,所以在字符输出时,需要在输出 n 之前输出 r,完成回车与换行,否则系统打印出来的信息将只有换行。
/**
*/
#define DEBUG_USART huart1
void rt_hw_console_output(const char *str)
{
while (*str!='�')
{
if (*str=='n')
{
DEBUG_USART.Instance->DR = 'r';
while (__HAL_UART_GET_FLAG(&(DEBUG_USART), UART_FLAG_TXE) == RESET);
}
DEBUG_USART.Instance->DR = *(str++);
while (__HAL_UART_GET_FLAG(&(DEBUG_USART), UART_FLAG_TXE) == RESET);
}
}
实现 rt_hw_console_getchar
char rt_hw_console_getchar(void)
{
uint8_t ch = 0;
if (__HAL_UART_GET_FLAG(&(DEBUG_USART),UART_FLAG_RXNE)!=RESET)
{
HAL_UART_Receive(&(DEBUG_USART), &ch, 1, 1);
__HAL_UART_GET_FLAG(&(DEBUG_USART), UART_FLAG_RXNE);
}
else
{
if(__HAL_UART_GET_FLAG(&(DEBUG_USART),UART_FLAG_ORE)!=RESET)
{
__HAL_UART_CLEAR_FLAG(&(DEBUG_USART), UART_FLAG_ORE);
}
}
return ch;
}
至此 Finsh 组件可以正常使用了
总结
主要基于 bsp>stm32f407-robomaster-c 裁剪出了一个包含内核基本功能,并且可以使用 RT-Thread 大部分工具的工程,大大减小代码体量。
裁剪前:
裁剪后:
全部0条评论
快来发表一下你的评论吧 !