1 前言

通过Shell可以跟子系统打交道,子系统也可以提供很多接口供外部设置和读取信息。

下面就Shell的Kconfig配置、Shell的使用以及如何新建一个Shell命令展开。

可以说Shell是一窥内核究竟的管道,有了这个管道能使开发事半功倍。

有时为了开发和调试需求,还需要新增命令。

2 Shell相关配置

CONFIG_CONSOLE_SHELL是Shell子系统的开关,打开某一个模块的Shell,比如NET可以通过CONFIG_NET_SHELL=y。

子模块的使能必须基于CONFIG_CONSOLE_SHELL。

如果要新增一个Shell配置,需要在使能CONFIG_CONSOLE_SHELL的情况下,在对应子模块中的Kconfig新增一个选项。

3 新增一个Shell命令

新增一个Shell命令,有如下步骤。

1. 新增一个选项,当然必须在定义CONFIG_CONSOLE_SHELL情况下才有效。

2. 通过SHELL_REGISTER.注册一个新命令,包括命令名称和回调函数。

shell命令结构体:

struct shell_cmd {
const char *cmd_name;---------------子命令名称
shell_cmd_function_t cb;------------子命令回调
const char *help;-------------------子命令帮助信息
};

3.1 kernel命令走读

kernel命令提供了获取

#if defined(CONFIG_INIT_STACKS)
static int shell_cmd_stack(int argc, char *argv[])
{
k_call_stacks_analyze();
return ;
}
#endif struct shell_cmd kernel_commands[] = {-----------------------------------------shell_cmd类型的结构体数组
{ "version", shell_cmd_version, "show kernel version" },--------------------
{ "uptime", shell_cmd_uptime, "show system uptime in milliseconds" },
{ "cycles", shell_cmd_cycles, "show system hardware cycles" },
#if defined(CONFIG_OBJECT_TRACING) && defined(CONFIG_THREAD_MONITOR)
{ "tasks", shell_cmd_tasks, "show running tasks" },
#endif
#if defined(CONFIG_INIT_STACKS)
{ "stacks", shell_cmd_stack, "show system stacks" },
#endif
{ NULL, NULL, NULL }
}; SHELL_REGISTER(SHELL_KERNEL, kernel_commands);---------------------------------通过SHELL_REGISTER注册shell这个命令,处理函数是kernel_commands。

4 Shell相关API

位于Shell API Functions.

Shell子系统初始化SYS_INIT(shell_run, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT)(shell_service.c)。

#define SHELL_PROMPT "shell> "

int shell_run(struct device *dev)
{
ARG_UNUSED(dev); shell_init(SHELL_PROMPT);
return ;
} SYS_INIT(shell_run, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT);---------------Shell子系统初始化 void shell_init(const char *str)
{
k_fifo_init(&cmds_queue);
k_fifo_init(&avail_queue); line_queue_init(); prompt = str ? str : ""; k_thread_create(&shell_thread, stack, STACKSIZE, shell, NULL, NULL,---------------创建一个shell线程处理shell命令
NULL, K_PRIO_COOP(), , K_NO_WAIT); /* Register serial console handler */
#ifdef CONFIG_UART_CONSOLE
uart_register_input(&avail_queue, &cmds_queue, completion);
#endif
#ifdef CONFIG_TELNET_CONSOLE
telnet_register_input(&avail_queue, &cmds_queue, completion);
#endif
}

Zephyr的Shell的更多相关文章

  1. Zephyr学习专题

    1 前言 本来想学习Zyphyr的Power Management,但是看着看着就被带进去了. 你看功耗,里面的suspend涉及到时间补偿相关的吧,然后就涉及到了Kernel Clocks/Time ...

  2. nRF Connect SDK(NCS)/Zephyr固件升级详解 – 重点讲述MCUboot和蓝牙空中升级

    如何在nRF Connect SDK(NCS)中实现蓝牙空中升级?MCUboot和B0两个Bootloader有什么区别?MCUboot升级使用的image格式是怎么样的?什么是SMP协议?CBOR编 ...

  3. Shell替换

    如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. #!/bin/bash a= echo -e "Value of a is ...

  4. Shell特殊变量

    $ 表示当前Shell进程的ID,即pid $echo $$ 运行结果 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数 ...

  5. shell变量

    定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名 ...

  6. 第一个shell脚本

    打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...

  7. shell简介

    Shell作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. shell使用的熟练程度反映了用户对U ...

  8. Shell碎碎念

    1. 字符串如何大小写转换 str="This is a Bash Shell script." 1> tr方式 newstr=`tr '[A-Z]' '[a-z]' < ...

  9. MongoDB学习笔记二—Shell操作

    数据类型 MongoDB在保留JSON基本键/值对特性的基础上,添加了其他一些数据类型. null null用于表示空值或者不存在的字段:{“x”:null} 布尔型 布尔类型有两个值true和fal ...

随机推荐

  1. Python 多线程、多进程 (三)之 线程进程对比、多进程

    Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.多线程与多进 ...

  2. sql script: Graphs, Trees, Hierarchies and Recursive Queries

    --------------------------------------------------------------------- -- Inside Microsoft SQL Server ...

  3. Redis 入门 安装 命令

    win7 64位安装redis 及Redis Desktop Manager使用 引自:http://blog.csdn.net/joyhen/article/details/47358999 写基于 ...

  4. java集合类学习

    以下基于jdk1.8 一. 集合类关系图 1. 接口关系图 2.集合中的类,(不包含线程安全的) 二.ArrayList 1.类定义 /** * 用“可伸缩数组”来实现List接口.实现了所有List ...

  5. 微信小程序/网站 上传图片到腾讯云COS

    COS简介: 腾讯云提供的一种对象存储服务,供开发者存储海量文件的分布式存储服务.可以将自己开发的应用的存储部分全部接入COS的存储桶中,有效减少应用服务器的带宽,请求等.个人也可以通过腾讯云账号免费 ...

  6. 利用火车头采集A67手机电影教程一

    今天将讲述:利用火车头采集A67手机电影,并导入到网站中,如果你要更多更快的教程,请访问:http://www.it28.cn/category-191.html 现在以A67中的电影中的动作片为例: ...

  7. Java集合之TreeMap源码分析

    一.概述 TreeMap是基于红黑树实现的.由于TreeMap实现了java.util.sortMap接口,集合中的映射关系是具有一定顺序的,该映射根据其键的自然顺序进行排序或者根据创建映射时提供的C ...

  8. JS列表

    promise 引用类型/值类型 ----- 对比python可变对象/不可变对象 原型继承

  9. centos6启动服务说明

    centos6启动服务说明 阅读目录 centos6.9最小化安装下的启动服务 其他服务(仅供参考,持续更新) 此表转自:参考1.参考2.另有多处补充及纠正. 1. centos6.9最小化安装下的启 ...

  10. 两个列表lst1和lst2,计算两个列表的公共元素和非公共元素

    方法1: 列表推导式 lst1 = [1, 3, 7] lst2 = [3, 5, 4] a = [x for x in lst1 if x in lst2] b = [y for y in (lst ...