博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Zephyr的Shell
阅读量:7096 次
发布时间:2019-06-28

本文共 2288 字,大约阅读时间需要 7 分钟。

1 前言

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

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

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

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

 

2 Shell相关配置

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

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

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

 

 3 新增一个Shell命令

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

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

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

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 0;}#endifstruct 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子系统初始化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 0;}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(7), 0, 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}

 

转载地址:http://wvhql.baihongyu.com/

你可能感兴趣的文章
webpack实战
查看>>
虚幻4游戏开发_3_创建与继承材质
查看>>
win2003域控主备(热备)搭建
查看>>
浪潮之巅读后感
查看>>
Mathematica 函数调用发生异常时停止计算
查看>>
Linux service命令
查看>>
TCP发送源码学习(2)--tcp_write_xmit
查看>>
Android第三方开源图片裁剪截取:cropper
查看>>
C# 中英文符号互转
查看>>
ACM HDU 1219 AC me(简单题,但是花了很长时间才AC)
查看>>
Ethernet LEDs
查看>>
row_number()over函数的使用(转)
查看>>
怎样在Delphi中屏蔽Flash控件的右键弹出菜单
查看>>
[BuildRelease]Mozilla Build Tools - Autoconf + GNU Make
查看>>
DRM-内容数据版权加密保护技术学习(上):视频文件打包实现(转)
查看>>
Html.ActionLink 几种重载方式说明及例子
查看>>
使用mysql触发器脚本,解决流水数据的添加。
查看>>
SIP and RTP Stack
查看>>
Activity间用Intent、Bundle、onActivityResult进行传值
查看>>
在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。
查看>>