RT-Thread Finsh控制台组件笔记

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进行初始化,该函

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值