WinPic의 플러그인 DLL을 변환하다.

회로와 펌웨어는 모두 완성한 것 같아서 실제로 동작하는지 확인하기 위해서 프로그램이 필요했는데 직접 만들려니 부족한 정보 탓에(실제로 마이크로칩은 정확한 방법들에 대해서 설명하지 않고 있다) 대안 프로그램을 찾다가 Winpic이라는 C++ 빌더로 만들어진 툴이 있는 것을 확인해서 공개된 소스코드 위에 직접 수정을 가해서 기능을 넣으려다 약간의 작업이 많아지는 것 같아서 플러그인 DLL을 만들어서 실험하려고 했는데 문제가 생겼다. 2006의 C++ 빌더는 DLL에서 ComPort를 사용하면 초기화 부분에서 익셉션이 생긴다. ComPort가 문제였을까 고민하면서 디버거를 돌려도 문제는 잡을 수 없었다. 이 문제는 런타임 라이브러리와 함께 사용해도 생기는 문제로 사용하지 않으면 문제가 없어진다.

결국 소스코드양도 적고 약간의 구조도 파악한터라 컨버팅을 결정하고 델파이용으로 변환했다. C++의 이 난잡함을 극복하고 변환해서 삽질 끝에 델파이로 새로이 만들어진 플러그인이 동작하는 것을 확인. 이제 기능만 넣고 실험을 준비하면 된다. 플러그인이라고 해봐야 기능은 제한적인 것 같다. 아마도 제대로 기능을 적용하려면 Winpic내에 기능을 넣는 것을 고려해봐야겠다.

새로이 만들어진 델파이의 플러그인 소스를 그렇게 나눈다.

winpic_plugin.zip

Winpic의 사이트 : http://www.qsl.net/dl4yhf/winpicpr.html

 

CPort 4를 C++ Builder에서 쓰기.

CPort를 C++빌더에서 사용하려고 하면 2가지 에러가 생긴다. 패키지를 인스톨하고 사용하려고 하면 헤더에서 정의가 잘못된 부분이 나오는데 이 부분은 주석문 처리해서 상관없다. 하지만 2번째로 “unsolved external 솰라솰라::SetPortA를 OBJ에서 링크를 할 수 없다”라는 에러가 뜬다. 이는 SetPortA라는 같은 이름을 가진 winspool.h와의 선언 충돌이며 간단히 SetPort라는 프로시저의 이름을 다른 이름으로 바꾸어주면 된다. SetPortN이나 등등 이름은 충돌하지 않는 이름이면 상관없다. 관련글에 winspool,h를 수정하는 방법으로 특정 선언을 해서 피하는 방법도 있는데, 기본 헤더파일을 일부러 고칠 필요는 없다고 생각한다.

 

관련글 : http://wiltonsoftware.com/posts/view/borland-cport-multiple-declaration-and-unresolved-linker-setporta-function

PIC16F627의 USART TX/RX 인터럽트.

PIC16F627을 이용해서 자그마한 PIC 프로그래밍 회로를 만들다 1024워드의 한계를 경험하던 중에 이전에 사용하던 Wiz-c라는 c언어 pic툴을 벗어나 새로이 mikropascal이라는 pic언어를 만난다. 왠지 PIC라는게 컴퓨터보다 재미있다. 간단하고 직관적이라고 할까 조그만 칩으로 별별 장난을 다 칠 수 있다.

wiz-c보다 더 많은 PIC를 지원하고 코드 편집기가 정말 간편하다. wiz-c와 비교되어 큰 장점은 pic에서는 필수인 bit접근이 편리하다는 점이었다. 정말 매력적인 장점이 아닐 수 없다. wiz-c의 너무 짜여진 틀에서 벗어나게되어 정말 편하다는 생각도 들었다. 그런데 가장 큰 문제가 생겼는데 바로 wiz-c 하드웨어 usart를 인터럽트로 처리하던 것이 폴링(polling)으로 처리하게 되어 가끔 시리얼 포트의 응답이 느려지는 문제가 발생해버린 것. 결국 프로그램이 반응성이 좋지 않아져 응답을 가끔 기다리곤 했다. 만약 사용자라면 정말 답답하다고 느낄 정도의 문제였다.

결국 많은 문서들을 살피고 미리 구현된 RX만 인터럽트로 처리하는 소스를 봤지만 역시 처음보는 세계라 너무 어려웠다. 기술 문서가 있긴 하지만 정말 딱딱 이렇게만 하면 된다는 식으로만 정리되어 있는 내용들을 봤지만 예외에 대한 문제는 찾아낼 수 없었다. 그 황당한 예외 중의 하나가 대표적인 것이 프로그래밍 상태로 칩셋을 만드는 것이었는데 결국 반대 순서로 바꾸어서 제대로 동작하는 이상한 일도 있었다.

일단 삽질을 해가며 전송할 바이트를 밀어넣는 TXREG레지스터의 비었음을 알리는 TXIF라는 플래그를 열심히 이용했지만 아무리 해도 무응답하는 프로그램. 여차저차 실험해보고 삽질도 해보니 문제는 USART가 활성화된 후 처음 전송은 반드시 TXREG를 통해서 1바이트를 보내야 플래그가 제대로 세팅된다. 그리고 누락된 처리를 위해 tmr0나 tmr1등등의 타이머의 카운터 오버플로우도 사용해야 한다.

단 하나의 인터럽트 처리 부분은 $0004번지 주소에 가지는데 이 하나로 모든 인터럽트를 처리한다. mikropascal 내부에서는 procedure Interrupt; 라는 프로시저를 선언하여 사용하면 된다. mikro-c도 비슷한 방법을 사용한다.

TXIF 플래그가 비어있음 1로 셋팅되기 위해서는 TXREG를 통한 하드웨어 변경 밖에 안되므로 소프트웨어로 인터럽트를 관여하는 레지스터로 리셋하는 것은 불가능하다. 이를 무시하고 인터럽트 방식으로 TX를 처리하게 되면 처음에 1번의 전송은 인터럽트에서 반응이 없어서 결국 플래그를 두고 처음에 1번은 TXREG로 전송하게 했다.

자세한 구현 이야기를 적고 싶지만 아직 초보자인 나로서는 하나하나 설명하기 힘들다.

일단 만들어낸 PIC16F627의 하드웨어 USART를 이용한 구현 파일을 첨부한다. 유닛상태로 사용하면 조금 커서 최적화를 위해서는 implementation 부분을 copy&paste해서 메인 소스에서 사용하는게 좋다.

왜 만들었냐면 아무도 사용가능한 제대로된 구현을 공개하는 것을 찾을 수 없었다. 이는 라이브러리 공개 사이트인 libstock.com에도 공개되어 있다.

UART_INTR.rar

빠른 다중쓰레드 어플리케이션 만드는 방법.

1. 문자열이나 동적배열을 함수나 프로시져의 파라미터로 쓸 경우에는 const를 쓴다.

2. 문자열 합하기 사용을 피하고 TStringBuilder와 같은 클래스를 이용한다.

3. 숫자를 문자열에 변환하여 넣을 경우에는 TStringBuilder도 제대로 성능을 못낸다. 그건 경우에는 Syncommon.pas 의 TTextWriter 클래스를 이용한다.

4. CriticalSection을 오용하지 않는다.  데이터를 접근할 때 InterlockedIncrement같은 함수들을 이용한다.

5. 공유하는 버퍼나 오브젝트를 접근할 때는 InterlockedExchange를 이용한다.

6. 데이터를 쓰레드끼리 공유하지 않는다. 개별적인 복사된 데이터를 만들어서 사용한다.

7. 문자열의 문자 접근의 인덱싱을 사용하지 않고 PosEx와 같은 함수를 이용한다.

8. Ansistring과 Unicodestring을 혼용하지 않는다.

9. 문자열을 결과값으로 전달할 때 result값으로 되돌리지 않고 var로 되돌린다. 이는 LOCK 기계어를 호출을 줄여준다.

10. 문자열이나 데이터를 파싱하는 경우, 임시적인 문자열이나 동적배열을 사용하지 않고 고정적인 버퍼에 포인터를 이용해서 접근한다.

11. TMemoryStream을 필요할 때 마다 생성하지 않는다. 충분히 할당해서 고정적인 크기로 사용한다.

12. 제한된 클래스 인스턴스를 생성하고 생성된 클래스를 재사용한다. 일부의 구조체나 오브젝트는 다시 복사해서 할당하지 말고 할당된 메모리에 포인터로 할당해서 접근한다.

13. 항상 테스트를 해본다.

14. 원초적인 본능(직감?)을 믿지 않는다. 당신은 사람이지 기계가 아니다.

 

출처 : http://blog.synopse.info/post/2011/05/20/How-to-write-fast-multi-thread-Delphi-applications

 

 

Microsoft Translator API V2 사용해보기.

구글의 번역 API가 더이상의 지원이 없어져 새로이 다른 방법으로 마이크로소프트의 번역 API를 사용하도록 하는 소스와 예제.

XML 라이브러리를 OmniXML로 템플릿을 사용한 부분과 문자열형의 인코딩 특성을 수정해서 다시 간단한 GUI 어플리케이션으로 만들었다.  UTF-8 인코딩을 다루기 때문에 델파이 6이상의 버전이 필요하다. 델파이 5에서도 확장 유닛을 사용해서 UTF-8을 다룰 수 있다면 사용이 가능하다.

mstranAPIv2.zip

 

출처 : http://theroadtodelphi.wordpress.com/2011/05/30/using-the-microsoft-translator-v2-from-delphi/

Page 1 of 3212345102030...Last »