2010년 7월 31일 토요일

stm32f10x에서 malloc의 최소 할당 메모리 사이즈(page size) 변경하기

임베디드 시스템에서 CodeSourcery 사의 arm-none-eabi 툴체인 사용시 page size가 4kB으로 되어 있다. 하지만 stm32f10x의 메모리는 보통 20kB 많아도 68kB다 이러한 상황이니 page size를 작게 변경하거나 malloc()대신 _malloc_r을 사용한다고 되어 있다만, 소스코드를 일일이 변경해야 하고 다른 시스템에서 다시 복구해야하는 문제점이 발생한다. 그래서 arm-none-eabi의 libc로 사용중인 newlibc의 page사이즈를 재설정하고 다시 컴파일해야한다. 하지만, 그리 간단한 일이 아닌가 보다. 다음과 같은 해답을 구했다.

> The mallocr.c from the newlib-source checks a define SMALL_MEMORY which
> sets the alignment to 128.
>
> Which sounds more reasonable.
>
> But I think this sbrk() stuff is quiet needles for system w/o virtual
> memory where the size of the heap is fixed at link-time.

그리고 _malloc_r에 대해서 찾아 보았다.

The _malloc_r routine is indeed a version of malloc which uses an additional
parameter to receive a reentrancy structure. The malloc routine simply calls _malloc_r with
the default reentrancy structure. Internally, any reentrant library routines must
call _malloc_r instead of malloc and pass whichever reentrancy structure was
passed to them. Thus, you want to replace the _r interfaces rather than the
top level routines like malloc() and free().

Multithreaded applications must create their own separate reentrancy structures per
thread and must use _r routines where provided. For more information, see the
library info files (make info install-info). You can alternatively peruse the info source
for the reentrancy chapter in newlib/libc/reent directory (reent.tex).

A while back, _malloc_r used to use manage heap storage from pools that were
stored off of the reentrancy structure. Now, the reentrancy structure is used
as a mutex identifier for __malloc_lock and __malloc_unlock. By default,
__malloc_lock and __malloc_unlock are only provided as stubs.

If you don't need to worry about multithreaded applications using your malloc,
simply create versions of _malloc_r, _free_r, _calloc_r, and _realloc_r that
ignore the reentrancy structure. Otherwise, you will have to either use
a mutex system (and supply mutex routines) or use a separate pool per reentrancy
structure.

아 모르겠다. 어쩌라는 건지?

2010년 7월 26일 월요일

Configuration of Matrox Meteor-II + MIL-lite


-->
출처는 알수 없지만, 문제가 된다면 연락주세요 오래된 내용 정리하다가
필요한 사람들이 있을 것 같아 이렇게 올려 봅니다.
Mil Mil Lite, Active Mil 과의 차이점
MIL-LITE 의 경우는 Matrox Frame Grabber 설치를 위한 Driver를 제공하며 기본적인 Frame Grabber 기능 즉, 영상획득, Display, 영상 Load, 저장이 가능한 Module들로 구성되어 있습니다.
주로 영상을 획득하여 Image 확인 및 이에 대한 저장을 위해 많이 사용되며 Image data를 직접 Access하여 독자적인 Processing처리 및 알고리즘을 적용할 수 있습니다.
MIL의 경우는 MIl-Lite에서 저공하는 기능을 포함하며 영상 처리를 위해 사용되는 알고리즘이 쉽게 사용할 수 있는 함수로 구현되어 있습니다.
, Image Processing, Pattern matching, OCR, blob, Measurement등의 기능을 함수로써 제공하므로 누구나 쉽게 사용하실 수 있도록 구성되어 있습니다.
MIL은 우리가 Visual C++ 환경에서 c language를 사용하여 programming 할 수 있도록 Library가 구성되어 있습니다.
Active MIL Active X를 사용하는 것으로써 Visual Basic Visual C++환경에서 개발이 가능하며 mil에서 사용하는 module들이 control들로 구성되어 있습니다.
MIL에서는 사용하기 위한 module들에 대한 선언 및 초기화 작업에 대한 작업을 coding을 통해 설정을 해주는 반면에 Active MIL의 경우는 Active X control로 모든 module들이 구성 되어 있어 control Form Resource에서 원하는 control을 선택하고 여기에 대한 초기화를 속성 창을 통해 설정을 합니다.
지원하는 기능은 동일하며 다만 사용하는 함수의 표현방식이 개발환경에 따라 다릅니다.

S/W License 정책 및 Maintenance
License의 경우는 MIL-Lite의 경우는 구매하시면 한 법인 내에서 1copy free로 사용가능합니다. 그러나 MIl의 경우는 1copy당 각각의 license가 있습니다. Hardware Lock key가 있어야만 사용이 가능 합니다. 따라서 2개 이상 사용시는 Hardware
Lock key를 추가로 구매하셔야 합니다.
Maintenance의 경우는 구매 후 1년 이내이면 Minor version upgrade시 무상 upgrade가 가능합니다. 그러나 Major version upgrade 및 구매 후 1년 이상이 지나신 경우는
Maintenance 비용을 지불하시면 upgrade가 가능합니다.

Mil Uninstall이 잘 되지 않을 경우
win2K 환경에서는 레지스트리 관리에 의해 MIL은 자체적인 Uninstall후에도 MIL이 제대로 제거되지 않는 경우가 있습니다.
또한 불가피하게 MIL을 다시 설치하게 될 경우 Uninstall 과정을 거친 후 다시 설치를 하게 되는데 설치가 제대로 되지 않는 경우가 있습니다.
이럴 경우에는 다음과 같이 setting을 하시면 됩니다.
1. Registry 편집기를 실행시킨다.
2. HKEY_LOCAL_MACHINE\SOFTWARE\Matrox의 폴더를 삭제 단, Matrox Desktop 제외
3. HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\MtxDma0의 폴더를 삭제
4. ControlSet003, ControlSet004, Current ControlSet 각각의 폴더 아래에 있는 MtxDma0도 모두 삭제
5. Boot.ini File 확인 사항Uninstall Boot.ini 파일 안에 메모리 관련 수치가 삭제되었는지 확인
C:\WINNT 폴더에 Boot.ini 파일의 내용 중 메모리 관련 내용을 삭제합니다.
Boot.ini File 내용의 일부분
[Operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft
Windows 2000 Professional(Memory :
NT=228MB, MIL=20.0MB)(Memory : NT=148MB,
MIL=100.0MB)" /MAXMEM=148 /MAXMEM=248 /fastdetect
6. 재부팅

Mil을 설치 했는데 보드가 제대로 인식이 되지 않는 경우
MIL을 설치한 후 장치관리자에서 새로운 장치가 올바르게 설치되었는지 여부를 확인할 수 있습니다. Board를 제대로 인식하지 않는 경우는 다음과 같습니다.
1. 적절한 드라이버가 설치되지 않아 노란 물음표기 표시되어 있는 경우
2. Frame Grabber Adapter가 잘못 명기되어 있는 경우
예를 들어 Meteor2/4 또는 Meteor MC를 설치했는데 인식되는 board MeteorII-digital Frame Grabber 일 경우 그 반대의 경우 MeteorII-digital을 설치했는데 MeteorII라고 인식되는 경우
3. Intellicam에서 System Device0로 인식되지 않는 경우
1~3번의 경우는 장치관리자에서 드라이버 업데이트를 통해 적절한 드라이버를 설치하도록 설정, 재부팅 합니다. 그런 후에도 board가 잡히지 않는다면 IRQ setting이 어떻게 되어있는지 확인하시고 IRQ의 설정을 변경한 후 check를 합니다.

Intellicam을 잘 활용하는 방법
Intellicam Matrox에서 제공하는 하나의 Application Program으로 MIL MIL-Lite 모두에 포함되어 있는 program 입니다.
Application program
1. Board가 제대로 인식되는지에 대한 확인
2. 사용하는 camera에 대한 적절한 dcf 제작및 편집
-> 대부분 Matrox에서 제공하며 sync mode exposure time을 원하는 형태로 설정하는 것을 이 Application program을 통해 편집 가능
3. 제공되는 또는 제작 편집을 한 dcf camera와의 interfacing을 통해 영상이 제대로 획득 되는지를 원하는 결과가 나타나는 지 렌즈 및 빛의 밝기 등이 적절하게 선택되었는지 확인 할 수 있습니다.
또한 dcf의 편집을 통해 다양한 기능을 수행할 수 있으며, 간단한 Digitizer control을 할 수 있습니다.
원하는 영상이 획득된다면 이에 해당하는 dcf를 사용하여 program을 작성하시면 됩니다.

Matrox에서 제공 하는 예제를 보는 방법
Visual Studio 6.0 환경에서 Source를 불러와서 직접workspace를 생성할 때
예제는 Active MIL MIL 예제가 제공되고 있습니다.
예제에 대한 전반적인 기능에 대해 살펴보기 위해서는 시작/프로그램/Matrox
Imaging/Active MIL(MIL)/Example 을 클릭하시면 됩니다.
Active MIL의 경우는 바로 예제를 Simulation할 수 있도록 지원되는 형태로 이루어져있습니다. 따라서 원하는 Program에 대한 결과를 볼 수 있습니다.또한 오른쪽 하단에 Edit이라고 나타나 있는 Button click할 경우 visual Basic에서 구현된 code form을 바로 볼 수 있습니다.
MIL의 경우는 각 예제에 대해 각각 선택을 할 수 있으며 이것을 선택하셔서 결과를 확인할 수 있습니다.
Code C:/program files/Matrox Imaging/MIL/examples 에서 원하시는 code를 살펴볼
수 있습니다.
물론 Active MIL도 위와 같은 방법으로 볼 수 있으며 Visual C++ 환경에서 coding program도 볼 수 있습니다

Mil workspace 생성을 위한 setting
MIL을 이용한 program을 실행하기 위해서는
1. Tool/option을 선택하셔서 Directories Tab에서 Library include File Matrox Include Library를 설정해주십시오.
2. 그런 후 complie을 하시면 workspace가 생성이 되면서 error가 여러개 발생합니다.
error의 경우는 각 module에 대한 library link되지 않아서 발생하는 error이므로 다음과 같은 설정을 합니다.
- project/setting tab link program에서 사용되는 library module을 삽입해 주시면 됩니다.
예를 들면 mblob.c를 사용할 경우 기본적으로 mil.lib milblob.lib, milim.lib library를 첨가해주시면 됩니다.
3. 다시 Complie 합니다.

Mil (or Mil lite) 소스의 기본구조
MIL(Matrox Imaging Library) Matrox에서 나오는 Frame Grabber를 사용하기 위해서 필요한 일종의 라이브러리입니다.
MIL MIL-lite의 두 종류로 나뉘어 있으며 MIL MIL-lite에 들어있지 않은 Image Processing관련 함수들이 포함되어 있습니다.
MIL을 처음 다루시는 분들을 위해 간단한 grab예제로 설명을 하도록 하겠습니다.
/* MIL함수들이 정의되어 있는 함수로써 include 해주셔야 합니다.*/
#include <>
#include <>
void main(void)
{
/* MIL에서 각 개체들을 다루는 data type으로서, 아래와 같은 */
/* 항목들을 지정합니다. */
MIL_ID MilApplication,
/* 제작하는 응용프로그램 ID */
MilSystem,
/* Frame Grabber ID */
MilDisplay,
/* Display를 위한 ID */
MilDigitizer,
/* Digitizer Camera를 위한 ID */
MilImage;
/* Image Buffer를 위한 ID */
/* 응용프로그램에서 각 ID들을 기본적인 설정으로 할당합니다. */
MappAllocDefault(M_SETUP, &MilApplication, &MilSystem,
&MilDisplay, &MilDigitizer, &MilImage);
/* Monitor MilImage의 내용을 Display하기 위한 설정을 합니다. */
MdispSelect(MilDisplay, MilImage);
/* Camera에서 Grab하여 MilImage에 저장합니다. */
MdigGrab(MilDigitizer, MilImage);
/* printf */
printf("An image has been grabbed.\n");
printf("Press to end.\n");
getchar();
/* 처음에 할당한 ID들을 해제합니다. */
MappFreeDefault(MilApplication, MilSystem,
MilDisplay, MilDigitizer, MilImage);
}
위에서 각 ID들을 할당하고 해제시켜주는 것은 모든 응용프로그램에서 동일합니다.
다만 각 경우에 따라 각 ID들을 따로 할당시키고 각각 해제할 수 있습니다.
각각의 MIL_ID를 할당 및 해제하는 함수는 다음과 같습니다.
MilApplication - MappAlloc, MappFree
MilSystem - MsysAlloc, MsysFree
MilDisplay - MdispAlloc, MdispFree
MilDigitizer - MdigAlloc, MdigFree
MilImage - MbufAlloc2d, MbufAllocColor, MbufFree, etc
여기서 주의하실 점은 할당 및 해제할 때 순서에 따라야 한다는 것입니다.
할당의 경우는
MappAlloc -> MsysAlloc -> MdigAlloc, MdispAlloc, MbufAlloc
해제의 경우는
MdigFree, MdispFree, MbufFree -> MsysFree -> MappAlloc
의 순서입니다

Visual C++에서 Mil 사용 팁!!
1. MIL help 이용방법
- MIL을 설치하신 후에 메뉴>Tools>Customize에 들어가셔서 Add-ins and Macro Files 탭을 보시면 다음과 같은 항목이 추가되는 걸 확인하실 수 있습니다.
. Matrox ActiveMIL VC++ Add-In
. Matrox MIL VC++ Add-In
여기서 Matrox MIL VC++ Add-In을 추가하시면 Visual C++을 사용하시다가 MIL함수에 대한 도움말을 보실 때, 함수 명위에 커서를 위치시키고, Ctrl+F1을 누르시면 바로 MIL help를 보실 수 있습니다.
2. LINK : fatal error LNK1104: cannot open file "mil.lib"
(or error LNK2001: unresolved external symbol)
프로그래밍을 조금만 해보신 분이라면 아시겠지만, 위 에러는 컴파일할 때 mil library를 못찾은 까닭입니다. 이 때는 메뉴>Tools>Options에서 Directories탭에 가셔서 library files의 디렉토리로 MIL library파일이 있는 경로를 추가해주시면 됩니다.
일반적인 경우 경로는 다음과 같습니다.
C:\PROGRAM FILES\MATROX IMAGING\MIL\LIBRARY\WINNT\MSC\DLL
Include file도 똑같이 해주시면 되고, 경로는 다음과 같습니다.
C:\PROGRAM FILES\MATROX IMAGING\MIL\INCLUDE
(주의)이미 만들어진 소스를 가지고 작업을 하시게 될 경우에도 위의 에러를 보시는 경우가 있을 것입니다. 이것은 기존 workspace에 설정돼있는 lib화일의 경로와 현재 사용하시는 컴퓨터에서의 경로가 다르기 때문인데, 이때는 위의 directories설정을 제대로 해주셔도 위와 같은 link error가 발생합니다.
이때는 workspace view에 있는 *.lib화일을 삭제하시고 다시 컴파일하시면 됩니다.

Milimage 를 파일로 저장하거나 불러오는 방법
MIL에서 기본으로 사용하는 Image Format *.mim형태의 tiff형식의 화일입니다.
따라서 MbufLoad MbufSave를 다음과 같이 사용하시면, mim화일로 저장 또는 불러오기가 가능합니다.
MbufLoad("load.mim", MilImageLoaded);
MbufSave("save.mim", MilImageSaved);
그러나 일반적으로 사용하는 포맷인 jpeg이나 tiff, raw등의 이미지화일포맷은 다음의 함수를 사용하여 저장 또는 불러오기가 가능합니다.
MbufImport("sample.jpg", M_JPEG_LOSSY, M_RESTORE,
MilSystem, &MilImage);
MbufExport("sample.tif", M_TIFF, MilImage);
그리고 Image sequence avi파일로도 저장이 가능한데, 이때는 MbufImportSequence, MbufExportSequence함수를 이용하시면 됩니다.

Mil을 이용한 프로세싱 시간 측정
프로그램을 직접 작성하시다 보면 각 부분들의 성능을 측정하고, 디버깅을 위해 Timer가 필요한 경우가 많습니다. 이럴 경우 MIL, MIL-lite에서 제공하는 MappTimer를 사용하시면 됩니다. 사용방법은 매우 간단합니다.
/* Return되는 시간값의 단위는 sec()이고, 따라서 보통
Time*1000(ms)로 사용합니다. */
double Time;
MappTimer(M_TIMER_RESET, M_NULL);
/* 이곳에 시간측정대상이 되는 프로세스가 들어갑니다.*/
MappTimer(M_TIMER_READ, &Time);

Mil을 이용한 프로세싱 시간 측정
Matrox 프레임그래버의 드라이버는 따로 화일로 주어지지는 않습니다. MIL이나 Mil-lite를 설치하실 때 깔게 되구요. 창이 설치도중에 뜨게 되는데 이때 선택하신 보드의 드라이버들이 깔리게 됩니다.
MIL이나 Mil-lite의 설치가 끝난 후 프레임그래버가 자동으로 잡히지 않는 경우에는 장치관리자를 확인하여 주시기 바랍니다. 제대로 잡혔다면 Matrox Imaging Adapter라는 폴더가 생기고 그 안에 프레임그래버정도가 들어있게 됩니다.
느낌표나 x표가 있을 경우 제대로 인식이 안된 것입니다. 이때는 등록정보의 드라이버탭의 드라이버 업데이트를 해주십시요.
위와 같이 하시면, 창이 새로 뜨게 되는데 여기서 밑의 항목을 선택합니다.
그러시면, 설치하신 프레임그래버 드라이버중 사용가능한 드라이버의 목록이나 설치할 준비가 되었다는 메시지가 뜨게 됩니다.
(참고로 Meteor2/Multi-Channel보드도 MeteorII라고만 표시됩니다.)
그리고 나시면 Intellicam 에서 Device 0 라고 나온것을 확인하실 수 있습니다.

2010년 7월 23일 금요일

WinAVR + Eclipse + AVR Plug-in Developement Environment Setting



AVR의 Windows버전 컴파일 도구 모음집인 WinAVR을 설치하자.
위의 사이트에 가서 최신의 버전을 다운받자. 지금 테스트 하는 시점의 버전은 20100110이다. 그리고 전에 언급한적 있는 Eclipse의 최신 버전을 다운 로드 받자. 다운 받을 주소
에서 최신버전의 Eclipse IDE for C/C++ Developer를 다운 로드 받자. 테스트하는 현시점의 최신 버전은 코드네임 Helios로 되어 있다. 주의 해야 할 것은 Windows의 버전이 32bits인지 64bits인지 구분해야한다. 여기에서는 32bits의 버전만 가지고 다룰 것이다. 64bits가 잘 동작하는지는 아직 잘 모르겠다. 그럼 위와 같이 설치를 마치게 되면 WinAVR은 C:\WinAVR-20100110에 설치되고 Eclipse는 C:\Eclipse에 설치 될 것이다.
그럼 새로운 프로젝트를 갖는 Workspace를 만들자 경로는 C:\work\AVR로 하고 Eclipse를 실행하자. 물론 workspace는 C:\work\AVR로 설정하는 것을 읻지 말자.


아직 AVR Workspace에는 아루런 프로젝트 정보가 없기 때문에 다음과 같은 Welcome화면만 보여 질 것이다. 우선 무시하고 Workbench 모드로 전환하자.




그럼 다음과 같이 Project Explore에 아무런 설정이 되어 있는 않는 빈 상태의 workbench가 열리게 된다.



Eclipse의 AVR Plug-in을 우선 설치해 보도록 하자. Eclipse 메뉴의 Help->Install New Software를 선택하자. Work with: 항목의 Add 버튼을 클릭하자.



그리고 다음과 같이 AVR Eclipse Plugin을 설치하기 위한 주소를 추가한다.



Work with: 의 주소를 AVR Eclipse Plugin으로 설정하고 CDT Optional Features중에서 AVR Eclipse Plugin만 설치하자. Source는 필요없는 부분이다. 필요 없다기 보단 불필요하게 다운 받을 필요가 없다.


자 그럼 이제 필요한 준비물들은 다 준비가 되었다. AVR Plugin을 이용해서 새로운 프로젝트를 생성하자. File 메뉴의 New -> C Project를 선택하고 다음과 같이 AVR128_MP3라는 프로젝트를 생성하자.


Next를 클릭하고, Debug와 Release 설정을 모두 선택하고 Next를 클릭하자.


프로젝트의 MCU 타입과 Crystal의 주파수를 ATmega128l과 16Mhz로 설정하고 Finish를 클릭하자.



자 이상으로 프로젝트를 생성하는 것은 마무리 되었다. 소스코드와 헤더파일및 데이터 파일은 File->New-> Source FIle 이나 Header FIle을 통해서 얼마든지 추가하고 수정할 수 있다.

이제는 avrdude.exe를 통한 이미지 업로드하는 설정을 하도록하자. Project 메뉴의 Properties항목을 선택하자. 그리고 AVR->AVRDude항목을 선택하자.



그리고 Programmer 탭의 New 버튼을 클릭하고 다음과 같이 설정하자.



그리고 Fuses 탭에 가서 다음과 같이 설정한다.
http://www.engbedded.com/fusecalc/ 에서 Fuse 계산기를 사용하면 내가 원하는 설정을 쉽게 알아 낼 수 있다. 우선은 다음과 같이 설정하자.











Atmega128 Module + USBTinyISP Under WinAVR
  • Atmega128 Module Schematic
  • USBTinyISP Schematic
  • Fuse Setting
    • AVR Part name
      Atmega128-PI
    • 4096 words boot 0xf000~0xffff, app 0x0000~0xefff
      BOOTSZ[1:0] = 00 ;
    • Start-Up time 258 CLK
      KSEL0:SUT[1:0] = 000;
    • 16Mhz Crystal
      CKOPT = 0;
Low : 0xce, High : 0x09, Ext : 0xff

2010년 7월 21일 수요일

STMicrosystem 사의 프로세서 stm32를 위한 개발환경 설정


1. 컴파일러 설치
ARM EABI GCC가 포함된 컴파일러 도구인 CodeSourcery G++ Lite를 다음 주소 http://www.codesourcery.com/sgpp/lite/arm/portal/subscription3053 에서 다운받자.



현재 시점에서 가장 최신버전인 Sourcery G++ Lite 2010q1-188을 설치하자.




모든 사용자가 사용할 수 있도록 PATH를 지정하도록 설정한다.



설치를 마치고 사용 방법을 살펴보도록한다.



2. IDE(Integrate Development Environment) 설치
http://www.eclipse.org/downloads/ 에서 Eclipse IDE for C/C++ Developer중에서 windows 32bits 버전을 다운 받고 c:\에 압축을 해제한다.

3. JRE(Java Runtime Environment) 설치
Eclipse를 설치하고 c:\eclipse\eclipse.exe를 실행하면 다음과 같은 메시지를 출력한다.


http://java.com/ko/download/windows_ie.jsp?locale=ko&host=java.com 에서 무료 Java 다운로드 항목을 클릭하여 JRE를 다운로드한다. 현재 시점에서 JavaSetup6u21.exe가 실행되면 설치시에 대상 폴더 변경을 선택한다.


그리고 c:\eclipse\jre라는 폴더를 만든다.



JRE 설치시에 대상폴더를 위의 폴더로 변경한다.



4. Eclipse 환경 설정
Eclipse를 실행하면 다음과 같이 workspace를 설정하는 화면이 나온다.


C:\work\STMicrosystem이라는 폴더를 생성하고 위의 경로를 C:\work\STMicrosystem으로 변경하자.


그러면 Loading Workbench 라는 메시지와 함께 Eclipse의 로딩 화면이 시작된다.



로딩이 종료된 시작화면은 다음과 같다.



새로운 프로젝트의 생성 File->New->C Project 를 선택하고 다음과 같은 STM32_MP3라는 프로젝트를 생성한다.


그리고 다음 화면에서 Workbench로 모드를 전환한다.


STM32_MP3라는 프로젝트가 Project Explore에 나타나고 내용은 아직 아무것도 없는 상태가 된다.


5. 프로젝트 파일 작성
생성된 프로젝트 STM32_MP3의 Project Explore 탭에서 오른쪽 버튼을 클릭하여 Property항목을 선택한다.



항목중 C/C++ Build의 Environment항목을 선택하고, 컴파일러의 경로를 지정해주기 위한 새로운 환경변수를 등록하자.

Add 버튼을 선택하고 아래와 같은 새로운 변수를 등록하자. 경로는 위에서 설치한 컴파일러의 경로인 C:\Program Files\CodeSourcery\Sourcery G++ Lite\bin을 추가하자.



위와 같이 컴파일러를 설정하면 컴파일러를 사용할 준비가 다 완료 되었다. 하지만, Eclipse에서 Build All을 선택하게 되면 Console에서 다음과 같은 메시지를 출력한다.


이메시지는 컴파일하는데 필요한 make명령어가 없다는 것을 알려주는 것이다. 실제로 컴파일러의 경로를 따라 가보면, 다음과 같이 make 명령어가 없고 cs-make라는 명령어만 존재한다.



이 부분을 해결하기 위해서 다시 Project의 Property부분으로 되돌아 가서 Use default build command를 해제하고 make부부분을 cs-make로 변경하자.



6. 디버깅환경 설정하기
여기서 사용할 디버깅 도구는 olimex사에서 나오는 openusbjtag이라는 장비와 OpenOCD라는 소프트웨어가 된다. 일반적인 Wiggler도 약간의 차이점만 있을 뿐 거의 비슷한 수준일 것이다. 우선 OpenOCD 의 최신 버전을 다운 받자. 불행히도 OpenOCD 최신버전은 git서버를 통한 접근만 허용하고 있기 때문에 Windows에서 사용할 수 있는 바이너리 구하는 것이 쉽지 않다. 하지만,공식적으로 http://www.freddiechopin.info/ 사이트에서 제공한다. Download/OpenOCD 0.4.0.msi 파일을 다운받자.



잘 살펴보면 Due to alleged GPLv2 license incompatibility of using ftd2xx.dll libraries, this version was compiled to use libftdi + libusb-win32 librarie 이라는 글에서 알 수 있듯이 ftd2xx.dll파일이 GPLv2 라이센스에 부합하지 않다고 다른 방법으로 사용하고 있음을 알려주고 있다. 우선은 설치해 보도록 하자.



설치가 완료되면 Eclipse를 다시 실행하자. Eclipse의 Run->External Tool -> External Tools Confiturations를 선택하자. 그리고 다음과 같이 이미지를 Upload하도록 하는 설정을 하자.



그리고 Debug를 하기 위한 설정을 다음과 같이 하자.


한가지 빼먹은 것이 있다. 위의 두설정의 각각의 Common탭의 Display in favorites menu에 External Tools를 체크해야지만 메뉴상에 나타나서 쉽게 사용할 수 있다. 그리고 위에서 언급된 olimexopenocd.cfg, stm32_jtag.cfg, stm32_program_eclipse_jtag.cfg, 그리고 stm32_debug_jtag.cfg라는 파일은 다음과 같다.

----------------------------------- olimexopenocd.cfg--------------------------------------
#interface
interface ft2232
ft2232_device_desc "Olimex OpenOCD JTAG A"
ft2232_layout "olimex-jtag"
ft2232_vid_pid 0x15BA 0x0003
------------------------------------------------------------------------------------------------

--------------------------- stm32_jtag.cfg ---------------------------------------------
# script for stm32

if { [info exists CHIPNAME] } {
set _CHIPNAME $CHIPNAME
} else {
set _CHIPNAME stm32
}

if { [info exists ENDIAN] } {
set _ENDIAN $ENDIAN
} else {
set _ENDIAN little
}

# Work-area is a space in RAM used for flash programming
# By default use 16kB
if { [info exists WORKAREASIZE] } {
set _WORKAREASIZE $WORKAREASIZE
} else {
set _WORKAREASIZE 0x4400
}

# JTAG speed should be <= F_CPU/6. F_CPU after reset is 8MHz, so use F_JTAG = 1MHz
jtag_khz 1000

jtag_nsrst_delay 100
jtag_ntrst_delay 100

#jtag scan chain
if { [info exists CPUTAPID ] } {
set _CPUTAPID $CPUTAPID
} else {
# See STM Document RM0008
# Section 26.6.3
set _CPUTAPID 0x3ba00477
}
jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID

if { [info exists BSTAPID ] } {
# FIXME this never gets used to override defaults...
set _BSTAPID $BSTAPID
} else {
# See STM Document RM0008
# Section 29.6.2
# Low density devices, Rev A
set _BSTAPID1 0x06412041
# Medium density devices, Rev A
set _BSTAPID2 0x06410041
# Medium density devices, Rev B and Rev Z
set _BSTAPID3 0x16410041
# High density devices, Rev A
set _BSTAPID4 0x06414041
# Connectivity line devices, Rev A and Rev Z
set _BSTAPID5 0x06418041
}
jtag newtap $_CHIPNAME bs -irlen 5 -expected-id $_BSTAPID1 \
-expected-id $_BSTAPID2 -expected-id $_BSTAPID3 \
-expected-id $_BSTAPID4 -expected-id $_BSTAPID5

set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME cortex_m3 -endian $_ENDIAN -chain-position $_TARGETNAME

$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0

set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME stm32x 0 0 0 0 $_TARGETNAME

# For more information about the configuration files, take a look at:
# openocd.texi
------------------------------------------------------------------------------------------------

--------------------------- stm32_program_eclipse_jtag.cfg -------------------------
# default ports
telnet_port 4444
gdb_port 3333
tcl_port 6666

init
jtag_khz 1125
reset init
verify_ircapture disable

halt
poll
stm32x mass_erase 0
flash write_image stm32f10x.bin 0x08000000 bin
reset run
shutdown
------------------------------------------------------------------------------------------------

-------------------------------- stm32_gdb_jtag.cfg --------------------------------------
# default ports
telnet_port 4444
gdb_port 3333
tcl_port 6666

#swj_mode 2

init
jtag_khz 565
reset init
verify_ircapture disable
------------------------------------------------------------------------------------------------

그리고 Wiggler를 사용할 경우 다음과 같은 내용의 *.cfg 파일을 만들어서 olimexopenocd.cfg파일을 대체시키면 사용이 가능하다.

#
# Parallel port wiggler (many clones available) on port 0x378
#
# Addresses: 0x378/LPT1 or 0x278/LPT2 ...

interface parport
parport_port 0x378
parport_cable wiggler

여기까지는 외부장치에 대한 설정을 하는 것이다. 실제로 Eclipse가 외부장치(Jtag 디버거)와 통신할 수 있는 환경을 만들어 주는 것도 설정해 주어야 한다. 단순히 이미지 업로드 하는 것은 별다른 설정없이 업로드할 이미지 즉, stm32_program_eclipse_jtag.cfg파일에서 stm32f10x.bin만 정확히 설정해 주면 동작하지만 디버깅의 경우 좀더 설정해 주어야 할 것이 있다. 우선 Eclipse에서 GDB Hardware Debugging 을 지원해주는 Plug-in을 설치하자. 설치하기 위해서 소프트웨어가 들어있는 서버의 주소를 아래와 같이 먼저 설정해 주어야한다. Help->Install New Softwares ->"Available Software Sites"를 선택하면 된다.


그리고 Work with항목에 위의 주소를 설정해 주고 다음 Plug-in을 설치하고 재시작하자.



Run메뉴에서 Debug Configurations를 선택한다. 그러면 다음과 같은 화면이 나타난다.


왼쪽 탭의 네가지 항목중에서 GDB Hardware Debugging을 선택하고 New 버튼을 클릭한다. 그리고 Debugger 탭에서 가서 다음과 같이 설정하고 Apply버튼을 누른다.




2010년 7월 15일 목요일

CameraHardwareInterface between Cupcake and Eclair

변화가 많다. 우선 기능별로 각각의 함수 내에서 동작하던 Callback 함수들을 하나로 통합하여 관리하고 카메라 동작시 문제가 많이 발생하였는지 mutex로 안정성을 공고히 하였다. proyo에서도 많이 변화가 예상된다. 나오거든 한번 봐야 겠다.

Customize Android.mk for libcameraservice to use a real camera hardware not fake camera

  • Android.mk under frameworks/base/camera/libcameraservice/
LOCAL_PATH:= $(call my-dir)

#
# Set USE_CAMERA_STUB for non-emulator and non-simulator builds, if you want
# the camera service to use the fake camera. For emulator or simulator builds,
# we always use the fake camera.

ifeq ($(USE_CAMERA_STUB),)
USE_CAMERA_STUB:=false
ifneq ($(filter sooner generic sim,$(TARGET_DEVICE)),)
USE_CAMERA_STUB:=true
endif #libcamerastub
endif

ifeq ($(USE_CAMERA_STUB),true)
#
# libcamerastub
#

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
CameraHardwareStub.cpp \
FakeCamera.cpp

LOCAL_MODULE:= libcamerastub

ifeq ($(TARGET_SIMULATOR),true)
LOCAL_CFLAGS += -DSINGLE_PROCESS
endif

LOCAL_SHARED_LIBRARIES:= libui

include $(BUILD_STATIC_LIBRARY)
else
#
# libcamera
#

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
CameraHardware.cpp \
V4L2Camera.cpp

LOCAL_MODULE:= libcamera

LOCAL_SHARED_LIBRARIES:= \
libui \
libutils \
libcutils

LOCAL_STATIC_LIBRARIES:= \
libjpeg

LOCAL_C_INCLUDES += \
external/jpeg

include $(BUILD_STATIC_LIBRARY)
endif # USE_CAMERA_STUB

#
# libcameraservice
#

include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
CameraService.cpp

LOCAL_SHARED_LIBRARIES:= \
libui \
libutils \
libbinder \
libcutils \
libmedia

LOCAL_MODULE:= libcameraservice

LOCAL_CFLAGS += -DLOG_TAG=\"CameraService\"

ifeq ($(TARGET_SIMULATOR),true)
LOCAL_CFLAGS += -DSINGLE_PROCESS
endif

ifeq ($(USE_CAMERA_STUB), true)
LOCAL_STATIC_LIBRARIES += libcamerastub
LOCAL_CFLAGS += -include CameraHardwareStub.h
else
LOCAL_STATIC_LIBRARIES += libcamera
LOCAL_CFLAGS += -include CameraHardware.h
endif

include $(BUILD_SHARED_LIBRARY)

  • init.rc under vendor/0xlab/devkit8000
# add these lines
chown root camera /dev/video0
chmod 0660 /dev/video0

The CameraHardwareInterface class has some changes in eclair version compare to donut version; Callback functions attached to individual function are removed but are handled by predefined messages.