기타/문제해결기2017. 4. 7. 06:54

다음과 같은 소스파일이 있다고 하자.


A.cpp


void testMainFunction(){

#ifdef LittleEndian

cout<< "LittleEndian Action" << cout;

#else

cout<< "BigEndian Action" << cout;

#endif

}



B.cpp


#define LittleEndian


void testB(){

testMainFunction();

}


C.cpp


void testC(){

testMainFunction();

}



B와 C에서 같은 함수를 호출하지만 결과는 서로 다르다.

만약 어떤 MCU가 서로 다른 두 센서에 시리얼 포트로 데이터를 전송한다고 하자.

첫번째 센서가 LittleEndian으로 데이터를 수신하고 두번째 센서가 BigEndian으로 데이터를 수신한다면 위와 같은 방법을 이용하면 같은 각각의 센서에 대해 큰 변동없이 같은 함수를 호출하여 대응할 수 있다.

Posted by 십자성군
기타/문제해결기2017. 4. 7. 06:45

C++에서 위 에러는 생성자 또는 소멸자가 없는 클래스 변수를 전역변수로 선언할 때 발생한다.

보통 클래스를 만들 때 생성자와 소멸자를 기본적으로 만들지만 없을 경우 해당 클래스 변수는 전역변수로 선언할 수 없다.


만약 어떻게해서든 전역변수로 선언하고 싶다면 해당 클래스의 포인터를 전역변수로 선언하고 임의의 함수에서 해당 포인터변수에 값을 할당하면 된다.

Posted by 십자성군
기타/문제해결기2017. 3. 7. 22:26

1. UEFI 인식이 가능한 설치 usb 만들기


참고1 : http://se0572.tistory.com/entry/%EB%85%B8%ED%8A%B8%EB%B6%81%ED%83%9C%EB%B8%94%EB%A6%BF%EC%9D%B4-%EB%B6%80%ED%8C%85-USB%EB%A5%BC-%EC%9D%B8%EC%8B%9D%EB%AA%BB%ED%95%9C%EB%8B%A4%EB%A9%B4


x86_64 linux는 64bit 지원 운영체제로 EFI를 포함하고 있다.



왼쪽은 CentOS7 64bit ISO 이고 오른쪽은 32bit ISO 파일의 내용이다.

64bit 쪽은 EFI가 있다. 따라서 win32imager 같은 것으로 usb를 이미지화 시키면 windows에서도 인식되고 usb 부팅을 이용해서 linux를 설치할 수 있다.


32bit 쪽은 EFI가 없다. win32imager로 이미지를 씌웠을 때 windows에서 이미지의 포맷형식을 인식하지 못해서 접근할 수 없다.


구글링을 해보면 dd커맨드를 이용해서 cd에 이미지를 넣는 방법이 있지만 그 방법을 써도 앞선 방법과 마찬가지로 windows에서는 인식안되며 애초에 UEFI부팅으로 사용될 수 없어서 설치할 수 없다.


CentOS등에서 이러한 iso 이미지를 usb에 쓰기 위한 유틸을 따로 제공하고 있다.

아래 첨부파일은 CentOS전용 iso2usb이다. 다른 linux는 다른 버전을 찾아야 할 수 있다.


iso2usb-v0.7.zip


위 유틸로 이미지를 쓰면 UEFI로 설치가 가능하다.


2. /dev/root does not exist 에러가 뜰 때


참고2

http://wnsgp.tistory.com/12


위 1번 과정에서 설치에 진입하여도 /dev/root does not exist 에러가 뜨는 경우가 있다.

이는 root에 대한 LABEL설정이 usb의 LABEL과 일치하지 않기 때문에 발생하는 문제이다.


따라서 설치에 진입하기 전에 LABEL 설정을 수정하여야 한다.



usb후 부팅메뉴에서 '어떤 키'를 누르면 설정을 할 수 있다고 나와있다.

이 때 위 사진과 같이 'LABEL='  이하를 usb에 지정된 라벨값으로 변경하면 된다.


이후 설치에 진입하면 된다.

Posted by 십자성군
기타/문제해결기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 십자성군
기타/문제해결기2017. 2. 3. 12:22

참고 : http://www.ehowstuff.com/how-to-fix-you-could-try-using-skip-broken-to-work-around-the-problem-error/


내용

-설치 유틸리티 list에 대한 업데이트가 필요한게 아닐까 하다.

-list를 업데이트하고 이전 캐시를 지우라는 내용이려나?

Posted by 십자성군
기타/문제해결기2017. 2. 2. 21:51

참고 : http://stackoverflow.com/questions/23067886/vfy-unable-to-resolve-lots-of-stuff


사용되지 않는 가상함수가 선언되어 있는듯 하다. 이를 사용하지 않는 한 문제는 없다고 한다.

Posted by 십자성군
기타/문제해결기2017. 2. 2. 20:20

참고 : http://raspberrypi.stackexchange.com/questions/14101/connect-network-is-unreachable-on-a-working-connected-wlan0-interface


가설정 문제 등에서 문제가 없으나 WiFi 연결하고 인터넷이 사용 불가능 할 때.

Gateway설정이 되어있지 않은 것이다.



Posted by 십자성군
기타/문제해결기2017. 2. 2. 20:17

참고 : http://h10430.blog.me/220089307529


하드웨어 가속을 끄면 해결 가능하다.


mWebview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

Posted by 십자성군
기타/문제해결기2017. 2. 2. 20:16

참고 : http://stackoverflow.com/questions/40464646/cant-see-strictmode-details-on-logcat-suppressed-strictmode-policy-violation-o


구글맵을 사용할 때 발생할 수 있는 문제로 개발자 문제가 아니다. 결론은 앞으로 나올 Google Play Services를 업데이트하면 해결될것이다.

Posted by 십자성군
기타/문제해결기2016. 9. 22. 17:41

https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/166755


DSP28335는 C2000계열의 32bit processor 이다.

실수연산에서 float과 double을 구분하지 않으며 둘 다 32bit 변수로 취급된다.

그리고 sin, cos 등 삼각함수를 포함하여 제공되는 연산 함수들이 모두 32bit 기준으로 되어있다.


64bit 실수를 다루기 위해서는 float64라는 변수를 다루어야 하며, 실제 자료형은 long double로 되어있다.

하지만 위 변수에 값을 대입할때, double에서 하던것처럼 그냥 대입했을 경우, 정밀도가 떨어진 값이 대입된다.

예를들어


double A = 3.141592653589793;

float64 B = 3.141592653589793;


의 경우 디버깅을 하면

A : 3.141592653589793

B : 3.141592741012573

과 같은 결과를 얻게 된다.


이 때는 다음과 같이 해결한다.

float64 B = 3.141592653589793L;

대입할 때, 대입하는 값의 자료형을 제대로 명명해야 하는 것이다. 32bit 프로세서이기 때문에 그냥 대입하면 32bit기준으로 대입이 이루어 져서 그런것이 아닐까?


sin, cos등의 함수들이 모두 32bit기준으로 되어있기 때문에 함수에 float64 데이터를 인자로 넣으면 32bit double로 형변환이 일어난다.
이것들은 직접 필요한 함수를 구현할 수 밖에 없을듯 하다.


Posted by 십자성군