[Zephyr] nRF52 Thread(쓰레드) 방법!!
Embeded/nRF522024. 11. 28. 13:33
반응형
메인함수에서 1초 간격으로 LED를 점등하고 쓰레드 함수에서 500ms 간격으로 LED를 점등하는 코드입니다
main() 함수에서 delay가 없을시 thread가 실행이 안되는 문제가 있던데 k_yield()로 점유시간을 양보하면 될 줄 알았는데 안되네요
이 부분은 좀 더 공부를 해봐야 겠습니다
#include <stdio.h>
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>
/* 1000 msec = 1 sec */
#define SLEEP_TIME_MS 1000
// 디바이스 트리에서 led0 노드를 가져옴
#define LED0_NODE DT_ALIAS(led0)
// 디바이스 트리에서 led1 노드를 가져옴
#define LED1_NODE DT_ALIAS(led1)
// 디바이스 트리에서 button 노드를 가져옴
#define BUTTON DT_ALIAS(button)
#define MY_STACK_SIZE 500
#define MY_PRIORITY 5
// 가져온 led 노드를 구주체로 초기화
static const struct gpio_dt_spec led0 = GPIO_DT_SPEC_GET(LED0_NODE, gpios);
// 가져온 led 노드를 구주체로 초기화
static const struct gpio_dt_spec led1 = GPIO_DT_SPEC_GET(LED1_NODE, gpios);
// 쓰레드 스택크기
#define MY_STACK_SIZE 512
// 쓰레드 우선순위
#define MY_PRIORITY 3
// 쓰레드 함수
void thread(void *, void *, void *){
int ret;
ret = gpio_pin_configure_dt(&led1,GPIO_OUTPUT);
while(1){
// 쓰레드 함수에서 500ms 간격으로 led 점등
gpio_pin_toggle_dt(&led1);
k_sleep(K_MSEC(500));
}
}
// 쓰레드 선언 및 시작, my_thread는 쓰레드 이름
K_THREAD_DEFINE(my_thread, MY_STACK_SIZE,
thread, NULL, NULL, NULL,
MY_PRIORITY, 0, 0);
int main(void)
{
int ret;
// gpio가 준비되었는지 확인
if (!gpio_is_ready_dt(&led0)) {
return 0;
}
// led 핀을 출력으로 설정
ret = gpio_pin_configure_dt(&led0, GPIO_OUTPUT_ACTIVE);
// 에러 처리가 필요할 경우 추가
// if (ret < 0) {
// return 0;
// }
while (1) {
// 메인 함수에서 1초 간격으로 led 점등
ret = gpio_pin_toggle_dt(&led0);
if (ret < 0) {
return 0;
}
k_msleep(SLEEP_TIME_MS);
}
return 0;
}
반응형
'Embeded > nRF52' 카테고리의 다른 글
[Zephyr] nRF52 Uart 송신, 수신 사용법!! (0) | 2024.11.29 |
---|---|
[Zephyr] nRF52 타이머(timer) 사용법!! (0) | 2024.11.28 |
[Zephyr] nRF52 GPIO 입력 제어(인터럽트)!! (0) | 2024.11.28 |
[Zephyr] nRF52 GPIO 입력 제어(폴링)!! (0) | 2024.11.28 |
[Zephyr] nRF52 GPIO 출력 제어!! (0) | 2024.11.28 |