[C++] 라즈베리파이 피코

c언어 예제에서는 printf로 출력을 했는데 c++의 cout으로 출력이 되는건지 궁금합니다. stdio와 iostream을 분리해서 속도를 높여도 출력이 되는건지 궁금합니다.

Pico는 uart0을 사용하여 USB 직렬을 통해 PC와 통신합니다. 또한 uart 장치(예: 블루투스 모듈)를 연결하려면 uart1을 사용해야 합니다. 더 많은 uart 장치를 연결하려면 Arduino의 softwareSerial을 구현해야 합니다(user_irq_claim 함수 및 irq_set_pending단, uart보다 빠르고 1:n 통신이 가능한 I2C 및 SPI 통신 프로토콜을 사용하는 것이 좋습니다.


#src/CMakeLits.txt

set(projname cout_test)

file(GLOB_RECURSE SRC_FILES CONFIGURE_DEPENDS
        ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp
)

add_executable(${projname} ${SRC_FILES})

# pull in common dependencies
target_link_libraries(${projname} pico_stdlib)

# create map/bin/hex file etc.
pico_add_extra_outputs(${projname})

# add url via pico_set_program_url
example_auto_set_url(${projname})

#printf 출력이 USB CDC(USB Serial)로 되도록함
pico_enable_stdio_usb(${projname} 1)
#printf 출력이 UART로 되지 않도록 함
pico_enable_stdio_uart(${projname} 0)

add_excuteable이 있는 CMakeLits.txt에서 pico_stdlib를 연결하고 pico_enable_stdio_~를 설정하는 것을 잊지 마십시오.

cmake_minimum_required(VERSION 3.12)

# Pull in SDK (must be before project)
set(BToolDIR $ENV{PICO_SDK_PATH}/../pico-examples)
include(${BToolDIR}/pico_sdk_import.cmake)

include(${BToolDIR}/pico_extras_import_optional.cmake)

project(pico_examples C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

if (PICO_SDK_VERSION_STRING VERSION_LESS "1.3.0")
    message(FATAL_ERROR "Raspberry Pi Pico SDK version 1.3.0 (or later) required. Your version is ${PICO_SDK_VERSION_STRING}")
endif()

set(PICO_EXAMPLES_PATH ${PROJECT_SOURCE_DIR})

# Initialize the SDK
pico_sdk_init()

include(${BToolDIR}/example_auto_set_url.cmake)

#빌드할 코드가 담긴 폴더 이름 입력
add_subdirectory(src)

add_compile_options(-Wall
        -Wno-format          # int != int32_t as far as the compiler is concerned because gcc has int32_t as long int
        -Wno-unused-function # we have some for the docs that aren't called
        -Wno-maybe-uninitialized
        )

간단한 예 – c 스타일

#include <stdio.h>
#include "pico/stdlib.h"

int main() {
    gpio_init(PICO_DEFAULT_LED_PIN);
    gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
    gpio_put(PICO_DEFAULT_LED_PIN, 1);

    stdio_init_all();

    while(1) {
        printf("Hello\n");
        sleep_ms(2000);
    }
    return 0;
}

stdio_init_all은 UART 또는 USB Serial로 출력하도록 printf를 구성하는 기능입니다.

이것을 사용하지 않는다면 pico_printf 함수를 사용해야 할 것 같습니다.

https://raspberrypi.github.io/pico-sdk-doxygen/group__pico__printf.html

라즈베리 파이 피코 SDK: pico_printf

Marco Paland([email protected]@[email protected]@mm)의 printf에 대한 간단한 교체

라즈베리파이.github.io

iostream – C++ 스타일

#include <iostream>
using std::cout;
using std::endl;

#include "pico/stdlib.h"

int main() {
    gpio_init(PICO_DEFAULT_LED_PIN);
    gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
    gpio_put(PICO_DEFAULT_LED_PIN, 1);

    stdio_init_all();

    while(1) {
        cout << "Hello" << endl;
        sleep_ms(2000);
    }
    return 0;
}

문제 없이 인쇄되는 것을 확인했습니다.

iostream – 비동기화

#include <iostream>
using std::cout;
using std::endl;

#include "pico/stdlib.h"

int main() {
    gpio_init(PICO_DEFAULT_LED_PIN);
    gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
    gpio_put(PICO_DEFAULT_LED_PIN, 1);

    std::ios_base::sync_with_stdio(false);
    stdio_init_all();

    while(1) {
        cout << "Hello" << endl;
        sleep_ms(2000);
    }
    return 0;
}

문제 없이 나옵니다. 이 경우 iostream은 동기화를 거치지 않고 자체 I/O 버퍼를 사용합니다. 속도가 획기적으로 향상됩니다. 그러나 prinf와 함께 사용하면

printf("printf");
cout << "cout" << endl;

그렇게 사용해도 cout이 먼저 출력될 수 있습니다.

그리고 다른 사람이 만든 라이브러리에서 printf를 사용하고 내가 cout을 주로 사용한다면 한번 테스트를 해봐야 알 수 있을 것이다. 함수 호출, 실행, 스택에 저장된 프로그레스를 불러오고 메인 뷰로 돌아가는 과정은 시간이 걸리기 때문에 이 경우 출력 순서가 뒤바뀌지 않을 확률이 높다. 그러나 짧은 인라인 함수라면 출력 순서를 충분히 뒤바꿀 수 있습니다.

비율?

115200은 Raspberry Pi Pico를 시작할 때 사용되었습니다.


그러나 이것은 문제없이 작동했습니다



아두이노 시리얼 모니터에서 아무 보드 이름을 선택하고 시리얼 포트를 열어 보레이트가 설정되었는지 확인하니 제대로 나오더군요. (아두이노에서는 이러면 안됩니다.) 컴퓨터와 직렬로 통신할 때 동기식 모드를 사용하거나 UART 레지스터를 사용하는 것 같지만 USB 프로토콜을 사용합니다.


그러나 UART 통신을 통해 다른 모듈/IC와 통신할 때는 전송 속도를 유지해야 합니다.