Embedded2010. 7. 18. 00:16
요새 구이가 하나 필요해서
이리저리 라이브러리를 뒤지고 있습니다.

리눅스나 제대로된 OS가 올라간다면 GUI문제가 해결되겠지만,
지금은 그런것을 올릴 계획이 없으므로 간단한 Embedded GUI를 찾아보고 있습니다.

그렇게 맘에 드는 것은 아직 못찾았습니다
그냥 Linux올려야 하나 라는 생각이 드네요

uC/GUI 데모 그림입니다.
디오이즈 데모 보드에서 돌리는 것입니다.


STM32F103 TFT LCD Board 에서 동영상입니다.


'Embedded' 카테고리의 다른 글

Altera NIOS-II (3)  (1) 2013.03.17
Altera NIOS-II (1)  (0) 2013.03.15
이슈 트래킹 어떻게 하나요 ?  (0) 2010.07.10
1초만에 부팅되는 Embedded Linux  (0) 2010.07.02
GCC4.5.0이 발표되었습니다.  (0) 2010.04.22
Posted by GUNDAM_IM
Embedded2010. 7. 10. 20:53

개발을 하다보면 발생되는  이슈 관리와 (아울러 커스터머 관리)가 항상  문제입니다.

이슈를 제기하는 쪽은 주로 커스터머 쪽입니다. 설령 회사 내에 동료라고 하여도, 엄밀하게 따지만, 개발자 측면 보다는 커스터머에 좀더 가까운 사람이 이슈를 제기하곤 합니다.  그래서 보통 회사에서는 이런 저런 이유로 대개 이슈 관리를 위한 이슈 트래커 시스템을 도입합니다.

특히 우리 회사처럼 칩개발하고 판매하게 되면 협업해야할 커스터머가 자꾸 늘어나게 되고,
그에 비례하여서 관리 해야할 이슈가 자꾸 발생하게 됩니다. 이런 경우 가끔 가다가 업무가 빠지거나 잊어먹는 소위 말하는 빵구 라는 경험을 자꾸 하게 되면 대개는 체계적으로 이슈를 관리할 필요가 있다고 생각되기 시작합니다.

문제는 이슈 관리하기 위해서 이슈 관리 소프트웨어들을 도입하게 되는데 이런  소프트웨어는 대개 본말이 전도되어서 관리를 위한 관리가 되어 버리기 쉽상입니다. 특히 휘황찬란한 입력 하면은 정말 입력을 포기하게 만들어버리는 일종의 이슈 게이트 키퍼로서의 역활을 하게 됩니다.

각설하고 요새 슬금슬금 고민되는 부분은 이슈가 늘어나기 전에 이슈 관리 시스템을 도입해야 하는 가에 대한 고민입니다.
만약 도입한다면, 회사의 개발자들과 관리자들과 영업/마케팅 사람들과
커스터머의 개발자 + 관리자 + 영업/마케팅 사람들과 함께 관리 시스템을 구축하여야 하는 것이 목표가 되어야 합니다.  하지만 결정적인 문제는 너무 쉬운 시스템은 윗분들이 쉽게 개입할 수 있고 너무 어려운 시스템은 그 자체로 죽어버린 시스템이 될 수 있다는 점입니다.

요새 유행하는 에자일에서는 반대로 이슈를 이런 시스템류에 묶어서 관리하지 말고,
커스터머랑 붙어서 일하라고 주장하고 있습니다.  즉 서로 교감해가면서 일하라는 의미입니다.
작은것 하나라도, 좀더 정밀하게 일하기 위해서는 좋은 접근법이라고 생각합니다.
물론 우리나라처럼 일방적인 갑과 일방적인 을이 존재하는 시스템에서는 교감이란 없습니다.

그런 의미에서 이슈 관리를 위한 방법을 나름대로 고민을 하였습니다.
일단 제일 쉬운 예로 이슈 트래킹 툴을 검토해볼만 합니다.

   상용으로 유명한 것은 JIRA이고
   GNU에서 유명한것은 MANTIS입니다.

저도 예전에 MANTIS를 도입해서 사용한 적이 있었습니다.
커스터머에 의한 이슈가 많아서라기 보다는 어떤 의미에서는 커스터머와 개발자 사이에 격리가 필요한 사항이었기 때문에 도입했었고 나름대로 효과를 보았다고 생각하였습니다. ( 매니저 측면에서 보았을때 개발자와 커스터머의 격리가 필요한 사항이라는게 좀 이상하겠지만, 그런 경우는 왕왕 발생합니다.)

이런류의 시스템의 문제점은 일단 사용법이 무지하게 귀찮다는 겁니다. 나름대로 잘 정리한 툴도 있고 단순하게 올리면 끝나는 툴도 있지만, 대개의 경우 첫 화면부터 사용자들을 질리게 한다는 점이죠.  
이슈를 올리기 위해서 툴을 공부해야 한다면 그것도 문제인 것입니다.

특히 JIRA는 완벽한 이슈 관리를 위한 완벽한 화면을 제공하지만 제공된 화면에 채워야할 칸의 수를 보면서 질려서 포기하게 됩니다. 특히 저같은 게으른 사람에게는 포기하고 싶은 완벽한 이유를 제공합니다.

더구나 실제 개발자가 아닌 윗분들이 그런 복잡한(?) 시스템에 들어와서 관리 현황을 체크하기란 어린아이가 JAVA 코드를 수정하는 것 만큼이나 어려운 문제입니다. 이문제가  JIRA의 구입을 어렵게 하는 요소입니다.

또한, 이런 류의 시스템은 무엇보다도 팀원의 절대적인 지지가 필요합니다. 팀원들이 사용하지 않고 차츰 무시하게 된다면 결과적으로 마지막에 가서는  팀원 전체가 무시하는 시스템이면 곤란하게 됩니다. 아무도 사용하지 않고 커스터머만 메아리없는 이슈를 올리게 되면 큰 문제가 됩니다.

그리고 그 다음 방법이 사실 가장 고전적인 방법인데
메일을 끊임없이 Reply하는 것으로 이슈를 관리하는 것입니다.

대개 창구를 정해놓고 그사람을 통해서 엄청나게 긴 메일을 관리하게 됩니다.
이렇게 되면 누구나 그런 이슈에 참가하게 되지만, 이슈를 관리한다기 보다는 나중에 문제가 터져을 때에
누구 책임인지를 공개적으로 마녀사냥할 수 있다는 점에서 (혹은 면피할 수 있다는 점에서)
애용되는 시스템입니다.

대개 사람들에게 이슈 트래킹 시스템을 갖추자고 한다면,
메일로 되는데 왜 또 다른 시스템을 구비해야 하냐고 답이오는데 이런 경우가 바로 메일로 Never Ending Reply를 하는 시스템을 사용하는 것입니다.

장점은 누구나 쉽게 이용한다는 점이고, 단점은 잘못되면 말장난으로 끝날 수 있다는 점입니다.

그래서 이번에 사용하는 방법은 Excel File에서 양식을 만들어서 Issue와 Action Item, Action Leader를 지정하고 관리할 수 있도록 하는 것입니다.

이 방법의 장점은
  엑셀 파일이므로, 관리자들도 쉽게 들어와서 현황 파악을 할 수 있다는 점입니다.
  그리고 누구나 테이블 관리가 되므로, 협업에서 커스터머도 참가할 수 있다는 점입니다.

물론 단점이 있는데
  이슈가 많아질 경우에 동시 다발 적일 경우에 관리가 혼란스러울 수 있다는 점과
  이슈 DB가 만들어지지 않으므로, 종국에 가서는 손해 일 수 있다는 점입니다.
 
  이슈 DB 문제는 약간 수고스럽지만,
  Application Note라던가 다른 방법으로 문서를 공유하도록 하면 해결 될 수 있습니다.
  동시 다발 적인 발생과 관리에서는 어쩔 수 없는 부분도 있습니다. 뭐 얻는것이 있다면 잃는 것도
  있어야죠. 등가 교환의 법칙인 셈입니다.

당장은 아쉬운대로 엑셀 파일로 충분하지만,

회사 규모가 커지고 프로젝트 참가자가 커진다면
지금처럼 엑셀로만 하는것에는 한계가 부딪칠 것입니다.
그때에는 맘에드는 이슈트래커를 찾아야 하겠지요.

다른 회사에서는 어찌하나
그리고 어떻게 하면 팀원들의 참가를 유도할수 있는지 궁굼해집니다.

------------------------------

이에 관련한 좋은 글은 아래 글을 읽어 보시기 바랍니다.


2회(2007년 12월): 이슈 트래커를 슬기롭게 활용하자



  ISSUE & WIKI 기반의 통합 관리에 대한 강의자료가 이곳에 있습니다.
  발표 자료는 아래에 연결해 두었습니다.

------------------------------

'Embedded' 카테고리의 다른 글

Altera NIOS-II (1)  (0) 2013.03.15
uC/GUI 데모 그림입니다.  (0) 2010.07.18
1초만에 부팅되는 Embedded Linux  (0) 2010.07.02
GCC4.5.0이 발표되었습니다.  (0) 2010.04.22
XCode에서 SCM 15505 ERROR가 발생하면..  (0) 2010.01.13
Posted by GUNDAM_IM
Embedded2010. 7. 2. 21:51
몬타비스타에서 1초만에 부팅되는 Linux Kernel을 발표했습니다.

리눅스의 로망이란것이 부팅할때 쫘악 하면서 올라가는 부팅메시지인데
이런것들이 없어지고 한방에 부팅되는것은 약간 허무하긴 합니다.

하지만 많이 사용할 수 있는 어플리케이션이 될 것 같습니다.
오토모티브라던가 포터블에서 부팅을 기다려줄 만큼 한가하지 않은 어플에서 경쟁력을 가질 수 있겠습니다.

아래 영상은 그 데모입니다.


아래는 관련한 리눅스의 발표 영상입니다.


Posted by GUNDAM_IM
Embedded2010. 4. 22. 21:12
GCC4.5.0이 발표되었습니다.

가장 큰 특징은 Link Time Optimization입니다. 이전에는 모듈 단위의 컴파일에서 최적화를 수행할 수 있었는데 이제는 모듈들을 링크해서 묶을때에도 최적화를 시킬 수 있습니다.  이것에 의해서 성능과 크기에 대한 최적화를 얻을 수 있다고 합니다.
LD로 메모리 올릴떄는 최적화가 되진 않을 것 같지만, 여러개의 모듈들을 하나의 Static으로 만들떄는 최적화가 될 것 같습니다.  

두번째 최적화 포인트는 루프 최적화입니다. 중첩 루프에 대한 최적화 방안인 Polytope 모델을 적용했습니다.
- 어려워서 패스~~

이에 관해서는 아래 링크를 참조하시기 바랍니다.
http://en.wikipedia.org/wiki/Polytope_model


버그 수정 본은 2010년 7월경에 4.5.1로 내놓을 예정이라고 하네요
빠르기도 하시지~

GUNDAM


-------

The Free Software Foundation and the GNU Compiler Collection (GCC)
development team have released GCC 4.5.0.  This release is a major
upgrade to the compilers, with a particular focus on the performance
of the generated code.  The developers have measured performance
improvements of 5% to 10% on high-performance computing benchmarks.
(Of course, results vary depending on choice of CPU, benchmark, and
optimization options.)

GCC 4.5.0 is now capable of "link-time optimization".  Traditionally,
most C and C++ compilers (including GCC) have only been able to
optimize within a single source file or "module".  GCC was therefore
unable to take advantage of optimization opportunities that required
knowledge about multiple modules.  This limitation has been removed in
GCC 4.5.0.  This optimization can provide significant increases in
performance and equally significant reductions in code size.

In addition, GCC 4.5.0 has improved loop optimization infrastructure.
This infrastructure, based on an advanced "polyhedral" model for
optimization, allows GCC to perform more advanced loop optimizations.
In the future, this infrastructure will be tuned and used more heavily.

GCC 4.5.0 also features improvements for a wide variety of specific
architectures, including support for recent CPUs using the ARM, AVR,
ColdFire, MIPS, Power, SuperH, and x86 architectures.  GCC also
generates better debug information for optimized code, including
information about the value of variables that have been optimized
away.  And, of course, a wide variety of defects in all parts of the
compiler (ranging from language conformance to code-generation) have
been corrected.

Refer to gcc.gnu.org:

 
http://gcc.gnu.org/gcc-4.5/changes.html

for more information about this release.

GCC 4.5.1, with corrections for any critical defects reported in GCC
4.5.0, is expected in July, 2010.

As always, a vast number of people contributed to this GCC release --
far too many to thank individually!  

--
Mark Mitchell
CodeSourcery

Posted by GUNDAM_IM
Embedded2010. 1. 13. 11:11
XCode에서는 코드 버전관리 기능이 들어가 있습니다.
저는 MACPRO에 SVNServer를 설치하고, MAC PRO나 MAC BOOK PRO에서 작업을 하면서, 코드를 일치시키고 있습니다.
그런데 빌드 폴더가 Commit가 안되는 경우가 발생합니다. 이 경우 아래와 같이 수정하였습니다.

이 오류는 빌드 폴더가 재 컴파일 시에 수시로 지워지거나 하기 때문에 발생합니다.

쉬운 방법은 SVN Configuration파일을 수정합니다.

~/.subversion/config
파일에서 주석문 처리된 것을 풀어냅니다.

[miscellany]
### Set global-ignores to a set of whitespace-delimited globs
### which Subversion will ignore in its 'status' output, and
### while importing or adding files and directories.
global-ignores = build *.model *.pbxuser *~.nib .DS_Store *~ 

위의 붉은색 라인에 주석문을 지웁니다.
그리고 아래 라인을 추가합니다.

 global-ignores = build *.mode1 *.pbxuser *~.nib .DS_Store *~


이후에 프로젝트를 다시 re-import하고
하드에 있는 프로젝트를 지우고
다시 check-out 하면 됩니다.

re-import시에 겹치므로, 서버에 있는 것을 지워져 있어야 합니다.


Posted by GUNDAM_IM
Embedded2010. 1. 3. 07:59
이번에는  Loop문이 어떻게 바뀌는지에 대해서 살펴 봅니다.
예제를 새로 짜는 것 보다는 기존에 있던것을 가지고 한번 해보겠습니다.

아래는 NEWLIB 라이브러리에 있는 memset 함수입니다.
참고로, newlib은 c에서 사용하는 여러가지 라이브러리를 embedded  등에서 사용할 수 있도록 제공해주는 라이브러리입니다. 다양한 프로세서에 포팅되어 있습니다. 대부분의 함수가 C로 코딩되어 있지만, 속도가 필요한 부분이나 프로세서에 종속적인 부분에 대해서는 assembler로 되어 있습니다.

주어진 어드레스 m에서 시작해서 주어진 값 c를   n개의 메모리에 차례로 기록하는 것입니다.

........
#define PREFER_SIZE_OVER_SPEED 1
_PTR
_DEFUN (memset, (m, c, n),
        _PTR m _AND
        int c _AND
        size_t n)
{
#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) || defined(__mips16)
  char *s = (char *) m;

  while (n-- != 0)
    {
      *s++ = (char) c;
    }

  return m;
#else
  char *s = (char *) m;
  int i;
  unsigned wordtype buffer;
......

#ifdef -else에서 #else는 복잡한(?) 판단문을 가지고 있으므로 위의 #ifdef를 이용하기로 합니다.
그래서 PERFER_SIZE_OF_SPEED를 Define하여서 #ifdef로 컴파일 되게 합니다.

코드를 보면 S라고 하는 스타팅 어드레스는 주어진 인자 m으로 세팅됩니다.
이후 while에서 n을 하나씩 밑으로 카운트 하면서 주어진 인자 c를  S포인터에 기록합니다.
이후 S 포인터를 하나씩 증가시킵니다.


컴파일 커맨드는 아래와 같습니다.
mips-elf-gcc -S -O2 memset.c -o memset.s

컴파일 결과는 아래와 같습니다.

        .file   1 "memset.c"
        .section .mdebug.abi32
        .previous
        .gnu_attribute 4, 1
        .text
        .align  2
        .globl  memset
        .set    nomips16
        .ent    memset
        .type   memset, @function
memset:
        .frame  $sp,0,$31               # vars= 0, regs= 0/0, args= 0, gp= 0
        .mask   0x00000000,0
        .fmask  0x00000000,0
        .set    noreorder
        .set    nomacro

        beq     $6,$0,$L7
        move    $2,$4

        sll     $5,$5,24
        sra     $5,$5,24
        move    $3,$4
$L3:
        addiu   $6,$6,-1
        sb      $5,0($3)
        bne     $6,$0,$L3
        addiu   $3,$3,1

$L7:
        j       $31
        nop

        .set    macro
        .set    reorder
        .end    memset
        .size   memset, .-memset
        .ident  "GCC: (GNU) 4.4.2"

위에서 보면 우선 $6이 $0과 같으면 $L7으로 분기하도록 되어 있습니다.
$0는 0 레지스터 값이므로 항상 0을 가집니다. 즉 주어진 카운트 값이 0이면 더이상 할 필요가 없으므로, 그냥 일을 마치고 돌아가는 것입니다.

따라서 $6이 인자 c (count)에 해당된다는 것을 알수 있습니다.

그리고 그 밑에

        sll     $5,$5,24
        sra     $5,$5,24

구분은 쉬프트 구문인데 $5를 왼쪽으로 24번 보냈다가 오른쪽으로 다시 24번 보내는 구문입니다.
뻉뻉이 돌리는 것인데요, 이렇게 하면 상위 24비트는 모두 0가 됩니다. 위의 구문은 그냥

and $5 , $5 , 0xFF와 같은 구문이 됩니다.

이렇게 해서 하위 8비트 즉 하위 1Byte만 사용한다는 것입니다. 인자 리스트를 쭈욱 보면 c에 해당하는 것이
함수 중간에서 char로 사용하고 있으므로 $5는 c에 해당하는 것임을 눈치밥으로 알수 있습니다.

      .......
      *s++ = (char) c; <-- 요기서  c가 char로 쓰이므로 불필요한 상위 24비트를 날려버리는 것이빈다.
      ....

이렇게 해서 필요한 / 사용할 데이터 타입과 변수들을 정리해 두고 whil에 해당하는 루프를 시작합니다.


$L3:
        addiu   $6,$6,-1
        sb      $5,0($3)
        bne     $6,$0,$L3
        addiu   $3,$3,1

을 살펴 봅니다.
$6이 카운트 값이라고 하였으니 addiu   $6,$6,-1  구문은 자연스럽게
 ...
 while (n-- != 0)
  ...
에서 n--에 해당함을 알 수 있습니다.
이제 갑자기 나온 레지스터 $3 이 보이는데 코드를 보면 레지스터 $5의 값을 어드레스 $3에 기록하는 것을 알 수 있습니다. 즉 메모리에 쓰는 어드레스를 $3에 기록합니다. 따라서 C코드에서 변수 s에 해당하는 것이 $3임을 알수 있습니다.

이후 카운트 값 레지스터 $6이 0이 아니면 계속 루프를 돌고 0이면 밑으로 내려가도록 되어 있습니다.
addiu $3,$3,1 은
어드레스를 1 증가시키는 것에 해당합니다.

      *s++ = (char) c;

에서 s++에 해당합니다.

이는 loop를 돌때 마다 해야 하므로 branch delay slot에 해당하는  BNE다음 구문으로 집어 넣습니다.

이렇게 해서 loop를 돌고 끝나면 jump로 복귀하게 됩니다.
복귀 문인 j 문 다음에 있는 NOP는 그냥 Delay Slot을 사용하지 않도록 하기 위해서 0으로 넣어버린 것입니다.






Posted by GUNDAM_IM
Embedded2009. 12. 30. 17:09
이번에는 조건부 분기문을 한번 보도록 하겠습니다.
C 코드는 아래와 같습니다.

typedef long TYPE;

TYPE foo( TYPE i , TYPE j )
{
  if ( i > j ) return i ;
  else  return j;
}


나중에 타입을 바꿀 경우를 생각해서 typedef로 선언했습니다.
비교해서 큰 값을 반환하는 것이 요지입니다.

        .file   1 "test.c"
        .section .mdebug.abi32
        .previous
        .gnu_attribute 4, 1
        .text
        .align  2
        .globl  foo
        .set    nomips16
        .ent    foo
        .type   foo, @function
foo:
        .frame  $sp,0,$31               # vars= 0, regs= 0/0, args= 0, gp= 0
        .mask   0x00000000,0
        .fmask  0x00000000,0
        .set    noreorder
        .set    nomacro

        slt     $2,$5,$4
        movz    $4,$5,$2
        j       $31
        move    $2,$4

        .set    macro
        .set    reorder
        .end    foo
        .size   foo, .-foo
        .ident  "GCC: (GNU) 4.4.2"


$4와 $5를 비교해서 그 결과를 $2에 저장합니다.
여기서 새롭게 등장하는 명령어가 movz입니다. 이 명령어는

if (GPR(rt) == 0 then rd <- rs

인 명령어입니다. 즉 주어진 값이 0 이면 이동 동작을 수행하라는 명령이죠.

위의 코드를 다시보면
slt 명령으로 set less then으로 세팅하고, 그 결과가 0 이면 $5를 $4로 아니면 그대로 진행합니다.
최종적으로 $4를 반환 레지스터인 $2로 이동함으로서 그 반환 값을 설정하도록 되어 있습니다.

ARM은 Instruction에 Condition Code를 넣어서 동작할 수 있도록 한 반면
MIPS는 Condition Code를 만들지 않고, 명령어를 운용하여서 분기문 내지 판단문을 처리할 수 있도록 하였는데, 위의 코드에서는 비교문을 SLT라는 명령어로 해결해서 다음 명령어에서 분기문의 효과를 내도록 되어 있습니다.

이럴때는 ARM Style이 더 낳을 것 같습니다.




Posted by GUNDAM_IM
Embedded2009. 12. 29. 14:58
앞서에 이어서  64비트 덧셈 코드를 테스트 해봅니다.

1. 64비트 덧셈

long long  foo( long long i ,  long long  j)
{
  return i + j ;
}

../local/bin/mips-elf-gcc -S test4.c -o test4.S -O2 -march=mips32

        .file   1 "test4.c"
        .section .mdebug.abi32
        .previous
        .gnu_attribute 4, 1
        .text
        .align  2
        .globl  foo
        .set    nomips16
        .ent    foo
        .type   foo, @function
foo:
        .frame  $sp,0,$31               # vars= 0, regs= 0/0, args= 0, gp= 0
        .mask   0x00000000,0
        .fmask  0x00000000,0
        .set    noreorder
        .set    nomacro

        addu    $3,$7,$5
        addu    $4,$6,$4
        sltu    $2,$3,$7
        j       $31
        addu    $2,$2,$4

        .set    macro
        .set    reorder
        .end    foo
        .size   foo, .-foo
        .ident  "GCC: (GNU) 4.4.2"


64비트 덧셈은 뭐, 좀 쉽습니다.

             [$4 : $5]
   +       [$6 : $7]
-------------------
   

재미있는것은 캐리를 발생시키는 방식인데요 위의 어셈블러 코드를 보면
sltu가 있습니다. 이것은 두 수를 비교해서 앞에 수가 작으면 1을 세팅하다는 의미입니다.
캐리를 직접 계산하는 것으로 사용하는 명령어입니다.

비교하는 수를 보면 $5+$7을 더한 결과값 $3과 그 인자인 $7을 비교하는 것입니다.
즉 더해서 얻는 값이 인자보다 작다면 이는 자리수가 한자리 커졌다는 것을 의미합니다.

쉽게 정리하면
     5
+  7
-----
1  2

입니다. 이때 비교 하는 것은 7과 결과 2 입니다. 결과값 2가 7보다 작으므로 캐리가 발생한것으로 알 수 있다는 의미입니다.  (그냥 캐리를 발생시키는게 더 빠를것 같기도 합니다.)


'Embedded' 카테고리의 다른 글

[MIPS] Assembler 코드 살펴보기 - 4  (0) 2010.01.03
[MIPS] Assembler 코드 살펴보기 - 3  (0) 2009.12.30
[MIPS] Assembler 코드 살펴보기  (0) 2009.12.26
Fedora 메일서버 세팅  (2) 2009.12.21
[MIPS] Simulator  (0) 2009.12.20
Posted by GUNDAM_IM
Embedded2009. 12. 26. 09:04
굳은 머리 돌리기 위한 간단한 어셈블러 해석입니다.
오래간만에 어셈블러 한번 볼려고 하니 힘드네요
MIPS에서 어셈블러와 C의 연결을 볼려고 간단한 테스트를 해보는 것을 정리하였습니다.

1. 간단한 함수


int foo( int i , int j )
{
  return i * j;
}

위 코드를 컴파일 해서 어셈블러를 확인합니다.

mips-elf-gcc -S -march=mips32 -O2 test.c -o test.S

그러면

                            LIBCFLAGS="-g -O2 ${flags}" \
        .file   1 "test.c"
        .section .mdebug.abi32
        .previous
        .gnu_attribute 4, 1
        .text
        .align  2
        .globl  foo
        .set    nomips16
        .ent    foo
        .type   foo, @function
foo:
        .frame  $sp,0,$31               # vars= 0, regs= 0/0, args= 0, gp= 0
        .mask   0x00000000,0
        .fmask  0x00000000,0
        .set    noreorder
        .set    nomacro

        j       $31
        mul     $2,$5,$4

        .set    macro
        .set    reorder
        .end    foo
        .size   foo, .-foo
        .ident  "GCC: (GNU) 4.4.2"

과 같은 코드를 얻을 수 있습니다.

코드를 보면 jump 다음에 mul을 하는 것을 알 수 있습니다. 즉 delay slot을 기본적으로 architecture에서 가지고 가므로, jump 명령이 먼저와도 분기를 마칠때에는 레지스터에 값이 기록되게 되어 있습니다.

리턴되는 값은 2번 레지스터에 기록되고
인자는 4번과 5번으로 기록됩니다.

2. unsigned 64비트 곱셈 test


unsigned long long  foo( unsigned long long i , unsigned long long  j)
{
  return i* j ;
}

../local/bin/mips-elf-gcc -S test3.c -o test3.S -O2 -march=mips32
으로 컴파일해서 결과를 보면 아래와 같습니다.

        .file   1 "test3.c"
        .section .mdebug.abi32
        .previous
        .gnu_attribute 4, 1
        .text
        .align  2
        .globl  foo
        .set    nomips16
        .ent    foo
        .type   foo, @function
foo:
        .frame  $sp,0,$31               # vars= 0, regs= 0/0, args= 0, gp= 0
        .mask   0x00000000,0
        .fmask  0x00000000,0
        .set    noreorder
        .set    nomacro

        mul     $2,$4,$7
        multu   $7,$5
        mflo    $9
        mfhi    $8
        mul     $3,$6,$5
        addu    $2,$3,$2
        addu    $2,$2,$8
        j       $31
        move    $3,$9

        .set    macro
        .set    reorder
        .end    foo
        .size   foo, .-foo
        .ident  "GCC: (GNU) 4.4.2"

입력이 64비트 두개의 값이므로,
4개의 레지스터가 입력으로 들어와야 합니다.


$4,
$7
$5
$6이 입력이 됩니다.

64비트 입력은 두개의 레지스터이고 두 64비트의 곱셈은

              A B
x            C D
----------------
         [B x D]
    [A x D]
    [B x C]
[A x C]
-------------
Result

입니다.

그런데 결과값이 64비트만 필요하므로 [A x C]는 불필요 합니다. 따라서 곱셈이 3번만 하면됩니다.
위의 코드에서 곱셈이 3번 나오는 이유입니다.

$7과 $5를 곱하면 그 결과가 Hi,Lo레지스터에 기록됩니다.
이를 $8,$9에 옮겨 두게 됩니다. [B x D]가 $8 $9입니다.

$4 $7을 곱한것은 그 결과로 하위 32비트가 필요하므로 [A x D] 가 됩니다. 따라서 공통으로 쓰이는 $7이 D임을 알수 있고, [ A : B ]는 [$4,$5]임을 알수 있습니다.
나머지 입력인 $6이 [ $6 : $7 ] 입니다.

$6 x $5를 한 하위 32비트를 사용하게 되므로 이 값이 $3에 들어갑니다.

최종적으로는 결과값의 상위 32비트에 해당되는 값은 각각의 덧셈의 결과이므로
$2 + $3 + $8이 그 결과값인 상위 32비트입니다.

이 결과값이 $2에 그리고 [BxD]의 결과값이 $3으로 옮기게 되므로 최종 결과치는
[$2:$3]이 됩니다.




'Embedded' 카테고리의 다른 글

[MIPS] Assembler 코드 살펴보기 - 3  (0) 2009.12.30
[MIPS] Assembler 코드 살펴보기 - 2  (0) 2009.12.29
Fedora 메일서버 세팅  (2) 2009.12.21
[MIPS] Simulator  (0) 2009.12.20
MPEG 1/2 Reference Site  (0) 2009.12.13
Posted by GUNDAM_IM
Embedded2009. 12. 21. 12:24
ASIC/SoC 시뮬레이션을 할 때에는 짧게는 몇시간 걸리고 길게는 하루 넘게 계속 기다려야 하는 경우가 발생합니다.
이를 일일이 창을 열고 기다리는 것 보다는 끝나면 바로 메일로 보내주도록 설정해 놓으면 나중에 시뮬레이션이 끝나면 메일로 해당 결과와 함께 메일로 통보되도록 할 수 있습니다.



Fedora 메일서버 세팅




1. 메일서버


       Fedora Core 2 에서 기본적으로 제공하는 패키지를 이용해 웹메일을
       구축한다.



2. 필요한 패키지


       다음의 패키지가 필요하다.

               sendmail
               sendmail-cf
               dovecot
               squirrelmail
               openssl
               cyrus-sasl
               cyrus-sasl-plain
               cyrus-sasl-md5

       설치하기 전에

               rpm -qa | grep <package-name>

       의 명령으로 우선 위의 패키지가 설치되어 있는지 확인해 본다.
       설치되어 있지 않은 패키지는

               yum install <package-name>

       의 명령으로 설치할 수 있다.



3. sendmail 설정


       sendmail의 설정파일은 /etc/mail에 모여있다.

       1) /etc/mail/access
          메일을 발송할 수 있는 ip의 RELAY를 열어준다.

               localhost.localdomain RELAY
               localhost RELAY
               127.0.0.1 RELAY

          파일을 수정한 후에는

               makemap hash /etc/mail/access < /etc/mail/access
       
          의 명령으로 access.db를 갱신한다. access 파일만 수정한 경우는
          sendmail을 재시작할 필요가 없으며 access.db 파일 갱신만으로
          변경사항이 적용이 된다.

       2) /etc/mail/virtusertable
          가상 사용자 목록을 만든다. 간단한 예로,

               admin@localhost                root

          라고 적으면 실제로 system 내에 존재하지 않는 admin 으로 오는
          메일은 root 계정이 받아보게 된다. 역시 파일을 수정한 후에는

               makemap hash /etc/mail/virtusertable < /etc/mail/virtusertable

          의 명령으로 virtusertable.db 파일을 갱신해줘야 한다.

       3) /etc/mail/local-host-names
          서버로 오는 email 중 이 파일에 나열된 주소로 오는 메일만을 받아들인다.

               ns
               example.com
               ns.example.com

          메일 주소로 사용하는 서버 이름들을 여기에 적어 놓는다.

       4) /etc/mail/sendmail.mc
          SMTP 인증 기능을 사용하기 위해서 다음의 라인을 확인한다.

                TRUST_AUTH_MECH(`LOGIN PLAIN EXTERNAL DIGEST-MD5 CRAM-MD5')dnl
                define(`confAUTH_MECHANISMS', `LOGIN PLAIN EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5')dnl

          없다면 물론 추가한다.
          외부메일을 받을 수 있게 하려면 다음의 라인을 찾은 후,

               DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

          다음과 같이 라인 처음에 dnl이라고 적는다.

                dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

          다음의 명령으로 sendmail.cf를 새로 생성한다.

               m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf



4. 나머지 설정


       나머지 설정은 그냥 기본으로 사용했다. 필요에 따라서는 다음 파일들을
       알아서 수정한다.

       1) dovecot

               /etc/dovecot.conf

       2) squirrelmail

               /usr/share/squirrelmail/config/config.php

          직접 수정하지 말고 될 수 있으면,

               /usr/share/squirrelmail/config/conf.pl

          의 명령을 이용해 수정할 것을 권한다. 설정편집시 imap 부분은 others
          로 설정하면 잘 동작한다.



5. 방화벽


       외부 포트가 열리지 않아서 메일이 도착하지 않는 경우가 종종 있다.
       iptables에서 25, 143, 993 (tcp) 포트를 반드시 열어 놓는다.



6. 서비스 시작하기


       각각의 서비스를 다음 명령으로 시작한다.

               service sendmail start
               service dovecot start


7. Perl Script


시뮬레이션은 Perl 스크립트에서 수행하면서 동작시킵니다.

sub send_mail {
  my ($status, $file) = @_;
  $to_user = $user . "\@" . "newtypeunion.com";
  system ("mail -s \"SIMULATION Result : ( $status )\" $to_user < $file");
}
.......
send_mail( "ERROR" , "./sim.log");
......

'Embedded' 카테고리의 다른 글

[MIPS] Assembler 코드 살펴보기 - 2  (0) 2009.12.29
[MIPS] Assembler 코드 살펴보기  (0) 2009.12.26
[MIPS] Simulator  (0) 2009.12.20
MPEG 1/2 Reference Site  (0) 2009.12.13
Eclipse + eCOS =??  (0) 2009.11.23
Posted by GUNDAM_IM