본문 바로가기

[ST_MICRO]/STM32F4

[STM32F4] FPU테스트 - Julia Set Fractal calculation TFT LCD 출력

[STM32F4] FPU테스트 - Julia Set Fractal calculation TFT LCD 출력

 

STM32F4 는 플로팅 포인트 연산을 하드웨어로 처리하는 FPU가 있다.

DSP도 아닌 저렴한 MCU에서 FPU를 사용할 수 있다는것은 상업용 MCU개발자에게 상당히 메리트 있는 소식이다.

 

우선 간단히 FPU의 성능을 테스트 해 보았다.

float function1(float number1, float number2)
{
    float temp1, temp2;
    temp1 = number1 + number2;
    temp2 = number1/temp1;
    return temp2;
}

 

 

STM32F4 를 이용하여 컴파일 해 보면 아래와 같이 플로팅 포인트 연산을 한 명령어에 처리하는것을 확인 할 수 있다.

      5          float function1(float number1, float number2)
      6          {
      7              float temp1, temp2;
      8              temp1 = number1 + number2;
      9              temp2 = number1/temp1;
     10              return temp2;
   \                     function1:
   \   00000000   70EE200A           VADD.F32 S1,S0,S1
   \   00000004   80EE200A           VDIV.F32 S0,S0,S1
   \   00000008   7047               BX       LR               ;; return
     11          }

 

 

 

FPU가 없는 STM32F103에서 동일한 코드를 컴파일 하면 플로팅 포인트 라이브러리 함수를 호출하는것을 확인 할 수 있다.

      9          float function1(float number1, float number2)
     10          {
   \                     function1:
   \   00000000   10B5               PUSH     {R4,LR}
   \   00000002   0446               MOV      R4,R0
   \   00000004   0846               MOV      R0,R1
     11              float temp1, temp2;
     12              temp1 = number1 + number2;
     13              temp2 = number1/temp1;
     14              return temp2;
   \   00000006   2146               MOV      R1,R4
   \   00000008   ........           BL       __aeabi_fadd
   \   0000000C   0146               MOV      R1,R0
   \   0000000E   2046               MOV      R0,R4
   \   00000010   BDE81040           POP      {R4,LR}
   \   00000014   ........           B.W      __aeabi_fdiv
     15          }

 

 

 

FPU를 사용하지 않았을때와 비교하면 17.9배 정도의 성능차이가 보인다고 한다.(실제 아래 동영상을 보면 10배 이상 차이나는것을 확인할 수가 있다.)

 

 

 

 

STM32F4 FPU테스트 소스코드

int main(void)
{
    float ret;
   
    Led1Init();
    Led1On();
  
    //Serial Init
    DebugInit(BAUD_115200);
    DebugPrint("STM32F4 FPU Program.\r\n");   
   
    ret = function1(5.1, 15.4);
    DebugPrint("result = %f.\r\n", ret);   
   
    while (1)
    {
        Led1On();
        Delay(100);
       
       
        Led1Off();
        Delay(100);
    }
}

 

 

 

STM32F4 FPU테스트 동영상

좀더 확실한 효과를 위해 STM32F405를 이용하여 Julia Set Fractal을 TFT LCD에 출력해 보았다. 400x240 화면에 한프레임씩 출력하도록 했는데 1프레임 출력 시간이 200ms 정도 된다. 상당히 빠르다.

(참고로 FPU가 없는 STM32F103으로 동일 코드 실행시 4000ms 정도 걸렸다. STM32F103은 메모리가 부족해서 화면출력을 반만 했는데도 오래 걸리는데 풀스크린으로 출력하면 훨씬 더 오래 걸린다.)

 

 

 

 

 

Julia Set Floating point 생성코드

void GenerateJulia_fpu(uint16_t size_x, uint16_t size_y, uint16_t offset_x, uint16_t offset_y, uint16_t zoom, uint8_t * buffer)
{
  float       tmp1, tmp2;
  float       num_real, num_img;
  float       rayon;

  uint8_t       i;
  uint16_t        x, y;

  for (y = 0; y < size_y; y++)
  {
    for (x = 0; x < size_x; x++)
    {
      num_real = y - offset_y;
      num_real = num_real / zoom;
      num_img = x - offset_x;
      num_img = num_img / zoom;
      i = 0;
      rayon = 0;
      while ((i < ITERATION - 1) && (rayon < 4))
      {
        tmp1 = num_real * num_real;
        tmp2 = num_img * num_img;
        num_img = 2 * num_real * num_img + IMG_CONSTANT;
        num_real = tmp1 - tmp2 + REAL_CONSTANT;
        rayon = tmp1 + tmp2;
        i++;
      }
      /* Store the value in the buffer */
      buffer[x+y*size_x] = i;
    }
  }
}  

반응형