blueecho's collection

누군가에게 "당신은 무엇을 잘하십니까?"라는 질문을 들었을때 바로 대답할것을 만들어보자~!!
        
분류 전체보기 (267)
NeWs (21)
배움생활 (107)
취미생활 (118)
끄적끄적 (5)
인생설계 (12)
Wish list (4)
사진 영화감상 지름신 리눅스 자전거 Fedora 연구실 생활 일본소설 솔카당 연구실생활
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
블로그 이동하였습니다.

 

스터디에 해당하는 글 4개
2010.08.09   C언어 매크로에서의 팁 
2010.07.26   OpenRISC : cygwin용modelsim 환경파일입니다. 
2010.07.26   링커 스크립트 

  C언어 매크로에서의 팁 | 2010. 8. 9. 18:22 | 배움생활/SoC   
개인적으로는 매크로보다는 인라인을 더 좋아하고 있는 저로서는 매크로를 쓰는 경우가 거의 없습니다만.... 다른분들의 프로그램을 보다보면 매크로가 많이 나오더군요.
인라인의 경우는 코드가 커지는 단점때문에 일반적으로 임베디드 프로그래밍에서는 사용을 잘 안한다고 배웠지만 요즘의 임베디드 프로세서의 메모리 크기는 광활하죠.. -_-;;
오늘 보는 책에 나오는 글중에 매크로를 쓰는중에 팁이 될만한 것들이 있기에 옮겨놔 봅니다. (일반적인 매크로 이야기는 생략하겠습니다.)

1. \를 사용할 경우 다수의 라인을 연결할 수 있습니다. (리눅스에서와 같네요. 전 이부분은 리눅스에서 먼저배워서.. ^^;)

2. ##을 사용할 경우 매크로의 parameter name을 그대로 사용할 수 있습니다.
ex)#define MAC_blueecho(in, out) \
     f_blueecho(pam1_##in##); \
     f_blueecho(pam1_##out##); \
의 경우
     MAC_blueecho(go, back);
이 다음과 같이 치환됩니다.
     f_blueecho(pam1_go); \
     f_blueecho(pam1_back); \

3. 위의 예제와 같이 여러 라인을 가지는 경우 {. }로 묶어주는게 좋습니다만 이부분에도 마지막 }후에 ;이 붙게 되므로 do~while(0)로 묶어 주는게 좋습니다. do~while(0)는 아시다시피 한번만 실행됩니다. ^^
ex)#define MAC_blueecho(in, out) \
     do{ \
     f_blueecho(pam1_##in##); \
     f_blueecho(pam1_##out##); \
     }while(0)

다 아시는 것이겠지만 전 몰라서.. ^^;;
알아두면 편하겠죠.
하지만 여전히 저는 인라인 선호자죠.. ^^

'배움생활 > SoC' 카테고리의 다른 글

Setup/Hold violation  (0) 2012.02.23
유지보수가 어렵게 코딩하는 방법  (0) 2011.12.16
링커 스크립트  (0) 2010.07.26
verilog 2001에서 배럴쉬프터 짜기....  (0) 2010.07.09
infer_mux 지정자  (0) 2010.07.06


  OpenRISC : cygwin용modelsim 환경파일입니다. | 2010. 7. 26. 17:01 | 배움생활/외부스터디   
MPSoC스터디 모임에서 만들었던 해당 파일입니다.
해당 파일은 opencore에서 배포한 vmware이미지에서 추출하였습니다.
사이트가 가끔 죽어서 혹시나 해서 백업 해놓습니다.


우선은 기본조건으로 cygwin과 modelSIM(이외의 시뮬레이터는 없는 관계로...)이 설치되었다는 가정하에 시작합니다.

해당 모델심 프로그램들(vsim,vlog)의 path는 환경변수에 이미 저장되어있다고 가정합니다.(설치하실때 path추가 물어보는 부분에서 no하지 않으셨다면 이상없습니다.)


아... 그리고 압축파일내에 .bashrc가 들어있으니 자신만의 환경을 가지신 분들은 다른 폴더에서 풀어서 path부분만 추가하시면 됩니다.

기본적으로 제가 만든 .bashrc에서는 or32-elf폴더가 사용자의 최상위 폴더(~/)에 있는 것으로 가정하였습니다. (압축파일을 해당 폴더에서 풀어버리시면 문제없습니다.)

또하나, vi의 경우 gvim.exe를 사용합니다. gvim 7.2를 기본폴더에 설치하셨다면 cygwin에서 gvim사용하시게 됩니다. (불편하신 분은 alias vi=~~~~~부분을 지우시면 됩니다.)


사용법>

1. 우선 압축파일을 사용자의 최상의 폴더로 복사합니다. (아마 c:\cygwin\home\[사용자명] 일껍니다.)

2. 압축해제후 MOF_~~~.sh를 실행합니다. (툴체인 및 or1ksim 그리고 리눅스 커널등등을 받아서 설치합니다.)

2-1. 식사나 휴식을 취하세요.^^ (조금 걸리네요...)

3. test_or1200/sim에 들어가셔서 ./run.sh를 실행하시면 waveform까지 떠야 정상입니다. (rtl 폴더의 파일을 사용합니다)

3-1. 혹시 우분투에 깔려있던대로 실행을 하시려면 ./run.sh old 로 실행하시면 됩니다. (rtl_old 폴더의 파일을 사용합니다.)

3-2.  ./run2.sh의 경우는 ./run.sh와 마찬가지로 ./run2.sh old로 실행하실 경우 rtl_old폴더의 파일을 사용하게 됩니다. 대신 쉘파일 뒤에 웨이브폼으로 보고싶은 파형의 모듈을 지정해 주면 해당 모듈의 파형을 열어줍니다. ex) ./run2.sh or1200_genpc ---> or1200_genpc 모듈의 파형을 열어줍니다.

3-3. 파형을 지정후 시뮬레이션을 하시려면 해당 스크립트 파일을 열으신후 vsim ~~~ 에서 -do 이후에 있는 부분을 지워주시면 됩니다.

3-4. 파형은 hex 포멧으로 열게 되어있습니다.

4. 크로스컴파일의 경우 제대로 동작하는지 확인하려면 test_or1200/sw폴더로 들어가셔서 make all을 해보시면 됩니다. 문제가 없다면 sim폴더에 memory.txt가 정상적으로 만들어져야 합니다.


수정 및 추가 부분>

1. rtl 폴더에 있는 soc.v 파일은 기존 우분투 이미지에서 추출한 soc.v에서 or1200이하 부분을 떼어낸 파일입니다. rtl_old에 있는 soc.v파일과는 다릅니다.

2. bench 폴더에 있는 CPUboard_tb.v 파일에서 $finish() 앞에 $stop()을 추가하였습니다.

3. 해당 보드 구현 파일에 설정되어있는대로 or1200_define.v에 있는 wishbone WB_B3부분을 활성화 시켰습니다.

4. sw폴더에서 생성하는 memory.txt파일의 생성장소를 sim폴더로 수정하였습니다.

5. 다른부분이 있을지도 모르겠습니다만....(적어놓은게 이정도네요..ㅠ_ㅠ) 아마 이게 다일 껍니다. (엔지니어가 아마????)


etc.>

1. 귀찮아서 더 이상은 못 만들겠습니다. make잘 쓰시는 분이나 쉘스크립트 잘 짜시는 분의 도움 부탁드립니다.

2. waveform window의 설정을 깨끗하게 해주시는 분이 계시다면 감사하겠습니다만... 그정도까지는 안해도 되겠죠? ^^;

3. 다되어있는 파일의 경우 50MB가 넘네요. 스크립트와 중요파일만 올려드립니다. 혹시 전체 파일 받고 싶으신 분은 따로 연락주세요.

4. 문제있는 부분이 있다면 댓글이나 메일 부탁드립니다.

4-1 현재 완벽하게 같다는 부분은 확인하지 못하였습니다. simulation에 문제가 있을수도 있으니 예전 파형을 보고 싶으신 분은 ./run.sh old 또는 ./run2.sh old 로 실행해 주세요.

5.  폴더명 변경의 경우 bench와 rtl 또는 rtl_old의 이름을 변경시에는 스크립트도 같이 변경해주시면 됩니다.

6. 아.. 모델심이 유료툴이므로 못구하시는 분들은 Iverilog와 Gtkwave를 사용하셔도 됩니다만 만들어놓은 스크립트가 modelsim기반입니다.

혹시 문제가 되는 분이 있으시다면 연락부탁드립니다. 해당 프로그램으로 수정하죠.. ^^;;;

7. 다른 컴퓨터에서 확인하지는 못했습니다. 집에 있는 컴퓨터에 재설치후 만들고 압축한 것이라서 혹시 문제있으면 연락부탁드립니다.


ps. 머리가 나빠서 얼레벌레 시간이 꽤 걸렸네요. 다른 분들이시라면 금방하셨을텐데... ㅠ_ㅠ

'배움생활 > 외부스터디' 카테고리의 다른 글

uC/OS-III가 Free네요.  (0) 2011.08.26


  링커 스크립트 | 2010. 7. 26. 16:53 | 배움생활/SoC   
링커스크립트 관련 박상호님께서  MPSoC스터디 모임 게시판에 올려주신 내용입니다.


토요일 스터디 모임에서 잠시나마 소개(?)를 했었던 링커 스크립트에 대해서 간략히 요약을 해 드리겠습니다.

링커 스크립트는 한마디로 말하면 object파일들의 각 영역에 대한 재정렬을 하는 스크립트라고 보시면 편하실 것입니다.


 더 자세히 공부해 보고 싶으시는 분들은 다음의 링크를 참조하시기 바랍니다. 한글 번역이 되어 있습니다. 잠시(?) 읽어보셈.. ^^;

http://korea.gnu.org/manual/release/ld/ld-mahajjh/ld_toc.html


  컴파일러가 컴파일을 하게되면 그 결과 파일이 object파일이 생긴다는 것은 잘 알고 계실것입니다.

이 각 object 파일들은 내부적인 어떤 포맷(보통 리눅스는 elf32,  윈도우는 coff 포맷을 가지고 있죠..)에 따라서

여러개의 섹션이란 녀석들을 가지고 있습니다. 대표적인 섹션이라면 코드 섹션(.text) 와 데이터 섹션(.data) 이 있습니다.


각 섹션들은 새롭게 빌드 과정에서 만들어 질수도 있고, 포맷별로 다른 이름을 가지고 있는 경우도 있죠. 컴파일러가

object파일을 만들면서 잘 분류를 해놓아서, 각 섹션에 차곡차곡 그 정보가 쌓여있게 되지요.


이후에 링커가 이들을 가지고 실행파일을 만드는 것을 이미 알고들 있으실터...


  일반적으로 링커는 내부정의된 링커 스크립트를 가지고 있고(default linker script), 이번에 봤던 임의의 스크립트를 연결해서 쓰는

경우도 있죠. 이 스크립트에 의해서 각 섹션을 다시 재 정렬 하는 녀석이 링커가 하는 역할이다라고 보시면 됩니다. 스크립트에 의해 마음대로 위치를 떡 주무르듯 할수가 있는 것이지요.


예를 들어보면, a.o에 (.text, .data)가 있고, b.o에 (.text, .data, .idata)가 있다고 하죠.

스크립트를 다음처럼 구성하면...
section {
 .text : { a.o(.text) } // a.o에서 .text 영역만을 .text 영역으로 구성하라!!
 .data : { *(.data) } // 모든 입력 파일에서의 .data 영역들을 가지고 .data 영역으로 구성하라!!
}

a.o에서 .text영역을 앞에두고, 모든 .data영역을 가지고 있는 입력 파일에서
차례대로 .data 영역을 읽어와 재구성을 하게 됩니다. 그 구성의 내용은

//////////////////////////////
//         a.o(.text)        //
//////////////////////////////
//         a.o(.data)        //
//         b.o(.data)        //
//////////////////////////////

가 되겠습니다. 여기서는 b.o의 .text 영역과 .idata여역은 스크립트에는 정의되지 않았기 때문에
최종 출력파일에는 b.o의 코드 영역은 들어갈수가 없습니다. 예로든 스크립트에
의해서 재정렬을 해보았지만, 결과 파일은 별 의미가 없는것 같군요.. ㅡㅡ;


한페이지 정도로 어떤 역할을 하는지 이해가 가셨으면 이번 글은 성공입니다.. ㅋㅋ

링커 스크립트에는 알수없는 외계(?)문자들이 많이 있으니 각 옵션을 알고 싶으신분은 위쪽 링크를 따라가셈...

'배움생활 > SoC' 카테고리의 다른 글

유지보수가 어렵게 코딩하는 방법  (0) 2011.12.16
C언어 매크로에서의 팁  (0) 2010.08.09
verilog 2001에서 배럴쉬프터 짜기....  (0) 2010.07.09
infer_mux 지정자  (0) 2010.07.06
H.264의 대항마가 나오네요....  (0) 2010.05.24


#1 #2
 
     
- Home
- Guestbook
- Manage - Location
- Tag - Post