一、CodeTEST的安装——on Redhat linux 7.2
我们参照CodeTEST 手册(getting-started-vxworks)Installing CodeTEST for Linux部分,进行CodeTEST的安装工作,但是没有成功。
通过多次摸索,我们完成了CodeTEST在Linux主机上安装。过程如下:
首先使用第一张光盘"Codetest version 3.5.0 winNT/2000, Solaris, Linux"
1、在X-terminal命令行窗口完成codetest.tar.Z包的解压缩:
cd <installation_directory>
zcat /<cdrom>/linux/codetest.tar.Z | tar xBpf -
2、然后运行光盘上的install.amc进行安装
/<cdrom>/linux/install.amc
CodeTEST安装画面将出现,对于一切选项使用默认值,也可以自行指定CodeTEST的安装路径。基本包安装完成后,在<installation_directory>目录下将创建下面一些目录和文件:
<installation_dir>/AcrobatReader
<installation_dir>/bin
<installation_dir>/lib
<installation_dir>/flexlm
<installation_dir>/hardware
<installation_dir>/help
<installation_dir>/instrconfig
<installation_dir>/JRE
<installation_dir>/codetest_setup.csh
<installation_dir>/codetest_setup.sh
3、设置环境变量
根据shell的类型,选择使用AMC CodeTEST 环境设置脚本codetest_setup.csh或codetest_setup.sh,修改相应的环境变量AMC__HOME、AMC_TARGET、PATH。设置了这些环境变量后要生效设置,需要在命令行窗口运行:
source $AMC_HOME/codetest_setup.csh或
. <installation_dir>/codetest_setup.sh
codetest_setup.sh内容示例:
AMC_HOME="/root/CodeTEST" /* CodeTEST 安装路径*/
export AMC_HOME
AMC_TARGET="gnu-x86-linux-native" /*为CodeTEST 正确指定打点文件*/
export AMC_TARGET
PATH="/root/CodeTEST/bin:$PATH" /*指定CodeTEST 可执行文件的路径*/
export PATH
第二张光盘"CodeTEST for Vxworks 5.x Version 3.5.0"主要是针对VxWorks目标操作系统的。而且运行这张光盘上的./linux/installvxworkslinux.bin将导致系统问题,所以第二张盘不必安装。
二、CodeTEST 3.5.0 on Redhat linux 7.2用户图形界面的获得
根据目前情况,CodeTEST 3.5.0对于Linux Redhat 6.2完全支持,但对于Linux Redhat 7.2只支持源代码打点编译,无法提供用户图形界面。
需要在另一台win2000主机上安装CodeTEST 3.5.0,以获得图形界面。在Linux Redhat 7.2主机上完成libctHwic.a文件的构造、源代码的打点,将打点生成的codetest.idb文件和源文件COPY到win2000主机上。并在配置Manager时,正确设置路径指向这些文件。
至此已基本完成CodeTEST在Linux 主机环境的安装及相应GUI的提供。这些过程只需在安装时进行一次,在以后的使用中将不需要再做。
三、构造libctHwic库
需要构造libctHwic库,并在打点编译目标代码的时候将其链接进去。用于构造libctHwic库的源程序存放在<installation_dir>/lib/rtos/linux目录下。
其中ctprintf.c提供CodeTest AMCPrintf支持;ctlinuxwrap.c提供C标准库内存函数的封装。ctPciAdapterLib.c和ctPciAdapterDrvr.c文件提供PCI支持。
CodeTEST对于RTOS Linux只支持PCI连接方式。因为Linux采用虚拟内存管理,所以在用户程序中是不能直接往物理端口写数据,采用PCI卡后,这个问题就可以解决了。PCI卡的驱动程序可以完成用户应用程序逻辑地址和系统物理地址的转换,所以在用户程序中可以往PCI卡的逻辑地址写,由驱动程序完成逻辑地址和物理地址的转换。
有些比较特殊的用户,受其硬件限制,不能使用CodeTEST PCI,需要我们根据PCI原理,自己编写代码,完成相应功能。
通过分析AMC的源程序,我们编写了ctlib.c,该程序ct_init() 的功能就是把物理地址转换成逻辑地址,然后将该逻辑地址赋给amc_ctrl_port_ptr、amc_ctrl_port_ptr,这样就完成了替代PCI卡的工作。
在不能使用PCI的用户环境下,我们可以使用ctprintf.c、 ctlinuxwrap.c、ctlib.c构造库文件,完成除任务性能监视以外的所有libctHwic库的功能。通常使用RTOS Linux的用户对于任务性能并不关注,这个libctHwic库文件的功能基本能够满足使用要求。对于任务性能的支持需要添加补丁程序修改Linux kernel 代码,添加任务钩子。
举例ct_init():
#define CFG_IMMR 0xff000000
#define CODETEST_PHY_ADDR 0x70000000
#define CODETEST_ATTRIB_VAL 0xfff009f0
int ct_init(void)
{
extern int fd;
extern int *ip;
immap_t *immap;
size_t size,pgsize;
fd = open ("/dev/mem", O_RDWR);
pgsize = getpagesize();
size = ((sizeof(immap_t)/pgsize)+1)*pgsize;
ip = (int *) mmap (0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, CFG_IMMR);
immap = (immap_t *)ip;
immap -> im_memctl.memc_or2 = CODETEST_ATTRIB_VAL;
immap -> im_memctl.memc_br2 = CODETEST_PHY_ADDR + 0x001;
munmap (ip, size);
ip = (int *)mmap (0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, CODETEST_PHY_ADDR);
amc_ctrl_port_ptr = ip;
amc_data_port_ptr = (ip + 1);
return 0;
}
初始化程序ct_init()完成了物理地址到逻辑地址的映射,对于不同的用户环境需要对片选、映射地址进行相应修改。
四、源代码打点编译
目标环境:嵌入式linux (kernel 2.2.14)
1、修改instrconfig文件
libctHwic库中的初始化程序ctlib.c完成了物理地址到逻辑地址的映射,这个逻辑地址被赋给amc_ctrl_port_ptr、amc_ctrl_port_ptr,使Probe可以正确接收数据。
这个逻辑地址的值同样需要被用户程序知道,我们的初始化程序ctlib.c必须先于用户的主程序运行。而在RTOS Linux中不同的用户程序无法实现变量的共用,所以我们采用了软件打点的方法来决这个问题。
存放在<installation_dir>/instrconfig目录下的打点配置文件为隐藏文件,为了对其进行相应修改,需要让系统显示所有文件。
根据环境变量AMC_TARGET的值,选择同名文件进行修改。修改的内容主要包括:
为CodeTEST确定当前环境使用的编译器类型,即令:
AMC_CC=ppc_8xx-gcc
AMC_CXX=ppc_8xx-gcc
在AMC_TAGDEFAULTS中增加-tags-to-ctTag选项,-tags-to-ctTag选项令CodeTEST采用软件方式打点。注释去
#AMC_TAGDEFAULTS=-gnu -no-placement-delete \
# -allocator-call-map=$AMC_HOME\lib\rtos\vxworks\ctvxwrap.map
令
AMC_TAGDEFAULTS=-gnu \
-no-placement-delete \
-tags-to-ctTag \
-allocator-call-map=$AMC_HOME\lib\rtos\linux\ctlinuxwrap.map
举例打点函数:
int ctTag( unsigned long tagID )
{
if ( amc_ctrl_port == NULL )
ct_init();
*amc_ctrl_port = tagID;
return( tagID );
}
int ctDataTag( unsigned long tagID )
{
if ( amc_data_port == NULL )
ct_init();
*amc_data_port = tagID;
return( tagID );
}
接下来需要对编译目标源代码的makefile文件进行修改,
1、 确定CodeTEST打点编译选项
注释去CC = ppc_8xx-gcc
令CC = ctcc -CTv –Ctkeep \
–CTtag-allocator=$AMC_HOME\lib\rtos\linux\ctlinuxwrap.map
其中-CTv选项提供版本号信息,–CTkeep选项将保留中间过程文件,通过*.i和*._i可察看源程序中的打点情况。
2、在编译需要链接的*.o文件,增加libctHwic.a,即令
mginit_OBJECTS = mginit.o \
libctHwic.a libctmem.a
3、令CodeTEST采用软件方式打点,注释去
#CFLAGS = -g -O2 -Wall -fomit-frame-pointer -fno-strength-reduce -g -O2 –pipe,令
令
CFLAGS = -g -O2 -Wall -fomit-frame-pointer -fno-strength-reduce -g -O2 –pipe -DTAG_DEST=1
保存修改好的makefile文件。
使用上述的makefile文件,对待测代码进行打点编译。打点编译完成后将在当前编译目录增加codetest.idb 和mginit.exe文件。
文章来源于领测软件测试网 https://www.ltesting.net/