홍영기
@guileschool
수강생
3,430
수강평
247
강의 평점
4.7
인하대학교 공과대학에서 전자공학 학사 학위를 받았으며 임베디드 시스템용 소프트웨어 개발자로써 수년간의 경력을 쌓았습니다. 임베디드 시스템 및 프로그래밍을 위한 전문 강사로도 활동 중입니다. 아이폰 3GS 등장과 같은 시기에 맥(북)에 입문하였고, 그때부터 맥(북) 자동화에 관심을 갖게 되었습니다. '맥(북)에서 사용할 수 있는 시리 리모트', '키보드마에스트로를 이용한 구글번역기' 같은 오픈 소스를 깃허브(https://github.com/guileschool) 에 두고 개발 및 유지보수하고 있습니다. 오픈 소스 하드웨어 '비글본블랙' 에도 많은 관심을 가지고 있습니다. 맥(북) 자동화를 이용하여 생산성을 높일 수 있는 컴퓨터를 사용하는 모든 분야에 관심을 가지고 있고, 이를 필요로 하는 사람들을 돕고 있습니다.
강의 요청 및 기타 문의사항은 guileschool@gmail.com으로 보내주세요 :)
강의
수강평
- FreeRTOS 프로그래밍
게시글
질문&답변
만약에 포팅을 할때 1년에 한번 잡는 치명적인 문제를 해결하는 코드가 들어갔다고 가정하면
안녕하세요, yoonkoo 님!포팅의 유용함은 검증된 소스를 많은 노력없이? 내가 원하는 기기에서 실행시킬 수 있다는 데 있다고 생각합니다. 버그는 2가지 유형이 있을 것인데, 포팅하기 이전부터 이미 내재된 버그와 포팅하면서 실수로 들어간 버그가 있겠죠. 전자의 경우는 이 자리에서 논할 필요가 없을 것 같고, 후자의 경우만 생각하면 되겠습니다. 짧게 말씀드리자면 모든 분야가 그렇듯, 포팅을 수행하는 사람의 스킬에 따라 포팅 과정상에서 없던 버그도 생길 수 있는 것으로 보시면 될 것 같네요.그리고, 이로 인해서 발생된 오류는 일반적인 소프트웨어의 버그에 준해서 생각하시면 될 것 같아요.1년에 한 번 나타나는 버그를 사후에 기다리는 건 신뢰성이 중요한 시스템에선 허용되지 않아요. 그래서 FreeRTOS의 스택 오버플로우 감지, Watchdog, 정적 분석 도구 같은 사전 검증 수단을 포팅 직후부터 함께 적용하는 습관을 들이는 게 중요합니다.
- 0
- 2
- 43
질문&답변
STM32 포팅할 때 STM32 Project가 없음
안녕하세요. PJlee 님!네^^ 1.0.2 버젼으로 해보시고 거기서도 동일한 문제가 보이거나 혹 어떤 이슈가 있다면 여기 다시 글 남겨주시면 제가 팔로우업 하겠습니다. 감사합니다. :)
- 0
- 2
- 96
질문&답변
FreeRTOS 멀티코어 지원안됨?
안녕하세요, PJlee님! 강의를 열심히 들어주셔서 감사합니다.좋은 내용을 찾아봐 주셨네요! 말씀하신 내용이 맞습니다. FreeRTOS는 2022년 V10.5.0 버전부터 SMP를 공식 지원하기 시작하면서 멀티코어 환경에서도 사용할 수 있게 되었습니다.다만, 제가 해당 강의를 준비하던 시점에는 아직 공식 지원 이전이었기 때문에 단점으로 소개드렸던 점, 참고해 주시면 감사하겠습니다. 아쉽게도 현재는 개인적인 사정으로 강의 내용을 바로 업데이트해 드리기가 어려운 상황입니다. 넓은 양해 부탁드리며, 앞으로도 궁금한 점이 생기면 편하게 질문해 주세요!
- 0
- 2
- 67
질문&답변
59회차 학습 미작동
수강에 불편을 드려 대단히 죄송합니다.말씀하신 영상(59회) 재생 오류는 인프런측에 문의를 해놓은 상태입니다.답변이 오는데로 상황 공유드리겠습니다.
- 0
- 2
- 53
질문&답변
[소스코드 분석-configUSE_TIME_SLICING] TASK1,2의 우선순위가 동일할 때, configUSE_TIME_SLICING값 변경에 따른 출력 변화
안녕하세요. 이준형님!아마도 우선순위를 동일하게 주고 테스트하신 것 같네요. 맞나요?"누가 먼저 CPU를 잡느냐"는 항상 Task1으로 동일하고, "누가 먼저 a/b를 출력하느냐"는 각 태스크가 시작할 때 시간이 많이 소요될 수 있는 printf의 수량과 tick 타이밍이 언제 발생하느냐에 따라 달라집니다.다시 말하면, 논리적으로는 비슷한 형태의 태스크 함수가 주어져 있고 Task1이 먼저 생성되니 'a'를 먼저 출력할 것이라 생각하기 쉽지만, tick이 발생하는 시점과 선행하는 printf 출력 시간이 합쳐져서 'b'가 먼저 출력되는 구조가 만들어질 수 있습니다.아래와 같이 시나리오를 그려보았습니다. 참고해보세요.## TIME_SLICING = 1 인 경우Task1 시작 -> 시작 메시지 printf 실행 중...Tick Interrupt 발생!TIME_SLICING=1이므로 같은 우선순위 태스크 체크 -> Task2 있음 -> 전환!Task2 실행 -> 시작 메시지 출력 시작이후 tick마다 Task1 Task2 교대결과적으로 Task2가 while문의 'b'를 Task1보다 먼저 찍게 되는 상황 발생## TIME_SLICING = 0 인 경우Task1 시작 -> 시작 메시지 printf 실행 중...Tick Interrupt 발생!TIME_SLICING=0이므로 같은 우선순위 체크 코드 실행 안 됨 -> 전환 없음!Task1 계속 실행 -> while문 진입 -> "aaaaaaa..."Task2는 yield나 block 없이는 실행 기회 없음정리하면, 질문자님께서 관찰한 "TIME_SLICING 값에 따라 먼저 출력되는 문자가 다르다"는 현상은 CPU 선점 순서가 바뀐 게 아니라, tick 발생 시점과 시작 코드 실행 시간의 조합으로 인해 while문 진입 순서가 달라진 것입니다.
- 0
- 2
- 67
질문&답변
DMA 관련한 강의도 제작해주실 수 있으신가요 ?
안녕하세요. yilee님!강의 재밌게 잘 보고 계시나요?DMA 강의에 대해 문의 주셨는데요, 아쉽게도 이번 강의 내용에서는 다루지 않습니다.FREERTOS 도 마찬가지고요.임베디드 시스템에서 고성능 처리를 위해서 중요한 기능인 DMA 에 대해서 다음 강의에서 다뤄볼게요.좋은 의견 감사합니다. 즐거운 하루되시고요 ^^
- 0
- 1
- 77
질문&답변
포팅 부탁드립니다. <NUCLEO-G071RB>
안녕하세요. jykim3님!포팅 자료를 참고해주세요https://inf.run/9vCpB
- 0
- 2
- 59
질문&답변
재진입가능여부에 관한 질문
안녕하세요. 박상우님!아래와 같이 사용하시면 void swap(int x, int y) 은 재진입에 대응할 수 있는 함수로서의 기능을 잘 수행해줍니다.// 태스크 1int a = 10, b = 20;swap(&a, &b); // temp1은 태스크1의 스택// 태스크 2 (동시 실행)int c = 30, d = 40;swap(&c, &d); // temp2는 태스크2의 스택하지만, 아래와 같은 사용 예시에서는 재진입이 안된다는 점 양지하시기 바랍니다.이건 swap 함수가 재진입 불가능해서가 아니라, 호출자가 같은 데이터에 동시 접근했기 때문입니다.// 태스크 1swap(&shared_x, &shared_y);// 태스크 2 (동시 실행)swap(&shared_x, &shared_y);- 끝 -
- 1
- 1
- 59
질문&답변
01_TASKMAN프로젝트 디버깅 모드 실패
안녕하세요. 학습자님!STM32CubeIDE 최신 버전에서 GCC 컴파일러가 업데이트되면서 발생하는 문제가 의심되어 chatGPT 에 확인한 결과 예상대로 그 문제가 맞았습니다.__FILENAME__ 매크로가 더 이상 기본 제공되지 않습니다.__FILE_NAME__ 을 사용하시면 되겠습니다. 아래 내용 참고해주세요.컴파일러 옵션으로 매크로 정의 (가장 깔끔)1. 프로젝트 우클릭 → Properties2. C/C++ Build → Settings → Tool Settings3. MCU GCC Compiler → Preprocessor4. Defined symbols (-D) 에 추가:```FILENAME=__FILE_NAME__```
- 1
- 2
- 67
질문&답변
그러면 malloc/free가 아닌 동적할당자를 써서 메모리를 할당했기떄문에
안녕하세요. 박상우님!필요하다면 main 함수 시작 직후 c runtime heap 영역에 malloc 이나 new 로 큰 메모리 블럭을 할당하시고 그 영역을 bss 에 할당하고 있는 것처럼 freertos 용 동적 메모리 풀을 선언하여 사용하실 수 있습니다. // FreeRTOSConfig.h #define configAPPLICATION_ALLOCATED_HEAP 1 #define configTOTAL_HEAP_SIZE (100 * 1024) // main.c uint8_t *ucHeap; // extern으로 선언된 ucHeap을 위해 int main(void) { // C 런타임 heap에서 할당 ucHeap = (uint8_t*)malloc(configTOTAL_HEAP_SIZE); if (ucHeap == NULL) { // 할당 실패 처리 while(1); } // 이제 FreeRTOS는 malloc된 영역을 ucHeap으로 사용 xTaskCreate(...); vTaskStartScheduler(); return 0; }
- 1
- 2
- 63






