VC++(MFC) 에서 /MD와 /MT 의 차이점

Posted by 빵빵빵
2015/12/10 17:15 전산(컴퓨터)/PC-Windows



/MT와 /MD 차이


컴파일 옵션중에 /MT(multi-threaded), /MD(multi-threaded dll)라는게 있습니다 (설정위치: 프로젝트속성-C/C++-코드생성-런타임라이브러리). 특히나, 정적 라이브러리를 사용할 경우에는 이것 때문에 무척 골치가 아픕니다. XXX is already defined in YYY 어쩌구 하는 라이브러리 충돌 컴파일 에러들은 모두 이놈들 때문에 발생합니다. 사용한 라이브러리가 하나는 /MT로 생성되었고 하나는 /MD로 생성되었다면 짤없이 라이브러리 충돌 에러 메시지를 보게 됩니다. http://msdn.microsoft.com/ko-kr/library/2kzt1wy3(v=vs.90).aspx에 보면 /MT, /MD가 설명되어 있지만 핵심 내용은 컴파일시 정적 버전의 C 런타임 라이브러리를 사용할 것이냐(/MT) 아니면 동적 버전을 사용할 것이냐(/MD)의 차이입니다.

 


/MT: 응용 프로그램에서 다중 스레드 정적 버전의 런타임 라이브러리를 사용하도록 지정합니다. 즉 응용 프로그램에서 입출력, 메모리 할당과 같은 C 런타임 라이브러리(CRT, C Run-Time library) 기능을 사용할 때 정적 링크 버전인 LIBCMT.lib를 사용하여 프로그램이 빌드됨.

 


/MD: 응용 프로그램에서 다중 스레드 DLL 전용 버전의 런타임 라이브러리를 사용하도록 지정합니다.  즉 응용 프로그램에서 C 런타임 라이브러리 기능을 사용할 때 이것의 동적 링크 버전인 MSVCRT.lib를 사용하여 프로그램이 빌드됨.

 


만일 사용하는 외부 라이브러리는 /MT로 빌드되었는데, 현재 응용 프로그램은 /MD로 빌드하면 동일한 기능에 대해 서로 다른 두 버전의 라이브러리가 동시에 사용되기 때문에 XXX is already defined in YYY 어쩌구 하는 무수한 충돌 메시지를 보게 됩니다. 외부에서 가져온 라이브러리라면 /MD, /MT를 맞추거나 /NODEFAULTLIB:library 외에는 별 방법이 없지만(이렇게 해도 해결 안되는 경우가 많음), 자신이 직접 정적 라이브러리를 만들 경우에는 라이브러리든, 응용프로그램이든 모조건 다 /MT 옵션으로 맞추면 됩니다(debug용은 /MTd).

2015/12/10 17:15 2015/12/10 17:15

비글보드 PWM 컨트롤 by C

Posted by 빵빵빵
2015/11/26 10:25 공작/비글보드



출처 : http://stackoverflow.com/questions/29369616/beaglebone-black-pwm-using-c

비글보드의 PWM이나 GPIO를 컨트롤 하기 위해서는 특정 파일을 접근하여 조작한다.
아래 예제 소스에서는 내 보드와 파일 이름이 달라(OS 버전별로 조금 다른가보다) 작동하지 않을 수 있지만 일단 프로그래밍 기법 참고용으로 저장한다.
내 보드에 맞는 파일은 예제 소스 아래에 기록한다.




내 보드에 맞는 파일 이름 및 PWM 컨트롤 순서
cape 등록 echo cape-universaln > /sys/devices/bone_capemgr.*/slots  
핀설정 조회 config-pin -l P9.16  
PWM 설정 config-pin P9.16 pwm  
 echo pwm > /sys/devices/ocp.*/P9_16_pinmux.*/state  
pinmux 상태 확인 cat /sys/devices/ocp.*/P9_16_pinmux.*/state  
export echo 4 > /sys/class/pwm/export  

export    pin
number, name, pins
 0 EHRPWM0A P9.22,P9.31
 1 EHRPWM0B P9.21,P9.29
 2 ECAPPWM0 P9.42
 3 EHRPWM1A P9.14,P8.36
 4 EHRPWM1B P9.16,P8.34
 5 EHRPWM2A P8.19,P8.45
 6 EHRPWM2B P8.13,P8.46
 7 ECAPPWM2 P9.28
   
 echo 500000 > /sys/class/pwm/pwm4/duty_ns  
 echo 1000000 > /sys/class/pwm/pwm4/period_ns  
 echo 1 > /sys/class/pwm/pwm4/polarity  
 echo 1 > /sys/class/pwm/pwm4/run  
run이 1인 상태에서 polarity 값을 바꿀 수 없다.   

참고사항
cape 해제 : echo -cape번호 > /sys/devices/bone_capemgr.*/slots
부팅시 cape 등록 : uEnv.txt에 적으면 되지 않을까?????

2015/11/26 10:25 2015/11/26 10:25

fopen시에 O_DIRECT와 O_SYNC의 차이

Posted by 빵빵빵
2015/10/29 14:43 전산(컴퓨터)/리눅스



fopen 할때 옵션으로 주는데...

O_DIRECT : 캐쉬를 거치지 않고 DMA로 바로 데이터 전송하고 리턴. 데이터가 모두 전송됬는지 보장하지 않는다.

O_SYNC : 데이터가 모두 (캐쉬로) 전송됬는지 보장하고 리턴. 그러나 아직 (하드 디스크 등 출력장치에 기록되지 않고) 캐쉬에 있을 수도 있다.


O_DIRECT | O_SYNC : 캐쉬를 거치지 않고 DMA로 바로 데이터 전송하고, 완전히 전송이 끝났을 때 리턴된다. 완전하게 데이터가 출력장치에 기록되는 것을 보장한다.



O_DIRECT | O_SYNC 를 쓰는 이유 : 임베디드에서 mmap를 이 옵션으로 열어서 하드웨어 핀(GPIO)를 제어할때 쓰면 응답의 신뢰성을 높일 수 있다. 이 옵션 없이 0.001초 간격으로 신호를 10000000번 주면 캐쉬에 씌여 있다가 안나가거나... 특정 조건이 되서 한방에 나가거나... 등등 어이없는 일이 생길 수 있다.

DB같은데서는 자기네들의 알고리즘이 OS보다 성능이 좋다고 요 옵션을 써서 스스로 제어하는 경우도 있다.


참고링크 :
http://stackoverflow.com/questions/5055859/how-are-the-o-sync-and-o-direct-flags-in-open2-different-alike
2015/10/29 14:43 2015/10/29 14:43