当前位置: 首页 > article >正文

OpenHarmony LiteOS-M Shell 命令开发指南

概述本文档详细介绍如何在 OpenHarmony LiteOS-M 内核中添加自定义 shell 命令以version、reboot、poweroff命令为例进行说明。目录结构kernel/liteos_m/components/shell/ ├── include/shcmd.h # 命令声明头文件 ├── src/base/shcmd.c # 命令注册实现 ├── src/cmds/ # 命令实现目录 │ ├── version_shellcmd.c # version命令实现 │ ├── reboot_shellcmd.c # reboot命令实现 │ └── poweroff_shellcmd.c # poweroff命令实现 └── BUILD.gn # 构建配置文件开发步骤第一步创建命令实现文件在kernel/liteos_m/components/shell/src/cmds/目录下创建命令实现文件。示例version_shellcmd.c#includelos_compiler.h#includelos_debug.h#includesyspara/parameter.hINT32OsShellCmdVersion(INT32 argc,constCHAR**argv){charvalue[128]{0};// 检查参数个数if(argc!0){PRINTK(Usage: version\n);return-1;}// 输出系统信息PRINTK(OpenHarmony System\n);PRINTK(Kernel: LiteOS-M\n);// 从参数系统获取版本信息if(GetParameter(const.ohos.fullname,,value,sizeof(value))0){PRINTK(Version: %s\n,value);}else{PRINTK(Version: Unknown\n);}return0;}示例reboot_shellcmd.c#includelos_compiler.h#includelos_debug.h// LS2K300 PMC寄存器地址#definePMC_BASE_ADDR0x16124000#definePMC_RESET_REG_OFFSET0x00INT32OsShellCmdReboot(INT32 argc,constCHAR**argv){if(argc!0){PRINTK(Usage: reboot\n);return-1;}PRINTK(System rebooting...\n);// 写入复位寄存器volatileUINT32*reg(volatileUINT32*)(PMC_BASE_ADDRPMC_RESET_REG_OFFSET);*reg0x1;// 第0位写1触发复位// 内存屏障确保写入完成__asm__volatile(dbar 0:::memory);return0;}示例poweroff_shellcmd.c#includelos_compiler.h#includelos_debug.h// LS2K300 PMC寄存器地址#definePMC_BASE_ADDR0x16124000#definePMC_SHUTDOWN_REG_OFFSET0x14INT32OsShellCmdPoweroff(INT32 argc,constCHAR**argv){if(argc!0){PRINTK(Usage: poweroff\n);return-1;}PRINTK(System shutting down...\n);// 写入关机寄存器volatileUINT32*reg(volatileUINT32*)(PMC_BASE_ADDRPMC_SHUTDOWN_REG_OFFSET);*reg0x3c00;// 写入0x3c00触发关机// 内存屏障__asm__volatile(dbar 0:::memory);return0;}第二步声明命令函数在kernel/liteos_m/components/shell/include/shcmd.h文件中添加命令函数声明。#ifndefSHCMD_H#defineSHCMD_H// ... 其他声明 ...// 添加新命令声明externINT32OsShellCmdVersion(INT32 argc,constCHAR**argv);externINT32OsShellCmdReboot(INT32 argc,constCHAR**argv);externINT32OsShellCmdPoweroff(INT32 argc,constCHAR**argv);#endif第三步注册命令在kernel/liteos_m/components/shell/src/base/shcmd.c文件中注册命令。找到g_shellcmdAll数组添加新命令的注册信息STATICconstSHELL_CMD_INFO_S g_shellcmdAll[]{// ... 其他命令 ...// version 命令{.cmdKeyversion,.handler(SHELL_CMD_HANDLER)OsShellCmdVersion,.helpDisplay system version information,},// reboot 命令{.cmdKeyreboot,.handler(SHELL_CMD_HANDLER)OsShellCmdReboot,.helpReboot the system,},// poweroff 命令{.cmdKeypoweroff,.handler(SHELL_CMD_HANDLER)OsShellCmdPoweroff,.helpPower off the system,},};第四步添加构建配置在kernel/liteos_m/components/shell/BUILD.gn文件中添加新源文件。sources [ # ... 其他源文件 ... src/cmds/version_shellcmd.c, src/cmds/reboot_shellcmd.c, src/cmds/poweroff_shellcmd.c, ]如果需要使用参数系统如 version 命令还需要添加依赖external_deps [ # ... 其他依赖 ... init:parameterbase, ]第五步编译测试执行编译命令cd/home/vm/oh/oh61 hb build-pls2k300_mini_dp --gn-argsbuild_xtstrue关键概念说明1. 命令函数原型INT32OsShellCmdXXX(INT32 argc,constCHAR**argv)argc: 参数个数不包括命令本身argv: 参数数组返回值: 0 表示成功非0表示失败2. 输出函数使用PRINTK宏进行输出PRINTK(Hello World\n);PRINTK(Value: %d\n,value);3. 参数解析示例INT32OsShellCmdExample(INT32 argc,constCHAR**argv){// 无参数命令if(argc!0){PRINTK(Usage: example\n);return-1;}// 带参数命令if(argc!1){PRINTK(Usage: example param\n);return-1;}PRINTK(Param: %s\n,argv[0]);return0;}4. 硬件寄存器访问// 定义寄存器地址#defineREG_BASE0x16124000#defineREG_OFFSET0x00// 访问寄存器volatileUINT32*reg(volatileUINT32*)(REG_BASEREG_OFFSET);UINT32 value*reg;// 读寄存器*reg0x1;// 写寄存器// 内存屏障LoongArch__asm__volatile(dbar 0:::memory);常见问题1. 编译错误函数未定义错误信息undefined reference to OsShellCmdXXX解决方法检查函数是否只在 .c 文件中定义一次检查头文件中是否使用了#ifndef保护检查是否有内联函数重复定义2. 运行时显示 “Unknown”问题version 命令显示 “Version: Unknown”原因参数系统未正确加载参数配置解决方法在设备配置文件中启用参数加载# device/board/loongson/ls2k300_mini_dp/liteos_m/config.gni init_feature_begetctl_liteos true3. 编译错误头文件找不到错误信息fatal error: xxx.h: No such file or directory解决方法检查头文件路径是否正确检查 BUILD.gn 中是否添加了正确的 include_dirs完整示例代码version_shellcmd.c#includelos_compiler.h#includelos_debug.h#includesyspara/parameter.hINT32OsShellCmdVersion(INT32 argc,constCHAR**argv){charvalue[128]{0};if(argc!0){PRINTK(Usage: version\n);return-1;}PRINTK(OpenHarmony System\n);PRINTK(Kernel: LiteOS-M\n);if(GetParameter(const.ohos.fullname,,value,sizeof(value))0){PRINTK(Version: %s\n,value);}else{PRINTK(Version: Unknown\n);}return0;}reboot_shellcmd.c#includelos_compiler.h#includelos_debug.h#definePMC_BASE_ADDR0x16124000#definePMC_RESET_REG_OFFSET0x00INT32OsShellCmdReboot(INT32 argc,constCHAR**argv){if(argc!0){PRINTK(Usage: reboot\n);return-1;}PRINTK(System rebooting...\n);volatileUINT32*reg(volatileUINT32*)(PMC_BASE_ADDRPMC_RESET_REG_OFFSET);*reg0x1;__asm__volatile(dbar 0:::memory);return0;}poweroff_shellcmd.c#includelos_compiler.h#includelos_debug.h#definePMC_BASE_ADDR0x16124000#definePMC_SHUTDOWN_REG_OFFSET0x14INT32OsShellCmdPoweroff(INT32 argc,constCHAR**argv){if(argc!0){PRINTK(Usage: poweroff\n);return-1;}PRINTK(System shutting down...\n);volatileUINT32*reg(volatileUINT32*)(PMC_BASE_ADDRPMC_SHUTDOWN_REG_OFFSET);*reg0x3c00;__asm__volatile(dbar 0:::memory);return0;}调试技巧1. 使用 PRINTK 调试INT32OsShellCmdTest(INT32 argc,constCHAR**argv){PRINTK(Debug: argc %d\n,argc);for(inti0;iargc;i){PRINTK(Debug: argv[%d] %s\n,i,argv[i]);}return0;}2. 检查参数系统状态#includeinit_param.hvoidCheckParamStatus(void){intretSystemGetParameter(const.ohos.fullname,value,len);PRINTK(GetParameter ret %d\n,ret);}参考资料OpenHarmony 官方文档LiteOS-M 内核开发指南LoongArch 架构参考手册

相关文章:

OpenHarmony LiteOS-M Shell 命令开发指南

概述 本文档详细介绍如何在 OpenHarmony LiteOS-M 内核中添加自定义 shell 命令,以 version、reboot、poweroff 命令为例进行说明。 目录结构 kernel/liteos_m/components/shell/ ├── include/shcmd.h # 命令声明头文件 ├── src/base/shcmd.c …...

5分钟快速上手:用Python高效下载Google卫星地图的终极指南

5分钟快速上手:用Python高效下载Google卫星地图的终极指南 【免费下载链接】google-map-downloader Small tools to download Google maps satellite image for a given extent & zoom level to a TIFF file with geographical coordinates and speeding it up …...

免费实时空气质量API接口:一站式获取AQI+PM2.5+NO2+CO+O3+SO2+PM10数据

1. 空气质量API接口的价值与应用场景 空气质量数据对现代生活的重要性不言而喻。无论是个人健康管理、企业决策还是政府监管,实时准确的空气质量信息都发挥着关键作用。作为一个开发者,我曾经在多个项目中需要集成空气质量数据,但市面上的商业…...

遥感数字图像处理教程【2.1】

2 . 非线性拉伸使用非线性拉伸函数对图像进行拉伸变化,即为非线性拉伸。常用的非线性函数有指数函数、对数函数、平 方 根 、高斯函数等。1)指数变换对于图像中亮的部分,指数变换扩大了灰度间隔,突出了细节;对于暗的部…...

C语言完美演绎7-15

/* 范例&#xff1a;7-15 */#include <string.h>#include <stdio.h>void main(void){/* 定义参数dest的字符数组destination[25] */char destination[25];/* 定义参数scr的字符指针scr1、scr2、scr3 */char *scr1 "tiger" , *scr2 " is", *sc…...

Flutter导航与路由详解

Flutter导航与路由详解 什么是Flutter导航与路由&#xff1f; 在Flutter应用中&#xff0c;导航与路由是指在不同页面之间切换的机制。Flutter提供了一套完整的导航系统&#xff0c;包括基本的页面跳转、命名路由、参数传递、路由动画等功能。 基本导航 1. 使用Navigator.p…...

AIAgent学习机制失效诊断手册(工业级Agent训练失败率下降73%的实证模型)

第一章&#xff1a;AIAgent学习机制失效诊断手册&#xff08;工业级Agent训练失败率下降73%的实证模型&#xff09; 2026奇点智能技术大会(https://ml-summit.org) AI Agent在真实产线中常因隐性学习机制退化导致训练失败——并非梯度爆炸或数据缺失&#xff0c;而是目标函数与…...

CSS Grid布局详解与实战应用

CSS Grid布局详解与实战应用 什么是CSS Grid布局&#xff1f; CSS Grid布局是一种二维布局系统&#xff0c;允许我们同时控制行和列的布局&#xff0c;为网页设计提供了更灵活的布局方案。与Flexbox的一维布局不同&#xff0c;Grid布局可以同时处理行和列&#xff0c;非常适合创…...

QuickTime Player录屏声音不全?试试这招!Soundflower+麦克风双轨录制教程

Mac双轨高清录屏终极方案&#xff1a;Soundflower与BlackHole实战指南 每次用QuickTime录制教程视频时&#xff0c;系统声音和麦克风解说总是无法完美同步&#xff1f;这个问题困扰着无数内容创作者。作为一位长期使用Mac进行音乐制作和视频教程录制的资深用户&#xff0c;我深…...

MedGemma 1.5医疗AI助手:基于Linux系统的部署与优化

MedGemma 1.5医疗AI助手&#xff1a;基于Linux系统的部署与优化 1. 引言 医疗AI正在改变传统的诊疗方式&#xff0c;但很多医疗机构面临数据隐私和网络安全的挑战。MedGemma 1.5作为谷歌开源的医疗多模态模型&#xff0c;提供了完全本地化部署的解决方案&#xff0c;让医院和…...

生产环境离线部署大模型

一、普通服务器升级ai服务器 1、服务器插槽装载8张INVIDA RTX 4090的显卡(单显卡48GB) 2、在INVIDA官网下载安装NVIDIA驱动NVIDIA-Linux-x86_64-550.120.run //服务器上禁用开源驱动 nouveau echo "blacklist nouveau" >> /etc/modprobe.d/blacklist-nouveau…...

OV2640寄存器配置黑魔法:手把手教你用ESP32-S3调出专业级画质

OV2640寄存器配置黑魔法&#xff1a;手把手教你用ESP32-S3调出专业级画质 在嵌入式视觉领域&#xff0c;OV2640这颗200万像素的图像传感器堪称常青树。它价格亲民、资料丰富&#xff0c;但想要榨干它的性能潜力&#xff0c;却需要深入理解其寄存器配置的奥秘。本文将带你从ISP底…...

机器学习与深度学习的区别是什么?看这一篇就够了

机器学习与深度学习的区别是什么&#xff1f;看这一篇就够了 标签&#xff1a;#机器学习、#深度学习、#人工智能、#计算机视觉、#自然语言处理、#数据分析、#ai### 一、企业招聘角度拆解&#xff1a;机器学习 vs 深度学习&#xff0c;岗位、要求、薪资、需求量### 二、对比学习…...

从ESP8266到ESP32-C6:一文看懂乐鑫芯片的‘家族进化史’与背后的物联网十年

从ESP8266到ESP32-C6&#xff1a;解码乐鑫芯片的十年物联网战略布局 2014年&#xff0c;一款售价仅3美元的Wi-Fi芯片悄然问世&#xff0c;谁也没想到这颗名为ESP8266的小芯片会彻底改变物联网行业的游戏规则。当时市面上的Wi-Fi模块价格普遍在10美元以上&#xff0c;且需要外接…...

面了个新人连Agent如何进行冷启动都不知道

一、产品侧&#xff1a;先做「精准小功能」&#xff0c;不做“万金油” ❌ 拒绝做一个什么都懂但都不准的Agent ✅ 核心逻辑&#xff1a;场景收窄 知识聚焦 人工兜底 1.只攻一个垂直场景 ToB方向&#xff1a;比如“合同审核Agent”. “电商售后Agent”&#xff0c;场景越…...

从洗碗到叠衣:用RECAP算法让机器人学会‘吃一堑长一智’

从洗碗到叠衣&#xff1a;用RECAP算法让机器人学会“吃一堑长一智” 想象一下&#xff0c;你刚教会家里的机器人如何叠衣服。第一次尝试时&#xff0c;它把袖子塞进了衣领里&#xff1b;第二次&#xff0c;衣服直接掉在了地上&#xff1b;第三次&#xff0c;它终于叠好了——但…...

为什么你的网络总抽风?可能是这个ARP协议漏洞在捣鬼(含防御方案)

为什么你的网络总抽风&#xff1f;可能是这个ARP协议漏洞在捣鬼&#xff08;含防御方案&#xff09; 想象一下这样的场景&#xff1a;你正在视频会议中发言&#xff0c;突然画面卡顿、声音断断续续&#xff1b;或者游戏激战正酣时&#xff0c;角色突然掉线。这些恼人的网络&quo…...

Phi-3-mini-128k-instruct代码解释能力实测:逆向工程与文档生成

Phi-3-mini-128k-instruct代码解释能力实测&#xff1a;逆向工程与文档生成 最近在尝试一些新的代码辅助工具&#xff0c;发现微软开源的Phi-3-mini-128k-instruct模型挺有意思。它主打轻量化和指令跟随&#xff0c;特别是那个128k的超长上下文&#xff0c;理论上能塞进去不少代…...

为什么92%的SITS2026项目在Phase 2失败?——多Agent角色编排、任务分解与状态同步的黄金三角模型,

第一章&#xff1a;SITS2026深度解析&#xff1a;多Agent协作系统设计 2026奇点智能技术大会(https://ml-summit.org) SITS2026&#xff08;Scalable Intelligent Task Synthesis 2026&#xff09;是一个面向开放域复杂任务的多Agent协作框架&#xff0c;其核心设计理念是“角…...

YOLOv7实战指南:如何实现高精度与实时性的多任务目标检测

1. YOLOv7为什么能成为工业级目标检测的首选&#xff1f; 第一次接触YOLOv7是在去年做一个智能质检项目时&#xff0c;当时测试了YOLOv5、YOLOv7和YOLOv8三个版本。结果发现YOLOv7在检测微小电子元件缺陷时&#xff0c;准确率比v5高出12%&#xff0c;推理速度却比v8还要快15%。…...

AIAgent自动驾驶到底靠不靠谱?2026奇点大会127项实测数据揭示L4级商用真相

第一章&#xff1a;AIAgent自动驾驶的范式革命与奇点大会背景 2026奇点智能技术大会(https://ml-summit.org) 传统自动驾驶系统长期依赖模块化流水线设计——感知、定位、规划、控制被严格解耦&#xff0c;各模块由独立模型驱动&#xff0c;通过手工定义接口传递确定性信号。…...

揭秘Reward Hacking真相:为什么90%的AI Agent在训练后期崩溃?

第一章&#xff1a;Reward Hacking的本质与系统性风险 2026奇点智能技术大会(https://ml-summit.org) Reward hacking 是强化学习系统在优化目标函数过程中&#xff0c;绕过设计者真实意图、利用奖励函数漏洞获取高分的非预期行为。它并非偶然错误&#xff0c;而是智能体在目…...

AIAgent协议一致性危机爆发前夜:4步诊断法+3类协议健康度SLI指标(P99延迟、语义丢失率、Schema漂移频次),立即自查你的Agent集群

第一章&#xff1a;AIAgent架构中的通信协议设计 2026奇点智能技术大会(https://ml-summit.org) 在多智能体协同系统中&#xff0c;通信协议是决定Agent间语义对齐、时序可控与容错能力的核心基础设施。不同于传统微服务间RESTful或gRPC调用&#xff0c;AIAgent需支持异步事件…...

目标分解效率提升300%的关键:动态权重分配算法(已开源v2.1,支持LangChain/AutoGen无缝集成)

第一章&#xff1a;AIAgent架构中的目标分解策略 2026奇点智能技术大会(https://ml-summit.org) 在复杂任务驱动的AI Agent系统中&#xff0c;目标分解是实现自主规划与协同执行的核心前置环节。它并非简单地将顶层目标切分为子任务&#xff0c;而是需结合领域知识、资源约束、…...

为什么93%的AIAgent在复杂任务中“想得清却走不远”?SITS2026深度拆解规划-执行失配症,附3套已验证Prompt-Action协同模板

第一章&#xff1a;SITS2026分享&#xff1a;AIAgent规划与推理能力 2026奇点智能技术大会(https://ml-summit.org) AI Agent 的规划与推理能力正从符号逻辑驱动迈向多模态协同增强的新阶段。在 SITS2026 技术分享中&#xff0c;核心聚焦于如何构建具备分层目标分解、动态环境…...

海思Hi3516DV500/HI3519DV500开发实战:从SDK编译到多媒体例程验证

1. 环境准备&#xff1a;搭建Hi3516DV500/HI3519DV500开发环境 拿到海思SDK后&#xff0c;第一件事就是搭建开发环境。我建议使用Ubuntu 18.04或20.04系统&#xff0c;这是官方推荐的环境。安装完系统后&#xff0c;需要配置一些基础工具链&#xff1a; sudo apt-get update su…...

深入解析CMP0074策略:如何正确使用<PackageName>_ROOT变量优化CMake依赖查找

1. 理解CMP0074策略的核心机制 当你第一次在CMake项目中看到"CMP0074 is not set"的黄色警告时&#xff0c;可能会感到困惑。这个看似简单的警告背后&#xff0c;其实隐藏着CMake依赖查找机制的重要进化。让我们从一个实际案例开始&#xff1a;假设你在Windows上编译…...

【JAVA基础面经】线程间的通信方式

文章目录前言JMM内存共享变量 volatile⭐Object.wait() / notify() / notifyAll()⭐Lock 和 Condition 接口等待多个事件完成 CountDownLatch⭐循环屏障 CyclicBarrier信号量 Semaphore阻塞队列 BlockingQueue ⭐两个线程交换数据 Exchanger&#xff08;了解&#xff09;异步编…...

计算机视觉需要哪些数学基础区别如何高效学习线性代数和概率论区别

计算机视觉需要哪些数学基础区别如何高效学习线性代数和概率论区别 标签&#xff1a;#计算机视觉、#线性代数、#人工智能、#深度学习、#自然语言处理、#神经网络、#机器学习### 一、痛点引入&#xff1a;为什么很多人怕CV数学&#xff1f;真相是什么&#xff1f;### 二、CV必备…...

当CRNN遇上CTC:揭秘文本识别中的序列建模魔法(PyTorch版)

CRNNCTC&#xff1a;从算法原理到PyTorch实战的文本识别全解析 在计算机视觉领域&#xff0c;文本识别一直是一个极具挑战性的任务。不同于简单的物体识别&#xff0c;文本识别需要模型同时具备图像特征提取和序列建模的能力。本文将深入探讨CRNN&#xff08;卷积循环神经网络&…...