RT Thread FinSH组件

RT Thread FinSH组件FinSH入口rt_components_init();voidmain_thread_entry(void*parameter){externintmain(void);#ifdefRT_USING_COMPONENTS_INIT/*RT-Threadcomponentsinitialization*/rt_components_init();#endif/*RT_USING_COMPONENTS_INIT*/#ifdefRT_US

大家好,又见面了,我是你们的朋友全栈君。

FinSH 控制台

1.初始化 时序

模块初始函数

int finsh_system_init(void)

初始化函数通过 INIT_APP_EXPORT(finsh_system_init) 宏定义加入到系统组建初始化

main_thread_entry 会调用 rt_components_init(); 从而去执行”.rti_fn.” level section下的函数入口地址。

RT thread 隐式调用封装的核心机制。

一般来说会创建一个cmd.c迎来存放我们各种添加的命令函数
命令函数需要在cmd.c中声明这样连接器才能找到函数的位置,一般我们会通过包含头文件。这样cmd.c会变得臃肿。
使用MSH_CMD_EXPORT 宏定义,就会把命令执行函数的入口放到相应的section下。类似一个命令向量表。

2.Finsh架构

FinSH 是控制台,控制台主要作用是
1:接收指定端口的信息
2:解析端口信息(命令)
3:执行命令

FinSH 主体为finsh_thread_entry 线程。
线程结构为
while(1)
{

1:接收指定端口的信息: getchr()
2:解析端口信息(命令) :if字符比较 ,字符串比较
3:执行命令 :执行函数指针
}

1.接收端口信息为了减少对资源的占用使用了,等待信号量的方式
2.解析命令端口 为查询命令列表方式
3.执行命令 通过命令函数指针执行函数

3.FinSH初始化

finsh_system_init

控制台的初始需要解决几个问题,
1.命令行列表的确定

finsh_system_function_init(&FSymTabKaTeX parse error: Expected ‘EOF’, got ‘&’ at position 7: Base, &̲FSymTabLimit);

2.主处理流程(thread)finsh_thread_entry的创建

tid = rt_thread_create(FINSH_THREAD_NAME,
                           finsh_thread_entry, RT_NULL,
                           FINSH_THREAD_STACK_SIZE, FINSH_THREAD_PRIORITY, 10);

3.任务控制信号量的创建 rt_sem_init

 rt_sem_init(&(shell->rx_sem), "shrx", 0, 0);

在任务死循环中等待 输入端口接收数据,接收端口接收数据后释放信号量唤醒FinSH函数处理字符

4.明确控制台输入输出对应的物理端口

finsh_set_device(console->parent.name);

4.线程通信和收发

finsh_set_device(console->parent.name);
设置console为FinSH为其输入输出设备

设定console 设备的接收回调函数,当console设备接收中断进入后会执行回调函数
finsh_set_device->rt_device_set_rx_indicate(dev, finsh_rx_ind);
回调函数的意义是发送信号量到 finsh_getchar(); 使得FinSH获得输入

 /* release semaphore to let finsh thread rx data */
    rt_sem_release(&shell->rx_sem);

finsh_getchar()得到信号量得以基础运行。

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

rt_device_read 判断底层是否有接收到数据,没有的话,FinSH线程进入信号量等待。直到isr接收数据回调函数释放信号量

这里的回调机制是没接收一个字符就会产生一次中断,就会发送一次信号量,下个章节说明

5.添加一个自己的命令
如果命令函数没有使用会被编译器优化 , 加入 attribute((used))

#include “finsh.h”

__attribute__((used)) int LED_state4(void)
{ 
   
	rt_kprintf("LED 4 \r\n");

	rt_pin_write(LED0_PIN,0);
	rt_pin_write(LED1_PIN,0);
	rt_pin_write(LED2_PIN,0);

	return  0;

}MSH_CMD_EXPORT(LED_state4,  Led all blink);

6.FinSH 字符解析

首先对操作字符解析,使用方向按键可以实时在控制台中进行操作
键盘的输入量是单个字符,为了识别和相应用户的单次按键键入,所以采用单个字符。

 /* * handle control key * up key : 0x1b 0x5b 0x41 * down key: 0x1b 0x5b 0x42 * right key:0x1b 0x5b 0x43 * left key: 0x1b 0x5b 0x44 */
 if (ch == '\r' || ch == '\n')

当检测到回车按键和换行的时候,表示用户输入完成一条信息。对信息进行分析
1.输入信息保存入,历史信息列表
2.查找命令列表,命中后执行

6.总结
核心部分为 finsh_thread_entry
1:解析端口信息(命令)
2:执行命令
这步分可以进行移植

配置部分为RT Thread 设备驱动架构,移植过程较为复杂。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143335.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月21日 下午9:40
下一篇 2022年5月21日 下午9:40


相关推荐

  • 虚拟机桥接模式不能上网

    虚拟机桥接模式不能上网首先我的主机的有线连接是正常的,如下: 但是我的虚拟机的网络连接模式为桥接模式,但是却上不了网,如下:  我们来确认下,我的虚拟机的网络模式,如下: 设置全部都是对的,但是为什么就是不能上网呢?后来我发现,原来是虚拟网络编辑器的设置有问题,如下: 我们点击“虚拟网络编辑器”,如下: 由上图,我们可以知道,我的“桥…

    2022年4月26日
    40
  • mysql 中报1062_mysql error 1062 问题解决

    mysql 中报1062_mysql error 1062 问题解决错误编号 1062 问题分析 向唯一字段插入相同数据 解决方法 1 请检查程序是否做了修改 如果修改过 建议用我们的原程序覆盖您的修改 再次检查问题 2 如果您的站点上有 phpMyAdmin 还可以通过他检查下您的数据库中出错的表的自增字段的当前自增值是否和该表中自增字段的最大值相同 如果相同则会出现该错误 3 如果您正在转移数据库 请确认数据库的版本是否相同 4 如果以上方法还未解决 请恢复备

    2026年3月26日
    2
  • 不同数据库oracle mysql SQL Server DB2 infomix sybase分页查询语句

    不同数据库oracle mysql SQL Server DB2 infomix sybase分页查询语句

    2021年12月8日
    54
  • navicat15 永久激活码最新_最新在线免费激活

    (navicat15 永久激活码最新)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1STL5S9V8F-eyJsaWNlbnNlSW…

    2022年3月27日
    64
  • [机器学习与scikit-learn-51]:模型评估-图解分类模型的评估指标(准确率、精确率、召回率)与代码示例

    [机器学习与scikit-learn-51]:模型评估-图解分类模型的评估指标(准确率、精确率、召回率)与代码示例作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客本文网址:目录前言:第1章混淆矩阵1.1二分类的混淆矩阵1.2三分类的混淆矩阵1.3N分类的混淆矩阵1.4混淆矩阵的作用第2章准确率、精确率、召回率2.1准确率/“正确率”:预测结果正确的百分比(只关心预测结果正确的样本,包括负样本)2.2精确率:预测结果为正例样本中真实为正例的比例(只关心预测结果为正的样本)2.3召回率:所有真实样本中,判为真实样本的.

    2022年10月5日
    8
  • Vscode新建html页面没有模板「建议收藏」

    Vscode新建html页面没有模板「建议收藏」文件–>新建文件–>html结果新建的html页面没有模板然后输入!叹号,Enter即可

    2022年8月22日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号