Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: RTDX с 2810
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
GDove
Это развитие моей предыдущей темы "Sau510 и CCS3.3". Уважаемый SM для наблюдения за состоянием системы посоветовал воспользоваться RTDX. не имея представления о том, как это выглядит, начал ковырять HELP CCS и сайт ti. впоследствии остановился на help-е, как более информативном источнике.

в хелпе написано :

To access the RTDX channel information using Microsoft Visual Basic:
1) Open Microsoft Visual Basic or Excel.
Make a reference to the Code Composer's type library and the Channel Viewer Control's type library. To make this reference:

· In Excel, select Tools->References under the VBA editor (Alt+F11).

· In Microsoft Visual Basic, select Project->References.

и далее приведен код программы, который необходимо вставить в exel. так вот Channel Viewer Control's type library я никак не могу найти, а без нее ессно не работает. выложите, пришлите ее на мыло, подскажите где взять или еще что-нибудь.

Также буду очень благодарен, если кто-нибудь поделится опытом про RTDX. прежде всего интересует, как ЭТО выглядит; т.е. мне не совсем понятно зачем вообще нужен Visual Basic или Visual C++, значит ли это что присылаемые эмулятором по RTDX данные не могут отображаться в CCS, а только в каком-то стороннем приложении?
Vasiliy Rufitskiy
> как ЭТО выглядит
Работать с RTDX в CCS ИМХО удобнее через DSP/BIOS. Пункт меню DSP/BIOS предназначен для просмотра различной отладочной информации: степени загрузки проца, сообщений лога, состояния задач, выделения памяти ... Вся эта информация передаётся по каналу RTDX, однако непосредственно работать с каналом RTDX при решении стандартных задач ИМХО не стоит.
Также RTDX нужен для загрузки/выгрузки областей памяти устройства (File->Data->Load/Save).
Моё мнение таково: чтобы начать работать с RTDX на самом первом этапе достаточно настроить Code Composer и не искать окольных путей через VB или VC++.
Degun
Цитата(Vasiliy Rufitskiy @ Dec 6 2007, 18:10) *
> как ЭТО выглядит
Работать с RTDX в CCS ИМХО удобнее через DSP/BIOS. Пункт меню DSP/BIOS предназначен для просмотра различной отладочной информации: степени загрузки проца, сообщений лога, состояния задач, выделения памяти ... Вся эта информация передаётся по каналу RTDX, однако непосредственно работать с каналом RTDX при решении стандартных задач ИМХО не стоит.
Также RTDX нужен для загрузки/выгрузки областей памяти устройства (File->Data->Load/Save).
Моё мнение таково: чтобы начать работать с RTDX на самом первом этапе достаточно настроить Code Composer и не искать окольных путей через VB или VC++.

А в какое значение в "Setup Code Composer Studio" должен быть выставлен пункт "TCLK rate" для нормальной работы RTDX и HSRTDX: в "autorange" или в "legacy clock (10 MHz)"?
Edmundo
Цитата(Vasiliy Rufitskiy @ Dec 6 2007, 18:10) *
Также RTDX нужен для загрузки/выгрузки областей памяти устройства (File->Data->Load/Save).

Интересно, откуда у вас такая информация?

Читаем Help...
Цитата
Real-Time Data Exchange (RTDX™) provides real-time, continuous visibility into the way target applications operate in the real world. RTDX allows system developers to transfer data between a host and target devices without interfering with the target application. The data can be analyzed and visualized on the host using any host client. This shortens development time by giving you a realistic representation of the way your system actually operates.
RTDX consists of both target and host components. A small RTDX software library runs on the target application. The target application makes function calls to this library's API in order to pass data to or from it. This library makes use of a scan-based emulator to move data to or from the host platform via a JTAG interface. Data transfer to the host occurs in real-time while the target application is running.

On the host platform, an RTDX Host library operates in conjunction with Code Composer™. Displays and analysis tools communicate with RTDX via an easy-to-use COM API to obtain the target data and/or to send data to the target application. Designers may use their choice of standard software display packages, including:

· National Instruments' LabVIEW™
· Quinn-Curtis' Real-Time Graphics Tools
· Microsoft Excel

Alternatively, you can develop your own Visual Basic™ or Visual C++™ applications. Instead of focusing on obtaining the data, you can concentrate on designing the display to visualize the data in the most meaningful way.

Прояснилось?
Vasiliy Rufitskiy
Цитата(Edmundo @ Dec 7 2007, 11:01) *
Интересно, откуда у вас такая информация?


Прошу прощения, ввёл в заблуждение себя и окружающих. В следующий раз буду более аккуратным.

Note: File I/O does not support real-time data transfer.


Цитата(Degun @ Dec 6 2007, 20:29) *
А в какое значение в "Setup Code Composer Studio" должен быть выставлен пункт "TCLK rate" для нормальной работы RTDX и HSRTDX: в "autorange" или в "legacy clock (10 MHz)"?


Для эмулятора SDSP-510 который у меня стоит, такого параметра нету, нужно смотреть описание на эмулятор. Для SM-510 целая статья написана на тему правильной его настройки...

Коннект с target'ом есть? Какие симптомы некорректной работы наблюдаются?
GDove
Вощем разобрался. Заставил работать через прерывание. Хелп гавно - половина необходимой инфы умалчивается. благо примеры есть, по ним методом проб и ошибок можно вникнуть в принципы.
теперь возникла необходимость в нормальном отладчике. я сколько не бился, так и не понял как через RTDX отправить данные в CCS. хотелось бы сделать также, как с брейкпоинтами, чтобы имя и значене переменной отображалось в watch window и гафифики можно было бы строить. это возможно? а то свой отладчик писать лениво =)
Degun
Цитата(Vasiliy Rufitskiy @ Dec 7 2007, 17:43) *
Для эмулятора SDSP-510 который у меня стоит, такого параметра нету, нужно смотреть описание на эмулятор. Для SM-510 целая статья написана на тему правильной его настройки...

Коннект с target'ом есть? Какие симптомы некорректной работы наблюдаются?

У меня следующая конфигурация:
1. эмулятор XDS560R с 14-pin JTAG Header.
http://www.spectrumdigital.com/product_inf...products_id=182
2. процессор TMS320DM642 (720 МГц) на evalution board rev.3
http://www.spectrumdigital.com/product_inf...8fc68ec799a426e
3. триальная версия Code Composer Studio vers. 3.3 со всеми последними апдейтами к ней.
4. DSP-BIOS vers. 5.32
5. Windows XP SP2 на PC с процессором AMD 2ГГц и памятью 2 ГБайт

Коннект с эмулятором и target'ом есть, но при передаче данных от target-устройства (т. е. с evalution board) на host-устройство (т. е. на PC) с помощью программы, приведённой ниже, происходит потеря блоков ( пакетов) данных. Например в данном случае, от target-а передаются 1000 блоков (один блок данных передаётся за один вызов функции RTDX_write) по 512 байт каждый. Но на host-е принимаются только порядка 100 блоков данных, а остальные 900 блоков где-то теряются по дороге. Есть подозрение, что это происходит из-за того, что процессор TMS320DM642 работает гораздо быстрее, чем блоки данных успевают передаваться по каналу, из-за этого некоторые пакеты накладываются друг на друга, что и приводит к их потере. По идее строка

while ( RTDX_writing != NULL );

должна предотвращать это, но, видимо, она работает некорректно. В прочем дело может быть совсем в этом. Тогда не понятно в чём здесь дело и как обеспечить стабильную передачу данных от target-а на host без потери данных?


Программа для TMS320DM642 имеет следующий вид:
Код
#include <rtdx.h>
#include <stdlib.h>

// declare a global RTDX channel
RTDX_CreateOutputChannel( ochanData );
RTDX_CreateInputChannel( ichanInfo );

//Packet size and RTDX data bufer
#define RTDX_PACKET_SIZE 512
static char vBuf[RTDX_PACKET_SIZE];

int main()
{
    unsigned int i, returncode, received;

    //Set rtdx bufer data
    for (i=0; i<RTDX_PACKET_SIZE; i++) vBuf[i]=rand()%256;

    // enable the output channel
    RTDX_enableOutput( &ochanData );

    // enable the input channel
    RTDX_enableInput( &ichanInfo );

    // Ожидание от host-PC значения кол-ва пересылаемых пакетов
    do {
        returncode = RTDX_read( &ichanInfo, &received, 4);
    } while((returncode==0)||(received==0));

    //send data to host
    for (i=0; i<1000; i++)
    {
        // make sure writes go through
        while(RTDX_write( &ochanData, vBuf, RTDX_PACKET_SIZE )==0);
        // check if RTDX channel is ready
        while ( RTDX_writing != NULL );
    }

    // disable the input channel
    RTDX_disableInput( &ichanInfo );

    // disable the output channel
    RTDX_disableOutput( &ochanData );

    return 1;
}


На host-стороне программа выглядит следующим образом:
Код
#include "stdafx.h"

// ########## RTDX(TM) ##########
#import "rtdxint.dll"
using namespace RTDXINTLib;
// ########## RTDX(TM) ##########
#include <iostream.h>
#include <stdio.h>
#include <fstream>            // For fstream
//Количество считываемых данных=RTDX_PACKET_NUMB*RTDX_PACKET_SIZE
#define RTDX_PACKET_SIZE 512
#define RTDX_PACKET_NUMB 1000
//Размер буфера данных
#define RTDX_DATA_SIZE  (RTDX_PACKET_NUMB*RTDX_PACKET_SIZE)


int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr, Result = NO_ERROR;
    long status=Success, status_of_write;
    VARIANT sa;
    IRtdxExpPtr DataChannel;
    IRtdxExpPtr H2TInfoChannel;

    // Initialize COM
    ::CoInitialize( NULL );

    // Initialize VARIANT
    ::VariantInit(&sa);

    // Instantiate the RTDX COM Objects
    hr = DataChannel.CreateInstance(__uuidof(RTDXINTLib::RtdxExp) /*L"RTDX"*/ );
    if ( FAILED(hr) ) {
        printf("RTDX Channel Instantiation failed!\n");
        Result = E_FAIL;
        goto ExitProc;
    }
    hr = H2TInfoChannel.CreateInstance(__uuidof(RTDXINTLib::RtdxExp) /*L"RTDX"*/ );
    if ( FAILED(hr) ) {
        printf("RTDX Channel Instantiation failed!\n");
        Result = E_FAIL;
        goto ExitProc;
    }

    //Opening RTDX Channels
    printf("Opening RTDX Channels...\n");
    if (DataChannel->Open( "ochanData", "R" ) != Success)
    {
        printf("RTDX Channel Open for reading failed!\n");
        Result = E_FAIL;
        goto ExitProc;
    }
    if (H2TInfoChannel->Open( "ichanInfo", "W" ) != Success)
    {
        printf("RTDX Channel Open for writing failed!\n");
        Result = E_FAIL;
        goto ExitProc;
    }

    // Отсылка стартового кода для начала пересылки пакета
    int CountPacket = RTDX_PACKET_NUMB;
    do {
        status = H2TInfoChannel->WriteI4(CountPacket, &status_of_write);
    }while(status != Success);

    //Приём данных с измерением времени
    int CountByte = 0;

    DWORD dwStart = GetTickCount();
    while(CountByte < RTDX_DATA_SIZE)
    {
        //Чтение сообщения
        status = DataChannel->ReadSAI1( &sa );
        switch(status)
        {
            case Success:
            {
                if (status==Success)
                {
                    //Обработка текущего пакета
                    int dataNumb = sa.parray->rgsabound[0].cElements;
                    if ( (dataNumb<=0) ) {
                        printf("RTDX Data Channel Zero length message received!\n");
                        Result = E_FAIL;
                        goto ExitProc;
                    }
                    //Обновление счётчика кол-ва пакетов
                    CountPacket--;
                    //Обновление счётчика принятых байт
                    CountByte += dataNumb;
                    //Вывод кол-ва принятых байт на экран
                    printf("Quantity accepted bytes=%i\r", CountByte);
                }
                break;
            }
            case ENoDataAvailable:
            {
                //delay for a while
                Sleep(1);
                break;
            }
            default:
            {
                Result = E_FAIL;
                goto ExitProc;
            }
        }
    }
    DWORD dwEnd = GetTickCount();
    double Rate=(double)(RTDX_DATA_SIZE*8000.)/(double)(dwEnd-dwStart);
    printf("Rate=%f MBit/sec\n", Rate/(1024.*1024.));

ExitProc:
    // Close chanels
    DataChannel->Close();
    H2TInfoChannel->Close();

    // Release chanels
    DataChannel.Release();
    H2TInfoChannel.Release();

    // Clear VARIANT
    ::VariantClear(&sa);

    // Uninitialize COM
    ::CoUninitialize();

    return 0;
}
GDove
to Degun

посмотри функцию RTDX_Poll();


if(RTDX_writing != NULL)
{
KickDog();// сброс watchdog-a
RTDX_Poll();
}
else
{
if (!RTDX_write(&ochan, &message, sizeof(message)))
abort();
}

разные девайсы конечно, но вдруг поможет
Degun
Цитата(GDove @ Dec 10 2007, 18:03) *
to Degun

посмотри функцию RTDX_Poll();
if(RTDX_writing != NULL)
{
KickDog();// сброс watchdog-a
RTDX_Poll();
}
else
{
if (!RTDX_write(&ochan, &message, sizeof(message)))
abort();
}

разные девайсы конечно, но вдруг поможет

Функция RTDX_Poll(); в 6000-м семействе не используется. А что это за функция KickDog()? Нигде в заголовочных файлах не нашёл её определения.
GDove
Цитата(Degun @ Dec 15 2007, 00:03) *
Функция RTDX_Poll(); в 6000-м семействе не используется. А что это за функция KickDog()? Нигде в заголовочных файлах не нашёл её определения.


кстати хелп композеровский однозначного ответа не дает. в разных местах по-разному, где-то написано точно не используестя, где-то обязательно используется.

KickDog - сброс watchdog таймера.

void KickDog(void)
{
EALLOW;
SysCtrlRegs.WDKEY = 0x0055;
SysCtrlRegs.WDKEY = 0x00AA;
EDIS;
}
лень каждый раз писать 4-ре строчки, проще функцией
Degun
Цитата(GDove @ Dec 19 2007, 16:17) *
KickDog - сброс watchdog таймера.

void KickDog(void)
{
EALLOW;
SysCtrlRegs.WDKEY = 0x0055;
SysCtrlRegs.WDKEY = 0x00AA;
EDIS;
}
лень каждый раз писать 4-ре строчки, проще функцией

Извиняюсь конечно, но что такое EALLOW, SysCtrlRegs.WDKEY и EDIS. Не нашёл в заголовочных файлах.
Edmundo
Цитата(Degun @ Dec 20 2007, 22:21) *
Извиняюсь конечно, но что такое EALLOW, SysCtrlRegs.WDKEY и EDIS. Не нашёл в заголовочных файлах.

Это то, чего в 6000-никах нет и не нужно smile.gif
Да и WatchDog'а между прочим в 'C6x тоже замечено не было...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.