blueecho's collection

누군가에게 "당신은 무엇을 잘하십니까?"라는 질문을 들었을때 바로 대답할것을 만들어보자~!!
        
분류 전체보기 (267)
NeWs (21)
배움생활 (107)
리눅스 (51)
SoC (29)
외부스터디 (2)
학교수업관련 (3)
일본어공부 (1)
ETC (21)
취미생활 (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
블로그 이동하였습니다.

 

배움생활/SoC에 해당하는 글 29개
2010.08.09   C언어 매크로에서의 팁 
2010.07.26   링커 스크립트 
2010.07.09   verilog 2001에서 배럴쉬프터 짜기.... 

  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


  링커 스크립트 | 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


  verilog 2001에서 배럴쉬프터 짜기.... | 2010. 7. 9. 18:36 | 배움생활/SoC   

verilog도 버젼이 몇가지가 있죠. 새로운 2001버젼에서 나온 배럴 쉬프터 짜는 부분이 있어서 옮겨봅니다.

기존에 저도 짜던 방식이 그냥 for문 돌리던지 아니면 case문으로 해당 쉬프트 비트수 만큼 옮기는 방법인지라... 이런 방법이 있다는 게 신기하기도 하는군요.

[CODE type=verilog]{y,tmp} = {a,a} << rotate_cnt[/CODE]

방식은 다음과 같습니다. 배럴 쉬프터라는게 원하는 수만큼 쉬프트를 해주는 로직인지라 저처럼 무식하게 하지 않는 이상 보통은 다음과 같이 만들죠

[CODE type=verilog]{y,tmp} = { a[(WIDTH-1)-rotate_cnt:0], a[(WIDTH-1):0], {rotate_cnt(1'b0)} }[/CODE]

이거 줄여놓은게 위에꺼 입니다. 참 쉽죠? (밥로스 선생님의 추억이... -_-)
뭐... 2001새로운 문법이랄꺼야 rotate_cnt(1'b0) 정도인데 이거 그냥 rotate_cnt의 수만큼 1비트짜리 0를 나열해 주는 겁니다.
뭐.. 신호 이름 화서 아시겠지만 y값이 결과값이고 a가 입력 WIDTH가 워드구성 비트수이고, rotate_cnt가 옮길 비트수입니다.
구현 자체는 RSR만 되어있는데 마찬가지로 RSL도 구현할 수 있겠죠. ^^

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

C언어 매크로에서의 팁  (0) 2010.08.09
링커 스크립트  (0) 2010.07.26
infer_mux 지정자  (0) 2010.07.06
H.264의 대항마가 나오네요....  (0) 2010.05.24
모델심 기본 스크립트  (0) 2010.04.12


#1 #2 #3 #4 #5 #6 #··· #10
 
     
- Home
- Guestbook
- Manage - Location
- Tag - Post