2011년 4월 17일 일요일

삼춘

Unkle

원래는 라디오헤드의 새 앨범 소식이 너무도 없던차에

한 곡이나마 유일하게 들을 수 있었던 그래서 기억하는 이름

이 곡의 영향으로 노숙자들을 유심히 살펴보는 버릇이 생겨서

같이 다니던 사람들이 눈 마주치치말라고 충고 하곤 했었는데.

나에게 나름 노숙자에 대한 인권신장에 일조한 곡.


Stone Roses의 까칠해 보이는 이안 브라운의 노래도 괜찬음.

뉴욕에 가서 기억나는건 꾀째재한 지하철뿐 이곡처럼 그리 음산하진 안았지만.

정말 더럽고 찝찝했던 기억이. 첨엔 엄청 쫄았다 뉴욕서 지하철 타면 목숨 내놓고

타야하나해서 심지어 흑인이라도 만나면 어쩌나 했는데

오히려 나에게 다가와서 짝퉁 시계있다고 어깨를 치며 너스레를 떨었던 기억이 있다.

안 좋았던 기억은 뭐 랩퍼 같이 생긴놈한테 공씨디 같은걸 거의 강재로 구매했었 것 정도.

프라이머스

어렸을때 이게 뭔가 싶어 무섭기 까지 했었는데.

이젠 웃음이....

매먼 퍼포먼스까지 다 계획하시는거 같던데 이제는 소식 듣기가 힘드네



the primus - mr. krinkle



Primus - Wynona's Big Brown Beaver

진화 좀 하자!

립스틱, 권총, 하이힐, 핸드백, 컴퓨터, TV, 자동차, 석유, .....

에디베더의 인디언의 우는 소리같은 목소리





(Pearl Jam - Do Evolution)

사내 자식이 울면 쓰겠니?

단순 조악한 구성의 중독성.

사우스 파크에서 우호적이었던 몇 안되는 밴드.

내 기억속의 역사에서 스모키 화장의 원조.

역시 내 기억속 필라멘트 머리의 원조.

양놈들도 사내 자식은 울면 안되나 보다.


작업일지

우선 3CCD 카메라 개발중 PCB까지 작업이 완료되었다.

앞으로 칩의 솔더링하는 작업을 마무리 하고,

카메라의 동작을 확인하기위해서 작성 해놓은 프로그램을 개선해야한다.

그리고 가장하기 싫은 글짓기 작업; 논문 쓰기도 조금씩 시작하자.

또 영어 공부도 해야 졸업도 하고 장가도 가고 취직도 하지.

지금 당장 오늘 모의 영어 시험 보고 온거 틀린 것 다시 풀어 봐야 겠다.

영어 싫다......

2011년 4월 12일 화요일

FreeRTOS on LPC17xx 분석

  • Runtime Library의 구성
    • CMSIS(Cortex Microcontroller Software Interface Standard)
    • Microcontroller Startup code for use with Red Suite
    • Main() 루틴

    • CMSIS의 구성
      • startup_LPC17xx.s
        • __cs3_heap_start, __cs3_heap_end : Heap_Size(0x00001000) 만큼 할당된 Heap 영역의 초기주소와 마지막 주소
        • __cs3_interrupt_vector_cortex_m : 스택영역의 최상위 주소, 리셋 및 인터럽트 핸들러가 정의된 vector
        • _cs3_stack_mem, __cs3_stack_size : Stack_Size(0x00000100) 만큼 할당된 Stack 영역의 초기주소와 크기
        • __cs3_reset_cortex_m : 리셋 핸들러 (rom모드일 경우 __bss_start__에서 __bss_end__까지의 영역을 0으로 초기화 한후 SystemInit() 처리와 main()으로 분기, ram모드일 경우 SystemInit() 처리와 _start로 분기)
        • Default_Handler : 지정되지 않은 (“B .”)재자리 분기의 IRQ 핸들러로써 LPC17xx내에 있는 모든 IRQ 핸들로의 초기상태가 되도록 한다.
      • system_LPC17xx.c
        • SystemInit() : Clock, PLL, Flash 설정 및 SCB(System Control Block)의 Vector table Offset설정
      • core_cm3.c
        • cortex에 관련된 정의와 cortex시스템 코어 제어루틴들 (가령 인터럽트 활성/비활성 기능과 Processor 상태 점검 기능) 이 정의되어 있으나 현재 RealView의 컴파일러만 지원한다. GCC는 cortex 관련 정의만 사용한다

    • Microcontroller Startup code for use with Red Suite
      • r_startup_lpc17.c 
        • __USE_CMSIS을 정의하여 CMSIS내에 포함된 system_LPC17xx의 기능을 사용함
        • g_pfnVectors을 .isr_vector 섹션에 생성한다. CMSIS에 존재하는 __cs3_interrupt_vector_cortex_m  벡터 테이블과 일대일 대응하는 항목으로 채워져 있다.
        • ResetISR()
          • g_pfnVectors의 리셋 핸들러 항목에 채워져 있음
          • _etext영역 이후의 데이터 영역에 해당하는 내용들을 SRAM(LPC17xx의 내부 메모리)의 _data부터 _edata까지의 영역에 복사
          • bss영역을 0으로 초기화
          • __USE_CMSIS가 정의되 있다면 CMSIS내에 포함된 SystemInit()루틴을 수행함
          • Main()루틴을 수행함

    • CMSIS와 FreeRTOS의 공생

      • 서로 동일한 내용을 담고 있는 상충되는 두 vector 테이블인 .isr_vector섹션에 있는 g_pfnVectors과 CMSIS라이브러리의 __cs3_interrupt_vector_cortex_m 벡터를 차이점을 파악하고 조정하고 대체할 수 있는 방법을 모색하자. Linker 스크립트의 수정이 반듯이 필요하다.

    • FreeRTOS와 newlib의 공생

      • FreeRTOS의 소스구조를 살펴보면 memory 할당자를 자체적으로 가지고 있다. 그레서 종종 malloc을 사용할 때 Bus-Fault를 발생시키거나 예기치 않은 동작을 할때가 있다. 이것은 컴파일러가 가지고 있는 자체 malloc이 동작하기 때문인데 FreeRTOS를 컴파일 할때는 Makefile에 CFLAGS += -DMALLOC_PROVIDED를 추가해서 newlib에 있는 malloc이 동작하지 않도록 할 수 있다. - 출처 : http://michaldemin.wordpress.com/2010/03/09/freertos-newlib-on-cortex-m3/

    • Port.c의 Macro 분석

      • portNVIC_SYSTICK_CTRL - STCTRL (System Timer Control and status register)
        • portNVIC_SYSTICK_CLK - System Tick clock source selection. (when 1, the CPU clock is selected. When 0, the external clock pin (STCLK) is selected.
        • portNVIC_SYSTICK_INT - System Tick interrupt enable
        • portNVIC_SYSTICK_ENABLE - System Tick counter enable
      • portNVIC_SYSTICK_LOAD  - STELOAD (System Timer Reload value register) 24bits register
      • portNVIC_INT_CTRL – ICSR (Interrupt Control and State Register)
        • portNVIC_PENDSVSET – PendSV set-pending bit (Write: 0 = no effect, 1 = changes PendSV exception state to pending), (Read: 0 = PendSV exception is not pending, 1 = PendSV exception is pending)
      • portNVIC_SYSPRI2 - SHPR3 (System Handler Priority Register)

    •  Port.c의 함수 분석

      • 인터럽트 핸들러
        • xPortPendSVHandler - context switching 을 위한 Task의 TCB(Tack Content Block)를 복구
        • xPortSysTickHandler - vTaskIncrementTick을 주기적으로 구동 시킴(실질적인 Task 전환이 이루어짐)
        • vPortSVCHandler
      •  인터럽트 설정 : prvSetupTimerInterrupt
        • *(portNVIC_SYSTICK_LOAD) = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; :  SysTick의 주파수를 설정하기 위한 CPU클럭 카운트 값(configTICK_RATE_HZ 값은 1000으로 설정되어 있음. 즉 1Khz = 1ms당 한번씩 SysTick이 구동됨)
        • *(portNVIC_SYSTICK_CTRL) = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE; : SysTick 의 활성화, 인터럽트 활성화, 그리고 구동 클럭 CPU의 클럭으로 설정
      •  스택 초기화 함수: pxPortInitialiseStack – 스택에서 Task가 사용할 위한 공간을 확보한 후 스택의 주소를 되돌려줌
      • xPortStartScheduler 
        • xPortPendSVHandler 와 xPortSysTickHandler 의 우선순위를 설정
        • prvSetupTimerInterrupt : xPortSysTickHandler 구동을 위한 설정
        • uxCriticalNesting : 스케쥴링의 활성 혹은 비활성화를 위한 nesting 변수 (초기값 0)
        • vPortStartFirstTask의 구동 (스택주소 로딩, 전역 인터럽트 활성화 등의 Pumping 작업을 함)
      • vPortEndScheduler - Schedule한 후 처리작업 (Cortex M3에서는 필요없는 작업)
      • vPortYieldFromISR - 강제적으로 context 전환을 이루도록 함
      • vPortEnterCritical - 인터럽트를 비 활성화 시키고, uxCriticalNesting값을 증가 시킴
      • vPortExitCritical - 인터럽트를 활성화 시키고 uxCriticalNesting값을 감소 시킴

      2011년 4월 6일 수요일

      LPC17xx를 위한 개발 환경 구성하기

      * Java Runtime Environment (Eclipse 를 구동하기 위해서 필요함)

       버전이 1.6.0_01이상인지 확인하자
      # jave -version

      버전이 낮은 경우 Java Runtime Environment (JRE) 를 다시 설치하자

      * CodeSourcery Toolchain

       codesoucery.com에 가서 해당 컴퓨터의 시스템에 알맞은 toolchain을 내려받아 설치하자
      기본적으로 설치되는 경로는 C:/Program Files/CodeSourcery/Sourcery G++ Lite 로 되어 있는지 확인하자. 그렇지 않을 경우 해당경로를 기억하여 앞으로 설명할 경로를 변경해서 적용하도록하는 것을 염두해두자.

      * C/C++ Eclipse IDE

       Eclipse IDE for C/C++ Deverlopers라는 다운로드 항목을 선택하여 내려받고 설치하자.

      * Zylin CDT plugin for Eclipse (Eclipse를 통해서 디버깅을 하기위한 plugin)

      Eclipse를 통해서 보드와 통신해가면서 디버깅을 수행하기 위해서 필요한 플러그인이다.
      내려받은 Eclipse버전에 따라서 Zylin CDT 플러그인이 없을 경우도 있다.

      Eclipse의 Help 메뉴 밑에 버전에 따라 다르겠지만 install New Software라는 항목을 선택하자.


      "Available Software Sites"라는 문장을 선택하자.


      위의 그림과 같이 선택된 4개의 사이트가 추가 되었는지 확인하고 없다면 추가하도록 하자.
      그럼 다시 install New Software 다이얼로그 화면으로 되돌아 가서 Work with라고 이름 붙여진 Edit Box에서 --All Available Sites--라는 항목을 선택하고, 사용가능한 Software 항목들이 나열되는 것을 살펴 볼 수 있다.


      다음은 현재 설치된 플러그인 항목들이다.


      zylin CDT를 설치하기 위해서 Eclipse Update 주소를 http://www.zylin.com/zylincdt 로 변경해야한다. 바뀐것 같다.

      * Wiggler 환경 설치하기 (JTAG을 통한 하드웨어 디비깅 장비)

      Wiggler라는 프린터 포트에 연결하는 초기의 하드웨어 디버깅 장비를 사용하기 위한 환경설정이다. 요즘은 프린터 포트가 없는 컴퓨터가 많기 때문에 불필요하게 느껴질 수 있지만, 많은 부분이 다른 디버깅 장비 사용에 필요한 부분과 동일하기 때문에 도움이 될 것이다.

      OpenOCD 최신버전을 내려받자.

      http://openocd.berlios.de/web/ 사이트에 가면 최신 버전의 OpenOCD에 대한 정보를 얻을 수있다. 그리고 사이트의 우측면에 보면 Getting OpenOCD라는 항목, Repository라는 항목을 참고하면 리눅스 시스템의 경우 GIT를 통해 최신버전을 내려 받을 수 있다.

       Windows 시스템의 경우는 다음 사이트에 가면 친절하게 컴파일해서 올려놓은 것을 내려받을 수 있다. http://www.freddiechopin.info/ > Download > Software > OpenOCD 의 경로로 선택하여 들어가면 최신 OpenOCD를 내려받을 수 있다. 그 이외의 arm을 가지고 개발할 때 유용하게 사용할 수 있는 다른 툴들도 내려받을 수 있다.

       Wiggler를 사용하기 위해선 드라이버가 필요하다. OpenOCD가 설치된 디렉토리 밑의 drivers\giveio.zip\install_giveio.bat를 실행하여 Wiggler에 해당하는 드라이버를 설치하자. 참고로 USB 방식을 사용하는 다른 디버거의 경우 libusb-win32_ft2232_driver-100223.zip 드라이버 파일을 설치하자. 리눅스의 경우는 드라이버설치를 따로 해줄 필요는 없다.

      디버거를 사용하기 위한 다른 설정들은 Eclipse 환경설정에서 좀더 자세히 다루도록 하자.

      * Flash Magic (ISP를 통해서 Flash를 쓰고 읽을 수 있는 프로그램)

      FlashMagic은 NXP사에 제조하는 모든 MCU를 ISP방식으로 프로그래밍할 수 있도록 해주는 프로그램이다. LPC17xx의 경우 uart 0번 채널을 통해서 이러한 기능을 사용할 수 있다. 이 기능은 P2[10]/EINT0/NMI 핀을 GND로 묶어 주면 사용할 수 있다. 하지만 주의해야 할 것은 GND에 묶어 두면 계속 ISP 모드로 대기상태가 되기때문에 mcu를 동작시켜주기 위해서 Pull up을 넣어 주어야 한다. 결로은 프로그래밍시 GND로 묶어 주고 프로그램을 실행 시켜 볼때는  pull up을 해주어야 한다. 보통 보드에서 jumper로 연결되어 있어서 jumper를 뽑았다가 끼웠다를 반복하면 된다.

      http://www.flashmagictool.com/

      flashmagic 기능에 시리얼 포트에서 하드웨어 흐름제어에 사용하는 핀을 리셋과 P2[10]/EINT0/NMI핀에 연결하여 jumper를 사용하지 않고도 편리하게 프로그래밍과 실행을 한번에 수행할 수 있다. 간단한 회로는 다음고 같다. (olimex사의 lpc1766회로에서 따왔음을 밝힌다.)


      그리고 두핀의 시차와 세세한 조절은 flashmagic에서 할 수 있다. 편리함을 위해서 약간의 시행착오는 감수 하셔야 할 것입니다.



      * lpc17xx.cmsis.driver.library 설정

      lpc17xx mcu를 사용하기 위해 필요한 기본적인 c언어 환경, startup 코드, 내부 기능을 사용하기 위한 드라이버 코드, 그리고 예제 코드등 담고 있기 때문에 앞으로 하고자 하는 모든 작업은 이 라이브러리를 사용할 수 있다는 전제 하에서 출발한다. 해당 파일은 nxp 홈페이지의 lpc17xx에 해당하는 support 섹션에서 찾아 볼 수 있다.

      http://ics.nxp.com/support/documents/microcontrollers/?scope=LPC1768

      이 라이브러리 환경을 설정하는 것은 많이 까다로운데 앞으로 차근차근히 하나씩 알아 보도록하자.

      * Eclipse에서 프로젝트 생성하기

      우선 작업할 디렉토리는 변의상 D:\workspace\LPC1768 로 한다.


      그럼 해당 디렉토리에 프로젝트 파일이 없다면 Welcome 화면이 뜰것이고 그럼 workbench 화면으로 전환하자. 그리고 C/C++ 모드로 상용하기 위해서 Window -> Open Perspective -> Other ...를 선택하고 그 곳에서 C/C++로 선택하자.


      새로운 프로젝트를 File -> New  -> Project ...을 통해서 다음과 같이 생성하자.


      그리고 Apps라는 이름의 프로젝트를 생성하자.




      C Project 타입으로 변경하자.


      다음과 같이 C Project 타입의 Apps 프로젝트가 생성된 것을 Project Explore에서 확인 할 수 있다.


      그리고 내려받은 lpc17xx.cmsis.driver.library.zip 파일을 다음 경로에 압축해제시키자.

      D:\workspace\LPC1768\LPC1700CMSIS_26Jan2011

      버전 관리를 위해서 "_26Jan2011"은 임의로 추가하였다.
      그럼 library를 생성한 프로젝트에 적용시키기 위해서 Project Explore 탭에서 Apps 프로젝트를 선택하고 오른쪽 버튼 메뉴에서 Import ... 메뉴를 선택하자.


      내려받은 library 파일 모음으로부터 프로젝트의 내용을 복사하기 위해서 다음과 같이 설정하자.


      원본이 있는 디렉토리를 설정하고 모든 파일을 선택하도록 하자.


      그럼 다음과 같은 구조의 Apps 프로젝트가 생성된다.


      Apps 프로젝트의 절대경로를 설정하는 부분인 .\makesection\makeconfig 파일의 PROJ_ROOT 부분과 설치된 CodeSourcery의 버전에 따라서 다음과 같이 수정하자. 여기서 사용한 gcc의 버전은 4.4.1이다.

      ==================================================================================

      ############################################################
      #
      # Note:
      # Add path of "tools" directory (in this folder)
      # to the HEAD of SYSTEM PATH variable
      #
      ############################################################

      #PROJ_ROOT =C:/nxpdrv/LPC1700CMSIS
      PROJ_ROOT =D:/workspace/LPC1768/Apps
      CMCORE_TYPE =CM3
      DEVICE =LPC17xx
      MANUFACTURE =NXP
      TOOL =gnu
      DEBUG_MODE =1



      GNU_INSTALL_ROOT =C:/Program Files/CodeSourcery/Sourcery G++ Lite
      #GNU_VERSION =4.3.3
      GNU_VERSION =4.4.1
      IAR_INSTALL_ROOT =C:/Program Files/IAR Systems/Embedded Workbench 5.0 Kickstart
      KEIL_INSTALL_ROOT =C:/Keil

      ==================================================================================


      외부 Toolchain와 makesection밑의 Tools의 경로인  %PATH%;C:\Program Files\CodeSourcery\Sourcery G++ Lite\bin;D:\workspace\LPC1768\Application\makesection\tools
      를 프로젝트의 Environment에 추가하자.


      프로젝트의 루트에 있는 Makefile은 전적으로 CMSIS  library 를 사용할 수 있는 *.lib파일을 생성하도록 초점이 맞추어져 있다. 그래서 all로 되어 있는 Build 변수 값을 libs로 바꾸자.


      그리고 parser도 다음과 같이 선택하자.


      이와 같이 설정되면 CMSIS library 파일이 생성된다.


      외부 프로그램을 사용할 수 있도록 해주는 External Tool영역을 설정하자. 이 부분은  FlashMagic와 Serial Termninal 프로그램을 실행할 수 있도록 해주는 설정이다.

      Flashmagic 툴 설정하기

      Run -> External Tools -> External Tools Configuration ...의 순서로 선택하자.



      그리고 Run 메뉴 밑에 해당항목을 추가하기 위해서 External Tool 항목을 체크하자.


      Serial Terminal

      Serial Terminal도 위와 마찬가지로 실행파일의 위치와 작업 디렉토리, 그리고 External Tool항목에 노출시키도록 설정해 두면 된다.


      * 디버깅 스크립트 작성하기