기타/문제해결기2017. 2. 22. 03:59

DSP 28377을 사용하면서 겪은 문제입니다. DSP에 한정되지 않고 다른 MCU를 사용하는 와중에도 발생할 수 있는 문제입니다.


DSP와 CC3200이라는 MCU사이에서 시리얼 통신을 하도록 하였습니다. 아래의 사진은 CC3200으로 로그를 확인한 것입니다.


CC3200으로 WiFi에 접속하여 인터넷을 사용할 수 있는데, Received Contents에 HEX값으로 데이터가 마구 들어와 있습니다.

이는 DSP에 코드를 다운로드 하는 와중에 발생한 문제입니다.

본래는 정상적으로 데이터를 수신해야 하지만 DSP에 프로젝트를 다운로드 할 때, 연결된 SCI 주변 센서에 쓰레기값을 마구마구 전송합니다.


첫번째 for문은 DSP에서 특정한 정보를 보내기 위해서 SCI버퍼에 송신 데이터를 넣는 방법과, 따로 함수를 사용하는 방법을 시험해 봤습니다. 당연한 것이지만 어떻게 하느냐에 따라서 센서가 데이터를 수신하기도 하고 못하기도 합니다. 시리얼 통신을 할 때는 데이터와 데이터 사이에 약간의 딜레이가 있어야 하는듯 합니다.


프로그램을 플래시모드로 돌린다면 문제 없겠지만 개발도중에는 디버깅 모드를 사용할 수 밖에 없기 때문에 CC3200에서 쓰레기값을 확인할 수 있게 하여야 합니다. 가끔씩 쓰레기 값인데도 형식에 맞는 데이터가 와서 곤란할 때가 있습니다.

특히 MCU가 메모리를 다루는 작업을 할 필요가 있을 때 조심해야 합니다. 위 사진은 프로토콜을 읽어서 데이터를 복사하는 부분인데, 쓰레기 데이터에 대한 처리를 잘못해서, 메모리를 마이너스 길이로 복사하게 해버렸습니다. 게다가 MCU에서 try, catch를 사용할 수 없게 해놨었기 때문에, 애초에 문제가 발생하지 않도록 해야 했습니다.


위 코드는 모터를 돌리기 위한 코드입니다. DSP28335에서 C++기반으로 코드를 짰다가 28377에 옮길 때, C++에서 너무 오작동을 많이 하기에 C코드로 변경했습니다. 그래도 함수는 그대로 사용했기 때문에 정상동작을 해야 했습니다만...


mTempMl = vPWM.pLeft 와 같이 그저 값을 복사 후 조건문을 사용해서 값이 음수면 양수로 바꿔주면서 방향에 대해 1, 0을 넣어주는 코드일 뿐인데, 28377에서는 제대로 동작 안하더군요. vPWM이라는 인자의 값 까지는 정상적으로 들어오지만 조건문을 거쳤을 때, mTempMr과 mTempMl의 값이 달라야 하는데 항상 서로의 값이 같아지는 현상이 발생했습니다. 코드 오류는 없었구요.


컴파일러가 어떻게 되어있길래 저런 문제가 발생하는지는 모르겠더라구요. 결국 인자로 받았던 vPWM의 값을 조건문에 넣었더니 해결되었습니다. 컴파일러의 문제이거나 DSP의 Code optimization 과정에서 발생한 문제일 수도 있겠습니다.



Posted by 십자성군