查看: 887|回复: 1

[分享] Zephyr的shell和log功能介绍

[复制链接]
  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3908

    主题

    7522

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39756
    最后登录
    2025-8-8
    发表于 2025-2-27 09:30:21 | 显示全部楼层 |阅读模式
    之前我们从0开始新建了一个简单的Zephyr应用-从0开始打造属于自己的HelloWorld,本期就带着大家熟悉一下Zephyr的shell和log系统。


    首先给大家介绍Zephyr log系统的使用,在使用log前需要:


    1. 修改proj.conf打开log功能:
    1. CONFIG_LOG=y
    复制代码
    2. 编辑main.c使用log功能:
    1. #include <zephyr/kernel.h>
    2. #include <zephyr/logging/log.h>
    3. LOG_MODULE_REGISTER(main);
    4. int main(void)
    5. {
    6.     int32_t count = 0;
    7.     printk("Hello Zephyr!\r\n");
    8.     while (1)
    9.     {
    10.          LOG_INF("Hello from main : %d", count++);
    11.          k_sleep(K_MSEC(1000));
    12.     }
    13.     return 0;
    14. }
    复制代码
    这里通过LOG_MODULE_REGISTER注册了一个叫做main的log系统,并通过LOG_INF来进行打印,执行程序编译和下载后可以得到结果:
    12.png
    当然,还可以利用LOG_WRN和LOG_ERR来打印信息,大家可以自行体验。
    接下来是shell的使用,同样的首先要打开shell功能:


    1. 编辑proj.conf文件:
    1. CONFIG_LOG=y
    复制代码
    1. CONFIG_SHELL=y
    复制代码
    2. 重新构建下载程序查看效果:
    13.png
    3. 当然我们也可以尝试其他有用的shell选项:
    1. CONFIG_LOG=y
    2. CONFIG_LOG_CMDS=y
    3. CONFIG_SHELL=y
    4. CONFIG_SHELL_PROMPT_UART="shell>"
    5. CONFIG_SHELL_VT100_COLORS=y
    6. CONFIG_KERNEL_SHELL=y
    7. CONFIG_THREAD_MONITOR=y
    8. #add a reboot command
    9. CONFIG_REBOOT=y
    复制代码
    4. 添加一个自定义shell命令, 拷贝如下内容到main.c :
    1. #include <zephyr/shell/shell.h>

    2. static int monkey_handler(const struct shell *shell,

    3.                       size_t argc,

    4.                       char **argv)

    5. {

    6.    ARG_UNUSED(argc);

    7.    ARG_UNUSED(argv);

    8.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"\r\n");

    9.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"                 ██████████████████████████            \r\n");

    10.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"               ██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██          \r\n");

    11.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"               ██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██        \r\n");

    12.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"             ██▒▒▒▒░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░██        \r\n");

    13.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"         ██████▒▒░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░██      \r\n");

    14.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"       ██░░░░░░▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░██████  \r\n");

    15.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"       ██░░░░░░▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░██░░░░██\r\n");

    16.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"       ██░░░░░░▒▒░░░░░░░░░░██░░░░░░░░██░░░░░░░░██░░░░██\r\n");

    17.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"         ████░░▒▒░░░░░░░░░░██░░░░░░░░██░░░░░░░░██████  \r\n");

    18.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"             ██▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░██      \r\n");

    19.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"     ████      ██▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░██        \r\n");

    20.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"   ██    ██      ██▒▒░░░░░░░░░░░░░░░░░░░░░░██          \r\n");

    21.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"   ██  ██      ██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██        \r\n");

    22.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"   ██          ██▒▒▒▒▒▒▒▒░░░░░░░░░░░░▒▒▒▒▒▒▒▒██        \r\n");

    23.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"     ████    ██▒▒▒▒▒▒▒▒░░░░░░░░░░░░░░░░▒▒▒▒▒▒▒▒██      \r\n");

    24.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"         ██████▒▒▒▒▒▒▒▒░░░░░░░░░░░░░░░░▒▒▒▒▒▒▒▒██      \r\n");

    25.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"             ██▒▒▒▒██▒▒░░░░░░░░░░░░░░░░▒▒██▒▒▒▒██      \r\n");

    26.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"               ██████▒▒▒▒░░░░░░░░░░░░▒▒▒▒██████        \r\n");

    27.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"                   ██▒▒▒▒▒▒████████▒▒▒▒▒▒██            \r\n");

    28.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"                   ██░░░░██        ██░░░░██            \r\n");

    29.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"                   ██████            ██████            \r\n");

    30.    shell_fprintf(shell,SHELL_VT100_COLOR_YELLOW,"\r\n");

    31.    shell_fprintf(shell,SHELL_VT100_COLOR_CYAN,"                          I'm Super\r\n");

    32.    return 0;

    33. }

    34. SHELL_CMD_REGISTER(monkey, NULL, "I'm super.", monkey_handler);
    复制代码
    这里我们通过SHELL_CMD_REGISTER声明了一个叫做monkey的指令,其处理函数是monkey_handler, 会打印一个黄色猴子:
    14.png
    这样,我们就介绍完了shell和log系统的添加。在上一期中,我们只添加了一个main.c,在本期我们为大家补一个如果添加额外的一个.c文件,需要干两件事儿:


    1. 编辑CMakeLists.txt 添加c文件:
    1. cmake_minimum_required(VERSION 3.20.0)
    2. find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
    3. project(hello_world)
    4. target_sources(app PRIVATE src/main.c)
    5. target_sources(app PRIVATE src/t2.c)
    复制代码

    2. 创建t2.c :
    1. #include <zephyr/kernel.h>
    2. #include <zephyr/logging/log.h>
    3. // Thread configuration
    4. #define CONFIG__T2_TH_STACK_SIZE 2048
    5. #define CONFIG__T2_TH_PRIORITY 5
    6. void t2_thread_task(void *, void *, void *);
    7. K_THREAD_DEFINE(t2_thread, CONFIG__T2_TH_STACK_SIZE,
    8.                 t2_thread_task, NULL, NULL, NULL,
    9.                 CONFIG__T2_TH_PRIORITY, 0, 0);

    10. LOG_MODULE_REGISTER(t2);
    11. void t2_thread_task(void *, void *, void *)
    12. {

    13.     while (1)

    14.     {

    15.         LOG_INF("Hello from T2!");

    16.         k_sleep(K_MSEC(500));

    17.     }

    18. }
    复制代码

    3. 使用west build + west flash编译下载代码:
    15.png
    这样,即便我们后面有更复杂的工程需要添加更多的.c文件,我们也能游刃有余,处理得当!!

    qiandao qiandao
    回复

    使用道具 举报

  • TA的每日心情
    开心
    前天 16:43
  • 签到天数: 1504 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    97

    主题

    4692

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    10093
    最后登录
    2025-8-8
    发表于 2025-2-27 13:05:13 | 显示全部楼层
    感觉 这Zephyr的入门门槛有点高呢
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-10 14:16 , Processed in 0.089695 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表