写了一个将VxWorks的shell打印输出到指定内存中的接口,可广泛用于CLI下的调试函数显示以及故障自动捕获等功能,稍作修改可以适合其它嵌入式OS...
本代码在Tornado2.0的Simu下调试通过,原理上与CPU架构无关,应该都适用。
如果引用的话,请告诉我,或者评论一句[页面最下方],不要一声不吭
/* Copyright 1984-1998 Wind River Systems, Inc. */
/*
modification history
--------------------
2004-9-29 ,Rex deal with buffer alloc
2004-9-29 ,Rex deal with task's err output
2004-9-25 ,Rex shell_output_to_memory()
01a,02jun98,ms written
*/
/*
DESCRIPTION
rex shell_output_to_memory
*/
/*********************rex******************************/
/*libs*/
#include <taskLib.h>
#include <vxWorks.h>
#include <stdio.h>
#include <string.h>
#include "dosFsLib.h"
#include "ramDrv.h"
#include "usrLib.h"
/*Macros*/
#define DIAG_RAM_DISK_SIZE (0x100000) /* 1M */
#define DIAG_RAM_DISK_NAME "/diag/"
#define DIAG_TEMP_PIPE_FILE DIAG_RAM_DISK_NAME"temp.pip"
/*struct&type*/
typedef struct Rex_taskSummary
{
int tid;
}Rex_TASKSUMMARY;
/*Declarations*/
STATUS Diagnose_Init();
char* shell_output_to_memory(FUNCPTR , void* , char *, unsigned int );
char* cmd_exe_taskSummary(char *);
void Rex_taskSummary(Rex_TASKSUMMARY *);
/******************************************************************************
*
* usrAppInit - initialize the users application
*/
void usrAppInit (void)
{
#ifdef USER_APPL_INIT
USER_APPL_INIT; /* for backwards compatibility */
#endif
/* add application specific code here */
Diagnose_Init();
}
/* new implement employing shell_output_to_memory() routine */
void Rex_taskSummary(Rex_TASKSUMMARY *Rex_ts)
{
i(Rex_ts->tid);
}
char* cmd_exe_taskSummary(char * taskNameString)
{
Rex_TASKSUMMARY Rex_TS;
if(NULL == taskNameString)
Rex_TS.tid = 0;
else
Rex_TS.tid = (int)taskNameString;
return shell_output_to_memory((FUNCPTR)Rex_taskSummary, &Rex_TS, NULL, 0);
}
char* cmd_exe_taskInfo(char * taskNameString)
{
return NULL;
}
/*
i | ti | tt | memShow | spyReport | etc.
*/
/*Exe Entry*/
void ExeRex(int cmdIndex, char* taskNameString)
{
char* stString = NULL;
switch(cmdIndex)
{
case 1: /* i */
if((stString = cmd_exe_taskSummary(taskNameString)))
{
printf("%s", stString);
free(stString);
}
else
{
printf("i Error\n");
}
break;
case 2: /* ti */
if((stString = cmd_exe_taskInfo(taskNameString)))
{
printf("%s", stString);
free(stString);
}
else
{
printf("ti Error\n");
}
break;
case 3: /* tt */
break;
case 4: /* memShow */
break;
case 5: /* spyReport */
break;
case 0:
default:
printf("help!\n");
break;
}
}
STATUS Diagnose_Init()
{
BLK_DEV *pBlkDev;
char *pDiagRamDiskBase = NULL;
ramDrv();
pDiagRamDiskBase = malloc(DIAG_RAM_DISK_SIZE);
if(NULL == pDiagRamDiskBase)
return ERROR;
bzero(pDiagRamDiskBase,DIAG_RAM_DISK_SIZE);
pBlkDev = ramDevCreate( pDiagRamDiskBase, /* start address */
512, /* sector size */
64, /* sectors per track */
(int)(DIAG_RAM_DISK_SIZE/512), /* total sectors 64 MBytes */
0); /* offset */
if(NULL == pBlkDev)
{
free(pDiagRamDiskBase);
return ERROR;
}
if(NULL == dosFsMkfs (DIAG_RAM_DISK_NAME, pBlkDev))
{
free(pDiagRamDiskBase);
return ERROR;
}
return OK;
}
/*****************************************************************************
函数名 : shell_output_to_memory
功能描述 : 将VxWorks的shell打印输出到指定内存中,可用于CLI下的诊断命令显示以及故障自动捕获等功能
调用函数列表 : ioTaskStdGet()
ioTaskStdSet()
open()
close()
fopen()
fseek()
ftell()
fclose()
bzero()
remove()
被函数调用 : CLI用户函数
输入参数 : FUNCPTR shellRoutine, 在shell下打印输出的函数实体,它调用printf输出的内容将“打印”到指定内存里去
void* arg, shellRoutine的参数,一般来说是一个结构指针,以包含更多信息,具体信息由shellRoutine解析
char *dest, 为NULL,则说明用户不知道输出的信息数据大小,需要本接口代为申请;不为NULL,即为指定地址
unsigned int destSize 当dest为NULL时无意义;当dest不为NULL时,为dest指向的内存的大小
输出参数 : 无
返回 : 指向具体输出信息的指针; NULL为失败
特殊内存 : 需要事先创建RamDisk,参见Diagnose_Init()
其他 :
==============================================================================
修改记录:
修改日期 版本 修改人 修改原因及内容
==============================================================================
2004-9-25 1.0 REX 创建
******************************************************************************/
char* shell_output_to_memory(FUNCPTR shellRoutine, void* arg, char *dest, unsigned int destSize)
{
int tempFileFd = ERROR;
int OrigOutPutFd = ERROR;
int OrigErrPutFd = ERROR; /*2004-9-29*/
FILE *tempFile = NULL;
long fileSize = 0;
char *contentBuf = NULL;
/*1、参数检查*/
if(NULL == shellRoutine)
{
return NULL;
}
if(NULL == dest) /*用户未指定内存,则将destSize置为最大,以便之后统一取最小值*/
destSize = ~0x0;
/*2、重定向输出到临时文件*/
OrigOutPutFd = ioTaskStdGet(0,1); /*保存原来的输出句柄*/
OrigErrPutFd = ioTaskStdGet(0,2); /*保存原来的ERR句柄 2004-9-29*/
if(ERROR == (tempFileFd = open(DIAG_TEMP_PIPE_FILE,O_CREAT | O_RDWR,0)))
{
printf("error open a temp file for diag\n");
return NULL;
}
ioTaskStdSet(0,1,tempFileFd);
ioTaskStdSet(0,2,tempFileFd); /*2004-9-29*/
shellRoutine(arg); /*调用用户输出例程*/
ioTaskStdSet(0,1,OrigOutPutFd);
ioTaskStdSet(0,2,OrigErrPutFd); /*2004-9-29*/
close(tempFileFd);
/*3、打开临时文件,获取数据大小,并指定内存*/
if(NULL == (tempFile = fopen(DIAG_TEMP_PIPE_FILE,"r")))
{
printf("error open the temp file for diag\n");
remove(DIAG_TEMP_PIPE_FILE);
return NULL;
}
fseek(tempFile, 0, SEEK_END);
if(-1L == (fileSize = ftell(tempFile)))
{
printf("error pos the temp file for diag\n");
fclose(tempFile);
remove(DIAG_TEMP_PIPE_FILE);
return NULL;
}
printf("fileSize1 = %ld\n",fileSize);
fileSize = (fileSize >= destSize) ? destSize : fileSize; /*取两者的最小值,避免越界*/
printf("fileSize2 = %ld\n",fileSize);
if(NULL == dest) /*用户未指定内存,我们为之申请*/
{ /*fileSize为零不处理,直接返回 2004-9-29*/
if((0 == fileSize) || (NULL == (contentBuf = malloc(fileSize + 1))))
{/*多申请一个字节作为字符串的结束符位置 2004-9-29*/
printf("error alloc mem for diag\n");
fclose(tempFile);
remove(DIAG_TEMP_PIPE_FILE);
return NULL;
}
}
else /*使用用户指定的内存存放*/
{
contentBuf = dest;
}/*内存的释放由用户完成*/
/*4、读取文件内容到内存*/
bzero(contentBuf, fileSize + 1); /*多清零一个字节作为字符串的结束符位置 2004-9-29*/
fseek(tempFile, 0, SEEK_SET);
fread(contentBuf, fileSize, 1, tempFile);
/*printf("%s\n",contentBuf);*/
/*5、清理*/
fclose(tempFile);
remove(DIAG_TEMP_PIPE_FILE);
return contentBuf;
}
写了一个将VxWorks的shell打印输出到指定内存中的接口,可广泛用于CLI下的调试函数显示以及故障自动捕获等功能,稍作修改可以适合其它嵌入式OS...相关推荐
- 从0开始写出一个最简单的shell(基于x210)
文章目录 前言 一.什么是shell? 1.shell是什么鬼 2.程序或操作系统的用户接口 3.两种shell:GUI和cmdline 4.shell的运行原理:由消息接收.解析.执行构成的死循环 ...
- 用 python 写了一个日记本
写一个随机任务抽取器 一.前言 二.逻辑构思 2.1 目标实现 2.2 搭建开发环境 2.3 Pyinstaller 打包 三.效果展示 3.1 初始化和添加日记 3.2 查看日记 3.3 删除日记 ...
- 网页制作(七)---照着google注册页面边学边写的一个网页
花了五六个小时边学边写了一个注册页面,仿照google邮箱注册的样子,刚开始,看了下google注册页面的原码,当时就不够淡定了,总计有六千多行代码,当时就有点晕了.在心里告诉自己:如果这次放弃,以后 ...
- linux 函数自动补全,Shell脚本中实现自动补全功能
对于Linuxer来说,自动补全是再熟悉不过的一个功能了.当你在命令行敲下部分的命令时,肯定会本能地按下Tab键补全完整的命令,当然除了命令补全之外,还有文件名补全. Bash-completion ...
- 用shell写了一个自动编译代码的脚本
点击打开链接 为了充分利用晚上的时间进行编译,用shell写了一个自动编译代码的脚本,这样保证第二天的调试工作不会受大版本编译的影响,同时也能监测服务器端的代码是否出错.我习惯是在每天下班离开之前运行 ...
- 用shell脚本写的一个简单的俄罗斯方块
用shell脚本写的一个简单的俄罗斯方块 代码 代码 测试 下载链接 代码 代码 #!/bin/bash #version 1.2,若非正常退出,请使用附带的killel.sh脚本杀死进程 #定义用于 ...
- php给apk包签名,Android_查看apk签名信息方法,用shell写了一个查看apk签名的 - phpStudy...
查看apk签名信息方法 用shell写了一个查看apk签名的脚本.代码很少也很简单 #!/bin/bash mkdir .temp_for_certificate cd .temp_for_certi ...
- 什么样的人适合学习嵌入式开发
未来的几年,随着信息化,智能化,网络化的发展,嵌入式系统技术也将获得广阔的发展空间. 手机.电子字典.可视电话.数字相机(DC).数字摄像机(DV).U-Disk.机顶盒(Set Top Box).高 ...
- 【技术分享】linux各种一句话反弹shell总结——攻击者指定服务端,受害者主机(无公网IP)主动连接攻击者的服务端程序(CC server),开启一个shell交互,就叫反弹shell。...
反弹shell背景: 想要搞清楚这个问题,首先要搞清楚什么是反弹,为什么要反弹. 假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常 ...
最新文章
- 简单的XML和JSON数据的处理
- 【ORACLE 高可用】作业 :配置ORACLE GoldenGate 2
- 软件构造学习笔记-第六周
- EL : Free Package of October
- C语言中全局变量存放在哪个位置?
- Html中锚点的使用【转】
- android app定时自动重启,android 应用程序自动重启
- 谭浩强c语言第五版 第二章习题解答
- 科技巨头极速进场 车路协同技术为何被热捧?
- Python 条件语句(If else)
- SharePoint 2013 安装中间出错了怎么办? 每一次安装都是一段曲折的路【1603(0x643) 】...
- 用自己电脑做网站服务器
- 关于大内存(大于4G)支持的问题
- react结合rust编写wasm图像处理
- 不撞南墙不回头-深度优先搜索算法
- 2020-11-01(电脑耳机声音外放)
- Padavan固件免流,能连接成功暂时没测成功免流没有
- WordPress 使用 CDN 后获取访客真实 IP
- javaAPI文档中文版(JDK11在线版)无需下载、直接打开
- 1分钟部署单机版kubernetes 1.13.4