TMS320/Study2016. 5. 23. 13:40

http://embed-avr.tistory.com/43

http://blog.naver.com/sigsaly/220688515740

http://blog.naver.com/seim_ryu/110020328222

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

28XDSP의 MMR선언과 배치 방법 정리  (0) 2014.08.11
구조체 명명법, MMR 관련 헤더 파일 종류  (0) 2014.08.11
28계열의 MMR선언 및 조작(2)  (0) 2014.08.11
28계열의 MMR선언 및 조작(1)  (0) 2014.08.11
MMR이란?  (0) 2014.08.08
Posted by 십자성군
Software/Programming2016. 4. 15. 04:19

응용. singleton 패턴과 volatile---DCL(Double Checking Locking)


간단한 싱글톤 예제를 작성하겠다


public class Singleton{

private static Singleton uniqueInstance;


private Singleton() {}


public static synchronized Singleton getInstance(){

if(uniqueInstance == null){

uniqueInstance = new Singleton();

}

return uniqueInstance;

}

}


위 타입의 인스턴스는 유일하게 하나만 존재해야 한다. 그러나 synchronized가 없을 경우, 다수의 쓰레드에서 인스턴스 생성/접근을 시도했을 때, 다수의 인스턴스가 발생할 가능성이 있다.

ex)

1. Thread1 에서 if(uniqueInstance == null) 에 접근

2. Thread1 이 다은 행을 이행하기 전에 Thread2에서 if(uniqueInstance == null) 실행

3. Thread1, 2에서 각각 new Singleton() 실행


synchronized를 적용하면 한 스레드가 메소드 사용을 끝내기 전까지 다른 스레드는 기다려야 한다.

그러나 이 경우 접근에 너무 제한이 들어 동시에 접근이 일어났을 때 처리가 늦어진다.(비용이 너무 크다)

따럿 아래와 같은 double checking locking 기법을 사용한다.


public class Singleton{

private static Singleton uniqueInstance;


private Singleton() {}


public static Singleton getInstance(){

if(uniqueInstance == null){

synchronized (Singleton.class){

if(uniqueInstance == null){

uniqueInstance = new Singleton();

}

}

}

return uniqueInstance;

}

}


설사 Thread2가 객체생성 전에 첫번째 checking에 진입하여도 synchronized에 걸리게 된다.

이미 객체가 생성되어있을 경우 synchronized에 걸릴것 없이 바로 객체를 받게된다.


그러나 아래와 같은 low-level 문제가 발생할 수 있다.


public class Singleton{

private static Singleton uniqueInstance;


private Singleton() {}


public static Singleton getInstance(){

if(uniqueInstance == null){

synchronized (Singleton.class){

if(uniqueInstance == null){

some_memory_space = aloocate space for Singleton object;

uniqueInstance = some_memory_space;

create a real object in some_memory_space;

}

}

}

return uniqueInstance;

}

}


new를 사용하여 객체를 생성할 때, 메모리 공간의 확보-변수에 메모리 공간 링크-해당 메모리에 오브젝트 생성 순으로 작업이 이루어진다. 이 때 아래와 같은 문제가 발생할 수 있다.


1. Thread1은 '변수에 메모리 공간 링크'만 된 상태

2. Thread2가 첫번째 if문에 걸림. 오브젝트가 생성되었다고 착각

3. Thread2가 getInstance()함수를 탈출, 해당 메모리 공간(오브젝트가 아직 미생성) 으로 작업을 하려고 함.

4. 오브젝트가 생성되지 않았기 때문에 에러 발생

이것이 재배치(reordering)과정에 의해 발생하는 문제이다.


public class Singleton{

private volatile static Singleton uniqueInstance;


private Singleton() {}


public static Singleton getInstance(){

if(uniqueInstance == null){

synchronized (Singleton.class){

if(uniqueInstance == null){

uniqueInstance = new Singleton();

}

}

}

return uniqueInstance;

}

}


volatile이 적용된 코드이다. volatile을 적용시켰기 때문에 오브젝트 생성/메인메모리에 배치까지 바로 업데이트가 되어 재배치 문제가 해소된다.


그러나 1.5 미만의 버전의 경우, 변수 자체(uniqueInstance)에만 업데이트 해주도록 되어있다. uniqueInstance = some_memory_space라는 대입과정이 메인 메모리에 실행만 하면 되기 때문에 오브젝트 생성전에 앞선 문제가 발생할 수 있다.


1.5 이상의 버전의 경우 모든 값(상태)가 업데이트가 된다. 즉, 재배치를 스킵하고 오브젝트 생성까지 진행되고 메인 메모리에 업데이트가 되기 때문에 문제가 발생할 소지가 없다는 것이다.

Posted by 십자성군
Software/Programming2016. 4. 15. 02:56

 참고 : http://blog.naver.com/jwmoon74/100157579221


1. volatile 을 사용하지 않은 변수 : 최적화가 될 수 있다. 재배치(reordering) 될 수 있다.

2. volatile 을 사용한 변수(1.5 미만) : 그 변수 자체에 대해서는 최신의 값이 읽히거나 쓰여진다.

3. volatile 을 사용한 변수(1.5 이상) : 변수 접근까지에 대해 모든 변수들의 상황이 업데이트 되고, 변수가 업데이트 된다.




1.

위와 같은 순서로 프로그램이 실행된다고 할 때(ready는 false로 초기화) volatile이 미적용된 상태에서 예상할 수 있는 문제는

1. answer와 ready의 최적화

2. 실행시간에 캐쉬된 값들이 바로 메인 메모리에 업데이트 되지 않을 수 있음


2번 문장이 실행되었는데 캐쉬만 업데이트 한 뒤, mail memory에 적용되지 않고 3번이 실행되었다면 3번에서 ready가 false로 읽어질 수 있다.


2.(1.5미만)

ready에 volatile이 적용될 경우, ready가 읽혀지거나 쓰여질 때마다 바로 업데이트 된다.

따라서 3번 문장에서 문제가 발생하지 않는다.

answer에 대하여 volatile이 적용되지 않았기에 최신의 answer(2)가 4번 문장에 전달되지 않았을 수 있다.


3.(1.5이상)

ready에 volatile이 걸렸을 경우, ready의 값이 읽혀지거나 쓰여질 때마다, 그 때까지의 쓰레드의 '모든 상태'가 업데이트 된다.

즉, thread 1의 ready가 true로 쓰여질 때,

같은 쓰레드에 있던 answer도 메인메모리에 업데이트 된다.

따라서 3번, 4번도 제대로 값이 읽어지게 된다.


Posted by 십자성군
Software/Programming2016. 4. 15. 02:43

본 자료는...


volatile이라는 정의의 의미


1.특정 최적화에 주의해라

2,.멀티 쓰레드 환경에서 주의해라


주로 C,C++이나 MCU의 레지스터를 다룰 때 1번의 의미로 사용되곤 하며

Java에서는 2번의 의미로 사용되곤 한다.


1.

옵티마이즈 기능에 의한 최적화를 시키지 않는다.


ex)


static int foo;
void bar(void)
{
    foo = 0;
 
    while (foo != 255);
}
와 같은 구문에서 최적화 옵션을 켜면, void bar내의 내용을 최적화 되어, while로 갈때는 항상 foo가 255가 아니라 0이기 때문에 

void bar_optimized(void)
{
    foo = 0;
 
    while (true);


위와 같이 된다. foo에 volatile을 적용하면


static volatile int foo;
 
void bar (void)
{
    foo = 0;
 
    while (foo != 255);
}


위와 같이 최적화에 의한 생략과정이 발생하지 않는다.

Posted by 십자성군
TMS320/F283352016. 3. 9. 00:33

DSP2833x_SysCtrl.c


위 파일에서 InitPeripheralClocks 함수가 있다.

이 함수에서는 HISPCP/LOSPCP 프리스케일 세팅뿐만 아니라 dsp28335에서 제공하는 각종 기능성 레지스터들의 기능 여부를 선택할 수 있다. 아래의 빨간 글씨 부분이다.


void InitPeripheralClocks(void)

{

   EALLOW;


// HISPCP/LOSPCP prescale register settings, normally it will be set to default values

   SysCtrlRegs.HISPCP.all = 0x0001; //HSPCLK=SYSCLKOUT/2=75MHz

   //SysCtrlRegs.LOSPCP.all = 0x0003; //LSPCLK=SYSCLKOUT/6=25MHz

   SysCtrlRegs.LOSPCP.all = 0x0002; //LSPCLK=SYSCLKOUT/4=37.5MHz


// XCLKOUT to SYSCLKOUT ratio.  By default XCLKOUT = 1/4 SYSCLKOUT

   // XTIMCLK = SYSCLKOUT/2

   XintfRegs.XINTCNF2.bit.XTIMCLK = 1;

   // XCLKOUT = XTIMCLK/2

   XintfRegs.XINTCNF2.bit.CLKMODE = 1;

   // Enable XCLKOUT

   XintfRegs.XINTCNF2.bit.CLKOFF = 0;


// Peripheral clock enables set for the selected peripherals.

// If you are not using a peripheral leave the clock off

// to save on power.

//

// Note: not all peripherals are available on all 2833x derivates.

// Refer to the datasheet for your particular device.

//

// This function is not written to be an example of efficient code.


   SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;    // ADC


   // *IMPORTANT*

   // The ADC_cal function, which  copies the ADC calibration values from TI reserved

   // OTP into the ADCREFSEL and ADCOFFTRIM registers, occurs automatically in the

   // Boot ROM. If the boot ROM code is bypassed during the debug process, the

   // following function MUST be called for the ADC to function according

   // to specification. The clocks to the ADC MUST be enabled before calling this

   // function.

   // See the device data manual and/or the ADC Reference

   // Manual for more information.


   ADC_cal();



   SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 0;   // I2C

   SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1;   // SCI-A

   SysCtrlRegs.PCLKCR0.bit.SCIBENCLK = 1;   // SCI-B

   SysCtrlRegs.PCLKCR0.bit.SCICENCLK = 0;   // SCI-C

   SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;   // SPI-A

   SysCtrlRegs.PCLKCR0.bit.MCBSPAENCLK = 0; // McBSP-A

   SysCtrlRegs.PCLKCR0.bit.MCBSPBENCLK = 0; // McBSP-B

   SysCtrlRegs.PCLKCR0.bit.ECANAENCLK=0;    // eCAN-A

   SysCtrlRegs.PCLKCR0.bit.ECANBENCLK=0;    // eCAN-B


   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;   // Disable TBCLK within the ePWM

   SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;  // ePWM1

   SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 0;  // ePWM2

   SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 0;  // ePWM3

   SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 0;  // ePWM4

   SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 0;  // ePWM5

   SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 0;  // ePWM6

   SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;   // Enable TBCLK within the ePWM


   SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 0;  // eCAP3

   SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 0;  // eCAP4

   SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 0;  // eCAP5

   SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 0;  // eCAP6

   SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 0;  // eCAP1

   SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 0;  // eCAP2

   SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 1;  // eQEP1

   SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 1;  // eQEP2


   SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0

   SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1

   SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 0; // CPU Timer 2


   SysCtrlRegs.PCLKCR3.bit.DMAENCLK = 0;       // DMA Clock

   SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;     // XTIMCLK

   SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    // GPIO input clock


   EDIS;

}

Posted by 십자성군
기타/문제해결기2016. 2. 1. 12:39

1. 통신 전압 기준 고려

RS232는 12V기준, MCU의 TTL은 5V 기준이다.

만약 같은 전압기준의 MCU끼리 통신한다면 TTL간 통신이기 때문에 별 문제 없지만, RS232로 통신해야 하는 PC또는 일부 모터드라이브 등은 MAX3232, MAX232등 전압레벨을 맞추어 주는 소자를 사용할 필요가 있다.


2. Baudrate 고려

통신하는 시스템간 Baudrate가 맞는지 확인한다.


3. RX, TX 연결이 바른지 확인.

RX-TX, TX-RX 끼리 연결되어야 한다.

만약 MAX3232등의 소자를 쓴다면 TTL, RS232를 연결하는 장소가 정해져 있으므로 이를 확인하고 연결한다.


위 세가지 사항만 맞추면 통신이 안될것은 없다.


Posted by 십자성군
기타/문제해결기2015. 10. 9. 17:39

Wifi모듈인 CC3000은 일정 시간동안 송수신이 없을경우 자동적으로 연결을 끊어버린다.

Timeout과 관련된 각종 설정을 변경하는 함수를 제공하고 있으므로 이를 통해 해결할 수 있다.


예시)

unsigned long aucDHCP = 14400;

unsigned long aucARP = 3600;

unsigned long aucKeepalive = 10;

unsigned long aucInactivity = 3600;


  /* add setup code here */

ConnectionInfo connection_info;

int i;


Serial.begin(115200);

Serial.println();

Serial.println("---------------------------------");

Serial.println("SparkFun CC3000 - Connection Test");

Serial.println("---------------------------------");


Serial.println("CC3000 initialization Trying");

if(wifi.init()){

Serial.println("CC3000 initialization complete");

}else{

Serial.println("Something went wrong during CC3000 init!");

return;

}


if(netapp_timeout_values(&aucDHCP, &aucARP, &aucKeepalive, &aucInactivity) != 0){

Serial.println("Error setting inactivity timeout!");

return;

}

else

{

Serial.println("Setting Inactivity timeout succeed");

}


진한 Code를 참고하면 된다.

사용된 함수는 netapp_timeout_values이다. 여기서는 inactivity 대기시간을 약 한시간으로 설정해 놓았다.

Posted by 십자성군
카테고리 없음2015. 10. 2. 05:32
1. rx tx통신
usart 통신으로 평범하게 하드웨어로 하는것과 지정된 핀 외의 것을 사용하는 소프트웨어적인 방법이 있다.

하드웨어적인 방법은 pin 1,2 번을 사용하는데 우노에서 시리얼로 사용하는 핀이라서 이 핀을 사용하면 println 등 모니터링용 내용도 전부 전송되어버린다.
또한 다운로드를 하는동안 해당 핀에 꽂혀있는 통신용 선들을 다 뽑아야 한다.

소프트웨어적인 방법은 SoftwareSerial 이라는 라이브러리를 인클루드 하면된다. NewSoftwareSerial 등 이전에는 구분되던 라이브러리도 다 통합되었다.
다만 데이터가 간간히 깨지는경우가 있기 때문에 왠만하면 하드웨어적인 방법을 쓰자.

DSP를 쓰다보ㄴ아두이노 우노에서도 당연히 Rx 인터럽트가 될줄 알았더니 그런거 없다... 모든 예제가 loop문에서 수신여부 확인한다. 소프트웨어적인 방법에서 rising 인터럽트로 해보았지만 한계가 역력했다.
Posted by 십자성군
TMS320/F283352015. 7. 31. 18:15

C++ 클래스를 사용할 때 발생한 경고문이다.

.sysmem 섹션을 아래와 같이 생성해주면 된다.




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

Baudrate 설정  (0) 2016.10.09
InitPeripheralClocks  (0) 2016.03.09
cmd 메모리 문제  (0) 2015.07.31
DSP2812의 자료형과 그 길이  (0) 2015.01.11
DSP2812의 Endian  (0) 2015.01.11
Posted by 십자성군
TMS320/F283352015. 7. 31. 18:12

#10099-D 에러는 주로 메모리 공간이 부족해서 발생한다.


예를들어 C++로 클래스를 사용하여 프로젝트를 작성한다던지, acos같은 수학함수를 사용할 때 이다.

이와 관련된 해결방법이 기재된 URL을 링크한다.


1. 

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


2.

http://processors.wiki.ti.com/index.php/C28x_Compiler_-_Understanding_Linking

or

http://processors.wiki.ti.com/index.php/C28x_Compiler_-_Understanding_Linking


나는 2번의 방법으로 해결하였다.

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

InitPeripheralClocks  (0) 2016.03.09
10247-D creating output section ".sysmem" without SECTIONS specification  (0) 2015.07.31
DSP2812의 자료형과 그 길이  (0) 2015.01.11
DSP2812의 Endian  (0) 2015.01.11
PWM  (1) 2014.08.20
Posted by 십자성군