[DSP]/DSP283352011. 11. 27. 23:30

[TMS320F28335 EVM] TI 무료 RTOS SYSBIOS 테스트

[TMS320F28335 EVM] TI 무료 RTOS SYSBIOS 테스트




TI에서 제공하는 무료 RTOS인 SYSBIOS를 TMS320F28시리즈(TMS320F28335)에서 테스트 해보았다. 이번에는 기존 SYSBIOS 테스트 예제 에 추가하여세마포를 이용하여 쓰레드를 처리하는 예제를 테스트 했다.
 


SYSBIOS 프로젝트 생성
CCS4.0 이상에서 (예제는 CCS5에서 테스트 했다.) 에서 SYSBIOS 프로젝트 생성시 지원 가능하다.
CCS 프로젝트 생성시 SYSBIOS 항목에서 적당한 탬플릿을 선택하면 간단히 적용할 수 있다.






RTOS 버전 설정







SYSBIOS 등록 후 cfg파일에서 SYS/BIOS관련 각종 파라미터들을 쉽게 설정 할 수 있다.






SYSBIOS 구조






SYSBIOS 기본 골격
#include <xdc/std.h>
#include <xdc/runtime/Log.h>
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Semaphore.h>

#include "system.h"
#include "serial.h"

/* Counter incremented by timer interrupt */
volatile UInt tickCount = 0;
volatile UInt tickCount2 = 0;

//세마포 생성
extern const Semaphore_Handle mySem;
extern const Semaphore_Handle mySem2;

Void main()
{
 //사용자 초기화 함수
//--------------------------------------------------------

 SystemInit();

 Led1Init();
 Led1On();

 Led2Init();
 Led2Off();

 //Serial Init
 DebugInit(BAUD_115200);
 DebugPrint("SYS/BIOS Test Program.\r\n");
//--------------------------------------------------------

//--------------------------------------------------------
    //Start RTOS BIOS
    BIOS_start();
//--------------------------------------------------------
}


//수행될 TASK 함수
Void myTaskFxn(Void)
{
  wihle(1) 
  {
    :
   }
}

Void myTaskFxn2(Void)
{
  wihle(1) 
  {
    :
   }
}





기본 환경 설정이 마무리 되었기 때문에 간단한 예제를 작성하여 테스트 해보자.


TASK 설정 및 추가를 위한 cfg 파일 수정
var BIOS = xdc.useModule('ti.sysbios.BIOS');
BIOS.swiEnabled = false;
BIOS.taskEnabled = true;
BIOS.clockEnabled = false;


/* Create a task with priority 1 */
var Task = xdc.useModule('ti.sysbios.knl.Task');
var taskParams = new Task.Params();
taskParams.priority = 1;
var myTask = Task.create('&myTaskFxn', taskParams);
var myTask2 = Task.create('&myTaskFxn2', taskParams);

/* Inhibit the creation of a task to run idle functions */
Task.enableIdleTask = false;



TASK 실행
cfg파일에서 정의한 TASK를 실행할 함수를 아래과 같이 작성해 준다. 아래 예제는 단순히 루프를 돌며 대기하다 세마포 이벤트가 발생하면 LED깜박이고 UART로 값을 출력하는 예제이다. 세마포 이벤트는 일정 간격으로  타이머 Task에서 호출하도록 했다.
//RTOS TASK1 - BIOS_start() thread.
Void myTaskFxn(Void)
{
    while (TRUE)
    {
        //세마포 핸들에 의해 호출 되기전 까지 대기
        Semaphore_pend(mySem, BIOS_WAIT_FOREVER);
       
        Led1Toggle();
        DebugPrint("Task1=%d\r\n", tickCount);
    }
}


//RTOS Task2
Void myTaskFxn2(Void)
{
 while(1)
 {
  //세마포 핸들에 의해 호출 되기전 까지 대기
        Semaphore_pend(mySem2, BIOS_WAIT_FOREVER);

  Led2Toggle();
  test_cnt2++;
  DebugPrint("Task2=%d\r\n", test_cnt2);
 }
}


예제를 실행하면 두개의 TASK가 원하는 시간에 동작되는 것을 LED및 UART를 통해 확인 할 수 있다.
Task1=41
Task2=418
Task2=419
Task2=420
Task2=421
Task2=422
Task2=423
Task2=424
Task2=425
Task2=426
Task2=427
Task1=42
Task2=428
Task2=429
Task2=430
Task2=431
Task2=432
Task2=433
Task2=434
Task2=435
Task2=436
Task2=437
Task1=43



결론
RTOS는 사용의 편리성 보다는 초기 설정이나 MCU별 포팅에 대한 문제 때문에 부담이 많이 가는것이 현실이다.
TI에서 제공되는 SYS/BIOS는 TI의 대부분 MCU를 지원하고 간단히 설정 가능하므로 여러가지 장점이 많다. 한번 설정 해 두면 앞으로 도움이 많이 될것 같다.
Posted by nexp

댓글을 달아 주세요

  1. 박인권

    관리자의 승인을 기다리고 있는 댓글입니다

    2012.01.05 04:00 [ ADDR : EDIT/ DEL : REPLY ]

[DSP]/DSP283352011. 11. 14. 02:29

[DSP28335 EVM] VS1053모듈이용한 MP3 출력 테스트

[DSP28335 EVM] VS1053모듈이용한 MP3 출력 테스트

 



[EXP-ALL EVM] 보드에서 VS1053 MP3모듈의 핀맵과 [DSP28335 EVM]의 핀맵









TMS320F28335 VS1053 모듈 드라이버 코드
#define VS_DREQ_BIT      BIT3
#define VS_DREQ_PORT     PORTA

#define VS_CS_BIT      BIT1
#define VS_CS_PORT      PORTA

#define VS_XDCS_BIT      BIT2
#define VS_XDCS_PORT     PORTA

#define VS_RST_BIT      
#define VS_RST_PORT 

#define VS1003_CS_H()      Sbi(VS_CS_PORT, VS_CS_BIT)
#define VS1003_CS_L()      Cbi(VS_CS_PORT, VS_CS_BIT)

#define VS1003_XDCS_H()      Sbi(VS_XDCS_PORT, VS_XDCS_BIT)
#define VS1003_XDCS_L()      Cbi(VS_XDCS_PORT, VS_XDCS_BIT)

#define VS1003_RESET_H()     //Sbi(VS_RST_PORT, VS_RST_BIT)
#define VS1003_RESET_L()     //Cbi(VS_RST_PORT, VS_RST_BIT)

#define IsVs1003DataReady()     (GPIOA->IDR&VS_DREQ_BIT)
#define VS1003_DREQ()           ((GPIOB->IDR&SW_BIT))

#define vs1003_enable()      VS1003_CS_L()
#define vs1003_disable()     VS1003_CS_H()


#define VS_SendByte       SPI1_WriteReadByte
#define VS_InitSpi()      SPI1_Init()
#define VS_SpiSpeed_Low()        SPI1_SetSpeed(SPI_SPEED_1MHZ)
#define VS_SpiSpeed_High()     SPI1_SetSpeed(SPI_SPEED_4MHZ)

#define MP3_PORT_INIT() 



TMS320F28335 SD Card 드라이버 코드

#define _SPI0_ENABLE     1
//-----------------------------------------------------------------------------
// SD Card HAL
#define MMC_CS_PORT      GPIOA
#define MMC_CS_BIT      BIT20

#define MMC_CS_INIT()     EALLOW;\
          GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 0;\
          GpioCtrlRegs.GPADIR.bit.GPIO20 = 1;\
          EDIS;\
          MMC_CS_HIGH()
          
          
#define MMC_CS_HIGH()     sbi(MMC_CS_PORT, MMC_CS_BIT)
#define MMC_CS_LOW()     cbi(MMC_CS_PORT, MMC_CS_BIT)


#define MMC_ASSERT_INIT()    MMC_CS_INIT();MMC_CS_HIGH()
#define MMC_ASSERT()     MMC_CS_LOW()
#define MMC_DEASSERT()     MMC_CS_HIGH()


#define MMC_SpiInit()     SPI0_Init()
#define MMC_SendByte     SPI0_WriteReadByte
#define MMC_Send(Data)      SPI0_WriteByte(Data)
#define MMC_Recv()      SPI0_WriteReadByte(0xFF)
#define MMC_RecvP(Data)     MMC_Send(0xFF); (*(Data)=SPI0_ReadByte())
#define MMC_SPISpeed     SPI0_SetSpeed

#define SPI_Mode3()
//-----------------------------------------------------------------------------
Posted by nexp

댓글을 달아 주세요

[DSP]/DSP283352011. 11. 13. 23:30

[DSP28335 EVM] Hardware TCP/IP W5300 TCP전송 테스트 - TMS320F28335 [EXP-ALL EVM]

[DSP28335 EVM] Hardware TCP/IP W5300 TCP전송 테스트 - TMS320F28335 [EXP-ALL EVM]



[EXP-ALL EVM] 보드에는 wiznet사의 고속 Hardwired TCP/IP  W5300모듈을 연결할 수 있다.
TMS320F28335 외부 메모리 인터페이스로 제어 하면 고속의 이더넷 데이터를 전송할 수 있기 때문에 여러가지 실험해 볼것이 많을것 같다.
(좀더 자세한 내용은 TM320F28335 W5300포팅 참고)

[EXP-ALL EVM] 의 W5300모듈 연결 회로도
TMS320F28335는 16비트 모드를 지원하기 때문에 R49, R1을 제거한다. W5300의 CS는 TMS320F28335 의 CS0에 연결한다.





TMS320F28335를 이용하여 W5300 TCP 서버 루푸백 전송 속도 테스트 결과
대략 28Mbps 정도 출력된다.  55Mbyte 동영상 전송시 15초 정도 걸린다.
저렴하고 OS없는 임베디드 보드에서 간단한 코드로 TCP전송 속도가 이정도 이면.. 상당히 빠르다. (참고로 ARM9 2410으로 테스트시 45Mbps정도 나온다) .
물론 비교 대상은 아니지만 ATmega128(8Mhz) 에서 W5300 속도 테스트 결과(2.6Mbps)와 비교해 보면 아주 많은 차이가 난다.







TCP Server 처리 함수
Wiznet칩 제어를 위한 함수를 통합했다. 앞으로 손을 좀더 봐야 겠지만 이 코드로 수정 해 나갈 예정인다.
//-----------------------------------------------------------------------------
//TCP Server 처리함수
void ProcessTCPS(SOCKET s, unsigned int port)
{
 unsigned long len;
 unsigned int mode = 0;

 //TCP SOCKET status
 switch(getSn_SSR(s))               
 {     
  //초기에
  case SOCK_INIT:
   //접속대기
   temp = listen(s);
   if(!gTcpStatus)DebugPrint("%d : LOOPBACK_TCPS(%d) Started.\r\n",s,temp);
   gTcpStatus = 1;
   break; 
  
  // Socket CLOSED일 경우
  case SOCK_CLOSED:
   
   //닫고
   _close(s);  //C2000에서 close() 함수는 예약되어 있어서 함수명 변경했다.
  
   //새롭게 Open
   DebugPrint("TCP Server Opne.\r\n");
   socket(s,Sn_MR_TCP,port,mode);
   gTcpStatus = 0;
   break;
   
  //ESTABLISH?
  case SOCK_ESTABLISHED:          
   //수신된 데이터가 있으면
   if((len=getSn_RX_RSR(s)) > 0)
   {
    //수신하고
    len = recv(s,data_buf,len);

    //재전송(루프백 테스트)
    send(s, data_buf, len);
   }
   break;

  // PASSIVE CLOSED
  case SOCK_CLOSE_WAIT:              
    disconnect(s);
    break; 
  
  default:
   break;
 }
}
//-----------------------------------------------------------------------------



W5300초기화 함수
//WIZENT Chip 초기화함수
void IINCHIP_NetInit(void)
{
 uint8 tx_mem_conf[8] = {8,8,8,8,8,8,8,8};          // for setting TMSR regsiter
 uint8 rx_mem_conf[8] = {8,8,8,8,8,8,8,8};          // for setting RMSR regsiter

 unsigned char addr[6] = MY_NET_MAC;

 //initiate W5300
 iinchip_init(); 

 /* allocate internal TX/RX Memory of W5300 */
 if(!sysinit(tx_mem_conf,rx_mem_conf))          
 {
  DebugPrint("MEMORY CONFIG ERR.\r\n");
  while(1);
 }

 // If Little-endian, set MR_FS.
    setMR(getMR() | MR_FS|BIT10|BIT11|BIT12);
 Delay(100);

 //set MAC
 IINCHIP_SET_MAC(addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]); 

 //set subnet
    MY_SUBNET_SET();
 IINCHIP_SET_SUB(addr[0], addr[1], addr[2], addr[3]);
 
 //set Gateway
    MY_GWIP_SET(); 
 IINCHIP_SET_GAR(addr[0], addr[1], addr[2], addr[3]);
 
 //set IP
    MY_IP_SET();
 IINCHIP_SET_IP(addr[0], addr[1], addr[2], addr[3]); 
}



TMS320F28335 W5300 TCP Server 테스트 예제코드
void main(void)
{
 short data = 0;
 unsigned int flag = 0;

 //DSP System Initialize
 SystemInit();

 Led1Init();
 Led1On();

 DebugInit(BAUD_115200);
 DebugPrint("W5300 Test\r\n");

 //TMS320F28335 외부 메모리 초기화
 init_zone();  

 //W5300 초기화
 IINCHIP_NetInit();
 DisplayConfig();

 while(1)
 {
  //TCP 서버 루프백 처리함수
  ProcessTCPS(SOCK_TCPS, MY_LISTEN_PORT); 
 }
}  


Posted by nexp

댓글을 달아 주세요

[DSP]/DSP283352011. 11. 13. 18:12

[DSP28335 EVM] ADC테스트 - 보드의 광센서 그래프 출력 예제

[DSP28335 EVM] ADC테스트 - 보드의 광센서 그래프 출력 예제



[DSP28335 EVM] 보드에는 ADC를 테스트 하기 위한  CdS 센서가 있고, ADCA1에 연결되어 있다
CdS센서를 사용하지 않는다면 R157을 제거하면 된다.





TMS320F28335 ADC테스트용 PC프로그램





TMS320F28335 ADC테스트 동영상




TMS320F28335 ADC초기화 함수
//ADC Initialize
void AdcInit(void)
{
   EALLOW;
   SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/ADC_MODCLK
   EDIS;
    
   InitAdc();  // For this example, init the ADC

// Specific ADC setup for this example:
   AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;
   AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;    
   AdcRegs.ADCTRL1.bit.SEQ_CASC = 1;        // 1  Cascaded mode
   AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
   AdcRegs.ADCTRL1.bit.CONT_RUN = 1;       // Setup continuous run 
  
     // Start SEQ1
   AdcRegs.ADCTRL2.all = 0x2000;
}


채널별 ADC 값 읽기 함수
//Read ADC Value
unsigned int AdcRead(unsigned char Channel)
{
 AdcRegs.ADCCHSELSEQ1.bit.CONV00 = Channel;
 AdcRegs.ADCTRL1.bit.CONT_RUN = 1;       // Setup continuous run

 while (AdcRegs.ADCST.bit.INT_SEQ1== 0) {} // Wait for interrupt
    // Software wait = (HISPCP*2) * (ADCCLKPS*2) * (CPS+1) cycles
    //               = (3*2)      * (1*2)        * (0+1)   = 12 cycles
    asm(" RPT #11 || NOP");
    AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;
    return (AdcRegs.ADCRESULT0>>4);
}



Posted by nexp

댓글을 달아 주세요

[DSP]/DSP283352011. 11. 12. 22:30

[DSP28335 EVM] TFT LCD 출력 속도 테스트 - TMS320F28335 EXP_LCD EVM

[DSP28335 EVM] TFT LCD 출력 속도 테스트 - TMS320F28335 EXP_LCD EVM



[LCD_EXP_EVM] 보드 를 이용하여 TMS320F28335로 TFT LCD출력 테스트를 진행 했다.
TMS320F28335는 외부 메모리 인터페이스(EXINF)를 지원하므로 EXINF로 실험 해 보았다.

LCD_CS는 TMS320F28335 CS0로 할당 했고 LCD RS는 A0로  할당 했다.




240x400 픽셀의 한 프레임 출력시 GPIO로 제어 하면 10ms정도 시간이 걸린다.

외부 데이터/어드레스 버스로 제어 했을때  Function -2옵티마이즈 옵션으로 8ms정도 나온다
File -3로 최적화시에 한프레임 출력하는데  4ms 정도 나온다.
특히나 CS동기를 맞추기 때문에 다른 입출력 장치(Ethernet, ADC, DAC 등)와 함께 사용시 확실한 성능 차이를 보여줄 것 같다.

TMS320F28335 TFT-LCD 출력 테스트 동영상





TMS32F28335 TFT LCD 테스트 동영상 - Sd card를 이용한 BMP출력
SPI를 이용하여 SD Card의 BMP이미지 출력시 속도가 많이 느려지는데 TMS320F28335의 SPI클럭속도가 최대 10Mhz밖에 되지 않기 때문인것 같다.
Posted by nexp

댓글을 달아 주세요