Finsh控制台简介
FinSH 是 RT-Thread 的命令行组件,提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息,它可以使用串口 / 以太网 / USB 等与 PC 机进行通信。用户在控制终端输入命令,控制终端通过串口、USB、网络等方式将命令传给设备里的 FinSH,FinSH会读取设备输入命令,解析并自动扫描内部函数表,寻找对应函数名,执行函数后输出回应,回应通过原路返回,将结果显示在控制终端上。
当使用串口连接设备与控制终端时,FinSH 命令的执行流程,如下图所示:
RT-Thread启动流程:
首先,从RT-Thread系统的启动流程可以看出,RT-Thread系统启动后先运行汇编文件startup_stm32f103xe.s,再跳转C代码调用entry()函数,接着进入rtthread_startup()函数对系统进行一系列初始化动作,最后转到main()函数,具体参考RT-Thread技术手册内核启动流程。
扩展: HAL库提供4个启动文件,分别适用于不同容量的STM32芯片:
- x6.s适用于小容量产品 -------------- 16KB
- xb.s适用于中等容量产品 -------------- 64KB
- xe.s适用于大容量产品 --------------- 256KB
- xg.s适用于超大容量产品 --------------- 768KB
由于开发板型号选择STM32F103ZET6,片上Flash是512KB,因此启动文件是startup_stm32f103xe.s。
FinSH控制组件的代码分析:
1.上电执行第一条指令Reset_Handler,调用SystemInit()对系统时钟进行初始化,最后再跳转到entry()函数执行。
/**
* @brief This is the code that gets called when the processor first
* starts execution following a reset event. Only the absolutely
* necessary set is performed, after which the application
* supplied main() routine is called.
* @param None
* @retval : None
*/
.section .text.Reset_Handler
.weak Reset_Handler
.type Reset_Handler, %function
Reset_Handler:
/* Copy the data segment initializers from flash to SRAM */
ldr r0, =_sdata
ldr r1, =_edata
ldr r2, =_sidata
movs r3, #0
b LoopCopyDataInit //跳转到标签LoopCopyDataInit
CopyDataInit:
ldr r4, [r2, r3]
str r4, [r0, r3]
adds r3, r3, #4
LoopCopyDataInit:
adds r4, r0, r3
cmp r4, r1
bcc CopyDataInit
/* Zero fill the bss segment. */
ldr r2, =_sbss
ldr r4, =_ebss
movs r3, #0
b LoopFillZerobss //跳转到标签LoopFillZerobss执行
FillZerobss:
str r3, [r2]
adds r2, r2, #4
LoopFillZerobss:
cmp r2, r4
bcc FillZerobss //将.bss段初始化为0
/* Call the clock system intitialization function.*/
bl SystemInit //跳转SystemInit()函数,对系统时钟初始化
/* Call static constructors */
bl __libc_init_array
/* Call the application's entry point.*/
bl entry
bx lr
.size Reset_Handler, .-Reset_Handler
2.在RT-Thread的内核中components.c文件中,rtthread_startup()函数分别被$$sub$$main()、__low_level_init()、entry()函数调用,其中分别对应编译平台为MDK,IAR和GCC。本工程编译环境默认是GCC环境编译。
3.在rtthread_startup()函数中,主要是rt-thraed进行板级的一些初始化。其中rt_hw_board_init()函数对一些板级硬件的初始化,该函数在drv_common.c中被定义。
4.在函数rt_hw_board_init()函数中首先通过调用rt_usart_init()函数对uart进行初始化,该函数在d