inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

FreeRTOS 프로그래밍

FreeRTOS Tick 관련 문의 드립니다.

878

ilyong kang

작성한 질문수 1

1

안녕하세요

막 FreeRTOS에 입문한 사람입니다.

궁금한게 있어 질문드리려 합니다.

FreeRTOS의 최대 TICK 주파수가 1kHz로 알고 있습니다.

그렇다면 1kHz 이상의 주파수로 측정을 해야 한다면 어떻게 해야할까요?

예를 들어 adc를 통해 아날로그 신호를 5kHz로 측정해야하는 경우는 어떻게 해야되는지요?

FreeRTOS는 꼭 써야 하는 상황입니다.

제 생각으로는 TICK 속도를 높이는 방법과 별도의 5kHz의 타이머 인터럽트를 사용하여 while(1) 루프 내에 프로그래밍하는 방법 두가지를 생각해보았습니다.

[질문1] TICK 속도를 높이는게 가능하다면 어떠한 방법으로 설정하는지 궁금합니다.

[질문2] 아니면 아래와 같이 while(1)루프 내에 별도의 5kHz 주파수의 타이머 인터럽트를 사용하여 프로그래밍 했을때 FreeRTOS의 태스크에는 영향이 없을지... 고려해야할게 있을지? 궁금합니다.

int main(void)
{
  while(1)
  {
    // 5kHz timer interrupt start
    if(tick_5khz_flag == 1)
    {
      tick_5khz_flag = 0;
      val = adc_read();
    }
    // 5kHz timer interrupt End
  }
}

FreeRTOS 임베디드 운영체제

답변 1

0

홍영기

안녕하세요. ilyong kang님!

아래와 같은 방법을 이용하면 CPU 성능을 조금만 사용하고도 원하는 작업을 수행하게 할수 있습니다.

DMA 방식으로 ADC 을 운용하고, 타이머 인터럽트 콜백(5KHZ 주기)으로 ADC_DATA 읽어낸다.


이 아이디어는 FreeRTOS 환경에서도 구현 가능합니다.
샘플 소스를 전달합니다. 직접 해보시고, 제 도움이 필요하면 다시 말씀해주세요.

image

image

/**
  * @brief  Regular conversion complete callback in non blocking mode
  * @param  hadc pointer to a ADC_HandleTypeDef structure that contains
  *         the configuration information for the specified ADC.
  * @retval None
  */
 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
 	uint32_t adcData;
 	float temperature;

 	// Check whether the call of this callback function is ADC1 CH10
 	if (hadc == &hadc1){
 		for(int i=0; i<sizeof(adcBuffer)/sizeof(adcBuffer[0])-1; i++){
		adcData = adcBuffer[i]; // read adc value
		temperature = Celcius * adcData; // adc data converted to celcius
		printf("current adcData(=%lu), celcius(=%.01fc)    \r", adcData, temperature);
	  //HAL_ADC_Start_DMA(hadc, adcBuffer, sizeof(adcBuffer)/sizeof(adcBuffer[0]));
 		}
 	}
}

 

그리고, TICK 주기를 변경하는 방법을 질문하셨는데 <FreeRTOSConfig.h> 의 configTICK_RATE_HZ 상수값을 변경하면 됩니다.

#define configTICK_RATE_HZ                       ((TickType_t)1000) 

 

0

ilyong kang

네~ 감사드립니다.

제가 드린 질문에 빠진 게 있었네요.

ADC는 SPI로 연결되는 외부의 전용 IC을 사용해야 하는 상황인데,

이 경우 선생님의 답변에 힌트를 얻는다면 SPI를 DMA로 운영하면 될 거 같습니다.

공부를 많이 해야겠습니다 ㅎㅎㅎ

만약에 포팅을 할때 1년에 한번 잡는 치명적인 문제를 해결하는 코드가 들어갔다고 가정하면

0

57

2

STM32 포팅할 때 STM32 Project가 없음

0

147

2

FreeRTOS 멀티코어 지원안됨?

0

82

2

[소스코드 분석-configUSE_TIME_SLICING] TASK1,2의 우선순위가 동일할 때, configUSE_TIME_SLICING값 변경에 따른 출력 변화

0

82

2

포팅 부탁드립니다!

0

57

1

포팅 부탁드립니다. <NUCLEO-G071RB>

0

64

2

상호배제 후 되지를 않아서 질문드립니다.

0

59

1

수료증 발급 기준 수정 요청

1

69

1

재진입가능여부에 관한 질문

1

66

1

01_TASKMAN프로젝트 디버깅 모드 실패

1

76

2

그러면 malloc/free가 아닌 동적할당자를 써서 메모리를 할당했기떄문에

1

69

2

실행순서

1

74

2

uart 전송중에는 스위칭이 금지되나요?

1

71

2

스택오버플로우 실습 중 stack size 설정 질문

0

79

2

포팅 원합니다.

2

75

2

코루틴 실습질문

1

99

2

TODO 2번 문제

1

140

4

10. 선점형 커널 그림 설명중 우선순위가 반대인 경우에도 Task B가 먼저 수행되나요?

1

79

2

디버거모드에 진입이 안됩니다.

0

175

2

prvExampleTaskHook 함수 호출 부분에 대해 문의드립니다.

0

119

2

보드 STM32H735IG와 강의 호환 여부 문의

1

151

3

[ L152RE ] 원샷 소프트타이머 실행 잘 되시나요?

1

157

2

Deferred Interrupt Processing 샘플 예제 문의 드립니다.

1

119

2

포팅 서비스 부탁드립니다

1

122

2