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. canvas-star2.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. table垂直居中

    th,td{ text-align:center;/** 设置水平方向居中 */ vertical-align:middle/** 设置垂直方向居中 */ }

  3. JqGrid: paging int asp.net

    https://www.codeproject.com/Articles/1118363/GridView-with-Server-Side-Filtering-Sorting-and-Pa http ...

  4. Gartner2017年BI研究计划曝光,来看看他研究的都是啥?

    文 | 水手哥 本文出自:知乎专栏<帆软数据应用研究院>——数据干货&资讯集中地   近日,Gartner发布了<Analytics and Business Intelli ...

  5. Linux进程ID号--Linux进程的管理与调度(三)【转】

    Linux 内核使用 task_struct 数据结构来关联所有与进程有关的数据和结构,Linux 内核所有涉及到进程和程序的所有算法都是围绕该数据结构建立的,是内核中最重要的数据结构之一. 该数据结 ...

  6. JavaScript高级特性-数组

    1. JavaScript中的数组 在C++.Java中,数组是一种高效的数据结构,随机访问性能特别好,但是局限性也特别明显,就是数组中存放的数据必须是同一类型的,而在JavaScript中,数组中的 ...

  7. 关于解决JetBrains 激活问题

    今天升级了下JetBrains 的一系列产品,安装后打开发现以前的激活失效了. 在网上看到网友们各类屏蔽和寻找服务器,尝试了下都不太方便. 最后去rover的个人博客看了下,很给力,总能跟上JetBr ...

  8. linux系统日志自动切割工具----logrotate

    参考资料 :https://www.cnblogs.com/kevingrace/p/6307298.html 对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务 ...

  9. switch语句(初学者)

    C语言提供了另一种用于多分支选择的switch语句(常用于开关),一般形式为: switch ( 常量表达式 ) { case 常量1 :语句; case 常量2 :语句; case 常量3 :语句; ...

  10. [转]mysql和redis的区别

    转自https://www.cnblogs.com/zxh1297/p/9394108.html 1.mysql和redis的数据库类型 mysql是关系型数据库,主要用于存放持久化数据,将数据存储在 ...