기타/문제해결기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 십자성군
TMS320/Error 해결2017. 1. 25. 21:19

DSP에 이것저것 코드를 넣다보면 헤더나 소스파일이 늘어나고 새로 만드는 함수도 많아진다. 그냥 쌩코딩을 할 경우는 그닥 마주칠 일이 없지만 기능별로 함수를 분류하다보면 빌드할 때는 아무런 에러도 없던것이 유독 실행만 하면 문제가 발생하는 경우가 있다.


예를 들어 평소에 문제 없이 돌아가던 코드에 함수 몇개 추가했더니


아래와 같은 ILLEGAL_ISR 인터럽트에 걸렸다. 


이녀석이 발생하는 경우는 하드웨어/소프트웨어 적으로 다양하다만 아래와 같이 추가했던 함수 몇개를 주석처리하면 평범하게 돌아갔다.


그럼 예상할 수 있는건 함수가 잘못되었던지 함수를 추가한게 문제인지 둘 중 하나일 것이다. 함수에 문제는 없었으므로 함수를 추가한게 문제겠고 그렇다면 메모리 문제일거라고 예상하였다.


메모리 문제라면 cmd파일 관련일 것이고 이에 대한 정보를 찾아보면



.stack이 함수 호출을 위한 메모리라는 것을 알 수 있다.


DSP 28377D를 사용했었는데 cmd파일의 메모리를 살펴보면 아래와 같다.



.stack에 'RAMM1 | 확장할 메모리 영역' 을 적용하고

프로젝트의 Properties->Build->C2000 Linker->Basic Options->Set C system stack size에 메모리 크기를 조정하면 해결된다.


단, 확장할 메모리가 PAGE1의 아무거나 선택하면 되는게 아니라 RAMD1과 같은 on-chip RAM이어야 효과가 있다.

'TMS320 > Error 해결' 카테고리의 다른 글

중요! Stack과 Heap size 설정  (0) 2016.09.09
Illegal isr problem  (0) 2016.09.08
[CCS V5]#10010 error, #10265  (0) 2014.07.17
[CCS V5]trouble setting breakpoint with the action  (1) 2014.07.17
[CCS V5]no source available  (0) 2014.07.17
Posted by 십자성군
Software/Programming2017. 1. 16. 15:53

가끔 편리하지만 협업이나 객체지향적 개발에서 금기시되는 extern 선언


ex)


s1.c

[

unsigned long ObjA = 0;


]


s2.c

[

extern unsigned long ObjA;


function{

ObjA = 2;

}


]


s1과 s2의 ObjA는 같은 변수를 가리키게 된다.

s1에서는 선언과 정의 모두 하였으며

s2에서는 선언과 참조만 하였다.


참조

http://netrance.blog.me/110059063292

'Software > Programming' 카테고리의 다른 글

static_cast와 reinterpret_cast  (0) 2016.06.28
const 키워드  (0) 2016.06.28
LNK2019 Link Error  (0) 2016.06.28
유니코드, 멀티바이트, 중간문자  (0) 2016.06.27
참조자 &  (0) 2016.06.27
Posted by 십자성군
Linux2017. 1. 9. 16:15

CentOS 7을 설치했는데 SELinux에서 gdm session worker 어쩌구 하는 보안경고를 낸다.

그래서 root에서 "setenforce 0"으로 SELinux를 꺼버렸다.

아래는 SELinux에 관한 글


http://blog.naver.com/shackerz/220375507309


http://blog.deadcoder.net/220827088242

Posted by 십자성군
TMS320/F283352016. 11. 21. 13:13


'TMS320 > F28335' 카테고리의 다른 글

DSP28335 Flash programming  (0) 2017.02.19
ePWM 설정  (0) 2017.02.09
Baudrate 설정  (0) 2016.10.09
InitPeripheralClocks  (0) 2016.03.09
10247-D creating output section ".sysmem" without SECTIONS specification  (0) 2015.07.31
Posted by 십자성군
TMS320/F283352016. 10. 9. 02:51


http://www.mcublog.co.kr/279

'TMS320 > F28335' 카테고리의 다른 글

ePWM 설정  (0) 2017.02.09
DSP 프로젝트 생성(28377, 28335 공통)  (0) 2016.11.21
InitPeripheralClocks  (0) 2016.03.09
10247-D creating output section ".sysmem" without SECTIONS specification  (0) 2015.07.31
cmd 메모리 문제  (0) 2015.07.31
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 십자성군
TMS320/Error 해결2016. 9. 9. 04:17

일반 PC와 다르게 MCU는 메모리가 크게 제한되어 있다.

기본적으로 DSP 28335는 Stack과 Heap이 0x400으로 설정되어 있다.

기본적으로 작은 프로젝트에서는 크게 신경쓸것 없으나 규모가 커질수록 신경을 많이 써줘야 한다.


메모리 설정에 대한 문제 사례와 해결을 확인하자.



위 사진은 Stack과 Heap의 메모리를 설정하는 부분이다. 기본값으로 되어있다.



위 사진은 현재 다루고 있는 프로젝트에서 클래스 선언 관련 부분이다.

IMUTranslator, IMUSensor, GPSSensor, wSession, Actuator, sHeading 등등 다양한 클래스 변수들이 정적으로 선언되어 있다.

단순하게 new를 사용하지 않고 선언하였다.


이 때 발생하는 문제를 확인하자.


위 사진은 센서로부터 받은 데이터를 처리하고 전송하기 전의 함수이다.

약 300*2 byte 크기의 버퍼이며 주소는 0x00000630이다




호출된 함수에서 참조된 배열의 주소가 0x00000000 이 되어있다.

0이 아닌 다른 주소가 전달되기도 하고 dataLength값이 변하거나 해당 클래스의 다른 변수값들이 변동되기도 한다.

이런 현상은 정적으로 선언된 배열의 길이가 매우 길때도 종종 발생한다.


원인은 stack 메모리 부족인 것으로 확인되었다. 어떤 과정을 거쳐서 저 주소값이 전달된지는 필자도 잘 모르겠다.


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

그럼 이제 해결법을 제시한다.


1. 동적 메모리 사용


위 사진같이 new 나 malloc을 사용한 동적할당을 이용한다. 이렇게 하면 Stack 대신 Heap 메모리를 사용하게 된다.


2. 정적 메모리 증가


위와 같이 정적 메모리를 늘리기 위한 두가지 과정을 거치면 된다.

cmd 파일의 .stack을 RAMM1 에서 RAMM1|RAML6 으로 변경하였다.



주소값이 정상적으로 전달되었음을 확인할 수 있다.

'TMS320 > Error 해결' 카테고리의 다른 글

.stack의 function memory  (0) 2017.01.25
Illegal isr problem  (0) 2016.09.08
[CCS V5]#10010 error, #10265  (0) 2014.07.17
[CCS V5]trouble setting breakpoint with the action  (1) 2014.07.17
[CCS V5]no source available  (0) 2014.07.17
Posted by 십자성군
TMS320/Error 해결2016. 9. 8. 21:01
인터럽트 관련된 에러로 주로 SCI에서 자주 발생하였다.

발생 원인은 여러가지 있지만, 나의 경우는 SCI관련된 클래스를 전역변수로 선언했을 때 발생하였다.


RAM 모드에서는 문제없이 돌아가지만 Flash-RAM 모드에서 종종 위의 원인으로 문제가 발생하기도 한다.


ex1)


SCIA_Class CSCIA;

SCIB_Class CSCIB;

SCIC_Class CSCIC;


int main(void){



}


해결)

main문 안에서 선언한다

1)

SCIA_Class* CSCIA;

SCIB_Class* CSCIB;

SCIC_Class* CSCIC;


int main(void){

CSCIA = new SCIA_Class();

CSCIB = new SCIB_Class();

CSCIC = new SCIC_Class();

}


2)

int main(void){

SCIA_Class CSCIA;

SCIB_Class CSCIB;

SCIC_Class CSCIC;

}

'TMS320 > Error 해결' 카테고리의 다른 글

.stack의 function memory  (0) 2017.01.25
중요! Stack과 Heap size 설정  (0) 2016.09.09
[CCS V5]#10010 error, #10265  (0) 2014.07.17
[CCS V5]trouble setting breakpoint with the action  (1) 2014.07.17
[CCS V5]no source available  (0) 2014.07.17
Posted by 십자성군