Git X 모듈 기반의 내장형 개발 프로젝트 구조

15297 단어 gitembeddedxmodules
다른 어떤 개발과 마찬가지로 삽입식 개발은 일반적으로 공유 코드 구성 요소, 예를 들어 특정 하드웨어의 라이브러리에 의존한다.그러나 이 분야에서는 모듈화 프로젝트를 관리하는 실제 업계 기준이 없다.Git 저장소 수준에서 이를 구현하는 방법 중 하나를 설명합니다.우리는 삽입식 개발의 특정한 문제가 아니라 프로젝트 조직 주제에 주목할 것이다.

인프라 시설


예를 들어 STMicroelectronics 패널을 통해 LED를 깜박이는 간단한 프로그램을 만들 것입니다.나는 우리가 STM32F4DISCOVERYMCU가 있는 STM32F4 발견판을 가지고 있다고 생각한다.Debian 10.6을 사용하지만 다른 운영 체제의 경우 절차가 유사합니다.나는'stlink 도구'와'gcc arm none eabi'패키지를 설치했다.전자는 일련의 도구(특히'stflash')의 집합으로 디스커버리 보드와 협동하여 작업하는 데 사용된다(예를 들어'stflash'는 STLink 프로토콜을 사용하여 컴파일된 이진 파일을 MCU의 flash에 기록한다).후자는 일반적인 ARM 교차 컴파일러이다. 왜냐하면 ST32F407VGT6는 ARM Cortex M4를 바탕으로 하는 MCU이기 때문이다.
패키지가 설치되어 있지 않은 경우 지금 다음을 수행합니다.
 sudo apt install stlink-tools gcc-arm-none-eabi
STMicroelectronics는 ST32F407VGT6ST32F407VGT6에 표준 라이브러리를 제공합니다.그러나 우리는 그것을 사용하지 않고, MCU 데이터 테이블을 직접 사용하여 우리의 라이브러리를 개발한다.우리 자신의 라이브러리를 개발하는 또 다른 이유는 라이브러리와 메인 프로젝트를 함께 개발하고 다른 프로젝트에서 다시 사용할 수 있는 전형적인 장면을 보여주는 것이다.
비록 본문에서 우리는 단지 하나의 항목만 있지만, 우리는 다른 항목이 같은 라이브러리를 다시 사용하고 있다고 가정할 것이다.특히 라이브러리에 대한 복구와 업데이트도 이 항목에 포함되어야 한다.
우리는 코드가 Git에 저장되고 서버 측은 AtlassianSTSW-STM32065/Bitbucket Server을 사용한다고 가정했다.이것은 반드시 필요한 것은 아니지만, 우리에게 좋은 사용자 인터페이스를 줄 것이다.
## 프로젝트 구조 ##
우리의 프로젝트는 다음과 같은 주요 부분을 포함할 것이다.
  • 주요 프로젝트 원본 파일;
  • ST32F407VGT6 단편기를 지원하는 유니버설 라이브러리;
  • C 코드를 ARM 플랫폼에 필요한 파일과 컴파일러 옵션으로 교차 컴파일합니다.
  • 프로젝트를 교차 컴파일하려면 많은 특정한 컴파일러 옵션과 시작 및 링크 스크립트 파일을 사용해야 합니다.같은 MCU에 여러 개의 프로젝트가 있을 때, 프로젝트 간에 이 파일과 옵션을 공유하는 것은 의미가 있다.따라서 관련 파일을 컴파일하는 데 사용되는 일반적인 구성 요소가 있습니다.이 구성 요소를 "common"이라고 명명합니다.
    라이브러리를 "stm32"구성 요소로 명명할 것입니다.기본 항목의 이름이 [내장 예제]로 지정됩니다.
    Data Center

    첫걸음stm32 프로젝트 만들기


    Atlassian Bitbucket 서버/데이터 센터 UI를 사용하여 "stm32"Git Repository 만들기

    그런 다음 복제합니다.
    git clone http://example.org/scm/ee/stm32.git stm32/
    cd stm32/
    
    CMakeLists를 생성합니다.txt 파일이 있는 곳:
    cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
    project(stm32)
    
    add_library(stm32 pin.c gpio.c util.c)
    target_include_directories(stm32 PUBLIC .)
    
    이것은 아주 좋은 예다.txt 파일은 세 개의 C 파일을 포함하는 항목을 설명하고, 그 항목을 포함하는 모든 항목을 알려 줍니다.include 디렉터리는 프로젝트 루트 디렉터리에 있습니다.따라서 파일 구조는 다음과 같습니다.
    ├── CMakeLists.txt
    ├── gpio.c
    ├── gpio.h
    ├── pin.c
    ├── pin.h
    ├── util.c
    └── util.h
    
    이 파일과 해당 제목을 만듭니다.

  • util.h - 특수 위치를 설정하고 얻는 편리한 기능을 포함한다.

  • util.cgpio.h - ST32F407VGT6 데이터 테이블 GPIO 규범의 무미건조하고 직접적인 실현을 포함한다.

  • gpio.cpin.h - 그것들은hw_pin_PD12의pin명칭과hw_pin_led_green의편의등가물을 정의했다.
  • 예를 들어 STM32F4에서 MCU의 PD12가 녹색 LED에 연결하는 이유는 다음과 같습니다.
    #define hw_pin_led_green hw_pin_PD12
    
    현재 변경 사항을 "stm32"라이브러리에 추가, 제출, 전송합니다.
    git add *.c
    git add *.h
    git add CMakeLists.txt
    git commit -m "Initial."
    git push origin master
    
    pin.c
    내가 지적하고자 하는 것은 이 라이브러리는 자체적으로 포함되어 있기 때문에 사람들은 심지어 그것을 컴파일할 수 있다. (그러나 아직까지는 교차 컴파일할 수 없다.)
    mkdir build
    cd build
    cmake ..
    make
    
    만일 모든 것이 순조롭다면 이것은 좋은 지표이다. 비록 이것은 매우 쓸모없는 속성이지만 우리의 목표 플랫폼은 ARM이기 때문이다.

    두 번째 단계.공통 항목 작성


    이 프로젝트는 프로젝트 간에 공유된 공공 설정을 포함합니다.또한 프로젝트 CMakeLists가 사용할 수 있도록 개별Git 저장소에 쉽게 넣고 프로젝트 CMakeLists에 삽입할 수 있습니다.txt.
    Atlassian Bitbucket 서버/데이터 센터를 사용하여 "공공"저장소 만들기

    새로 만든 저장소를 복제합니다.
    git clone http://example.org/scm/ee/common.git common/
    cd common/
    
    지금 생성vars.cmake:
    set(CMAKE_SYSTEM_NAME      Generic)
    set(CMAKE_SYSTEM_VERSION   1)
    set(CMAKE_SYSTEM_PROCESSOR arm-eabi)
    
    set(CMAKE_C_COMPILER       arm-none-eabi-gcc)
    set(CMAKE_CXX_COMPILER     arm-none-eabi-g++)
    set(CMAKE_ASM_COMPILER     arm-none-eabi-as)
    set(CMAKE_OBJCOPY          arm-none-eabi-objcopy)
    set(CMAKE_OBJDUMP          arm-none-eabi-objdump)
    
    set(CMAKE_C_FLAGS "-mthumb -mcpu=cortex-m4 -fno-builtin -Wall -Wno-pointer-to-int-cast -std=gnu99 -fdata-sections -ffunction-sections" CACHE INTERNAL "c compiler flags")
    set(CMAKE_CXX_FLAGS "-mthumb -mcpu=cortex-m4 -fno-builtin -Wall -Wno-pointer-to-int-cast -fdata-sections -ffunction-sections" CACHE INTERNAL "cxx compiler flags")
    set(CMAKE_ASM_FLAGS "-mthumb -mcpu=cortex-m4" CACHE INTERNAL "asm compiler flags")
    
    set(CMAKE_EXE_LINKER_FLAGS "-nostartfiles -Wl,--gc-sections -mthumb -mcpu=cortex-m4" CACHE INTERNAL "exe link flags")
    set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS CACHE INTERNAL "reset default flags")
    
    set(STM32_STLINK_CLI_EXECUTABLE "st-flash")
    
    이 파일은 ARM을 타겟 플랫폼으로 하여 소스 코드를 상호 컴파일하는 데 필요한 다양한 변수를 정의합니다.이것은 컴파일러 로고와 2진 파일을 MCU에 쓰기 위한 'stflash' 유틸리티의 경로를 설정합니다.stm32f407vg_flash.ld, startup_stm32f40xx.sstm32f4xx.h 파일도 추가됩니다.나는 이곳에서 그것들을 인용하지는 않지만, 그것들은 상당히 표준적이며, 의법 반도체 회사에서 발행한다.
    따라서 저장소 컨텐트는 다음과 같습니다.
    ├── startup_stm32f40xx.s
    ├── stm32f407vg_flash.ld
    ├── stm32f4xx.h
    └── vars.cmake
    
    변경 내용 커밋 및 푸시:
    git add vars.cmake stm32f4xx.h startup_stm32f40xx.s stm32f407vg_flash.ld
    git commit -m "Initial."
    git push origin master
    

    세 번째.프로젝트 저장소


    이제 주 프로젝트 저장소를 만듭니다.저장소에는 다음과 같은 구조가 있습니다.
    ├── CMakeLists.txt
    ├── common   <--- here common.git will be inserted
    ├── libs
    │   └── stm32  <--- here stm32.git will be inserted
    │
    └── src
        └── main.c
    
    따라서 Atlassian Bitbucket 서버/데이터 센터 UI를 사용하여 빈 Git 저장소를 만듭니다.

    복제:
    git clone http://example.org/scm/ee/embedded-example.git embedded-example/
    cd embedded-example/
    
    생성CMakeLists.txt:
    cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
    include(common/vars.cmake)
    project(embedded-example)
    enable_language(C ASM)
    
    add_subdirectory(libs/stm32)
    
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -T${CMAKE_SOURCE_DIR}/common/stm32f407vg_flash.ld")
    
    add_executable(${PROJECT_NAME}.elf
        ${CMAKE_SOURCE_DIR}/common/startup_stm32f40xx.s
        ${CMAKE_SOURCE_DIR}/src/main.c)
    target_include_directories(${PROJECT_NAME}.elf PRIVATE stm32)
    target_link_libraries(${PROJECT_NAME}.elf PRIVATE stm32)
    
    add_custom_target(${PROJECT_NAME}.hex DEPENDS ${PROJECT_NAME}.elf COMMAND ${CMAKE_OBJCOPY} -Oihex ${PROJECT_NAME}.elf ${PROJECT_NAME}.hex)
    add_custom_target(${PROJECT_NAME}.bin DEPENDS ${PROJECT_NAME}.elf COMMAND ${CMAKE_OBJCOPY} -Obinary ${PROJECT_NAME}.elf ${PROJECT_NAME}.bin)
    set(STLINK_CMD ${STM32_STLINK_CLI_EXECUTABLE} write ${CMAKE_BINARY_DIR}/${PROJECT_NAME}.bin 0x8000000)
    add_custom_target(write-flash DEPENDS ${PROJECT_NAME}.bin COMMAND ${STLINK_CMD})
    
    호출include()에 앞서 공공 변수가 있는 파일에 대한 호출project()이 중요하다. 그렇지 않으면 CMake는 무한 순환에 빠질 것이다(이런 이상한 행동을 Cmake bug로 간주할 것이다).마찬가지로 "공공"에 넣을 링크 스크립트를 지정합니다.git의 항목입니다.add_subdirectory()전화는 도서관을 포함한다.우리는 거기에 몇 개의 도서관을 세울 수 있다.라이브러리는 libs/ 디렉토리에 삽입됩니다.
    마지막 줄에 make write-flash 목표를 만듭니다. 이 목표는 MCU에 바이너리 파일을 만들 뿐만 아니라 STLink 프로토콜을 사용하여 플래시 메모리에 기록합니다.${STM32_STLINK_CLI_EXECUTABLE} 일반 항목에 정의됩니다.
    지금 src/main.c 파일을 만듭니다.
    #include <gpio.h>
    
    hw_pin_t leds[] = {
      hw_pin_led_red,
      hw_pin_led_green,
      hw_pin_led_blue,
    //  hw_pin_led_orange
    };
    
    int leds_count = sizeof(leds) / sizeof(hw_pin_t);
    
    void SystemInit() {
    }
    
    int main() {
      hw_gpio_configure(hw_pin_led_blue, hw_gpio_mode_output_pull_push, hw_gpio_speed_2mhz, hw_gpio_alternate_function_none);
      hw_gpio_configure(hw_pin_led_green, hw_gpio_mode_output_pull_push, hw_gpio_speed_2mhz, hw_gpio_alternate_function_none);
      hw_gpio_configure(hw_pin_led_orange, hw_gpio_mode_output_pull_push, hw_gpio_speed_2mhz, hw_gpio_alternate_function_none);
      hw_gpio_configure(hw_pin_led_red, hw_gpio_mode_output_pull_push, hw_gpio_speed_2mhz, hw_gpio_alternate_function_none);
    
      int current_led = 0;
    
      while (TRUE) {  
        hw_gpio_set(leds[current_led], FALSE);
        current_led = (current_led + 1) % leds_count;
        hw_gpio_set(leds[current_led], TRUE);
    
        int delay = 1000000;
        while (delay--) {
        }
      }
    }
    
    이 파일은 매우 간단하다. LED와 관련된 트랙터를 초기화하고 빨간색, 녹색, 파란색으로 트랙터를 깜박인다.기본 STM32F4DISCOVERY 펌웨어가 모든 4개의 LED에 깜박이기 때문에, 우리는 그것과 다르기를 희망합니다.
    변경 내용 커밋 및 푸시:
    git add src/main.c
    git add CMakeLists.txt
    git commit -m "Initial."
    git push origin master
    

    네 번째 단계.범용을 삽입합니다.git'와'stm32.git 저장소 간 삽입식 예.지트


    한 저장소를 다른 저장소에 삽입하려면 Git 를 사용합니다.Atlassian Bitbucket 서버/데이터 센터에는 사용자 인터페이스가 뛰어난 전용 애플리케이션이 있습니다.다른 Git 서버의 경우: Git X-Modules 명령줄 도구를 사용합니다.
    Atlassian Bitbucket 서버/데이터 센터에 X-Modules 애플리케이션이 설치되어 있는지 확인합니다.없으면 Administration | Find new apps | Search the [Marketplace](https://marketplace.atlassian.com/apps/1223696/git-x-modules-for-bitbucket-server)에 액세스하여 Bitbucket 서버/데이터 센터 사용자 인터페이스에서 "X-Modules"를 입력합니다.
    X-Modules
    내장 예제 Git 저장소 페이지로 이동합니다.Git X-Modules 애플리케이션을 설치한 후 왼쪽 패널에 Git X-Modules 버튼을 클릭합니다.

    그런 다음 모듈 추가를 클릭하여 첫 번째 모듈을 추가합니다("common.git"로 설정).

    공용 저장소 및 마스터 분기를 선택합니다.이 저장소 경로가 범용인지 확인합니다.저장소가 삽입될 경로입니다.

    모듈 추가를 클릭합니다.변경 사항을 적용하지 않은 상태에서 다시 '모듈 추가' 를 누르면 'stm32' 저장소를 모듈로 추가합니다.

    [stm32] 저장소와 [마스터] 분기를 선택합니다.

    This Repository Path: 이(가) "libs/stm32"인지 확인합니다. 이것은 "stm32"의 삽입 경로입니다.git의 저장소입니다.

    모듈 추가를 클릭하고 변경 사항을 적용합니다.

    이제 저장소가 X 모듈로 삽입됩니다.

    이것은'보통'을 의미한다.git'와'stm32.git와 embedded example의 상응하는 디렉터리 (각각 "common"과 "libs/stm32") 가 동기화됩니다.지트?
    내장 예제에서 변경 내용을 가져오려면 다음과 같이 하십시오.
    cd embedded-example/
    git pull --rebase
    
    이제 모든 항목이 포함됩니다.
    ├── CMakeLists.txt
    ├── common
    │   ├── startup_stm32f40xx.s
    │   ├── stm32f407vg_flash.ld
    │   ├── stm32f4xx.h
    │   └── vars.cmake
    ├── libs
    │   └── stm32
    │       ├── CMakeLists.txt
    │       ├── gpio.c
    │       ├── gpio.h
    │       ├── pin.c
    │       ├── pin.h
    │       ├── util.c
    │       └── util.h
    └── src
        └── main.c
    
    항목이 컴파일되었는지 확인하려면 다음과 같이 하십시오.
    mkdir build
    cd build
    cmake ..
    make
    make write-flash
    

    런타임make write-flash에는 STM32F4DISCOVERY 보드를 연결해야 합니다.만약 네가 하는 모든 일이 정확하다면, 너는 세 개의 LED가 깜빡이는 것을 볼 수 있을 것이다.
    이 저장소 구조는 ST32F407VGT6 기반 프로젝트에 사용할 수 있으며 해당 위치에 "common"과 "stm32"를 삽입하면 됩니다.또한 디렉터리는 삽입된 저장소와 양방향으로 동기화되기 때문에 프로젝트 저장소에서 결과를 변경하고, 결과를 보고, 'stm32' 를 수정할 수 있습니다.

    좋은 웹페이지 즐겨찾기