사용자 환경에서 PlaatformIO 사용

PlaatformIO


PlaatformIO는 VScode와 Clion 등의 확장 기능과 독립된 CLI로 활용할 수 있는 교차 개발 환경군으로IDE와 상관없이 다양한 삽입식 프레임워크의 다운로드, 설정, 이용이 간단합니다. Arduiino와mbed 등 주요 환경 (기판의 정의와 프레임워크 교차 컴파일러) 은 기본적으로 지원됩니다.
이런 PlaatformIO 중에서도 (시스템을 구축한 이상) PlaatformIO가 상상할 수 없는 환경을 사용할 수 있다.

예시적 환경

  • TI제 LaunchPad 평가판 EK-MT 4C 123GXL
  • 어느 정도의 환경 정의가 있었지만 확장된 형식으로 이루어졌다
  • TivaWare(HAL: 하드웨어 추상화 라이브러리)의 고유 버전
  • 이 문장에 포함되지 않은 내용

  • PlaatformIO에서 지원하지 않는 새로운 종류의 CPU를 사용할 경우: 구축 스크립트 등 지식 재사용 가능
  • 기존 프레임워크(mbed) 등을 사용할 때: 다른 글에 쓰기
  • 맞춤형 환경을 만들자.


    이제 만드는 거.

  • 대상 기판의 정의: 동작 주파수와 CPU 종류를 나타낸다
  • 구축 스크립트: 사용자 정의 라이브러리 (HAL 등) 를 읽어야 합니다. 이번에는 extra_scripts 로 읽은 것입니다
  • platformio.ini: PlaatformIO의 프로젝트 설정에서 구축 스크립트 지정
  • 부팅 코드: 0x00호에 설정된 인터럽트 탐지기 테이블과 하드웨어 초기화 코드
  • 포함

    기판 정의의 제작


    공식 문서: Custom Embedded Boards에 따라 제작되었습니다.
    PlateformIO의 프로젝트 디렉토리 아래에서 작성boards/(基板名).json합니다.
    여기에 정의해야 할 값은 CPU 구조와 프레임워크에 따라 정해진 것이고 문서화되지 않은 경우도 있기 때문에 공식 GiitHub 중의 창고를 확인하는 것이 좋다.
    이번 경우platform-titiva. 창고 자체에 정의된 JSON이 몇 개 있으므로 참고하거나 구축 스크립트builder/ 이하를 확인하십시오.
    {
        "build": {
            "core": "tivac",
            "cpu": "cortex-m4",
            "f_cpu": "80000000L",
            "mcu": "lptm4c1230c3pm",
            "variant": "EK-TM4C123GXL"
        },
        "debug": {
            "svd_path": "TM4C1230C3PM.svd",
            "tools": {
                "ti-icdi": {
                    "onboard": true,
                    "server": {
                        "arguments": [
                            "-s",
                            "$PACKAGE_DIR/scripts",
                            "-f",
                            "board/ti_ek-tm4c123gxl.cfg"
                        ],
                        "executable": "bin/openocd",
                        "package": "tool-openocd"
                    }
                }
            }
        },
        "frameworks": [],
        "name": "EK-TM4C123GXL",
        "upload": {
            "maximum_ram_size": 32768,
            "maximum_size": 262144
        },
        "url": "http://www.ti.com/ww/en/launchpad/launchpads-connected-ek-tm4c123gxl.html",
        "vendor": "TI"
    }
    
    build 아래에 판의 CPU 종류와 주파수를 정의했습니다. 프레임을 사용하지 않을 때 구축 스크립트에서 f_cpu,cpu만 참조합니다.debug 다음은 디버깅에 대한 설정입니다. svd_path는 CPU 내의 메모리 구조 등이 저장된 파일입니다. 파일 자체는 아까 창고에 저장됩니다. tools는 디버깅 도구를 지정했습니다. 이번에는 일반적인 OpenOCD를 사용하는 설정입니다. 여기 설정은,방금 창고 구축 스크립트에서 몇 개를 사용한 것 외에 PlaatformIO 내부에서도 사용되고 있습니다.frameworks 사용 가능한 프레임을 일람표string[]로 정의했는데 이번에는 독자적인 HAL만 사용하기 때문에 지정하지 않습니다.upload RAM 및 ROM의 최대 값을 정의합니다.

    스크립트 작성


    PlaatformIO에서는 Python을 기반으로 한 구축 시스템 SCons 을 사용합니다. 지정한 구축 시스템의 구축 스크립트 형식으로 개입할 수 있기 때문에 HAL을 읽었습니다.
    이번에는 이런 각본을 사용했다.
    from os.path import isdir, join
    Import("env")
    
    
    TIVAWARE_DIR = join(env['PROJECT_DIR'], "../../../../ti/TivaWare_C_Series-1.0") # HAL directory
    assert isdir(TIVAWARE_DIR)
    
    env.Append(
        CPPDEFINES=[
            ("PART_TM4C123GH6PM", ""), # define for HAL
            ("PART_TM4C123GE6PM", ""),
            ("TARGET_IS_BLIZZARD_RB1", ""),
            ("gcc", ""),
        ],
    
        CCFLAGS=[
            "-mfloat-abi=hard",
            "-mfpu=fpv4-sp-d16",
            "-mabi=aapcs",
            "--param", "max-inline-insns-single=500",
            "-nostdlib"
        ],
    
        LINKFLAGS=[
            "-Wl,--entry=ResetISR",
            "-Wl,--check-sections",
            "-Wl,--gc-sections",
            "-Wl,--unresolved-symbols=report-all",
            "-Wl,--warn-common",
            "-Wl,--warn-section-align",
            "-Wl,-Tscripts/linker.ld", # linker script
            "-mfloat-abi=hard",
            "-mfpu=fpv4-sp-d16",
            "-fsingle-precision-constant"
        ],
        LIBS=["libc", "driverlib"],
        CPPPATH=[
            TIVAWARE_DIR,
            join(TIVAWARE_DIR, "inc"),
            join(TIVAWARE_DIR, "driverlib"),
            join(TIVAWARE_DIR, "utils"),
        ],
        LIBSOURCE_DIRS=[
            join(TIVAWARE_DIR, "driverlib")
        ]
    )
    
    libs = []
    libs.append(
        env.BuildLibrary(
            join("$BUILD_DIR", "driverlib"), # library destination
            join(TIVAWARE_DIR, "driverlib"))) # library source
    
    env.Prepend(LIBS=libs)
    
    Import("env")는 파이톤의 import문이 아니라 PlateformIO 고유의 것이다.
  • env: C++의 define 일람
  • env.Append: C++ 컴파일러의 매개 변수
  • CPPDEFINES: 린카의 매개 변수. CCFLAGS에서 린카 스크립트가 지정되었다(후술).
  • LINKFLAGS: 컴파일러에 전달된 라이브러리의 일람-Wl,-Tscripts/linker.ld 파라미터 사용
  • LIBS: 디렉토리 포함
  • -l: 라이브러리 소스
    이곳의 변수는 Scons의Construction Variables 등에 표시됩니다.
  • CPPPATH는 HAL을 프로그램 라이브러리로 구축하는 지정입니다.
    이 함수는 PlaatformiO 혼자서 이루어진 것이다. platformio.py 등을 보면 Scons에 해당하는 LIBSOURCE_DIRS 을 알 수 있다.

    platformio.ini


    이 파일에는 대상의 기판, 구축 스크립트, 환경 이름이 ini 형식으로 기록되어 있습니다. 환경 이름은 platform-titiva 사용하기 때문에 env.BuildLibrary 로 지정됩니다.
    구축 스크립트도 여기서 지정합니다.
    이번에는 이렇게 됐어.
    [env:tm4c123gxlevk]
    platform = titiva
    board = tm4c123gxl
    extra_scripts = pre:scripts/build.py
    monitor_speed = 9600
    
    영역 이름StaticLibrary은 여러 사용 환경을 정의하는 데 사용됩니다.titivaenv:lptm4c1230c3pm 이하에서 제작된 JSON 파일이며, board에서 구축 전(pre)에서 구축 스크립트를 읽는다.boards/는 직렬 모니터의baudrate 지정입니다.

    부팅 코드


    이번에는HAL에 첨부된 example에서 빌려온 것으로 C 언어, 어셈블리 문서, 인터럽트 벡터표, 메인 프로그램 전의 초기화 코드를 포함한다

    린카 스크립트


    HAL이 첨부한 example에서 빌려온 것입니다. 어느 주소에서 코드를 설정했는지 표시하는 파일입니다.

    후기


    이외에도 mbed를 프레임워크로 사용하는 경우와 PlaatformIO의 라이브러리 시스템을 활용했다.

    좋은 웹페이지 즐겨찾기