예전에 제가 마이컴으로 10MBps 신호를 잡아서

CRC 처리하고 다 파싱해서 4us 안에

응답패킷(CRC 포함)을 만들어서 처리하는 프로젝트에 대해서 질문드린적이 있습니다.

다들 FPGA를 권하셨지만

(당연히 FPGA 사용이 맞는 프로젝트지요)

하지만!

이론적으로 가능하다는 결론을 내고 과감히 MCU 로 도전하였고 2달 고생해서 성공한 것으로 보입니다.

아래 신호는 10Mbps 신호를 파싱해서 3.46us 만에 정상 응답하는 결과물입니다.

현재는 HSI 로 처리해서 데이터를 놓치는 경우가 많습니다. HSE 로 해보니 데이터 유실 비율이 확연히 줄어들어서, 노이즈 처리 잘하고 좋은 오실레이터를 사용해서 보드를 제작하면 될 것으로 생각됩니다.

물론 100% 패킷을 보장해야 된다던지 특수한 오류 처리를 해야 된다던지 하는 조건에는 미달하지만

현재 정도라면 이 프로토콜에서는 양호한 수준이라 생각됩니다.

그동안 검토한 내용은 아래와 같습니다.

1. 통신 주파수에 맞는 최고 클럭 MCU 를 찾자.

2. 개발보드 구매후 실제 패킷을 아날라이저로 보고 프로토콜 사양서를 참조하여 파싱 알고리즘 작성 및 검증

3. 제일 느린 통신 속도에서부터 하나씩 검증.

4. HSE 와 HSI 통신 파싱 에러율 검토

5. 응답 속도를 최대한 빠르게 하기위하여 CRC 알고리즘 재작성 및 파싱 알고리즘 최적화

6. 그냥 패킷을 전체 받고 나중에 계산하는 것이 아니라 한비트씩 받으면서 모든 연산 처리

7. 보낼때도 다 패킷을 만들고 보내는 것이 아니라 STX 부터 보내면서 데이터를 만들어 처리

8. 모든 보내고 받는 연산은 DMA 처리

9. HAL 라이브러리 거의 들어내고 레지스터 직접 연산 처리

남들이 가지 않는 길을 가서 굉장히 불안했었는데 나름 쾌감이 드는 프로젝트가 된거 같습니다.

무조건 STM32H7가 이 이정도 다 처리된다고 생각하시면 안되고

프로토콜의 여러가지 개구멍을 이용하여 처리하였으므로

일반적으로 다른 프로젝트에 적용하시면 안되니 주의바랍니다.

FPGA 쓰셔요~~~

 

안녕하세요.

 

 

최근에 엄청난 속도 최적화를 해야 될 일이 있어서 몇달간 고생을 조금 하였습니다.

 

STM32H7 하에서 이루어진 작업이므로 모든 프로젝트에 적용하기는 어렵습니다만,

거의 공통적인 부분이라 ARM 계열은 최소한 비슷하리라 생각됩니다.

 

너무 뻔한 내용일 수도 있으니 병아리들만 보셔도 좋습니다.

 

일단 어떤 기법보다 확인하는 툴이 중요하겠지요.

 

[Tool]

1. Diassembly 디버깅

  1) 컴파일러 툴을 이용하여 디어셈블하면서 내 코드가 어떻게 변환되는지 확인한다.

  2) 어셈블리 코드를 몰라도 되며 몇줄로 바뀌는지만 확인하면 충분하다.

 

2. CPU Counter 레지스터가 있으면 원하는 함수 시작부터 마칠때까지 CPU 카운트를 확인하여

    몇 카운트가 흘렀는지를 확인하여 수치로 정확하게 확인해본다.

 

도구가 준비되었으면 이제는 내 머리가 준비되면 됩니다.

[기본 지식]

1. 속도와 용량 둘다 잡을 수 없다. 싸고 좋은 물건은 없다.

   속도가 빠르면 용량이 크고 , 용량이 좋으면 속도가 느리다.

 

2. 위 1번 툴을 이용하여 C 코드가 어떻게 변경되는지 감을 조금 잡는다.

 

-아래부터는 STM32 쪽

3. 라이브러리는 끝까지 추적해서 직접 제어 하도록 한다.

    STM32 의 경우 HAL 라이브러리는 되도록 자제하고 직접 레지스터를 제어한다.

    그렇다고 무식하게 번지를 그냥 입력해서 가독성이 떨어지도록 할 필요는 없다.

 

4. 컴파일러 옵션은 speed 최대

 

5. 시스템의 캐쉬를 켤수 있다면 On ( 7-10배 증가)

 

6. DTCM 과 ITCM 이해

 

7. Bus 아키텍처를 보고 가장 짧은 라인으로 데이터가 움직이도록 처리

 

8. 되도록 DMA 처리

 

9. flash 보다는 ram 에서 실행하는게 더 빠르겠지요.

 

 

 

 

+ Recent posts