RTT之FinSH组件添加(含启动流程分析)

FinSH,类似于linux的shell,对于调试阶段还是很有用的,可以在完成整个程序时再关上,就是了。

常用的就是msh()模式,即shell模式,另一个C-Style模式,类似于调用C函数名的方式,不常用。

Fish的执行过程:

1、每次命令的执行都是在FinSH(tshell线程)的上下文中完成的。

在rtconfig.h中#define RT_USING_FINSH,即可以初始化FinSH线程,通过函数finsh_system_init() 完成。追踪下此函数可以发现,在shell.c文件下。并且是通过INIT_APP_EXPORT(finsh_system_init);这种自动初始化机制来调用的。

注:

这些自动初始化的函数,何时被调用呢?

从内核的启动流程上看,主要是通过rt_components_board_init()和rt_componets_init()来调用。

其中rt_hw_board_init()下rt_componets_init()这个函数会遍历所有INIT_BOARD_EXPORT声明的函数。默认只开启了串口和Pin设备。

rt_comonents_init()是在componets.c文件下void main_thread_entry(void *parameter),main线程启动时调用。

在rtdef.h中定义了6种的自动初始化类型:

 

FinSH的命令输入的实现:

FinSH命令也是在rtdef.h中实现,紧接着就是:

仿真可知,FinSH线程也是在main线程里调用rt_comonents_init()时实现,调用shell.c里的int finsh_system_init(void)创建FinSH线程。

在FinSH线程实现,接收字符,在shell.c中void finsh_thread_entry(void *parameter),调用以下函数:

static char finsh_getchar(void)
{
#ifdef RT_USING_POSIX
    return getchar();
#else
    char ch;

    RT_ASSERT(shell != RT_NULL);
    while (rt_device_read(shell->device, -1, &ch, 1) != 1)
        rt_sem_take(&shell->rx_sem, RT_WAITING_FOREVER);

    return ch;
#endif
}

一直等待信号量。

然后,接收中断服务调用rx_indicate(),通知FinSH线程有输入。可以看到在drv_usart.c中,调用了中断函数,

通过uart_isr()函数又调用了serial.c中的void rt_hw_serial_isr(struct rt_serial_device *serial, int event),这里面调用了rx_indicate()表明已经接收到了数据。然后放到FinSH线程中解析就可以了。

了解这些,其实一定可以实现FinSH的。可能遇到问题是用普通的串口工具是无法实现交互的,最好是用xshell或SecureCRT.

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guangod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值