2017-12-29 3 views
0

내 STM32F4 기반 보드에 FreeRTOS를 사용하고 있고, 이해하기 쉽고 적용하기 쉬운 대기열 및 세마포 작업 간의 통신에 대해 읽었습니다.STM32 - 다중 작업에서 입출력 읽기

그러나 문서에, 나는 예를 들어, 다른 작업에서 같은 메소드를 호출 할 안전한지에 대한 정보를 찾을 수 없습니다 :

void DefaultTask(void const * argument) 
{ 
    uint8_t pin = 10; 
    uint16_t analog = ADC_GetAnalog(pin); 
    uint32_t encoder = Encoder_GetCount(1); 
} 

void SecondTask(void const * argument) 
{ 
    uint8_t pin = 14; 
    uint16_t analog = ADC_GetAnalog(pin); 
    uint32_t encoder = Encoder_GetCount(2); 
} 

ADC_GetAnalog :

uint16_t ADC_GetAnalog(uint8_t PinNumber) 
{ 
    if((PinNumber >=1)&&(PinNumber<=18)) 
    { 
     return ADC_Pin[PinNumber].AnalogValue; 
    } 
    else 
     return 0; 
} 

I을 또한 내 시스템에 여러 엔코더가 있습니다 (htim #의 CNT 속성을 증가/감소시키는 인터럽트). ADC와 같은 줄에있는 read 메서드를 다른 작업에서도 호출합니다.

uint32_t Encoder_GetCount(uint8_t encoder_num) 
{ 
    volatile __IO uint32_t count = 0; 
    switch(encoder_num) 
    { 
    case 1: 
     count = htim1.Instance->CNT; 
     break; 
    case 2: 
     count = htim3.Instance->CNT; 
     break; 
    case 3: 
     count = htim5.Instance->CNT; 
     break; 
    default: 
     break; 
    } 

    return (uint32_t)count; 
} 

오늘 저는이 방법을 사용합니다.하지만 이것이 가장 안전한 (안전한) 방법인지 알고 싶습니다 !!

+0

재진입 성 또는 스레드 안전성의 개념은 본질적으로 기능이 재진입 성 여부를 묻는 것처럼 읽을 수있는 주제입니다. – rjp

답변

1

당신이 제공 한 것으로부터, 동시에 호출 할 수있는 함수는 쓰는 것이 아니라 쓰는 것을 읽는 것입니다. 그래서 당신은 잘 가게됩니다. 글을 쓰는 경우에도 로컬 변수라면 괜찮습니다. (각 태스크는 자신 만의 복사본을 가질 것입니다)

전역 변수를 쓸 때 또는 특정 주변 장치에 쓸 때 동기화에주의해야합니다. , 직렬 플래시 칩, 당신은 2 개의 작업이 동시에 그것을 사용하는 것을 원하지 않는다). 이를 처리하는 한 가지 방법은 단순히 세마포어/뮤텍스 (mutexes)를 사용하는 것인데, 가능하다면이 주변 장치에 대한 액세스 권한이있는 태스크를 1 개만 수행하는 것이 좋습니다. 유지 관리가 가능한 시스템의 핵심은 깨끗한 디자인입니다.

1

기능에 따라 다릅니다.

함수는 전역 변수를 변경하지 않으므로 다른 작업에서 전역 변수를 호출하는 것이 안전해야합니다.

예를 들어 전역 변수에 쓰는 함수가 있다면, 두 번째 호출은 첫 번째 호출에서 변경 한 내용을 덮어 씁니다. 버퍼가 데이터를 보내는 데 사용되는 경우 작업은 동일한 바이트를 보낼 수 있습니다 (타이밍에 따라 다름).

+0

좋아요! 나는이 공유 메소드에서 변수 만 읽으며, 다른 메소드를 써야하지만,이 경우에는 세마포어를 사용했다. –