JavaService로 java프로그램을 서비스로 윈도우에 등록할 수 있다.
그런데 등록 후 net start 서비스명 이라고 쳐보면 Error 3534를 만나게 된다.
보통 두가지 원인이다.
첫번째는 Windows xp 의 경우 jvm.dll 이 필요로 하는 msvcr100.dll 이 Windows의 system32 디렉토리에 없어서이다.
이때는 Microsoft.com 에 가서 Visual C++ 배포가능 패키지를 다운받아 설치하면된다.
정확한 이름은 Microsoft Visual C++ 2010 Redistributable Package (x86)이고
http://www.microsoft.com/ko-kr/download/details.aspx?id=5555
위 링크에서 받으면된다.
이렇게 했는데도 안되면
만든 프로그램에 문제가 있는것이다.
주로 현재디렉토리가 바뀌는 문제이므로
JavaService.exe -install XXXService "C:\Program Files\Java\jre7\bin\client\jvm.dll" -Djava.class.path=.;C:\어쩌고\bin;C:\어쩌고\sqljdbc4.jar -Xms64M -Xmx128M -start 내클래스명 -params 각종파라메터 -out C:\어쩌고\out.txt -err C:\어쩌고\err.txt -current C:\어쩌고
와 같이 -current 옵션을 사용해서 강제로 현재디렉토리를 변경하면 된다.
디렉토리에 공백이 들어가는 경우 따옴표를 적절히 활용해주면된다.
Saturday, November 10, 2012
Tuesday, June 12, 2012
Allegro PowerPad 그리기
TI의 IC를 보면 TSSOP 형태중 PowerPad 라는것이 있다.
아래 그림은 그 원리인데, IC바닥에 금속판의 열을 동박을 거쳐 공기중으로 배출하는것이다.
이런 구조가 되려면 IC가 위치하는 부분에 동박을 놓아야 하고(당연히 코팅하면 안됨) 그자리에 땜을 해줘야 하고 비아홀을 여러개 뚧어서 밑면의 동박으로 전달해주어야 한다.
이렇게 하려면 package 를 만들때 특별한 방법을 써야 하는데 그것을 설명하겠다.
PowerPad(TI 고유 상표)가 될 PAD를 만든다.
* Multiple drill 이 중요.
보통 pad 는 1개의 drill hole이 있지만 이건 여러개의 drill 을 해서 홀을 많이 뚧는다.
그래야 열 전달이 잘된다.
아래 그림처럼 윗면과 아랫면이 서로 연결된다.
이렇게 만든 Pad를 mechanical pin 으로 IC 바닥에 깐다.
그외 설명은 안하겠다.
English:
Q: How to make PowerPad ( Thermal pad, Thermal shape with multiple via hole, Via in shape )?
A:
1. make multiple drill pad
2. place multiple drilled pad for mechanical pin
Tuesday, May 1, 2012
개발은 집에서 해야 제맛. 디지털앰프, 2.4Ghz 무선송수신
2012년 5월 2일 새벽이다. 업무상 필요로 디지털앰프와 2.4Ghz 무선 송수신 모듈의 조합을 시험중이다. 납기가 13일 남았다. 무조건 성공해야 한다.
무선 송수신기단에서의 음성 전송은 아주 깨끗이 잘된다.
그러나 수신기에서 디지털앰프로 넘어갈때 어마어마한 노이즈가 끼어든다.
일단 디지털 앰프의 아날로그 입력에 캐패시터를 달아 고역 노이즈는 제거했지만 "쉬" 소리가 계속 난다. 일단 앰프의 승압 회로에서 생기는 노이즈가 파워서플라이까지 전달되어 전체적으로 노이즈가 생기는것으로 짐작하고 있다. 내일 낮에 실제 사용할 24V 배터리 환경에서 시험해볼것인데 만약 배터리 환경에서도 마찬가지의 노이즈가 나타난다면, 물론 지금만큼 이하로 나타난다면 노이즈는 그냥 허용하는것으로 마무리 해야할것이다.
이런일이 생기지 않도록 무선 수신기에서 음성을 수신하자 마자 ADC->광 SPDIF 로 해서 디지털 앰프로 전달하고 디지털 앰프에서는 광을 받아 I2S 로 변환 해서 PWM processor로 바로 넘기도록 하는게 가장 확실한 노이즈 대책이다.
다음 버전은 그렇게 만들어야징.
결국 항상 필요한것은 아날로그오디오->ADC->I2S->SPDIF->광 또는
아날로그 오디오->ADC->I2S->LVDS 아니면,
아날로그 오디오->반전출력-> 전송선로 -> 트랜스포머 또는 Isolated 반전증폭기->아날로그
..
아니다. 모든 음성 신호는 I2S 또는 SPDIF 로 하는것이 항상 정확할것이다.
아날로그 회로는 노이즈와 함께 산다. 하지만 디지털 회로는 노이즈는 없고, 노이즈를 만들어서 아날로그회로를 괴롭히지.
TI TAS5504-TAS5162 조합의 디지털앰프
ADC는 PCM1808, 입력프리앰프는 LM4861..
그러니까 전부 TI꺼로만 조합한거다.
2.4Ghz 오디오 수신 모듈을 사용한 수신기
한쪽 채널의 DTMF를 수신해서 명령을 알아듣는다.
2.4Ghz 오디오 송신 모듈을 사용한 송신기
일단 켜지면 무조건 DTMF를 내보낸다.
수신기들아 켜저라~ 하고 말이다.
Saturday, April 14, 2012
STM32F103 Reset cpu
NVIC_SystemReset 함수를 이용하세요.
core_cm3.h 에 있음.
Thursday, April 5, 2012
IAR EWARM 에서 파일 링크하기(Raw Binary Image link)
STM32f103c8t6 (ram 20kbyte, flash 64kbyte) 사용중 mp3 파일을 CPU 내장 플래시(flash)메모리에 넣고자 애쓰다가 삽질했다.
http://www.iar.com/Global/Resources/Developers_Toolbox/Building_and_debugging/Constructing%20a%20bootloader%20STM32F207ZG-SK.pdf
위에 링크한 게시물을 확인하세요.
그러니까.. 펌웨어를 작성하는데, 프로그램 안에서 jpg 파일이나 mp3파일이나 wav 파일등 바이너리(binary)데이터를 flash에 넣고 그것을 읽어서 사용하고 싶을때 어떻게 하느냐.
xxx.h 나 xxx.c 등.. 코드로 변환하여 파일을 포함시키면 기본적으로 ram 에 올라간다. 그러면 안그래도 부족한 램이 꽉차서 프로그램이 뻣어버린다. 따라서 flash에 넣고 그것을 읽어서 사용하도록 해야 한다.
방법은 iar ewarm 의 linker 옵션의 input 섹션의 raw binary image 기능이다.
파일을 선택하고, symbol 과 section을 지정해주고, icf 파일에다가 직접 원하는 flash 속에서의 주소를 지정해준다.
그렇게 하면 linker 가 icf 에 기술한 주소에 raw binary image 로 지정한 파일을 해당 위치에 저장해준다.
그러면 프로그램에서는 unsigned char *my_jpg = (unsigned char*)0x08001234 식으로 파일의 주소를 직접 지정하여 읽어서 사용하면 된다.
이거 몰라서 hex로 변환하여 프로젝트에 .c 파일로 추가해서 했다가 졸라 삽질했다.
왜냐하면 램이 20KByte 밖에 없는데 내가 추가한 파일은 15KByte 였으니까 프로그램이 시작도 못하고 죽지... 젠장..
예제)
stm32f10x_flash.icf 를 다음과 같이 수정하였음
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000 ;
define symbol __ICFEDIT_region_ROM_end__ = 0x0800FFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x2000FFFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x800;
define symbol __ICFEDIT_size_heap__ = 0x3000;
/**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
initialize by copy { readwrite };
do not initialize { section .noinit };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place at address mem:0x08008000 {section .wave };
place in ROM_region { readonly };
place in RAM_region { readwrite,
block CSTACK, block HEAP };
위에 place at address mem:0x08008000 {section .mp3 }; 부분의 0x08008000 이라는 주소는 0x0800FFFF (FLASH의 끝 주소) 에서 파일 용량만큼 7FFF(32KB) 만큼 뺀 것이다.
링커 옵션의 input 섹션에 다음과 같이 파일을 추가해야함.
http://www.iar.com/Global/Resources/Developers_Toolbox/Building_and_debugging/Constructing%20a%20bootloader%20STM32F207ZG-SK.pdf
위에 링크한 게시물을 확인하세요.
그러니까.. 펌웨어를 작성하는데, 프로그램 안에서 jpg 파일이나 mp3파일이나 wav 파일등 바이너리(binary)데이터를 flash에 넣고 그것을 읽어서 사용하고 싶을때 어떻게 하느냐.
xxx.h 나 xxx.c 등.. 코드로 변환하여 파일을 포함시키면 기본적으로 ram 에 올라간다. 그러면 안그래도 부족한 램이 꽉차서 프로그램이 뻣어버린다. 따라서 flash에 넣고 그것을 읽어서 사용하도록 해야 한다.
방법은 iar ewarm 의 linker 옵션의 input 섹션의 raw binary image 기능이다.
파일을 선택하고, symbol 과 section을 지정해주고, icf 파일에다가 직접 원하는 flash 속에서의 주소를 지정해준다.
그렇게 하면 linker 가 icf 에 기술한 주소에 raw binary image 로 지정한 파일을 해당 위치에 저장해준다.
그러면 프로그램에서는 unsigned char *my_jpg = (unsigned char*)0x08001234 식으로 파일의 주소를 직접 지정하여 읽어서 사용하면 된다.
이거 몰라서 hex로 변환하여 프로젝트에 .c 파일로 추가해서 했다가 졸라 삽질했다.
왜냐하면 램이 20KByte 밖에 없는데 내가 추가한 파일은 15KByte 였으니까 프로그램이 시작도 못하고 죽지... 젠장..
예제)
stm32f10x_flash.icf 를 다음과 같이 수정하였음
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000 ;
define symbol __ICFEDIT_region_ROM_end__ = 0x0800FFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x2000FFFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x800;
define symbol __ICFEDIT_size_heap__ = 0x3000;
/**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
initialize by copy { readwrite };
do not initialize { section .noinit };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place at address mem:0x08008000 {section .wave };
place in ROM_region { readonly };
place in RAM_region { readwrite,
block CSTACK, block HEAP };
위에 place at address mem:0x08008000 {section .mp3 }; 부분의 0x08008000 이라는 주소는 0x0800FFFF (FLASH의 끝 주소) 에서 파일 용량만큼 7FFF(32KB) 만큼 뺀 것이다.
링커 옵션의 input 섹션에 다음과 같이 파일을 추가해야함.
Tuesday, March 13, 2012
Binary CDMA 아트웍 완료
아... 드디어어제밤에 바이너리 CDMA 아트웍을 완료 하였다.
눈알이 빠지려하네
STM32F103ZET6 144핀 MCU와. 60핀 Board to board 커넥터를 연결하고 나니 ㅆㅂ... 부품 심볼을 잘못만들어서 1번핀이 가운데서 시작하네... 돌아버림.. 다시 1번핀이 구석에서 시작하게 심볼을 새로 만들고 다시 라우팅.... 제길.. 이런걸 진짜 삽질이라한다.
삽질을 안하는 방법은 작은 것에서 신경을 써야한다는거다.
계속된 삽질에 눈이 아프다.
Monday, March 12, 2012
Binary CDMA 공부중
바이너리 CDMA를 처음 알게된건 약 2년전. 친구가 재난관련 업체와 정보를 나누다 전해 들었다. 2.4Ghz의 ISM대역을 사용하므로 전파사용에 허가나 신고 없이 소출력으로 사용이 가능하다.
나는 그것에 별 쓰임이 없다고 생각했으나 최근 고이득안테나를 이용하면 작은 건물정도는 통과할수 있음을 시험으로 알게되고 매우 감탄했다.
현재 STM32F103ZET6과 대우전자부품의 모듈을 이용하여 개발중이며 개발성과가 있으면 포스팅하겠다.
물론 회사 직무관련이므로 회로도를 올릴수는 없고 완성품사진정도만 올릴예정.
근데 눈아파서 아트웍을 못하겠다.
Subscribe to:
Posts (Atom)




