Don't think! Just do it!

종합 IT 기술 정체성 카오스 블로그! 이... 이곳은 어디지?

임베디드 소프트웨어/Zephyr

[nRF52840 + Zephyr] #2. 뭘 공부해야 하나?

방피터 2023. 5. 3. 22:06

2023.05.01 - [임베디드 소프트웨어/Zephyr] - Nordic NRF52840 + Zephyr 개발 환경 구축

 

Nordic NRF52840 + Zephyr 개발 환경 구축

nrf52840을 위한 zephyr 개발 환경은 vscode에 nrf extension을 설치하는 방식으로 구축해. 공식 가이드에도 이렇게 나와있으니까 고민하지 말고 따라왓! 우선 아래 링크에서 nrf connect for desktop을 설치!👇

engschool.tistory.com

 
아래는 저번 시간에 보드에 올리고 테스트 했던 blinky app의 main.c 파일 내용이야.

👇👇

적당히 주석을 달아놨으니 당장 모르겠어도 한 번 주~욱 살펴보라굿.

#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>

#define SLEEP_TIME_MS   1000

/* The devicetree node identifier for the "led0" alias. */
/* "led0"라는 별칭을 위한 디바이스 트리 노드 식별자 */
#define LED0_NODE DT_ALIAS(led0)

/*
 * A build error on this line means your board is unsupported.
 * 여기에서 빌드에러가 나오면 니 보드를 지원하지 않는거임.
 * See the sample documentation for information on how to fix this.
 * 어떻게 고치는지는 샘플 문서 보세요~
 */
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);
//디바이스 트리 스팩 얻어오고

void main(void)
{
	int ret;

	if (!device_is_ready(led.port)) { //디바이스가 준비되었는지 확인.
		return;//main thread로 돌아갓!
	}

	ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);//led를 gpio output으로 설정
	if (ret < 0) {// 무언가 에러가 있으면
		return;//main thread로 돌아갓!
	}

	while (1) {// 자 영원히 돌자~
		ret = gpio_pin_toggle_dt(&led);//led를 토글하자
		if (ret < 0) {// 뭔가 에러가 있으면
			return; //while 끝 -> main thread로 돌아갓!
		}
		k_msleep(SLEEP_TIME_MS);// 1초 쉬자~
	}
}

그냥 보기에는 다른 mcu 코딩할 때와 비슷한데

사실 이 main은 일반적인 메인이라기 보다는 메인 main thread의 일부야.

main thread가 zephyr 커널을 초기화하고 나면 main()을 호출하게 되어 있어.

그런데 만약 main()이 없으면?

호출 안되는 거지 뭐 ㅎㅎ

그리고는 idle thread라고 부르는 아무것도 안하는 빈 thread가 돌고 있을거야.

main 함수 중간 중간에 조건이 안맞으면 return을 하기도 하는데

일반적인 임베디드 코딩에는 매우 이상한 동작이지만 zephyr에서는 그냥 일반 함수 하나가 끝난거지. ㅎㅎ

다들 Thread에 익숙해지도록 하자구 ㅋㅋ
 
어쨋든 조금 더 살펴보면 devicetree node라는 놈도 보이고

그걸 가지고 led0라는 gpio를 설정하고 1초마다 토글한다던지 하는 동작을 하고 있어.

나중에 더 자세히 공부하겠지만

k_msleep(SLEEP_TIME_MS);

요놈이 zephyr 커널에서 제공하는 시간 함수 중 하나야.

보통 앞에 "k_" 가 붙어 있는 함수들은 전부 zephyr 커널 함수라고 생각하면 돼. 
 
자 이제, 여기서 모르는 걸 공부하면 되겠네. 여기서 보이는 건 두 가지 정도잖아?
Device tree 하고
k_msleep과 같은 zephyr 커널 API
 

Device Tree

ACTIONS 탭 아래 있는 Devicetree를 클릭하면

위 그림처럼 nrf52840dk_nrf52840.dts라는 이름의 창이 열리는데

딱봐도 하드웨어 설정이라는 걸 한눈에 알 수 있지.
 
그런데 Device tree 아래 Kconfig라는 메뉴가 하나 더 있어.👇👇

Kconfig

요놈도 보면

devicetree info라던지,

board selection 이러던지

하는 항목들이 보여서 devicetree 서브셋인가? 하는 생각이 들지만 그건 아니고

커널 설정, 통신 모듈 설정, usb stack, ble stack 같은 소프트웨어를 설정하는 config 파일이야.
 
다시 정리해보자면 적어도 아래 3가지는 알아야 zephyr 펌웨어 코딩을 하겠지?
 
🤩 Device tree 👍
🤩 Kconfig 👍
🤩 zephyr 커널 api 👍
 
Device tree로 하드웨어 설정

Kconfig로 소프트웨어 설정

그리고 나서는 zephyr 커널 api로

Thread 생성도 하고 Queue, mutex, semaphore 같은 기능들 활용해서 application 코드를 짜는 거지 ㅇㅇ
 
이 3가지는 공부하는 게 좀 지루할 수 있지만 모르고 넘어가면 오히려 개발이 더 늦어질거야.

그러니까 배우고 넘어가자고! 다음 글부터! 안녕!

👋👋

 

2023.05.09 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #3. 디바이스 트리 1

 

[nRF52840 + Zephyr] #3. 디바이스 트리 1

2023.05.03 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #2. 뭘 공부해야 하나? [nRF52840 + Zephyr] #2. 뭘 공부해야 하나? 2023.05.01 - [임베디드 소프트웨어/Zephyr] - Nordic NRF52840 + Zephyr 개발 환경 구축 Nordic

engschool.tistory.com

 

반응형