Private Quick
Directory
실제로 변환하는 메인 컴포넌트는 현재 x86 리눅스 바이너리(cilly.asm.exe)로 제공된다. 이것은 모든 기본 블록에 카운터를 추가한 모듈과 함께 컴파일된 버전의 CIL이다. 모듈 코드는 scripts/counter.ml 에 있다. 그래서 만약 x86리눅스가 동작하지 않는다면 CIL을 설치하고 counter.ml에 추가하고, 자신에게 맞는 cilly 프로그램을 생성해야한다. :)
만약 자신만의 CIL을 컴파일 했다면, 다음 내용을 참고하기 바란다. nesC 컴파일럭의 출력물을 만들어 내기 위한 CIL을 얻는 것은 식별자로서 유효한 '$'를 인식하게 하는 약간의 수정이 필요하다. 즉, src/fontc/clexer.ml 파일의 다음 두 라인에 '$'를 추가해야만 한다 :
let ident = (letter|'_')(letter|decdigit|'_'|'$')* let attribident = (letter|'_')(letter|decdigit|'_'|':'|'$')
일단 cilly가 동작하면, 거의 다 된것이다… (이미 기본 PowerrTOSSIM이 셋팅되어 있다면…)
makefile은 디버깅 옵션(-g)과 함께 Mica2로 컴파일하도록 셋팅되어있을 것이다. 매우 중요한 부분이다!!
OPTFLAGS := -g -O0
를
ifeq ($(PLATFORM), mica2)
섹션에 추가해야 한다.
CPU Cycle 을 카운탕히기 위해서는 다음과 같이 어플리케이션을 실행해야 한다.
$ cd $TOSROOT/apps/MyApp $ $TOSROOT/tools/scripts/PowerTOSSIM/compile.pl .... warning 이 많이 발생하지만.. 에러는 없어야 한다.... $ cd build/pc $ ./a.out -cpuprof 1 ... 0: POWER: Mote 0 CPU_CYCLES 5985780.5 at 38191327 0: POWER: Mote 0 CPU_CYCLES 6059924.0 at 38591427 0: POWER: Mote 0 CPU_CYCLES 6133961.0 at 38991527 0: POWER: Mote 0 CPU_CYCLES 6209839.5 at 39391627 ...
실행이 완료될때 (-t=TIME 사용), bb_exec_cnt 파일은 각 기본 블록을 위한 실행 카운트를 기록하고 있을 것이다. 각 라인에 맵핑되는 기본블록은 bb_linenum_map 안에 있으며 기본 블록에 대한 cycle 카운트는 bb_cycle_map 에 있다. cpuprof.py 스크립트는 이들 파일에서 정렬된 기본 블록 또는 cycle 실행 카운트를 얻기 위한 프로세싱을 수행할 수 있다.
cygwin에서 측정하기 위해서 cilly를 컴파일하고 자신에게 맞게 몇가지 수정을 해야 한다. Turkmen Canli가 이에 대한 방법을 작성하였다.
1 C:/PROGRA~1/UCB/cygwin/opt/tinyos-1.x/tos/platform/pc/events.c:58 2 C:/PROGRA~1/UCB/cygwin/opt/tinyos-1.x/tos/interfaces/BareSendMsg.nc:67 ..... ....
하지만 다음과 같은 에러가 발생한다.
Use of uninitialized value in pattern match (m//) at /usr/lib/perl5/5.8/cygwin/C wd.pm line 544, <> line 1. : No such file or directory at /opt/tinyos-1.x/tos/../tools/scripts/PowerTOSSIM/ fixnames.pl line 26 fixnames.pl error
fixnames.pl 에 있는 정규표현식
"/^(\d+)\t([^:]*):(\d+)$/"
에 문제가 있다.
정규표현식의 “*” 앞에 ”.” 을 추가하면.. 다음과 같은 정규표현식이 되고 문제를 해결할 수 있다.
"/^(\d+)\t([^:].*):(\d+)$/"
Mica2 디렉토리에서 다음 명령을 실행한다.
avr-objdump -d -l make.exe
(PowerTOSSIM 스크립트 명령중 하나인 bb2asm.pl이 위 명령을 사용한다.) 만약 “C:” 로 시작하는 패스가 있으면, bb2asm.pl 파일을 수정해줘야 한다.
elsif (/^C\:\/PROGRA~1\/UCB\/cygwin/){
$temp=$_;
$temp=~s!C\:/PROGRA~1/UCB/cygwin!!;
($cur_file, $cur_line) = split /:/, $temp;
}
“while(<OBJDUMP>) { ” 로 시작하는 부분에 위 코드를 추가하면 된다.
Discussion