목록전체 글 (80)
total_activ
간단하게 stm32 보드를 활용해서 버튼에 따라 panel UI가 변경되는 미니 플젝을 진행했다. freeRTOS를 기반으로 3개의 task를 활용했다.사용자가 엑셀 버튼을 누르면 속도 게이지가 증가한다.버튼을 아무것도 안누르면 속도 게이지는 천천히 줄어든다.사용자가 브레이크 버튼을 누르면 속도 게이지는 가속도를 가지며 빠르게 줄어든다.신호등은 빨강, 노랑, 초록색을 번가라가면 켜진다.만일 빨강색 신호에 속도 게이지가 10 이상이면 DANGER DRIVING 문구를 띄운다.정상적으로 노랑색과 초록색 신호에 속도 게이지가 10 이상이라면 SFAE DRIVING 문구를 띄운다.최종 시연 영상 & TouchGFX 이미지 & .ioc 구성 Task에서 하는 일 (FREERTOS)task에서는 엑셀 버튼과 브레..
절대 우선순위1. taskENTER_CRITICAL2. 일반 인터럽트 (TICK, IRQ, ISR)3. 높은 우선순위 테스크4. 낮은 우선순위 ISRISR (인터럽트 핸들러함수)는 테스크 보다 먼저 실행된다. 그렇기에 ISR에는 무거운 작업을 진행하면 안된다. (ex. memcpy함수)따라서 IPC(xSemaphoreGive)을 활용해서 테스크에서 일을 수행하도록 구현해야한다. IPC 함수 예시는 아래와 같다.xSemaphoreGiveFromISR ()vTaskNotifyGiveFromISR ()xQueueSendFromISR()xMessageBufferSendFromISR() 실습 배경실제로 heavyCopyLoader함수에서 memset()을 진행하여 오랜 시간 소비되는 함수를 만들었다. Task1과..
vTaskDelay와 HAL_Delay 관계vTaskDelay와 HAL_Delay 함수가 헷갈려서 정리해본다.HAL_Delay함수는 호출한 함수나 태스크가 멈춰버리는 Blocking 상태로 만든다.하지만 vTaskDelay함수는 태스크를 대기시키고 다른 태스크 실행을 가능캐한다.이점에서 vTaskDelay함수는 RTOS에서 사용되는 함수이다. HAL_Delay()RTOS를 사용하지 않거나, 매우 간단한 지연이 필요할 때RTOS 태스크 외부(예: 초기화 코드)에서 잠시 멈춰야 할 때vTaskDelay()FreeRTOS 환경에서 멀티태스킹을 활용해 효율적으로 시간 지연을 구현할 때CPU 자원을 낭비하지 않고 다른 태스크와 병행 작업을 수행해야 할 때 간단하게 다시 설명하자면 vTaskDelay함수는 아래의..
vTaskDelay 함수는 Block상태로 빠지는 대표적인 함수이다.해당 함수는 아래 처럼 사용된다.void Task1( void *pvParameters ){ const char *pcTaskName = "Task1"; pvParameters = pvParameters; // for comipler warning /* Print out the name of this task. */ printf( "%s is running\r\n", pcTaskName ); while(1) { vTaskDelay (pdMS_TO_TICKS (1000)); printf("a"); fflush(stdout); // 문자 'a' 출력 task1timer++; }} 이 함수의 정의로 가보면 아래와 같다.void vTa..
동적 메모리 할당1. 동적 메모리 할당으로 테스크 생성시 TCB 및 스택 메모리 확보 방식FreeRTOS가 런타임에 메모리를 할당해서 테스크를 생성할 수 있도록 허용한 경우만 아래와 같은 과정을 지나간다.#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )xTaskCreate()를 통해 테스크 생성함이후 TCB를 Heap 공간에 만듦해당 할당 메모리는 .bss 섹션에 저장됨1.1 xTaskCreate()이 함수는 configSUPPORT_DYNAMIC_ALLOCATION == 1일 때만 존재한다.즉, FreeRTOS가 런타임에 메모리를 할당해서 테스크를 생성할 수 있도록 허용한 경우만 컴파일됨1.2 pvPortMalloc(). pxNewTCB = (TCB_t *) pvPortM..
태스크 생성 및 운용#define TASK_MAIN_PRIO 20 //숫자가 큰게 우선순위가 높음#define TASK_1_PRIO 10#define TASK_2_PRIO 9#define TASK_3_PRIO 8태스크의 우선순위는 숫자가 클수록 높다. 하지만, Contex-M에서는 우선순위 숫자가 작을 수록 높다. TaskHandle_t xHandleMain, xHandle1, xHandle2; void USER_THREADS( void ) //main 함수에 호출{ /* Create one of the two tasks. */ xTaskCreate( (TaskFunction_t)TaskMain, /* Pointer to the function that implements the task. *..
소프트웨어 개발자로서 설계에 필요한 단계 정확한 정의는 소프트웨어 디자인 과정에서 자주 발생하는 문제들에 대한 전형적인 해결잭이다.알고리즘과 혼동되서는 안된다. 알고리즘은 어떤 목표를 달성하기 위해 따라야 할 명확한 일련의 절차를 정의한다.하지만, 패턴은 해결책에 대한 더 상위 수준의 설명이다. 왜 패턴을 배워야 할까?일반적인 소프트웨어 문제에 대해 시도되고 검증된 해결책을 모은것이 디자인 패턴이다.그렇기 때문에 소프트웨어를 설계하는데 있어서 더 효율적으로 소통하는데 사용된다. 종류생성 패턴 : 기존 코드의 재활용과 유연성을 증가시키는 객체 생성 매터니즘들을 제공함구조 패턴 : 구조를 유연하고 효율적으로 유지하면서 객체와 클래스를 더 큰 구조로 조합하는 방법을 설명함행동 패턴 : 객체 간의 효과적인..
C#과 C++의 참조 의미 차이C#은 포인터가 없다.객체: 레퍼런스 타입. 레퍼런스 값 저장됨레퍼런스 객체의 주소 역활을 하는 난수모든 객체는 힙에 생성된다.C++과 유사한 구조를 C#일 가지고 있지만 참조의 의미가 다르다.C++에서 참조값은 주소값을 의미하지만, C#에서는 직접 주소에 접근하는 것이 위험하다고 해서 막혀있다.그래서 C#에서의 참조값은 객체의 참조값을 갖는 참조변수을 의미한다. 코드 예시말로만 설명하면 이해가 안되니 아래 예시를 들어보겠다.class Test{ public int A { set; get; } public int b; public Test(int a, int b) { this.A = a; //this: 현재 객체의 참조값을 갖는 참조변수 ..
잘못된 접근이 문제를 딱 봤을때 부모 트리를 사용해야 하나? 라는 생각이 들었다.merge를 하려면 최상위 부모만 변경해서 진행하면 편할것 같았다.근데 바로 적용이 안되었던거는 트리.. 알고리즘을 잘 사용하지 못하고 별로 안좋아하기 때문이다.결국, 병합한 것들을 모두 vector 변수에 저장하는 식으로 진행했다. 하지만, 어설픈 코드 구성은 결국 테스트 코드만 성공하는 결과를 초래했다. 올바른 접근Union Find 함수루트 노드값을 찾아내는 find함수두가지 집합을 합치는 union 함수이렇게 두가지 함수가 이번 문제에 활용되었다.근데 나에게 가장 헷갈렸던거는 노드를 접근하는 방식이 x,y인 것이다.하지만, 실제로 코드를 짜다 보니까 겁먹을 필요가 없었다. 기본적인 코드는 아래와 같다.int root..