기타/문제해결기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. 16. 05:24

DSP등을 사용하면서 UART데이터를 보내려고 할 때, 이를 위한 전용의 함수를 만들어서 사용하곤 한다.



예를들면


typedef volatile struct SCI_REGS RSCI, *PRSCI;


void sci_xmit(const PRSCI pChannel, const unsigned char b);

void ArrayTransmit(const PRSCI pChannel, const unsigned char* Array, const unsigned int length);


void sci_xmit(const PRSCI pChannel, const unsigned char b){

while(pChannel->SCICTL2.bit.TXEMPTY == 0){}

pChannel->SCITXBUF.all=b;

}


void ArrayTransmit(const PRSCI pChannel, const unsigned char* Array, const unsigned int length){

unsigned int i=0;


for(i=0; i<length;i++){

while(pChannel->SCICTL2.bit.TXEMPTY == 0){}

pChannel->SCITXBUF.all=Array[i];

}

}


위 코드는 내가 DSP 28335나 28377 에서 시리얼데이터를 보낼 때 사용하는 함수이다.

위와 같이 사용하면 SCI관련 레지스터의 포인터를 보내는 것으로 어떤 SCI 채널에서든 사용할 수 있다.


그런데 사용 도중 문제가 발생하였다. A와 B센서를 사용하고 이와 통신할 때, 처음에는 함수가 잘 동작하였었는데 프로젝트의 규모가 커지고 코드가 많아짐에 따라 B센서에 데이터가 잘 보내지지 않는 것이다.


당시 전송을 위해서 아래와 같은 코드를 사용했다.


BOOL Write(const PRSCI pChannel, const BYTE* data, const DWORD dataLength){

if(!data || dataLength <=0)

return FALSE;


if(pChannel == 0)

return FALSE;


const DWORD EOI = dataLength/2;

BYTE TXData = 0;

DWORD i = 0;


for(i=0; i<EOI; i++){

TXData = data[i];

sci_xmit(pChannel, (TXData&0x00ff));

sci_xmit(pChannel, ((TXData&0xff00)>>8));

}


return TRUE;

}


DSP에서는 자료형의 최소단위가 2byte였는데, 문자열을 보내는것이 아니라 byte데이터를 보내야 했기 때문에 2byte데이터에 대해서 위처럼 bit shift를 활용해야 했었다. 데이터가 정상적으로 센서에 전송이 되면 센서는 응답을 보내는데 당시 DSP의 수신기능에는 전혀 문제가 없었다.


이것저것 시험해본 결과 깨닫게 된 것은 데이터 전송에 있어서 함수호출방식을 사용했다는 것에 문제가 있다는 것이다. 저 sci_xmit함수를 한번 호출하는데 적어도 다음과 같은 과정을 거칠것이다.


1. 함수의 주소를 참조하여 함수를 호출한다.

2. 두개의 인수 pChannel과 데이터를 넣어준다.

3. 호출된 함수 sci_xmit에서 두 인수가 복사된다.

4. while에서 전송용 버퍼가 비워질 때 까지 기다린다.

5. 전송하고 return한다.


프로젝트 규모가 작았을 때는 센서 B에서 문제없이 응답이 돌아왔었는데 프로젝트가 커지더니 응답이 돌아오지 않았다. 디버깅모드에서 전송 행위는 정상적으로 이루어졌다고 보였었다.


여러가지 방법을 시도하다가 sci_xmit의 while문(버퍼가 비워질 때 까지 대기하기 위한)을 제거해 보았다. 그랬더니 센서 B로부터 응답이 돌아왔다. 정상적으로 동작한 것이다.

나로써는 프로젝트의 규모가 커졌다고는 하나 고작 16byte데이터를 보내는데 함수호출방식을 사용한다고 DSP 내부적으로 어떤 문제가 발생할 수 있는지 모르겠다.


센서 B와 통신이 정상화 되었더니 이번에는 센서 A로부터 응답이 없다.

센서 A는 B와는 전혀 다른 센서였는데, 명령 커맨드를 보내주면 이후에 요청한 정보를 계속 전송해 준다. 따라서 명령 커맨드가 제대로 전송되지 않았다고 보았다.

실제로 제거했던 while문을 다시 넣었더니 동작하는 것이다. 이 점에 있어서는 DSP의 문제라기 보다는 센서 A가 데이터를 수신할 때 어느정도의 텀이 필요한것이 아닌가 생각되었다.

결국 센서 A와 센서 B에 대하여 다른 전송 함수를 사용할 수 밖에 없었다.


--------------------------------------------------------------------------------------

센서 B와 관련해서는 함수호출방식을 아예 배제하기 위해서 Write 함수의 빨간 코드 부분을 아래와 같이 바꾸었다.


for(i=0; i<EOI; i++){

TXData = data[i];

pChannel->SCITXBUF.all=(TXData&0x00ff);

pChannel->SCITXBUF.all=((TXData&0xff00)>>8);

}


만약 C++로 개발중이었다면 가볍게 인라인 함수로 함수화 했을텐데 아쉬운 부분이다.

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 십자성군