Embedded2009. 11. 23. 07:03
eCOS는 cygnus 사에서 만들어서 발표한 Embedded용 RT O/S입니다.
uC/OS보다는 무겁지만, 성능은 좋다고 알려져 있습니다.

cygnus사는  cygwin으로 유명하였던 회사입니다. 현재  이 회사는 redhat에 인수되었습니다.
하지만, 최근에도 조금씩은 eCOS나 Cygwin의 업댓을 하는 것 같아보입니다.

eclipse는 당연히 다 아시겠지만,
공개된 강력한 IDE 플랫폼 입니다. plugin을 설치하거나 설계해 넣어서 고유한 기능을 확장 할 수 있도록 만들었습니다.  IBM에서 공개해주었지만, IBM 도 이렇게까지 성공할 줄은 정말 몰랐던것 같습니다.  관련자들도 그렇게 증언하고 있으니까요...

뭐 이렇게 설명하는 것은 재미있는 툴이 하나 발견되었기 때문입니다.

eCOS는 H/W Layer와 내부 컴포넌트를 적당히 선택해서 다시 구성할 수 있는 GUI를 제공했었습니다.
(과거형인것은 요새 써보질 않아서리..)

그런데 이것을 eclipse에 통합시킨 툴을 파는 회사가 있습니다.

codeconfidence사입니다. 영국 회사이고 제품 이름은 code confidence입니다.


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
한카피에 400 파운드 정도이니, 한 카피당 80만원정도가 되네요

eCOS는 국내에서는 크게 대우 못받지만, 해외에서는 간간이 쓰인다고 하던데,
그게 사실이었던것 같습니다. 이런 툴들이 나오고 또 판매되니까요.

그런데 궁굼한것은
 eCOS는 무료였고, Eclipse도 무료입니다. 여기에 plugin을 붙여서 파는 것은 허락되어 있으니까,
그런 형태로 상용으로 파는 것은 이해가 되는데, 본질적인 이 툴의 용도는 eCOS의 Configuration GUI입니다.
그럼, eCOS에서 기본적으로 제공하는 Configuration GUI랑 경쟁하게 될텐데 어떤 다른 장점이 있을까요 ?
80만원이나 내고 사용할 필요가 있을지가 궁굼하여집니다.

 통합개발 환경이니, GDB와 JTAG도 지원한다는 의미일텐데, 사실 대부분의 프로세서 개발환경이 오픈된 상태에서 경쟁력 포인트가뭔지 궁굼합니다. - 그리고 개발 환경 자체도, 프로세서 회사것이 훨씬 좋습니다. ARM만 해도 RVDS가 좋지, GDB가 좋지 않은 것과 마찬가지 입니다.


아래 그림은 eCOS 에서 제공하는 default configuration tool입니다.
이곳 페이지에서 찾아볼 수 있습니다.


사용자 삽입 이미지

 
사용자 삽입 이미지

참고로 eCOS 라이센스는 GPL 라이센스를 따릅니다. 그냥 GPL만 따르면 무시무시한 소스코드 공개 라이센스 조항에 의해서 eCOS를 사용하는 모든 어플리케이션은 다 소스 코드를 오픈해야 하는 상황에 봉착합니다. 당연히 상용으로는 사용하지 않을려고 하겠죠.  그래서, eCOS는 별도의 예외 조항을 두어서 eCOS의 코아를 건드리면 오픈해야 하고, 코아를 건드리지 않는 범위 내에서는 어플리케이션 S/W는 오픈하지 않아도 된다는 라이센스 형태를 두고 있습니다. - 이런 조항도 가능한것이구나 싶은 라이센스 조항이었습니다.

관심 있으신 분들은 아래 사이트를.. 참고하세요

'Embedded' 카테고리의 다른 글

[MIPS] Simulator  (0) 2009.12.20
MPEG 1/2 Reference Site  (0) 2009.12.13
H.264 SVC 참고 사이트 입니다.  (0) 2009.07.04
DM6467 Develop Board  (2) 2009.06.25
FFMPEG /X264를 MAC에서 빌드  (0) 2009.06.14
Posted by GUNDAM_IM
MAC Life2009. 11. 20. 09:48
Perl은 스크립트 베이스로 움직이는 아주 쉬운 랭귀지중 하나입니다.
그냥 예전의 Basic처럼 풀어쓴다는 느낌으로 사용하며, 원래 목적은 스트링을 쉽게 처리하기 위한 것이 목적인 언어입니다.  

SoC의 테스트 환경을 빌드 할 경우에도,

PERL->PLI->Verilog

와 같이 하여서 몇가지 트릭으로 Command를 만들고, 보내기도 하기 때문에 유용하게 쓰일때가 많이 있습니다.

사실 저는 Makefile 신봉주의자에 가까워서, 모든 것을 Makefile로 해결하였습니다. 하지만  떄떄로 시뮬레이션할때 상호간에 Interactive한 환경을 빌드 할 경우 몇가지 옵션을 만들어서 해결해야 하는 것이어서, 사실상 그때마다, Makefile내에 새로운 Target을 지정하여 사용하였습니다.

이런 방식은

TCL/TK -> Makefile @ Multi Target

정도로 표현이 가능하겠습니다.

예를 들어서 언제 써먹냐 하면 SoC내의 부팅 옵션을 틀리게 지정하고 싶은 경우에
Make NANDBootSIM 을 하면 NAND Boot 되는 옵션으로 세팅되면서 시뮬레이션을 돌리지만,
그때마다 다른 조건들을 맞추어주거나 조건의 배열을 만들어주어야 하는 불편함도 좀 있습니다.


그래서 좀더  유연한 확장을 위해서 Makefile+Perl을 같이 사용하기 위해서 Perl환경을 꾸며보기로 했습니다.
명색이 그래도 그냥 Perl을 사용하긴 싫고 하여 Perl/Tk도 같이 붙여서 사용하는것이 좋을 듯 하였습니다.

시뮬레이션은 MAC에서 하지는 않지만, 그래도 Perl/Tk 스크립트를 짜고 간단한 테스트를 하는 것은 MacBook에서 수행해기 때문에 MAC에도 빌드해 두어야 할 필요성이 생겼습니다.
다행히 Perl자체는 이미 Leopard에 포함되어 있어서 사용에는 아무런 문제가 없습니다.

일단 코드는 아래 사이트에서 받아 볼 수 있습니다.

http://search.cpan.org/~srezic/Tk-804.028_501/

다운로드 받아서 빌드를 하면 잘 풀어집니다.

perl Makefile.PL
make
sudo make install

로 하면 잘 풀어서 컴파일이 됩니다.

중간 중간에 경고나 에러가 뜨는데, 그런것에 대해서 일일이 반응하시지 마시고 무시하고 진행하면 됩니다.

용법은 단순합니다. perl 스크립트의 시작시에 다음과 같이 한 줄을 넣으면 됩니다.

use Tk;

다음은 예제 스크립트입니다.

my $mw = MainWindow->new;
$mw->Label(-text => 'Hello I\'m Perl/Tk !')->pack;
$mw->Button(
    -text    => 'Quit',
    -command => sub { exit },
)->pack;
MainLoop;


test.pl이라는 이름으로 저장하고요

perl test.pl

을 하면 다음과 같이 창이 나타납니다.

사용자 삽입 이미지
tk는 좀 그렇다 치더라도
대량의 테스트 패턴을 인터렉트브한 상황에서 만들어야 할 경우 PLI/C도 유용한 환경입니다.
하지만 그때마다 PLI를 만드는것 보다는 Perl Script로 만들어서 동작시키는 것도 좋습니다.

'MAC Life' 카테고리의 다른 글

바텍이 Things 로 옮겼네요  (0) 2010.03.21
산호세 애플샵  (0) 2010.02.28
SIGGRAPH [2]  (0) 2009.08.07
CUDA on MAC OS  (0) 2009.06.23
맥에서 프로파일링 하기  (0) 2009.06.18
Posted by GUNDAM_IM
Hobby2009. 11. 17. 18:03
3번째 도전 끝에 드디어 대천사 엘기오스를 물리치고
NDS세상과 불편했던 제 마음에  평화를 가지고 왔습니다.

사용자 삽입 이미지

이넘이 최종 보스 마왕이된 2단 변신 엘기오스 입니다.
드래곤볼의 프리쟈도 3단 변신했었는데 이넘은 2단 변신이 끝이네요..
정말 강적으로 원샷에 멤버 3명이 누울 때는 정말 갑갑했습니다.
날개 빼면 웬지 프리쟈 생각나는게 저만그런가 싶네요..


재도전을 하기 위해서 파티원들의 레벨을 올려서  48~49 대로 포진 시키고 도전했는데 그래도 원체 강력해서, 몇번 실패했습니다. 역시 운빨이 필요합니다.

사용자 삽입 이미지
하여튼 간신히 물리치고 나니 간만에 보는 게임 엔딩..
FF3 이후 처음으로 정말로 정말로 오래간만에 완파한 게임이네요

여신님 (유이인가 ??!!, 아니면 아야세 하루카.. ) 에게서 인간 세상을 지키라는 새로운 임무를 받았으니
이제 당분간 세상을 지키면서 던전 탐험을 해볼랍니다.








'Hobby' 카테고리의 다른 글

새로운 트랙키의 시작입니다.  (0) 2010.01.05
아~~~ 아~~~ 얄미운 아이폰  (0) 2009.12.09
Perl Debug command 정리  (0) 2009.11.17
[DQ9] 드디어 마지막 장으로....  (0) 2009.11.12
Dragon Quest IX 열랩하기  (0) 2009.11.05
Posted by GUNDAM_IM
Hobby2009. 11. 17. 13:32
요새 갑자기 안쓰던 Perl을 쓸일이 생겨서 Perl을 열심히 공부하고 있습니다.
그렇다고 새로 짜는것도 아니고 전문가가 (정말 Perl의 전문가) 께서 작성한 코드를 디버깅 해야 하는 상황이 발생해서 고생하고 있습니다.

이리저리 하다가 필요한 것이 Perl 디버깅 커맨드를 따로 정리해 두는 것이 편할 것 같아서 정리해둡니다.
관련 내용은 아래 페이지에서 발췌했습니다.

대부분은 GDB 커맨드랑 비스므레 하기 때문에 쉽게 다가설 수 있습니다.
모듈 로딩 이라던가 기타 등등은 디버깅에서 확인하면 도움이 됩니다.

http://www.devshed.com/c/a/Perl/Using-The-Perl-Debugger/
 
요기 아래 링크로 가면 좀더 자세한 디버깅 정보를 확인할 수 있습니다.
설명도 좋고..
http://doc.perl.kr/twiki/bin/view/Perldoc/PerlDebtut


1. 디버깅 모드에 들어가기


펄은 자체적으로 디버깅 환경을 가지고 있습니다.

perl -d로 수행하면 되고 대개의 경우 스크립트 제일 처음에 있는

#/usr/bin/perl

라인에

#/usr/bin/perl  -d

옵션을 추가해서 실행하면 자동적으로 디버깅 모드에 들어갑니다.

2. 리스트 보기


"l" (L) 입니다. (I)가 아니고..
을 넣으면 스크립트 라인을 보여줍니다.

DB<1> l

6==> unless($ARGV[0])
7 {
8: print "ERROR: Please provide a valid input ID\n\n";
9 }
10
11 # get user input into variable
12: my $id = $ARGV[0];
13
14 # connect
15 # fix these as per your local settings

"l <line number>"로 지정된 라인을 볼 수 있습니다.

DB<3> l 19
19==> my $sendmail = "/usr/sbin/sendmail -t";


아니면 지정된 라인부터 몇 라인 까지 본다면

"l 20-25"
로 하면 됩니다.

DB<4> l 20-25
20==> my $reply_to = "Reply-to: foo\@bar.org";
21: my $subject = "Subject: FOOBAR";
22: my $content = "Hello and how are you doing? This is the message body";
23
24 # now retrieve email addresses and send mail to each
25: my $sth = $dbh->prepare("SELECT email FROM users WHERE users.id =
'$id'");


"V <line number>" 는 주어진 라인 을 기준으로 전후 라인을 보여줍니다.
DB<3> v 27
24: my $description = $ref->{'description'};
25: $sth->finish();
26
27 # now use the group ID to get the group text
28: my $sth = $dbh->prepare("SELECT group_text FROM groups WHERE
group_id =
'$gid'");
29: $sth->execute();
30: my $ref = $sth->fetchrow_hashref();
31: my $gtext = $ref->{'group_text'};
32: $sth->finish();
33

문자열을 찾고 싶다면 vi처럼

"/STRING" 을 하면 됩니다.

DB<3> /FOOBAR
21: my $subject = "Subject: FOOBAR";

3. 실행하기


다음 라인을 수행하고 싶다면

"s" 를 하면 됩니다.

main::(mailer.pl:6): unless($ARGV[0])
main::(mailer.pl:7): {
DB<1> s
main::(mailer.pl:12): my $id = $ARGV[0];
DB<1> s
main::(mailer.pl:16): my $dbh =
DBI->connect("DBI:mysql:database=db198;host=localhost", "root",
DBI->"secret",
{'RaiseError' => 1}) or die ("Cannot connect to database");
DB<1> s DBI::connect(/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi/DBI.pm
:442):
442: my $class = shift;
DB<1> s DBI::connect(/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi/DBI.pm
:443):

s 명령어는 gdb와 마찬가지로 한스텝씩 실행하면서 진행하고 서브 루틴이 나오면 해당 서브루틴으로 들어가서 수행하게 됩니다.

서브 루틴을 건너 뛰면서 수행하는 것은 gdb와 마찬가지로 n 입니다.

main::(mailer.pl:6): unless($ARGV[0])
main::(mailer.pl:7): {
DB<1> n
main::(mailer.pl:12): my $id = $ARGV[0];
DB<1> n
main::(mailer.pl:16): my $dbh =
DBI->connect("DBI:mysql:database=test;host=localhost", "root", "",
{'RaiseError' => 1}) or die ("Cannot connect to database");
DB<1> n



서브 루틴 안에 있다면 서브 루틴의 끝까지 수행하여야 하는 경우
"r" 명령을 이용해서 서브 루틴의 끝까지 진행할 수 있도록 합니다.

DB<1> s DBI::connect(/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi/DBI.pm
:443):
443: my($dsn, $user, $pass, $attr, $old_driver) = @_;
DB<1> r
scalar context return from DBI::connect: empty hash
main::(mailer.pl:19): my $sendmail = "/usr/sbin/sendmail -t";



4. 값을 보기

변수들의 값을 확인하는 방법입니다.
gdb와 같은 방식을 취하고 있습니다.

"x"  명령은 변수의 값을 확인할 수 있습니다.

DB<7> @friends = qw(Rachel Ross Joey Monica Chandler Phoebe);

DB<8> x @friends
0 'Rachel'
1 'Ross'
2 'Joey'
3 'Monica'
4 'Chandler'
5 'Phoebe

"p" 명령은 값을 프린트 할 수 있습니다.

DB<4> p $sendmail
/usr/sbin/sendmail -t

DB<7> $movie="Star Wars"

DB<8> p $movie
Star Wars


"V package_name"  명령은 지정된 패키지의 정보와 모든 내부 변수를 확인할 수 있습니다.

DB<32> V DBI
%DBI_methods = (
'db' => HASH(0x81e292c)
'CLEAR' => HASH(0x8281ff8)
'O' => 4
'DESTROY' => undef
'EXISTS' => HASH(0x8281ff8)
-> REUSED_ADDRESS
'FETCH' => HASH(0x808b198)
'O' => 1028
'FIRSTKEY' => HASH(0x8281ff8)
-> REUSED_ADDRESS
'NEXTKEY' => HASH(0x8281ff8)
-> REUSED_ADDRESS
'STORE' => HASH(0x8284968)
'O' => 1040
'_not_impl' => undef
'begin_work' => HASH(0x83155a8)
'O' => 1024
'U' => ARRAY(0x831556c)
0 1
1 2
2 '[ \\%attr ]'
'column_info' => HASH(0x81e2680)
'O' => 512
'U' => ARRAY(0x81e2644)
0 1
1 6
2 '$catalog, $schema, $table, $column [, \\%attr ]'
'commit' => HASH(0x8315608)
'O' => 1152
'U' => ARRAY(0x83155d8)
0 1
1 1
...


"X" 명령은 스크립트 전체의 변수와 환경 변수 등에 대한 모든 정보를 덤프시킵니다.

DB<32> X
FileHandle(STDIN) => fileno(0)
$^V = "\cE\cH\c@"
$2 = ''
$1 = 'main'
$movie = 'Star Wars'
$^WARNING_BITS = "\c@\c@\c@\c@\c@\c@\c@\c@\c@\c@\c@\c@"
$< = 515
FileHandle(stdin) => fileno(0)
@ARGV = (
0 'ueruir'
)
@INC = (
0 '/usr/lib/perl5/5.8.0/i386-linux-thread-multi'
1 '/usr/lib/perl5/5.8.0'
2 '/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi'
3 '/usr/lib/perl5/site_perl/5.8.0'
4 '/usr/lib/perl5/site_perl'
5 '/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi'
6 '/usr/lib/perl5/vendor_perl/5.8.0'
7 '/usr/lib/perl5/vendor_perl'
8 '.'
)
%INC = (
'AutoLoader.pm' => '/usr/lib/perl5/5.8.0/AutoLoader.pm'
'Carp.pm' => '/usr/lib/perl5/5.8.0/Carp.pm'
'Carp/Heavy.pm' => '/usr/lib/perl5/5.8.0/Carp/Heavy.pm'
'Config.pm' => '/usr/lib/perl5/5.8.0/i386-linux-thread-multi/Config.pm'
'DBD/mysql.pm' => '/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBD/mysql.pm'


"M"은 로딩된 모든 모듈에 대한 정보를 보여줍니다.

DB<32> M
'AutoLoader.pm' => '5.59 from /usr/lib/perl5/5.8.0/AutoLoader.pm'
'Carp.pm' => '1.01 from /usr/lib/perl5/5.8.0/Carp.pm' 'Carp/Heavy.pm' => '/usr/lib/perl5/5.8.0/Carp/Heavy.pm'
'Config.pm' => '/usr/lib/perl5/5.8.0/i386-linux-thread-multi/Config.pm'
'DBD/mysql.pm' => '2.0416 from /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/DBD/mysql.pm'
'DBI.pm' => '1.30 from /usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi/DBI.pm'
'DynaLoader.pm' => '1.04 from /usr/lib/perl5/5.8.0/i386-linux-thread-multi/DynaLoader.pm'
'Exporter.pm' => '5.566 from /usr/lib/perl5/5.8.0/Exporter.pm' 'Exporter/Heavy.pm' => '5.566 from /usr/lib/perl5/5.8.0/Exporter/Heavy.pm'
'Term/Cap.pm' => '1.07 from /usr/lib/perl5/5.8.0/Term/Cap.pm' 'Term/ReadLine.pm' => '1.00 from /usr/lib/perl5/5.8.0/Term/ReadLine.pm'
'dumpvar.pl' => '/usr/lib/perl5/5.8.0/dumpvar.pl'
'perl5db.pl' => '1.19 from /usr/lib/perl5/5.8.0/perl5db.pl' 'strict.pm' => '1.02 from /usr/lib/perl5/5.8.0/strict.pm' 'vars.pm' => '1.01 from /usr/lib/perl5/5.8.0/vars.pm' 'warnings.pm' => '1.00 from /usr/lib/perl5/5.8.0/warnings.pm' 'warnings/register.pm' => '1.00 from /usr/lib/perl5/5.8.0/warnings/register.pm'

소문자 로 쓰여진

"m Package_name"은 지정된 패키지의 함수 등에 대한 정보를 보여줍니다.

DB<33> m DBI
CLONE
_clone_dbis
_dbtype_names
_debug_dispatch
_rebless
_rebless_dbtype_subclass
_set_isa
_setup_driver
available_drivers
bootstrap
carp
confess
connect
connect_cached
connect_test_perf
constant
croak
data_sources
dbi_profile
via Exporter: export_ok_tags
via Exporter: export_tags
via Exporter: export_to_level
via DynaLoader: AUTOLOAD
via DynaLoader: boot_DynaLoader
via DynaLoader: dl_install_xsub
...

마지막으로 "S" 명령은 현재 스크립트및 로딩된 스크립트에서의 서브 루틴 리스트를 모두 보여줍니다.

DB<35> S
AutoLoader::AUTOLOAD
AutoLoader::BEGIN AutoLoader::__ANON__[/usr/lib/perl5/5.8.0/AutoLoader.pm:96]
AutoLoader::import
AutoLoader::unimport
Carp::BEGIN
Carp::caller_info
Carp::carp
Carp::cluck
Carp::confess
Carp::croak
Carp::export_fail
Carp::format_arg
Carp::get_status
DBD::mysql::AUTOLOAD
DBD::mysql::BEGIN
DBD::mysql::_OdbcParse
DBD::mysql::_OdbcParseHost
DBD::mysql::db::ANSI2db
DBD::mysql::db::BEGIN
DBD::mysql::db::_SelectDB
DBD::mysql::db::admin
DBI::BEGIN
DBI::CLONE
DBI::DBI_tie::STORE
...


"s string"은 string으로 지정된 문자열을 포함한 함수 혹은 변수의 리스트를 보여줍니다.

DB<35> S connect
DBD::_::db::disconnect
DBD::_::dr::connect
DBD::_::dr::connect_cached
DBD::_::dr::disconnect_all
DBD::mysql::dr::connect
DBI::connect
DBI::connect_cached
DBI::connect_test_perf
DBI::disconnect
DBI::disconnect_all






'Hobby' 카테고리의 다른 글

아~~~ 아~~~ 얄미운 아이폰  (0) 2009.12.09
[DQ9] 오오 드디어 엔딩으로  (0) 2009.11.17
[DQ9] 드디어 마지막 장으로....  (0) 2009.11.12
Dragon Quest IX 열랩하기  (0) 2009.11.05
MockUp-재미있는 GUI Outliner 프로그램  (0) 2009.09.23
Posted by GUNDAM_IM
Hobby2009. 11. 12. 13:13
2개월 여 동안 꾸준히 진행한 끝에 드디어  마지막 장으로 들어갔습니다.

마이게임 투덜투덜 님의 공략기가 있어서 따라서 가면서 끝낼 수 있었습니다.
사용자 삽입 이미지
아길로와 함께 하늘을 나는 기차를 타고 신의 나라 아니 이제는 마궁이 되어버린 곳으로 가는 주인공입니다.
입고 있는 뽀대있는 옷은 용기사 갑옷 씨리즈입니다.
  - 항상 RPG는 최종장의 장갑은 용기사 아니면 전기사 씨리즈로 통일 시킨듯 한 느낌이죠

사용자 삽입 이미지
최종 장인 신의나라에 도착, 이곳은 이미 엘기오스의 마력에 의해서 마궁으로 바뀌어져 있습니다.

최종장에는 어떤 감동이 ..

이번 드퀘9은 스토리는 짧께 되어있습니다만, 대신에 게임 엔딩  이후에도 다양한 공략을 즐길 수 있도록 되어 있습니다.  짧은 시나리오 덕분에 FF3보다는 빠른 시간내에 끝낼수 있었네요.  좀더 즐겨 보다가 다른 게임으로 넘어가야 하겠습니다.


게임의 분위기는 곳곳에서 드래곤 볼 냄새를 풍기는 게임이었습니다.

여신의 과일 모으기 == 드래곤 볼 모으기
천사의 나라 -> 신의 나라  == 신 -> 계왕

주인공의 사부인 이지아르는 크리링 리비전이란 느낌이 강하죠..
사용자 삽입 이미지
 - 주인공의 스승인 이쟈르 중간에 장렬하게 전사합니다.  도대체 날개만 뺴면 크리링이랑 차이점이 뭘냔 말이냐 ?

중간 중간 나오는 캐릭터는 18호랑 닮은 느낌 (성격은 하늘과 땅이지만)
적 몬스터도, 타이의 대 모험과 드래곤 볼의 합성이란 느낌이 강하고....




'Hobby' 카테고리의 다른 글

[DQ9] 오오 드디어 엔딩으로  (0) 2009.11.17
Perl Debug command 정리  (0) 2009.11.17
Dragon Quest IX 열랩하기  (0) 2009.11.05
MockUp-재미있는 GUI Outliner 프로그램  (0) 2009.09.23
건담 강림 3rd - 사진 정리  (0) 2009.09.02
Posted by GUNDAM_IM
ASIC SoC2009. 11. 8. 22:08
학생들을 대상으로 강의한 다는 것은 많이 많이 어려운 점이 있습니다.

제가 실력이 없어서 가리키기가 힘든 것도 있습니다.

가리키기 어려운 부분이 많이 있지만, 그중에서도 경험자들에게는 당연시되는 부분인 Protocol이나 Timing Chart를 해석하는 것이 처음 배우는 학생들에게는 가리키는 것도 배우는 것도 어려운 부분인듯 합니다.  
   매년 이런 부분은 학생들 보고 알아서 준비하라는 다소간 무책임한 형태로 넘어갔지만, 올해는 한번 잘 설명해볼려고 자료를 만들어 봤습니다. 쉽게 쉽게 설명할려고 글은 최대한 배제하고 만들었습니다.

  부족한 부분은 실제 버스 프로토콜을 설명하는 부분과,
  진짜 시간에 대한 설명등이 필요하지만,
 
  그것까지 만들기에는 게을러서.. 건너 뛰었습니다.
  나머진 다음번에 추가시키겠지만, 아마 올해가 마지막 강의가 될것이어서...  더이상의 업데이트는 없겠습니다.
    

부족한 자료이지만, 참고하시기 바랍니다.

GUNDAM


'ASIC SoC' 카테고리의 다른 글

[MIPS] OSX에서 MIPS C Compiler를 빌드하기  (0) 2009.12.17
PERL TIP  (0) 2009.12.05
SystemC에서 main() 함수 넣기  (0) 2009.11.04
SystemC에서 배포가능 버전 만들기  (0) 2009.11.01
취업 씨즌이 시작되었군요  (0) 2009.10.27
Posted by GUNDAM_IM
Hobby2009. 11. 5. 09:38
오다이바 건담 탐방에 득템하였던 몇가지 아이템 중에 하나가 국민 RPG라고 불리우는 드래곤 퀘스트 9 입니다.
파이널 판타지와 함께, 양대 RPG 산맥을 구축하는 게임이죠

사용자 삽입 이미지
 5탄을 해본 뒤로는 하지 않았는데, 요새 파이널 판타지도 뜸하고 WOW는 페인 증세로, 잠시.. 접었기 때문에
남는 시간에 손을 대고 있습니다.
 
사용자 삽입 이미지
 위 사진은 드퀘9 발매일에 살려고 전날 밤부터 줄선 사람들의 사진입니다. - 우울 + 신기 한 사진..

플레이 시간을 집중적으로 할당하기 힘들어서, 파트 시간을 쪼개서 하고 있습니다.
점심 / 저녁 먹고, 30분 정도씩  그리고 화장실 가서 조금씩 하고 있으니 진도가 더디게 나가고 있습니다.
이제 여신의 과일을 모으는 것이 주요 미션인 게임입니다. 간신히 7개 모았으니 천공계로 돌아가야 하는 순서입니다.  여신의 과일 == 드래곤 볼.. 인 느낌이 나죠.. 옵니버스 스토리에, 중간 보스가 있는 스토리 등등
토리야마 선생께서 그림을 그려서인가 하여튼 상당히 드래곤볼 틱합니다.

그래도 꾸준히 격파해 나가면..  파이널 판타지 3 이후 처음으로 완파한 닌텐도 DS용 게임이 될 것 같습니다.

이 게임의 장점은 게임이 끝난 후에도 계속 게임을 즐길 수 있다는데 있습니다.
게임 완파 한 뒤에도 즐길 수 있는 숨겨진 던전이라던가 맵이 상당히 많이 있다는  사실..

그런데 그런 던전 정보등을  교환할려면, 여관 차리고 손님받기 모드로 해서 손님이랑 정보 교환을 해야 한다고 합니다.
- 아직 거기까진 못가봐서.. 루머만 듣고 있죠..

여관에서 손님받기 모드로 해두면, 좋긴 하는데, 손님 받을 수 있을려나  
아키하바라에서는 엄청 많은 사람들이 손님 받기 모드로 기대리고 있다고 하는데 우리나라는.. 그런거 별로 없겠죠

아키하바라에 여관 차려야 하겠습니다.

사용자 삽입 이미지
손님 못 받으면, 이런 상태가 되어버릴지도...
그렇다고 액코를 넣기에는 자존심이 허락치 않으니.. 기필코... 수작업으로 돌파하리라 하는 생각을 가지고 있습니다.



Posted by GUNDAM_IM
ASIC SoC2009. 11. 4. 21:56

SystemC는 sc_main에서 시작합니다. 보통은 여기서 부터 초기화를 하고 진행하면 되지만

경우에 따라서는 곤란한 경우가 존재합니다.  대표적인것이 특정 그래픽 라이브러리를 함께 사용하고자 할 경우 오류가 발생하게 됩니다. 이는 Multi Thread 환경에서 발생하는 오류입니다.


이를 해결하기 위해서는 해당 라이브러리의 Multi Thread Support 기능을 잘 조정해 주어야 하는데 이 역시 코딩할 때나 컴파일 할 때 신경을 써야 하는게 많으므로 현실적인 해결책이 아닙니다.


그래서 main 함수에서 multi thread에 들어가기 전에 초기화 시키는 방법을 사용하는데 문제는 systemC가 main 함수를 wrapping하여서 sc_main을 제공한다는 점입니다. 그래서  계속 오류가 발생하는 데요.. 이를 해결하기 위해서는 main 함수를 새로 만들어 주어야 합니다.


표준안에 따르면 SystemC는 sc_elab_and_sim 을 호출하여서 시작합니다. 그리고 별도로 main함수를 제공할 수 있도록 되어 있습니다.


과정은 아래와 같습니다.


main.cpp에서 main함수가 있으면 이 함수를 먼저 호출하게 됩니다.

그리고 이 함수의 내에서 sc_elab_and_sim 을 호출하여 systemc의 영역으로 들어갑니다.
sc_elab_and_sim는 sc_main을 다시 호출하도록 정의 되어 있습니다.


아래 코드는 그에 대한 예제입니다.


#include "systemc.h"

//#include <iostream>



int main (int argc, char * argv[]) {

printf("This is  Main Function\n ");

sc_elab_and_sim(argc,argv);

}


int sc_main (int argc, char * argv[]) {

    // insert code here...

    std::cout << "Hello SystemC!\n";

    sc_start();

    return 0;

}



실행 결과는 아래와 같습니다.

This is  Main Function


             SystemC 2.2.0 --- May 25 2008 11:34:05

        Copyright (c) 1996-2006 by all Contributors

                    ALL RIGHTS RESERVED

Packaged for MacOS by Logic Poet: http://www.logicpoet.com


Hello SystemC!



1. 한가지 주의 할 점은 위의 코드에서 main 함수가 가장 먼저 나와야 한다는 점입니다.
name space에 관계된 부분인데, 별도의 키워드를 지정하면 되긴 하지만, 일단은 제일 쉬운 방법중 하나는  코드의 제일 처음에 나오도록 (심지어 변수도 다 뒤에서 정의하도록 한다.) 배열을 정리하면 호출하게 됩니다

'ASIC SoC' 카테고리의 다른 글

PERL TIP  (0) 2009.12.05
Timing Chart  (0) 2009.11.08
SystemC에서 배포가능 버전 만들기  (0) 2009.11.01
취업 씨즌이 시작되었군요  (0) 2009.10.27
SystemC : Module을 인스턴스 할 때에 파라미터 전달 하기.  (0) 2009.10.21
Posted by GUNDAM_IM
ASIC SoC2009. 11. 1. 22:26
SystemC와  Verilog의 가장 큰 차이점 중에 한가지는 배포본 만들기에 있습니다.

C/C++은 각각의 Class에 필요한 함수와 변수등을 Header파일에 선언하고 함수 등을 선언 한 뒤에
cpp파일에서 구현하게 됩니다.

비록 배포 버전에서는 cpp파일을 object로 바꾸어서 전달할 수 있지만 header파일을 찬찬히 보면,
세부 사양은 알 수 없더라도, 어떤 방식으로 구성되어 있는지 등은 알 수 있습니다.  
SystemC도 엄밀하게는 C++위에서 구성되어 있어서 마찬가지로 이런 문제점이 발생합니다.

IP의 생명인 보안성 부분에서는 상당히 취약하다고 할 수 있습니다.  

그래서 귀찮지만 Pointer로 받아서 구현하는 방식을 취합니다.
이 방식은 ME C++에서 설명한 방식입니다만, SystemC에서 응용할 줄은 몰랐습니다.

PIMPL Idiom 구현 방식입니다. 말 그대로 Pointer로 받아서 구현하는 것이므로,  Pointer IMPlementation 구현 방식입니다.

일종의 Pointer Wrapper 방식이라 할 수 있습니다.

사용자 삽입 이미지
위와 같이 DesignModule을 설계하였으면 이것을 그냥 배포하는 것은 곤란하므로
DesignModule_wrapper를 쒸워서 내부 설계 정보를 최대한 Hidden 시켜서 배포하게 됩니다.

Wrapper가 가지는 조건은 다음과 같이 됩니다.

당연하게 포트가 같아야 합니다.
   - 나중에 실제 모듈로 대치하게 된다면 포트 이름도 같이 해두는게 당연히 좋습니다.


그럼 아래와 같이 예를 들어 보겠습니다.

설계한 모듈은

DesignModule이라고 한다면 header파일과 cpp파일을 가지고 있습니다.

DesignModule.h

SC_MODULE(DesigModule)
{
// Port Declaration
PortA ;
PortB ;
PortC ;
// 이하는 뭔가 중요할 것만 같은 .. 중요해야 되는 디자인 정보.. T__T;;
......
......
}

DesignModule.cpp
.....


이것을 쒸울 Wrapper는

DesignModule_Wrapper.h

class DesignModule; // 미리 클래스라고 알려주어서 컴파일 시에 오류가 생기지 않도록 한다.

SC_MODULE(DesignModule_Wrapper)
{
// Port Declaration
        SC_CTOR(DesignModule_Wrapper){
DesignModule_Wrapper_port();
        };
//
private :
DesignModule * pDesignModule;       // 이렇게 하위 클래스의 포인터를 선언해서 받아온다.
virtual ~ DesignModule_Wrapper();  // 포인터로 선언해서 나중에 new 연산으로 할당
                                                                     //  할 것이므로 Destructor에서 반드시 Delete해 주어야 한다.
                void DesignModule_Wrapper_port();

}

DesignModule_Wrapper.cpp

#include "DesignModulle.h"

DesignModule_Wrapper::DesignModule_Wrapper_port()
{
   pDesignModule = new DesignModule;

   pDesignModule->PortA(PortA);
   pDesignModule->PortB(PortB);
   pDesignModule->PortC(PortC);

}

......
DesignModule_Wrapper ::~ DesignModule_Wrapper()
{
delete pDesignModule;
}

 





DesignModule.h파일을 DesignModule_Wrapper.cpp파일에서 불러들인다는 점이 중요합니다.
즉, 실제 디자인에 관련된 정보는 DesignModule.h파일에 있으며 이 것을 Wrapper용 Header File에서 Include하지 않음으로서 Compile 시에 Dependency를 제거해 주는 것이 목적이 됩니다.

따라서 최종 사용자는

DesignModule_Wrapper.h


DesignModule_Wrapper.o
DesignModule.o

3개 파일을 받게 되는 것입니다.
물론 Obj들은 Lib으로 묶어 버리면 2개 정도 파일만 가면 되는 것이어서 큰 문제가 없이 잘 됩니다.

최종 유저에게 오픈되어 있는 정보는 DesignModule_Wrapper.h 파일 뿐이므로 실제 디자인 내부 정보는 오픈되지 않습니다.

이 방식은 Wrapper를 거치는 방식이므로, 실제 동작시에는 느려진다고 합니다.
어느정도까지 느려질 지는 테스트 해보지 않아서 잘 모르겠습니다.

Posted by GUNDAM_IM
Books2009. 10. 30. 13:59
사용자 삽입 이미지
시중에 나온 대부분의 SystemC책들은 아직 SystemC 자체를 가리키는 데 목적을 두어서 응용편에서는 한없이 취약합니다. 원서들도 마땅히 그런 책을 찾아보기 힘듭니다.
이번에 발견한 책은 Amazon Japan에서 발견한 책입니다.

물론 이 책은 1/2 정도는 SystemC를 설명하고 있고 그 나머지 부분에서 JPEG을 설계하는 것을 알려주고 있습니다.  Untimed Functional Model에서  Cycle Accurate 모델까지 차례로 발전시켜 나가면서 설계를 하고 있습니다. 이러한 설명법은 모델간 차이점을 실제 구현에서 확인해 볼 수 있는 좋은 접근법입니다.

소스코드는 이책의 출판사 사이트에서 다운 받을 수 있을거라고 설명되어 있지만, 아직 사이트에 올라오지는 않은것 같구요..  2005년도 버전이라서 약간 예전 SystemC 코드를 사용한다는 점이 아쉽지만, 실제 구현예를 볼 수 있는 유일한 서적에 가까우니 권할 만 합니다. 이 책으로 완전한 JPEG을 구현하겠다는 분이 보신다면 좀 아쉬울 것입니다. 그냥 SystemC 코드의 실제 응용 예를 보는데 만족한다면 충분히 좋은 책입니다.

책은 JPEG 전체를 설명하지 않고 DCT 부분만 설계를 하고 있고 나머지 부분은  mcore라고 하는 프로세서를 연결시켜서 하게 되어 있습니다. 예전에 다른 문서를 보면 이 mcore는 도시바에서 (기억이 가물가물합니다. ) 사용한것으로 설명된 자료를 본적이 있습니다.

혹자가 말하길 이제 일본어는 제 2 외국어 축에 못낀다고 하죠.. 이 책의 일본어는 마크로스 대사를 외우시는 분들이 본다면,  쉽게 따라가면서 읽어 볼 수 있는 수준의 책입니다.  물론 책장에 한권 영어 말고 일본어 서적이 꽂혀 있으면 원서만 꽂아놓은 다른 분들 책장 보다 더~~~~욱 반짝이는 가오 효과를 볼 수 있다는 점도 장점입니다.


Posted by GUNDAM_IM