Readme.txt
1、引言
嵌入式开发编辑器现状
随着嵌入式系统的日益广泛应用,各种各样的嵌入式微处理器已经渗透到各种
电子产品中。嵌入式系统的最大特点是软硬件的可裁减性,嵌入式软件开发的主要
任务就是针对特定的硬件系统对软件进行裁剪、配置,大多数的嵌入式软件开发者
都是在别人的程序的基础上进行增删修改来实现自己的功能而完成应用开发。由于
嵌入式软件一方面需要各种架构的微处理器及其各种外设,另一方面又要保持结构
的一致性以实现代码的复用,因此,嵌入式软件的源代码中大量使用了宏定义语句
(C语言中的#ifdef...#endif),不可否认这是一种科学的、有效的代码组织方法。
然而对于代码的使用者来说,当进去代码裁剪时就要花费大量的精力查阅了解这些
预定义语句,尤其当源代码中出现太多的宏定义语句时阅读代码就十分费劲:此常
量是否被定义过?在哪个文件中定义过?
......
#ifdef INCLUDE_DC
{ "dc", dcattach, (char*)IO_ADRS_DC, INT_VEC_DC, INT_LVL_DC,
DC_POOL_ADRS, DC_POOL_SIZE, DC_DATA_WIDTH, DC_RAM_PCI_ADRS,
DC_MODE },
#endif /* INCLUDE_DC */
#ifdef INCLUDE_EGL
{ "egl", eglattach, (char*)IO_ADRS_EGL, INT_VEC_EGL, INT_LVL_EGL },
#endif /* INCLUDE_EGL */
#ifdef INCLUDE_EI
{ "ei", eiattach, (char*)INT_VEC_EI, EI_SYSBUS, EI_POOL_ADRS, 0, 0},
#endif /* INCLUDE_EI */
#ifdef INCLUDE_FEI
{ "fei", feiattach, (char*)FEI_POOL_ADRS, 0, 0, 0, 0},
#endif /* INCLUDE_FEI */
#ifdef INCLUDE_EX
{ "ex", exattach, (char*)IO_ADRS_EX, INT_VEC_EX, INT_LVL_EX,
IO_AM_EX_MASTER, IO_AM_EX },
#endif /* INCLUDE_EX */
#ifdef INCLUDE_ENP
{ "enp", enpattach, (char*)IO_ADRS_ENP, INT_VEC_ENP, INT_LVL_ENP,
IO_AM_ENP },
#endif /* INCLUDE_ENP */
#ifdef INCLUDE_IE
{ "ie", ieattach, (char*)IO_ADRS_IE, INT_VEC_IE, INT_LVL_IE },
#endif /* INCLUDE_IE */
#ifdef INCLUDE_ILAC
{ "ilac", ilacattach, (char*)IO_ADRS_ILAC, INT_VEC_ILAC},
#endif /* INCLUDE_ILAC */
#ifdef INCLUDE_LN
{ "ln", lnattach, (char*)IO_ADRS_LN, INT_VEC_LN, INT_LVL_LN,
LN_POOL_ADRS, LN_POOL_SIZE, LN_DATA_WIDTH, LN_PADDING,
LN_RING_BUF_SIZE },
#endif /* INCLUDE_LN */
#ifdef INCLUDE_LNSGI
{ "lnsgi", lnsgiattach, (char*)IO_ADRS_LNSGI, INT_VEC_LNSGI,
INT_LVL_LNSGI, LNSGI_POOL_ADRS, LNSGI_POOL_SIZE, LNSGI_DATA_WIDTH,
LNSGI_PADDING, LNSGI_RING_BUF_SIZE },
#endif /* INCLUDE_LNSGI */
#ifdef INCLUDE_NIC
{ "nic", nicattach, (char*)IO_ADRS_NIC, INT_VEC_NIC, INT_LVL_NIC },
#endif /* INCLUDE_NIC */
#ifdef INCLUDE_NIC_EVB
{ "nicEvb", nicEvbattach, (char*)IO_ADRS_NIC,INT_VEC_NIC,INT_LVL_NIC },
#endif /* INCLUDE_NIC_EVB */
#ifdef INCLUDE_MED
{ "med", medattach, (char*)IO_ADRS_DBETH, INT_VEC_DBETH, INT_LVL_DBETH},
#endif /* INCLUDE_MED */
#ifdef INCLUDE_ELC
{ "elc", elcattach, (char*)IO_ADRS_ELC, INT_VEC_ELC, INT_LVL_ELC,
MEM_ADRS_ELC, MEM_SIZE_ELC, CONFIG_ELC},
#endif /* INCLUDE_ELC */
#ifdef INCLUDE_ULTRA
{ "ultra", ultraattach, (char*)IO_ADRS_ULTRA, INT_VEC_ULTRA,
INT_LVL_ULTRA, MEM_ADRS_ULTRA, MEM_SIZE_ULTRA, CONFIG_ULTRA},
#endif /* INCLUDE_ULTRA */
#ifdef INCLUDE_EEX
{ "eex", eexattach, (char*)IO_ADRS_EEX, INT_VEC_EEX, INT_LVL_EEX,
NTFDS_EEX, CONFIG_EEX},
#endif /* INCLUDE_EEX */
#ifdef INCLUDE_ELT
{ "elt", eltattach, (char*)IO_ADRS_ELT, INT_VEC_ELT, INT_LVL_ELT,
NRF_ELT, CONFIG_ELT},
#endif /* INCLUDE_ELT */
#ifdef INCLUDE_ENE
{ "ene", eneattach, (char*)IO_ADRS_ENE, INT_VEC_ENE, INT_LVL_ENE},
#endif /* INCLUDE_ELT */
#ifdef INCLUDE_ESMC
{ "esmc", esmcattach, (char*)IO_ADRS_ESMC, INT_VEC_ESMC, INT_LVL_ESMC,
CONFIG_ESMC, RX_MODE_ESMC},
#endif /* INCLUDE_ESMC */
#ifdef INCLUDE_QU
{ "qu", quattach, (char*)IO_ADRS_QU_EN, INT_VEC_QU_EN, QU_EN_SCC,
QU_EN_TX_BD, QU_EN_RX_BD, QU_EN_TX_OFF, QU_EN_RX_OFF, QU_EN_MEM},
#endif /* INCLUDE_QU */
#ifdef INCLUDE_SN
{ "sn", snattach, (char*)IO_ADRS_SN, INT_VEC_SN },
#endif /* INCLUDE_SN */
#ifdef INCLUDE_FN
{ "fn", fnattach },
#endif /* INCLUDE_FN */
#ifdef INCLUDE_SM_NET
{ "sm", smNetAttach2, 0, 0, 0, 0, 0, 0, 0, 0 },
#endif /* INCLUDE_SM_NET */
#ifdef INCLUDE_PCMCIA
{ "pcmcia", pcmciaattach, 0, 0, 0, 0, 0, 0 },
#endif /* INCLUDE_PCMCIA */
#ifdef INCLUDE_PPP
{"ppp", 0, 0, 0, 0, 0},
#endif /* INCLUDE_PPP */
#ifdef INCLUDE_SLIP
{ "sl", 0, 0, 0, 0, 0 },
#endif /* INCLUDE_SLIP */
{ "lo", loattach, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0 },
};
#endif /* INCLUDE_NETWORK */
/* global variables */
SYMTAB_ID sysSymTbl;
int consoleFd; /* fd of initial console device */
char consoleName [20]; /* console device name, eg. "/tyCo/0" */
int sysStartType; /* BOOT_CLEAR, BOOT_NO_AUTOBOOT, ... */
BOOL scsiInitialized = FALSE;
int bootCmdTaskPriority = 1;
int bootCmdTaskOptions = VX_SUPERVISOR_MODE;
int bootCmdTaskStackSize = BOOT_CMD_STACK_SIZE;
/* Two magic cookies used to detect data section misalignment */
#define TRAP_VALUE_1 0x12348765
#define TRAP_VALUE_2 0x5a5ac3c3
LOCAL volatile UINT32 trapValue1 = TRAP_VALUE_1;
LOCAL volatile UINT32 trapValue2 = TRAP_VALUE_2;
#ifdef INCLUDE_NETWORK
/* network protocol configuration parameters */
#ifdef INCLUDE_UDP
UDP_CFG_PARAMS udpCfgParams = /* udp configuration parameters */
{
UDP_FLAGS_DFLT,
UDP_SND_SIZE_DFLT, /* send buffer size */
UDP_RCV_SIZE_DFLT /* recv buffer size */
};
#endif /* INCLUDE_UDP */
#ifdef INCLUDE_ICMP
ICMP_CFG_PARAMS icmpCfgParams = /* icmp configuration parameters */
{
ICMP_FLAGS_DFLT /* no icmp mask replies by default */
};
#endif /* INCLUDE_ICMP */
......
笔者以前最先接触的是一些简单的单片机,使用汇编语言和C语言,对于简单
应用开发足矣;后来转向ARM,使用了UCLinux,UC/OSII,在别人移植好的代码的
基础上修改实现自己的功能,需处理的源代码不多还能凑合;再后来由于工作需
要使用了VxWorks,面对大量的代码,大量的条件编译语句,看代码都十分费劲。
搞通之后回头看看,一大堆的源代码虽然看起来挺吓人的,其实大多数都是没用
(不活跃代码)的语句。至此,忽然想起哲学中的矛盾论观点:实物都是有两面
性的。C语言源代码中包含少量的条件编译语句就能便于管理和其他人使用,但
是若是使用了过多的条件编译语句就反而成了累赘:别人看代码和使用代码都不
方便了。其实,嵌入式系统也是在这种矛盾中发展的,嵌入式的初衷就是针对特
定、单一的功能的,如果一个系统什么功能都有那它就不叫嵌入式系统了。
笔者在学习VxWorks的过程中首先对BSP源代码中出现大量的条件编译语句深感
不便,决定给它的进行“瘦身”处理:希望去掉那些不参加编译和不实际执行的
代码。调查、试用了各种源代码编辑器(UltraEdit-32,SourceInsight...)未
发现具有此功能的软件,于是萌发“vxworks bsp瘦身计划”——决定自己开发
一款软件,最终命名为嵌入式开发代码编辑器EmbEdit。
2、软件介绍
本软件属于一种源代码编辑器,除了具备常规代码编辑器的功能之外,主要任
务是进行识别、标记源代码中的不活跃代码(条件编译语句)。目前可稳定支持
vxWorks5.5 for PowerPC的源代码识别。其它系列如vxWorks5.5 for ARM、
vxWorks5.5 for Xscale等等的源代码识别正在开发测试中。
3、软件设计要点及特色功能
软件设计本着简洁、稳定、高效的原则,重点突出编辑器的常用功能、特色
功能,服务与嵌入式软件的开发。
嵌入式源代码编辑常用功能:
跳转到指定行;
高亮标记当前行;
在整个文件范围向上/下搜索功能;
本软件特色功能:
在整个文件范围高亮标记当前选中的单词;
识别、标记(加阴影)不活跃代码;
4、软件安装及系统需求
IBM PC及其兼容机
CPU主频:650MHz以上
操作系统:win98以上
其它:
需要计算机中安装有vxWorks5.5 for PowerPC的集成开发环境Tornado2.2和
vxWorks BSP for PowerPC。
5、注册版本的购买方法
1)本软件的License及其注册使用方法:
本软件分为功能受限制的免费的测试版本(一次只能打开、编辑一个文件),
和全功能的注册版本。其中Demo版本不需要License即可运行;注册版本需要付费
申请注册,获得包含了全部功能的注册版本软件,在指定的计算机上运行,1套注
册版本软件包含1个License,只能在指定的一台计算机上运行,将该注册版本软件
拷贝到其它计算机将无法运行或无法实现本软件的特色功能。
注册方法:
在您想安装注册版本软件的计算机上先运行Demo版本的EmbEdit,在Help->
License中获得您的计算机的机器码,连同您的个人email地址通过e