CodeTEST在Linux 環境的使用方法 Linux
一、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文件。