对操作系统来讲,无论是PC的Windows、Linux还是嵌入式系统VxWorks、QNX、SylixOS,shell都是一个强大的调试手段,在进行驱动开发、应用开发、系统维护方面有着重要作用。
SylixOS提供了基本的shell命令,能够满足绝大多数情况下的需要,但在一些特殊应用中通过添加自定义的shell命令,可以极大的方便设备的维护和使用。
在SylixOS中添加shell命令的函数为API_TshellKeywordAdd,该函数需要在内核模块中调用,函数介绍如下:
API_TShellKeywordAdd(pcKeyword, /* 添加的 shell 命令 */
pfuncCommand); /* 执行 shell 命令的函数 */
下面使用一个简单的实例演示添加shell命令的过程,该命令可以实现三个整数的加法运算。
#define __SYLIXOS_KERNEL
#include <SylixOS.h>
#include "linux/compat.h"
#include <module.h>
#include "../SylixOS/kernel/include/k_kernel.h"
#include "../SylixOS/system/include/s_system.h"
#include "../SylixOS/system/include/s_internal.h"
#include "sys/time.h"
/******************************************************************************
** 函数名称: shellCmdTest
** 功能描述: 添加的 shell 测试命令功能函数
******************************************************************************/
INT shellCmdTest (UINT32 uiStart, UINT32 uiCount, UINT32 uiData)
{
UINT32 uiRet;
uiRet = uiStart + uiCount + uiData;
printk("result:%d\n", uiRet);
return (ERROR_NONE);
}
/******************************************************************************
** 函数名称: tshellTestCmd
** 功能描述: 向内核添加的测试命令
******************************************************************************/
static INT tshellTestCmd (INT iArgC, PCHAR ppcArgV[])
{
UINT32 uiStart = 0;
UINT32 uiCount = 0;
UINT32 uiData = 0;
if (iArgC == 1) {
printk("cmd do nothing!\n");
return (ERROR_NONE);
}
if (lib_strcmp(ppcArgV[2], "-g") == 0) {
}
sscanf(ppcArgV[1], "%d", &uiStart);
sscanf(ppcArgV[2], "%d", &uiCount);
sscanf(ppcArgV[3], "%d", &uiData);
shellCmdTest(uiStart, uiCount, uiData);
return (ERROR_NONE);
}
/******************************************************************************
** 函数名称: module_init
** 功能描述: 内核模块被注册进系统时调用的函数
******************************************************************************/
int module_init (void)
{
API_TShellKeywordAdd("numadd", /* 添加的 shell 命令 */
tshellTestCmd); /* 执行 shell 命令的函数 */
return (ERROR_NONE);
}
/******************************************************************************
** 函数名称: module_exit
** 功能描述: 内核模块从系统时调用的函数
******************************************************************************/
void module_exit (void)
{
}
代码使用:
1.在控制台中将工作目录切换到“/lib/modules”,注册模块并测试shell,过程如下;
[root@sylixos_station:/lib/modules]# ls
modu_shell_add.ko xinput.ko xsiipc.ko
[root@sylixos_station:/lib/modules]# modulereg modu_shell_add.ko
hello_module init!
module modu_shell_add.ko register ok, handle : 0x30c74910
[root@sylixos_station:/lib/modules]# numadd 1 3 5
result:9
[root@sylixos_station:/lib/modules]#
注意:本例程的工程创建时,需要选择 kernel module工程类型