Don't think! Just do it!

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

전체 글 213

[nRF52840 + Zephyr] #13. Inter-task communication B

2023.06.03 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #11. Inter-task communication A [nRF52840 + Zephyr] #11. Inter-task communication A 제퍼의 경우에는 Inter-thread communication이 되겠구만! 지원되는 기능을 살펴보니.... 너무 많아;;;😢 👇👇 우린 너무 많은 거 안좋아 하니까 줄여보자구. 난 보통 다른 RTOS에서는 Flag와 Queue를 많이 engschool.tistory.com 이전에서 FIFO랑 Queue만 해봤는데 이번에는 Message Queue랑, Mail box를 해볼거야. 그럼 Message Queue부터 시작! Message Queue의 기본적인 동작..

[nRF52840 + Zephyr] #12. Synchronization

Synchronization에 대해서는 Semaphore와 Mutex, 이 두 개만 알면 끝! 😆😆😆😆 Semaphore부터 보자구. //런타임에서는 이렇게 struct k_sem my_sem; k_sem_init(&my_sem, 0, 1); //컴파일타임에서는 이렇게 K_SEM_DEFINE(my_sem, 0, 1);//가용 세마포어 1, 초기 가용 세마포어 0 //or K_SEM_DEFINE(my_sem, 1, 1);//가용 세마포어 1, 초기 가용 세마포어 1 👆 위처럼 선언하고 👇 아래처럼 사용하지. //Semaphore take k_sem_take(&my_sem, K_MSEC(50)) //Semaphore give k_sem_give(&my_sem); 약간 설명하자면 가용한 세마포어가 있으면 k..

[nRF52840 + Zephyr] #11. Inter-task communication A

제퍼의 경우에는 Inter-thread communication이 되겠구만! 지원되는 기능을 살펴보니.... 너무 많아;;;😢 👇👇 우린 너무 많은 거 안좋아 하니까 줄여보자구. 난 보통 다른 RTOS에서는 Flag와 Queue를 많이 사용했어. 그런데 제퍼에는 Flag가 없네? 진짜 없는 건가? ;;; 간편하게 사용하기 좋았는데 ㅠㅠ Queue는 당연히 있는데... FIFO가 Queue 아닌가?;; LIFO가 Stack이고? Pipe는 freertos에서 stream같고 ㅎㅎ 주절 주절 말이 많았는데 Stack은 잘 안쓰니까 우선 Queue부터 해보자구 👇👇 #include #include K_QUEUE_DEFINE(my_queue); typedef struct queueItem{ uint8_t ite..

[nRF52840 + Zephyr] #10. Time management

제퍼도 다른 os와 마찬가지로 여러가지 시간관련 기능을 제공하고 있어. 대표적인게 os timer야. 임베디드 프로젝트를 하다보면 타이머를 자주 사용하게 되는데. 타이머를 하드웨어로 돌리려면 하드웨어 사용 설정하고, 주기 설정하고, 인터럽트 작성해주고, 혹시나 동작이 길면 global flag 설정해주고 인터럽트 외주에서 나머지 동작을 처리해야 하지. ㅋㅋㅋ 🤪😜😝😅😢😣😖😞😤😳 데이터시트도 읽어야 하는 건 덤이고 말이야 ㅋ 아주 그냥 대환장 파티. 그에 비해 os timer는 사용 설정하고 쓰면 끝이야. 매우 간편! 👇👇 struct k_timer my_timer; extern void my_expiry_function(struct k_timer *timer_id); k_timer_init(&my_tim..

[nRF52840 + Zephyr] #9. Memory Management

제퍼에서 제공하는 Memory management 기능은 여러 가지가 있는데 k_malloc()과 k_free() 정도만 알면 될 것 같아. 사실 나머지는 어디서 어떻게 사용되는지 잘 모르겠거든 ㅋㅋ 누가 잘 아는 사람은 알려주고 ㅎ k_malloc()과 k_free()는 특별한 사용법이 없어. malloc, free랑 동일하거든. 다만 prj.conf 에서 CONFIG_HEAP_MEM_POOL_SIZE(힙 크기) 만 설정해주면 끝이야. 굳이 이상한 예제를 만들어보자면 👇👇 //prj.conf CONFIG_HEAP_MEM_POOL_SIZE=1024 //main.c void main(void) { for(;;){ k_sleep(K_MSEC(1000)); uint8_t* ptr = k_malloc(100);..

[nRF52840 + Zephyr] #8. Thread Management

제퍼에서 thread를 굳이 나누자면 System thread와 User thread로 나눌 수 있어. System thread는 main()을 호출하는 main thread와 idle thread 그리고 workqueue thread 정도가 될거고 User thread는 말 그대로 유저가 만드는 거겠지. Thread 뭐 별거 없어. 생성하고 종료하고 멈추고 재시작하고 이게 전부. 이왕 이면 예제를 통해 살펴보는게 좋겠지? #define MY_STACK_SIZE 500 #define MY_PRIORITY 5 extern void my_entry_point(void *, void *, void *); K_THREAD_STACK_DEFINE(my_stack_area, MY_STACK_SIZE); struct..

STM32CubeMX 와치독 디버그 옵션

그냥 이건 간단한 팁 같은건데 ㅎㅎ ST-LINK로 디버깅할 때 와치독이 Enable되어 있으면 Break point 걸릴 때 리셋이 되버리잖아. 엄청 짜증나지. 그래서 보통 와치독을 Disable하거나 주석처리하고 디버그를 했었어. 그래서 실수도 많이 하고 말이지. Debug configuration에서 이걸 해결해주는 옵션이 있더라고;;; 이거 체크해주면 와치독이 활성화된 상태에서도 break point를 걸면서 디버깅을 할 수가 있어 ㅋ 나만 몰랐나? ㅎㅎㅎ 해피 코딩~ 아디오스!

[nRF52840 + Zephyr] #7. RTOS 기본

RTOS 가 기본적으로 제공하는 기능들이 있어. 5가지 정도인데 아래를 보자구! 👇👇👇 1. Task(Thread) management 2. Memory management 3. Time management 4. Inter-task communication 5. Synchronization 모든 rtos가 비슷해. (제퍼도 마찬가지!) 그래서 난 새로운 rtos를 사용해야 할 때 항상 저 기준을 적용하고 있어. Thread management Thread 혹은 Task의 생성, 삭제, 정지, 재시작 등등의 기능을 말하는 거야. Delay로 많이 사용하는 sleep도 thread의 기능 중에 하나임. 제퍼에서도 k_thread_create, k_thread_suspend 와 같은 함수들이 있어. Memor..

[nRF52840 + Zephyr] #6. KConfig

Kconfig는 제퍼 소프트웨어 설정에 관련이 있어. gpio나 usb처럼 하드웨어 드라이버를 로드하기 위한 설정도 포함되지. 👇👇 CONFIG_GPIO=y CONFIG_UART=y ... 이런 식으로 하드웨어 사용 설정을 하는데 하드웨어 peripharal 종류만큼 있겠지? 자주 사용되는 것들은 외우면 좋을 듯 하고. 소프트웨어 설정 쪽을 살펴보면 두 가지 정도가 있을 거 같아. 1. 제퍼 os 시스템 소프트웨어 2. 그 외 서브 시스템 소프트웨어 등등 k_malloc, k_free를 위한 heap 사이즈 설정이나 logging 모듈 사용처럼 os과 밀접하게 관련이 있는 것들이 있고 👇👇👇 modbus 처럼 어플리케이션 종류에 따라 사용이 결정되는 subsystem software가 있지. 👇👇 CON..

콧속 물혹 비수술 완치기? (완치된 줄 착각! ㅋㅋㅋ)

엔지니어 블로그에서 왠 코 물혹이냐고? ㅋ 이건 널리 알려야 함 ㅋㅋㅋ 결론부터 말하자면 의사가 당장 수술해야 한다고 했던 콧속 물혹이 없어졌어!! ㅋㅋ 한 4년 전쯤 와이프가 내 코골이를 못참겠는지 코 관련 한의원을 데려갔어. 그날 침을 콧속에 엄청 맞았는데;;; 그 뒤로 갑자기 냄새가 안나는 거야. 그래서 4년동안 냄새없이 살았어 ㅋㅋㅋ 그러다가 점점 숨쉬는 게 힘들어져서 이비인후과를 갔더니 콧속에 물혹이 엄청 심각해서 당장 수술을 해야 한다고 하는거야 ㅠㅜ 걍 봐도 심해보이긴 하네;; 그런데 회복에 1주일 정도 걸리고, 비행기도 타면 안된다 해서 출장 때문에 미루고 있었어. - 광고 절대 아니다 - 그런데 그 사이에 와이즐리에서 홍삼이 엄청 싸길래 시켜 먹고 있었거든 ㅋㅋ 한 3개월 먹으니까 갑자기..

기타/주절주절 2023.05.19

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

2023.05.11 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #4. 디바이스 트리 2 [nRF52840 + Zephyr] #4. 디바이스 트리 22023.05.09 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #3. 디바이스 트리 1 [nRF52840 + Zephyr] #3. 디바이스 트리 12023.05.03 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #2. 뭘 공부해야 하나? [nRF52840 engschool.tistory.com이제 실제로 디바이스 트리를 수정해보자구! printk를 사용해서 hello world!! ㅋㅋ 기본 blink app에서 printk("hello world"); 달..

[nRF52840 + Zephyr] #4. 디바이스 트리 2

2023.05.09 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #3. 디바이스 트리 1 [nRF52840 + Zephyr] #3. 디바이스 트리 12023.05.03 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #2. 뭘 공부해야 하나? [nRF52840 + Zephyr] #2. 뭘 공부해야 하나? 2023.05.01 - [임베디드 소프트웨어/Zephyr] - Nordic NRF52840 + Zephyr 개발 환경 구축 Nordicengschool.tistory.com지난 번에는 blinky 앱에서 디바이스 트리의 노드를 어떻게 사용했는지 간단하게 살펴봤어. 이 번에는 조금더 들어가서 unit address하고 chosen에 대해 알아..

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

2023.05.03 - [임베디드 소프트웨어/Zephyr] - [nRF52840 + Zephyr] #2. 뭘 공부해야 하나? [nRF52840 + Zephyr] #2. 뭘 공부해야 하나? 2023.05.01 - [임베디드 소프트웨어/Zephyr] - Nordic NRF52840 + Zephyr 개발 환경 구축 Nordic NRF52840 + Zephyr 개발 환경 구축nrf52840을 위한 zephyr 개발 환경은 vscode에 nrf extension을 설치하는 방식으로 구축해. 공 engschool.tistory.com 저번 글에서 적어도 3가지는 공부해야 한다고 그랬어. Device tree, Kconfig, zephyr kernel api. 이 중에 하드웨어 설정과 관련이 있는 Device tre..

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

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 #include #define SLEEP_TIME_MS..

[nRF52840 + Zephyr] #1. 개발 환경 구축

nrf52840을 위한 zephyr 개발 환경은 vscode에 nrf extension을 설치하는 방식으로 구축해. 공식 가이드에도 이렇게 나와있으니까 고민하지 말고 따라왓! 우선 아래 링크에서 nrf connect for desktop을 설치! 👇 https://www.nordicsemi.com/Products/Development-tools/nRF-Connect-for-Desktop/Download#infotabs nRF connect for desktop을 통해서 SDK 등 여러가지 nrf 개발용 소프트웨어를 설치할 수 있어. 그리고 아래 링크에서 nrf command line tool 설치! 👇👇 이건 segger debugger 디바이스 드라이버가 들어 있는 놈이지! 플래시에 프로그램하거나 디버..

[nRF52840 + Zephyr] #0. nRF and Zephyr

NRF52 시리즈 중 하나를 아주 잠깐 사용해본 적이 있었어. 어렴풋한 기억으로는 RTOS에 블루투스 스택이 돌아가고 있었고 유저는 유저 테스크에서만 한정적으로 코드를 만졌던 것 같아 -_-;;; 스쳐지나가는 프로젝트라 깊게도 안팠지만 그 때 뭐랄까.. 좀 나쁜 이미지가 있었는데 이제와서 다시 보니~ 제퍼 OS를 사용하고 있네? 오~ 👇👇👇 사용자 환경도 매우 잘 구축되어 있고 예제도 충실해! 이것 저것 테스트해보고 나니 이건 뭐 신세계! 개인적으로 느끼기에 지금까지 경험해본 임베디드 개발 환경 중 단연 으뜸이라 말할 수 있었어. 블루투스 쪽 스택이나 프로파일도 알아야 하고 제퍼 RTOS도 해야 한다는 압박감이 있는 걸 알지만 nordic에서 제공하는 vscode extension을 설치하고 예제를 몇개..

CCMRAM 사용하기

지금 사용하고 있는 stm32f407vg는 sram 192kbytes 있다고 되어 있는데; 빌드해보니 CCMRAM이라는 녀석은 사용을 안하고 있더라고? 이건 집에서 만든 예제라 사용량이 여유가 있지만 내가 하고 있는 실제 프로젝트에서 RAM 사용량이 90퍼센트가 넘어가다보니 CCMRAM 사용을 안할 수가 없더라고 ㅎㅎㅎ 램 사용량 빨간거 보면 참 ㅋㅋㅋ 생각이 많아지지 ㅋㅋ 저 영역을 사용하는 건 간단해. 👇 __attribute__((section(".ccmram"))) uint8_t buffer[1024]; 앞에다가 __attribute__((section(".ccmram"))) 이라고 선언만 해주면 됨! 그런데 귀찮으니까 메크로 고고! #define CCMRAM __attribute__((secti..

[Flutter] Iphone Local ip address

앱에서 자기 자신의 ip주소를 얻어와야 할 때가 있는데.. 음... 특히 내 경우는 hot spot 상태에서 폰의 local ip address하고 폰에 붙은 클라이언트들의 ip address를 읽어와야 할 때가 있어. 그래서 해봤음. 기본적인 아이디어는 이래. dart:io 패키지-> NetworkInterface class를 통해 hot spot용 네트워크 인터페이스가 생겼는지 확인하고 로컬 ip 주소를 가져왓! dart_ping 패키지를 사용해 2 ~ 255 까지 핑 쐇! 핑이 있는 ip 주소 업데이트! 참 쉽죠? main을 보자! 👇 import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:ither..

Flutter 2023.03.20

STM32F407 32.768kHz Crystal 선정 및 디버그!

보통은 큰 문제가 안돼. STM의 경우 메인 크리스탈은 any vendor(아무거나) 8Mhz 때려박고 대강 18pf 정도 달아주면 왠만하면 동작해. 그런데 문제는 32.768khz.... RTC용 크리스탈인데;;; 이게 잘 동작하지 않는 경우를 한 두어번 본거 같은데 첫 번째는 십수년 전, stm32f103! 이 때는 해결을 못해서 클럭을 내부 RC 오실레이터로 몰래 변경하고 모른척 했어 ㅋㅋㅋㅋ stm32 mcu의 clock tree에서 RTC 부분을 보면 mux를 통해서 3개 중 하나를 RTC 클럭 소스로 사용할 수 있게 되어 있어. HSE를 분주한 것, 외부 32.768khz 클럭 소스, 내부 32khz RC 오실레이터 이렇게 3 가지인데 RTC를 사용하는 Application에서는 1초를 정확하..

LWIP TCP Send가 느릴 때

stm32f407vg + freeRTOS 조합에서 lwip을 사용하고 있는데 TCP Send에 문제가 있는 걸 발견했어! 왠지 모르게 조금 늦게 패킷이 나가더라구. 작은 패킷은 상관없는데 약간 큰 패킷(그래봐야 1024bytes)은 바로 나갈 때도 있고 딜레이가 생길 때도 있고 하더라구. 한.. 0.5초에 한번쯤 나가는 느낌? 해결하려고 신나게 뻘짓을 했지. TCP Thread 스택 크기가 작아서 그런가? 하고 TCP_THREAD_STACKSIZE도 4096 Word(16k)까지 늘려봐도 안되고~ 혹시 Segment 때문에 그런가 싶어서 536 bytes -> 1460 bytes(최대값)으로도 변경하고 Sender buffer도 이빠이 늘려보고~ Queue length도 늘리고~ 해봐도 증상에 변함이 없..

반응형