VisualDSP Automation API |
![]() |
Добавил(а) microsin | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Этот документ описывает интерфейс автоматизации, встроенный в систему разработки VisualDSP++ 5.0 (перевод соответствующего раздела справки). Технология Windows Automation [3], обычно называемая OLE Automation, основанная на Microsoft COM система API, позволяет одним приложениям использовать функции, предоставленные другими приложениями. В нашем случае это API-функции, которые предоставляются системой разработки VisualDSP++. Они делают рабочее окружение VisualDSP++ доступным программно из других приложений, которые понимают технологию Automation. [Архитектура VisualDSP++] VisualDSP++ состоит из некоторого количества компонентов, которые работают совместно, позволяя осуществлять функции отладки и управление проектом через графический интерфейс пользователя (IDDE GUI). На картинке показаны основные составляющие системы VisualDSP++, и ниже дано краткое объяснение смысла этих компонентов. External Automation Client. Это так называемый внешний клиент автоматизации, т. е. какая-либо программа, которая пользуется технологией Automation. Примеры таких внешних клиентов включают программы на Visual Basic, скрипты Visual Basic, Mathworks Matlab и Microsoft Excel. Automation API. Слой Automation API это интерфейс автоматизации, которые предоставляет определенные службы VisualDSP++ для клиентов. Эти службы включают создание проекта, его сборку, а также отладку проекта путем его загрузки в процессор системы, запуск проекта на выполнение, просмотр содержимого памяти и регистров процессора. Плагины. Плагин это компонент, который интегрирует в себе собственное меню и/или окно диалога в среде разработки VisualDSP++. Плагины сами используют Automation API для обмена информацией со средой разработки VisualDSP++. Примеры плагинов включают окно просмотра конвейера (Pipeline Viewer). Script Engine. Система обработки скриптов, встроенная в VisualDSP++, использует фреймворк Microsoft ActiveScript, чтобы дать пользователю возможность доступа к Automation API через любой скрипт, совместимый с ActiveScript (это может быть скрипт VBScript или JScript). VisualDSP++ IDDE. Аббревиатура IDDE означает Integrated Development and Debugging Environment, т. е. интегрированная среда разработки. Это приложение Windows, который предоставляет пользователю графический интерфейс, с помощью которого осуществляется весь процесс разработки и отладки приложений. Symbol Manager. Менеджер символов - компонент, который отвечает за загрузку выполняемых файлов (*.dxe) в память целевого процессора. Он сохраняет и распознает всю отладочную информацию, содержащуюся в файлах DXE, включая символы объектов, полученных из исходного кода приложения, и оттуда помещенные в выполняемый файл. Debug Target. Это цель отладки - компонент, который отвечает за весь обмен данными с целевым процессором. Он может (через интерфейс JTAG) читать/записывать память, регистры, запускать/выполнять по шагам/останавливать процессор, и т. д. Примеры debug target включают эмуляторы (это аппаратный отладчик JTAG) и симуляторы (программная система, моделирующая поведение процессора). Processor Library. Библиотека процессора - компонент, выполняющий некие операции, специфические для определенного процессора. Это операции наподобие указаний, как данные должны быть представлены в среде IDDE, как определяются числовые форматы, выглядят окна просмотра памяти и регистров процессора для определенной модели процессора. [Использование Automation API] VisualDSP++ Automation API разработано для использования в скриптах на различных языках программирования и средах разработки, включая C++, JScript и VBScript. Чтобы использовать это API, разработчик должен сначала получить ссылку на верхний объект ADspApplication, откуда становятся доступны все другие объекты VisualDSP++ Automation API. Ниже дано краткое описание основных шагов, которые нужно выполнить для использования Automation API в Visual C++ 2003 (или более новой версии), JScript и VBScript. Microsoft Visual C++ 2003. Поскольку C++ это компилируемый язык (что также называют early bound language, язык предварительной сборки), то в нем нужно сначала предоставить определения для всех объектов, свойств, методов и событий в используемом API. Это реализуется через директиву #import среды разработки Visual C++. Самый простой способ использовать #import это предоставить полный путь до библиотеки или исполняемого кода, в котором реализовано API. В большинстве случаев это файл Idde.exe, который находится в директории System каталога установки VisualDSP++, но некоторые части API реализованы в библиотеках плагинов (plugin libraries, файлы *.dll), которые также находятся в директории System. Атрибут no_namespace является опциональным, и он будет подавлять создание namespace (пространства имен) VisualDSP в генерируемом коде. Если Вы опустите этот атрибут, то понадобится добавлять префикс VisualDSP:: в начала всех типов данных API (например VisualDSP::IADspApplicationPtr). // Импорт библиотеки типов для Automation API
#import "c:\Program Files (x86)\Analog Devices\VisualDSP 5.0\System\idde.exe" no_namespace
// Импорт библиотеки типов для всех объектов PGO (ADspPgo*)
#import "c:\Program Files (x86)\Analog Devices\VisualDSP 5.0\System\pgoengine.dll" no_namespace
Примечание: PGO расшифровывается как "Profile Guided Optimization", т. е. это данные, относящиеся к специальному виду оптимизации. Подробнее см. описание этой технологии в статье [2]. Как только были импортированы библиотеки типов, Вы можете получить ссылку на них использованием метода CreateInstance() объекта в случае объекта ADspApplication, или использованием объекта Plugin в случае вызовов API, которые реализованы в библиотеках плагинов. #import "c:\Program Files (x86)\Analog Devices\VisualDSP 5.0\System\idde.exe" no_namespace
#import "c:\Program Files (x86)\Analog Devices\VisualDSP 5.0\System\pgoengine.dll" no_namespace
#import "c:\Program Files (x86)\Analog Devices\VisualDSP 5.0\System\imageviewer.dll" no_namespace
#import "c:\Program Files (x86)\Analog Devices\VisualDSP 5.0\System\wmbtcengine.dll" no_namespace
#import "c:\Program Files (x86)\Analog Devices\VisualDSP 5.0\System\wmflashprogrammer.dll" no_namespace
int main( int argc, _TCHAR* argv[] ) { CoInitialize( NULL ); IADspApplicationPtr pApp; // Создание объекта ADspApplication: pApp.CreateInstance( "VisualDSP.ADspApplication" ); // Использование объекта ADspApplication: ... // Создание объекта ADspImageViewer: IADspImageViewerPtr pImgViewer = pApp->PluginList->GetItem("ImageViewer")->Open(); // Использование объекта ADspImageViewer: ... // Создание объекта ADspFlashProgrammer: IADspFlashProgrammerPtr pFlashPrg = pApp->PluginList->GetItem("Flash Programmer")->Open(); // Использование объекта ADspFlashProgrammer: ... // Создание объекта ADspBtcManager: IADspBtcManagerPtr pBtcMgr = pApp->PluginList->GetItem("BtcManager")->Open(); // Использование объекта ADspBtcManager: ... // Создание объекта ADspPgoManager: IADspPgoPluginPtr pPgoPlugin = pApp->PluginList->GetItem("PGO Engine")->Open(); // Использование объекта ADspPgoManager: ... return 0; } JScript. Поскольку JScript является интерпретируемым языком программирования, ему не нужно заранее ссылаться на библиотеку типов API. Чтобы использовать VisualDSP++ Automation API в JScript, просто создайте экземпляр объекта ADspApplication верхнего уровня с использованием объекта ActiveXObject следующим образом: var app = new ActiveXObject( "VisualDSP.ADspApplication" ); // ... использование объекта ADspApplication ... var imgViewer = app.PluginList.Item("ImageViewer").Open(); // ... использование объекта ADspImageViewer ... var flashPrg = app.PluginList.Item("Flash Programmer").Open(); // ... использование объекта ADspFlashProgrammer ... var btcMgr = app.PluginList.Item("BtcManager").Open(); // ... использование объекта ADspBtcManager ... var pgoPlugin = app.PluginList.Item("PGO Engine").Open(); // ... использование объекта ADspPgoManager ... VBScript. Для VBScript, как и для JScript, не требуется предварительный импорт библиотеки типов. Для использования VisualDSP++ Automation API в VBScript Вы можете просто создать экземпляр ADspApplication верхнего уровня глобальной функцией CreateObject, следующим образом: Set app = CreateObject( "VisualDSP.ADspApplication" ) ' ... использование объекта ADspApplication ... Set imgViewer = app.PluginList.Item("ImageViewer").Open() ' ... использование объекта ADspImageViewer ... Set flashPrg = app.PluginList.Item("Flash Programmer").Open() ' ... использование объекта ADspFlashProgrammer ... Set btcMgr = app.PluginList.Item("BtcManager").Open() ' ... использование объекта ADspBtcManager ... Set pgoPlugin = app.PluginList.Item("PGO Engine").Open() ' ... использование объекта ADspPgoManager ... [Справочник по функциям VisualDSP++ Automation API] Automation позволяет клиентам использовать службы VisualDSP++ путем манипуляции объектами, определенными в интерфейсе автоматизации. Каждый объект интерфейса может иметь свойства (properties), методы (methods) или события (events).
Ниже в таблице приведено краткое описание объектов VisualDSP++ Automation.
Это точка входа в плагин VisualDSP++ или контроллер автоматизации, находящийся вне процесса, наподобие программы Visual Basic. Это позволяет клиенту создать новый объект сессии, получить активную сессию, ли вывести что-то в одну из закладок выходного окна. Также этот объект позволяет пользователю создать новый список проекта, открыть существующий список проекта, или получить активный список проекта. Ниже показан пример, демонстрирующий печать версию IDDE в окне консоли. C++/ATL: IADspApplicationPtr pApp;
TCHAR szVersion[32];
pApp.CreateInstance( "VisualDSP.ADspApplication" ); sprintf( szVersion, "IDDE Version: %d.%d", pApp->VersionMajor, pApp->VersionMinor ); pApp->PrintText( tabConsole, szVersion );
Visual Basic: Dim app As Application Dim strVersion As String Set app = CreateObject( "VisualDSP.ADspApplication" ) strVersion = "IDDE Version: " + CStr( app.VersionMajor ) + "." + CStr( app.VersionMinor ) app.PrintText tabConsole, strVersion СвойстваActiveDocument МетодыCreateMPSession События[ADspBreakpoint] Объект представляет установленную для процессора точку останова. Примеры ниже демонстрируют печать списка точек останова и их свойств в окне консоли. C++/ATL: IADspApplicationPtr pApp;
TCHAR szBuffer[128];
pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspProcessorPtr pProcessor = pSession->ProcessorList->GetItem( CComVariant( 0 ) ); IADspBreakpointListPtr pBreakpointList = pProcessor->BreakpointList; for ( long i = 0; i < pBreakpointList->Count; i++ ) { IADspBreakpointPtr pBreakpoint = pBreakpointList->GetItem( i ); sprintf( szBuffer, "File Name = %s Line Number = %ld Address = 0x%lx", (char *) pBreakpoint->FileName, pBreakpoint->LineNumber, pBreakpoint->Address ); pApp->PrintText( tabConsole, szBuffer ); } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim breakpoint_list As ADspBreakpointList Dim breakpoint As ADspBreakpoint Dim processor As ADspProcessor Set app = CreateObject( "VisualDSP.ADspApplication" ) Set session = app.ActiveSession Set processor = session.ProcessorList( 0 ) Set breakpoint_list = processor.BreakpointList For Each breakpoint In breakpoint_list app.PrintText tabConsole, "File Name = " + breakpoint.FileName + _ " Line Number = " + CStr( breakpoint.LineNumber ) + _ " Address = 0x" + Hex(breakpoint.Address) Next СвойстваAddress [ADspBreakpointList] Объект представляет набор установленных для процессора в настоящий момент точек останова. Объект позволяет перебрать точки останова в списке (см. пример выше). Также он позволяет установить или удалить точки останова. СвойстваCount МетодыIsBreakpointAtAddress [ADspBtcChannel] Этот объект представляет канал BTC, определенный загруженной в настоящий момент программой. Он позволяет Вам читать и записывать память, связанную с каналом (подробнее о том, что такое канал BTC, см. [4]). Имейте в виду, что этот объект реализован во внешнем dll-файле WmBtcEngine.dll, который находится в папке System каталога установки системы VisualDSP++, не напрямую в IDDE. Если Вы используете окружение разработки, которое требует библиотеку типов (например, C++ или .NET), то должны указать на эту библиотеку вместо Idde.exe. Обратите внимание, что ссылка на этот объект должна быть получена из свойства PluginList объекта ADspApplication, как это показано в примерах ниже. Следующий пример демонстрирует печать свойств канала. Также демонстрируется запись и чтение памяти процессора, и затем отображают результаты этих данных в окне консоли. C++/ATL: USES_CONVERSION; long i;
char cj;
char msg[256]; IADspApplicationPtr pApp("VisualDSP.ADspApplication"); IADspPluginPtr pBtcPlugin = pApp->PluginList->GetItem("BtcManager"); IADspBtcManagerPtr pBtcManager = pBtcPlugin->Open(); IADspBtcChannelListPtr pBtcChannelList = pBtcManager->ChannelList((long)0); IADspBtcChannelPtr pBtcChannel = pBtcChannelList->GetItem((long)0); sprintf(msg,"Channel Name: %s \n" "Channel Address: %x \n" "Channel Length: %x \n" "Channel Timeout: %d \n" "Supported Widths: %x \n", OLE2A(pBtcChannel->Name), pBtcChannel->Address, pBtcChannel->Length, pBtcChannel->Timeout, pBtcChannel->SupportedWidths); pApp->PrintText( tabConsole, msg );
long length = pBtcChannel->Length; LPSAFEARRAY psaWrite = SafeArrayCreateVector( VT_VARIANT, 0, length ); cj = 0x11; for( i=0; i < length; i++, cj+=0x22 ) { CComVariant var = cj; SafeArrayPutElement( psaWrite, &i, &var ); } CComVariant varWrArray; varWrArray.vt = VT_ARRAY|VT_VARIANT; varWrArray.parray = psaWrite; pApp->PrintText( tabConsole, "Writing data..."); pBtcChannel->Write(adspBtcDataWidth(1), varWrArray); pApp->PrintText( tabConsole, "Reading data..."); CComVariant varRdArray; varRdArray = pBtcChannel->Read(adspBtcDataWidth(1)); for( i=0; i < length; i++ ) { CComVariant varRd, varWr; SafeArrayGetElement( varRdArray.parray, &i, &varRd ); SafeArrayGetElement( varWrArray.parray, &i, &varWr ); if (V_UI1(&varRd) != V_UI1(&varWr)) { sprintf(msg, "Data mismatch. wrote: %x read: %x", V_UI1(&varWr), V_UI1(&varRd)); pApp->PrintText( tabConsole, msg); } else { sprintf(msg, "Data match. wrote: %x read: %x", V_UI1(&varWr), V_UI1(&varRd)); pApp->PrintText( tabConsole, msg); } } pBtcPlugin->Close(pBtcManager); VBScript: Dim app
Dim btc_plugin
Dim btc_manager
Dim btc_channel_list
Dim btc_channel
Dim wr_array()
Dim rd_array
Dim length, data, i
Set app = CreateObject( "VisualDSP.ADspApplication" ) Set btc_plugin = app.PluginList("BtcManager") Set btc_manager = btc_plugin.Open() Set btc_channel_list = btc_manager.ChannelList(0) Set btc_channel = btc_channel_list(0) app.PrintText tabConsole, "Channel Name: " + btc_channel.Name app.PrintText tabConsole, "Channel Address: " + Hex(btc_channel.Address) app.PrintText tabConsole, "Channel Length: " + Hex(btc_channel.Length) app.PrintText tabConsole, "Channel Timeout: " + CStr(btc_channel.Timeout) app.PrintText tabConsole, "SupportedWidths: " + CStr(btc_channel.SupportedWidths) app.PrintText tabConsole, "" length = btc_channel.Length
ReDim wr_array(length-1) data = &H11 For i = 0 To UBound(wr_array) wr_array(i) = data data = data + &H11 Next
app.PrintText tabConsole, "Writing data..." btc_channel.Write 1, wr_array app.PrintText tabConsold, "Reading data..." rd_array = btc_channel.Read(1) For i = 0 To UBound(wr_array) If wr_array(i) <> rd_array(i) Then app.PrintText tabConsole, "Data mismatch. wrote: " + Hex(wr_array(i)) _ + " read: " + Hex(rd_array(i)) + "." Else app.PrintText tabConsole, "Data match. wrote: " + Hex(wr_array(i)) _ + " read: " + Hex(rd_array(i)) + "." End If Next
btc_plugin.Close btc_manager СвойстваName Методы[ADspBtcChannelList] Объект представляет набор каналов в виде объектов ADspBtcChannel, определенных программой, загруженной в настоящий момент в процессор. Примеры выше показывают, как осуществить печать в окне консоли списка каналов и их свойств. СвойстваОбъект предоставляет доступ к памяти процессора, когда он работает или остановлен. Доступ осуществляется через каналы, которые определяет программа, работающая на процессоре. Имейте в виду, что этот объект реализован во внешнем dll-файле WmBtcEngine.dll, который находится в папке System каталога установки системы VisualDSP++, не напрямую в IDDE. Если Вы используете окружение разработки, которое требует библиотеку типов (например, C++ или .NET), то должны указать на эту библиотеку вместо Idde.exe. Обратите внимание, что ссылка на этот объект должна быть получена из свойства PluginList объекта ADspApplication, как это показано в примерах ниже. Пример кода, использующего объект ADspBtcManager, см. во врезке с описанием объекта канала ADspBtcChannel. СвойстваМетоды[ADspCompilerAnnotation] Объект представляет аннотацию компилятора в загруженной в настоящий момент программе .dxe. Свойства[ADspCompilerAnnotationList] Объект представляет список всех аннотаций компилятора в загруженной в настоящий момент программе .dxe. СвойстваСледующий пример показывает печать списка аннотаций и их свойств в окне консоли. C++/ATL: IADspApplicationPtr pApp;
TCHAR szBuffer[4096];
pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspProcessorPtr pProcessor = pSession->ProcessorList->GetItem( CComVariant( 0 ) ); IADspCompilerAnnotationListPtr pCompilerAnnotationList = pProcessor->CompilerAnnotationList; for ( long i = 0; i < pCompilerAnnotationList->Count; i++ ) { IADspCompilerAnnotationPtr pADspCompilerAnnotation = pCompilerAnnotationList->GetItem( i ); pApp->PrintText( tabConsole, "================================================================================" ); sprintf( szBuffer, "File Name: %s", (char *) pADspCompilerAnnotation->FileName ); pApp->PrintText( tabConsole, szBuffer ); sprintf( szBuffer, "Line: %d", pADspCompilerAnnotation->Line ); pApp->PrintText( tabConsole, szBuffer ); sprintf( szBuffer, "Column: %d", pADspCompilerAnnotation->Column ); pApp->PrintText( tabConsole, szBuffer ); switch ( pADspCompilerAnnotation->Type ) { case compilerAnnotationsTypeInfo: sprintf( szBuffer, "[info] %s", (char *) pADspCompilerAnnotation->Text ); break; case compilerAnnotationsTypeAdvice: sprintf( szBuffer, "[advice] %s", (char *) pADspCompilerAnnotation->Text ); break; case compilerAnnotationsTypeFailure: sprintf( szBuffer, "[failure] %s", (char *) pADspCompilerAnnotation->Text ); break; default: sprintf( szBuffer, "[unknown] %s", (char *) pADspCompilerAnnotation->Text ); break; } pApp->PrintText( tabConsole, szBuffer ); } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim annotation_list As ADspCompilerAnnotationList Dim annotation As ADspCompilerAnnotation Dim processor As ADspProcessor Set app = CreateObject( "VisualDSP.ADspApplication" ) Set session = app.ActiveSession Set processor = session.ProcessorList( 0 ) Set annotation_list = processor.HardwareStackList For Each annotation In annotation_list app.PrintText tabConsole, "Name = " + hardware_stack.Name _ + " Width = " + CStr( hardware_stack.Width ) _ + " Depth = " + CStr(hardware_stack.Depth) app.PrintText tabConsole, _ "================================================================================" app.PrintText tabConsole, "File Name: " + annotation.FileName app.PrintText tabConsole, "Line : " + cstr(annotation.Line) app.PrintText tabConsole, "Column : " + cstr(annotation.Column) If (annotation.Type = 0) Then app.PrintText tabConsole, "[info]" + " " + annotation.Text Elseif (annotation.Type = 1) Then app.PrintText tabConsole, "[advice]" + " " + annotation.Text Elseif (annotation.Type = 2) Then app.PrintText tabConsole, "[failure]" + " " + annotation.Text Else app.PrintText tabConsole, "[unknown]" + " " + annotation.Text End if Next
Объект позволяет плагинам VisualDSP++ добавлять свои собственные пункты в контекстное меню, которое всплывает по правому клику на окне плагина. Следующий пример демонстрирует добавление пользовательских пунктов в контекстное меню. C++/ATL: STDMETHODIMP CPlugin::ExtendContextMenu( LPDISPATCH pIADspContextMenu ) { // IDDE вызовет этот метод автоматически, когда пользователь сделает // правый клик в окне плагина. Это дает возможность добавить любые // пункты в контекстное меню. try { IADspContextMenuPtr pMenu = pIADspContextMenu; pMenu->AddMenu( "My Menu", ID_MY_MENU, TRUE, TRUE ); pMenu->AddMenu( "SEPARATOR", 0, FALSE, FALSE ); pMenu->AddMenu( "SubMenu:My Menu 2", ID_MY_MENU2, FALSE TRUE ); } catch( _com_error err ) { ASSERT( !"Failed to add context menu" ); } return( S_OK );
}
МетодыОбъект предоставляет способ создать файл ядра (core file) для процессора, и загрузить этот файл ядра в процессор, связанный с ним. Имейте в виду, что этот объект реализован во внешнем dll-файле CoreFileSupport.dll, который находится в папке System каталога установки системы VisualDSP++, не напрямую в IDDE. Если Вы используете окружение разработки, которое требует библиотеку типов (например, C++ или .NET), то должны указать на эту библиотеку вместо Idde.exe. Обратите внимание, что ссылка на этот объект должна быть получена из свойства PluginList объекта ADspApplication, как это показано в примерах ниже. Следующий пример демонстрирует создание файла ядра для процессора, который может быть загружен впоследствии. C++/ATL: IADspApplicationPtr pApp( "VisualDSP.ADspApplication" ); IADspCoreFilePluginPtr pCfsPlugin = pApp->PluginList->GetItem("Core File Support")->Open(); IADspCoreFileManagerPtr pMgr = pCfsPlugin->CoreFileManager("ADSP-BF537"); pMgr->Save("H:\\Test\\adsp-bf537.core"); VBScript: set app = CreateObject("VisualDSP.ADspApplication") set cfs = app.PluginList.Item("Core File Support").Open() set mgr = cfs.CoreFileManager("ADSP-BF537") mgr.Save("H:\Test\adsp-bf537.core") СвойстваExecutableFileName Методы[ADspCoreFileMemoryBlock] Объект представляет блок памяти, предназначенный для записи в файл ядра. СвойстваEndAddress [ADspCoreFileMemoryBlockList] Объект представляет коллекцию объектов ADspCoreFileMemoryBlock. Объект позволяет добавлять, удалять и получать список объектов блоков памяти. СвойстваМетодыПример ниже демонстрирует создание файла ядра для процессора, который может быть позже загружен в процессор. C++/ATL: IADspApplicationPtr pApp( "VisualDSP.ADspApplication" ); IADspCoreFilePluginPtr pCfsPlugin = pApp->PluginList->GetItem("Core File Support")->Open(); IADspCoreFileManagerPtr pMgr = pCfsPlugin->CoreFileManager("ADSP-BF537"); IADspCoreFileMemoryBlockPtr pMemBlock( "CoreFileSupport.ADspCoreFileMemoryBlock" ); pMemBlock->StartAddress = 0xffa10000; pMemBlock->EndAddress = 0xffa13fff; pMemBlock->Name = "my code"; pMemBlock->MemoryType = "BLACKFIN Memory"; pMgr->MemoryBlockList->Add(pMemBlock); pMgr->Save("H:\\Test\\adsp-bf537.core"); VBScript: set app = CreateObject("VisualDSP.ADspApplication") set cfs = app.PluginList.Item("Core File Support").Open() set mgr = cfs.CoreFileManager("ADSP-BF537") set mem_block = CreateObject("CoreFileSupport.ADspCoreFileMemoryBlock") mem_block.StartAddress = &hffa10000 mem_block.EndAddress = &hffa13fff mem_block.Name = "my code" mem_block.MemoryType = "BLACKFIN Memory" set mem_list = mgr.MemoryBlockList mem_list.Add(mem_block) mgr.Save("H:\Test\adsp-bf537.core") Объект представляет сессию отладки. Он содержит информацию о цели отладки (target), платформе и процессорах, которые подключены к IDDE. При этом используется доступ к списку процессоров и групп MP (если они имеются). В следующем примере подразумевается, что у Вас имеется установленный симулятор SHARC, и демонстрируется создание сессии симулятора SHARC с одним процессором ADSP-21065L. C++/ATL: IADspApplicationPtr pApp;
pApp.CreateInstance( "VisualDSP.ADspApplication" );
try { IADspDebugSessionPtr pSession = pApp->CreateSession("My Session Name", "ADSP-2106x Family Simulator", "ADSP-2106x Simulator", "ADSP-21065L" ); } catch ( _com_error err ) { pApp->PrintText( tabConsole, "CreateSession failed" ); } Visual Basic: Dim app As Application Dim session As ADspDebugSession Set app = CreateObject( "VisualDSP.ADspApplication" ) On Error Resume Next Set session = app.CreateSession( "My Session Name", _ "ADSP-2106x Family Simulator", _ "ADSP-2106x Simulator", _ "ADSP-21065L" ) If (session Is Nothing) Then app.PrintText tabConsole, "CreateSession failed" End If СвойстваActiveProcessor МетодыСобытия[ADspDebugTarget] Объект представляет установленную цель отладки (debug target). Он позволит Вам получить её имя или список платформ. Debug target это канал взаимодействия между средой VisualDSP++ и процессором DSP (или группой процессоров DSP). Понятие "target" включает в себе симуляторы, эмуляторы и платы разработчика EZ-KIT. В системе может быть установлено несколько target. Цели симулятора (simulator target), такие как ADSP-219x Family Simulator, отличаются от целей эмулятора (emulator target) тем, что в цели симулятора процессор присутствует только в программной модели. ADSP-21xxx JTAG Emulator обменивается с одним или большим количеством физических устройств через шину PCI хоста PC. ADSP-21xxx Trek-ICE Emulator осуществляет обмен с устройством через сеть TCP/IP. Другие современные эмуляторы наподобие ICE-100B, ICE-1000 обмениваются данными с хостом PC через интерфейс USB. Свойства[ADspDebugTargetList] Объект представляет набор установленных в системе debug target. СвойстваСледующий пример демонстрирует вывод в окне консоли списка установленных debug target. C++/ATL: IADspApplicationPtr pApp;
pApp.CreateInstance( "VisualDSP.ADspApplication" );
// Получение списка установленных в целей отладки (debug target): IADspDebugTargetListPtr pDebugTargetList = pApp->DebugTargetList; // Проход по списку целей отладки и отображение имени каждого:
for ( long i = 0; i < pDebugTargetList->Count; i++ ) { IADspDebugTargetPtr pDebugTarget = pDebugTargetList->GetItem( i ); pApp->PrintText( tabConsole, pDebugTarget->Name ); } Visual Basic: Dim app As Application Dim debug_target_list As ADspDebugTargetList Dim debug_target As ADspDebugTarget Set app = CreateObject( "VisualDSP.ADspApplication" ) Rem Получение списка установленных в целей отладки (debug target):
Set debug_target_list = app.DebugTargetList Rem Проход по списку целей отладки и отображение имени каждого:
For Each debug_target In debug_target_list app.PrintText tabConsole, debug_target.Name Next
[ADspDocument] Объект представляет открытый документ (обычно это модуль исходного кода). Это позволяет клиенту перейти на строку и столбец документа по номеру, редактировать текст, сохранить текст в файл, вывести текст на печать или закрыть документ. СвойстваApplication МетодыActivate [ADspDocuments] Объект представляет список открытых в настоящий момент документов. Это дает клиенту возможность просмотра списка документов, создать новый документ, или закрыть все документы. СвойстваApplication МетодыСобытияOnDocumentAdded Следующий пример демонстрирует печать в окне консоли списка открытых документов. C++/ATL: IADspApplicationPtr pApp; pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDocumentsPtr pDocumentList = pApp->Documents; for ( long i = 0; i < pDocumentList->Count; i++ ) { IADspDocumentPtr pDocument = pDocumentList->GetItem( i ); pApp->PrintText( tabConsole, pDocument->Name ); } Visual Basic: Dim app As Application Dim document_list As ADspDocuments Dim document As ADspDocument Set app = CreateObject( "VisualDSP.ADspApplication" ) Set document_list = app.Documents For Each document In document_list app.PrintText tabConsole, document.Name Next
Объект позволяет получить доступ к некоторым полезным свойствам плагина программатора flash (flash programmer plug-in), что позволяет пользователю изменять содержимое памяти flash процессора. Обратите внимание, что этот объект реализован во внешнем dll-файле WmFlashProgrammer.dll, находящемся в папке System каталога установки VisualDSP, а не напрямую в самой IDDE. Если Вы используете окружение разработки, которое требует библиотеку типов (например, C++ или .NET) то Вы должны сослаться на этот dll-файл вместо Idde.exe. Имейте в виду, что ссылка на этот объект должна быть получена из свойства PluginList объекта ADspApplication, как это показано в следующих примерах. МетодыCompareFlashWithFile Следующие примеры демонстрируют методы LoadDriver, EraseAll, LoadFile, EraseBlock, FillFlash, CompareFlashWithFile и SendCustom. C++/ATL: // test.cpp: определяет точку входа в консольное приложение.
//
// Как использовать: передайте начальный адрес для дампа памяти, и количество
// ячеек в формате HEX (без префикса 0x)
#include "stdafx.h"
#define _SAFP_
#ifdef _SAFP_
#import "C:\Program Files\Analog Devices\VisualDSP 4.5\System\WmSAFP.dll" named_guids no_namespace
#else
#import "C:\Program Files\Analog Devices\Visualdsp 4.5\System\WmFlashProgrammer.dll" named_guids no_namespace
#endif
#define Driver _T("C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\Blackfin\\Examples\\ADSP-BF537 EZ-Kit Lite
\\Flash Programmer\\BF537EzFlashDriver.dxe")
#define Ldr _T("C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\Blackfin\\Examples\\ADSP-BF537 EZ-Kit Lite
\\Power_On_Self_Test\\1000320_AA0188-2004_M29W320DB_U24.ldr")
#define Config _T("C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\BF537_SAFP_config.ini")
int _tmain(int argc, _TCHAR* argv[]) { // Инициализация библиотек COM: CoInitialize( NULL ); USES_CONVERSION; _bstr_t bstrDriverPath = Driver; _bstr_t bstrLdrFile = Ldr; _bstr_t bstrConfigFile = Config; int VerifyWhileWriting = 0x1; unsigned long ulBlock66Start = 0x3F0000; unsigned short sMAC_Address[3];// Mac address values long lCount = 0x1; short sStride = 0x1; // Назначение MAC-адреса: sMAC_Address[0] = 0xE000; sMAC_Address[1] = 0xFE22; sMAC_Address[2] = 0x3412; #ifdef _SAFP_ IADspSAFPPtr pFlashProg("VisualDSP.ADspSAFP"); // Установка файла конфигурации: pFlashProg->put_ConfigFile(bstrConfigFile); #else IADspApplicationPtr pApp("VisualDSP.ADspApplication"); IADspPluginPtr pFlashPlugin = pApp->PluginList->GetItem("Flash Programmer"); IADspFlashProgrammerPtr pFlashProg = pFlashPlugin->Open(); #endif
// Загрузка драйвера: printf("Start: Loading the flash programmer driver...\n"); HRESULT hr = pFlashProg->LoadDriver(bstrDriverPath.GetBSTR()); if( hr != S_OK ) { printf("Failed Loading Driver"); return 1; } printf("Done: Loading the flash programmer driver...\n\n"); // Загрузка файла в формате Intel Hex: printf("Start: Loading POST ldr file...\n"); hr = pFlashProg->LoadFile(bstrLdrFile.GetBSTR(), formatIntelHex, VerifyWhileWriting, eraseAffected, 0x0 ); if( hr != S_OK ) { printf("Failed Loading Ldr file."); return 1; } printf("Done: Loading POST ldr file...\n\n"); printf("Start: Comparing POST ldr file to the flash contents...\n"); hr = pFlashProg->CompareFlashWithFile(bstrLdrFile.GetBSTR(), formatIntelHex, 0x0); if( hr != S_OK ) { printf("Ldr file did not match the contents of flash."); return 1; } printf("Done: Comparing POST ldr file to the flash contents...\n\n"); try { // Стирание блока с MAC-адресом: printf("Start: Erasing block that contains the MAC address...\n"); hr = pFlashProg->EraseBlock(70); if( hr != S_OK ) { printf("Failed erasing sector."); return 1; } printf("End: Erasing block that contains the MAC address...\n\n"); } catch(...) { printf("Make sure the sector number is correct and not write protected.\n"); return -1; } // Запись нашего MAC-адреса: printf("Start: Writing MAC address...\n"); pFlashProg->FillFlash( ulBlock66Start, lCount, sStride, sMAC_Address[0] ); if( hr != S_OK ) { printf("Failed filling flash."); return 1; } pFlashProg->FillFlash( (ulBlock66Start + 2), lCount, sStride, sMAC_Address[1] ); if( hr != S_OK ) { printf("Failed filling flash."); return 1; } pFlashProg->FillFlash( (ulBlock66Start + 4), lCount, sStride, sMAC_Address[2] ); if( hr != S_OK ) { printf("Failed filling flash."); return 1; } printf("End: Writing MAC address...\n"); #ifndef _SAFP_ pFlashPlugin->Close(pFlashProg); #endif
printf("Done.\n"); return 0; } Visual Basic: '//////////////////////////////////////////////////////////////////////////////
'// Основное приложение
'//////////////////////////////////////////////////////////////////////////////
Const SAFP = 1 Const CONFIG_FILE = "C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\BF537_SAFP_config.ini" Const DRIVER_FILE = "C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\Blackfin\\Examples \\ADSP-BF537 EZ-Kit Lite\\Flash Programmer\\BF537EzFlashDriver.dxe" Const LDR_FILE = "C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\Blackfin\\Examples \\ADSP-BF537 EZ-Kit Lite\\Power_On_Self_Test\\1000320_AA0188-2004_M29W320DB_U24.ldr" Dim FileFormat
Dim VerifyWhileWriting
Dim EraseOption
Dim StartAddress
FileFormat = 0 ' формат Intel HEX VerifyWhileWriting = 1 ' проверить память после записи EraseOption = 0 ' стирать только задействованные сектора памяти StartAddress = 0 ' этот параметр игнорируется для Intel HEX if SAFP Then Set pFlash = CreateObject("VisualDSP.ADspSAFP") ' Установка файла конфигурации: wscript.Echo "Setting config file..." pFlash.ConfigFile = CONFIG_FILE Else Set app = CreateObject("VisualDSP.ADspApplication") Set plugin = app.PluginList.Item("Flash Programmer") Set pFlash = plugin.Open() End If ' Загрузка драйвера: wscript.Echo "Loading driver..." pFlash.LoadDriver DRIVER_FILE ' Стирание блока: wscript.Echo "Erasing Block 0..." pFlash.EraseBlock 0 ' Загрузка ldr-файла wscript.Echo "Load the LDR file..." pFlash.LoadFile LDR_FILE, FileFormat, VerifyWhileWriting, EraseOption, StartAddress if SAFP = 0 Then plugin.Close pFlash End If wscript.Echo "Done."
JScript: //////////////////////////////////////////////////////////////////////////////
// Основное приложение
//////////////////////////////////////////////////////////////////////////////
////////////////////////////////
// Определение переменных
var SAFP = 1; // Установка пути до файла конфигурации, драйвера и LDR-файла
var ConfigFile = "C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\BF537_SAFP_config.ini"; var DriverFile = "C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\Blackfin\\Examples \\ADSP-BF537 EZ-Kit Lite\\Flash Programmer\\BF537EzFlashDriver.dxe";
var LdrFile = "C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\Blackfin\\Examples \\ADSP-BF537 EZ-Kit Lite\\Power_On_Self_Test\\1000320_AA0188-2004_M29W320DB_U24.ldr";
var FileFormat = 0; // формат Intel HEX var VerifyWhileWriting = 1; // выполнить проверку после записи var EraseOption = 0; // стирать только задействованные сектора var StartAddress = 0; // этот параметр игнорируется для Intel HEX if( SAFP ) { // Получить объект SAFP var pFlash = new ActiveXObject( "VisualDSP.ADspSAFP" ); // Установить файл конфигурации: WScript.Echo("Setting config file..."); pFlash.ConfigFile = ConfigFile; } else { // Получить объект VDSP: var app = new ActiveXObject( "VisualDSP.ADspApplication" ); var plugin = app.PluginList.Item("Flash Programmer"); var pFlash = plugin.Open(); } // Загрузить драйвер: WScript.Echo("Loading driver..."); pFlash.LoadDriver(DriverFile); // Стереть первый блок: WScript.Echo("Erasing sector 0..."); pFlash.EraseBlock(0); // Загрузка LDR-файла: WScript.Echo("Loading the LDR file..."); pFlash.LoadFile(LdrFile, FileFormat, VerifyWhileWriting, EraseOption, StartAddress); if( !SAFP ) { plugin.Close(pFlash); } WScript.Echo("Done.");
Python: import win32com.client #/////////////////////////////////////////////////////////////////////////////
#// def main()
#/////////////////////////////////////////////////////////////////////////////
if __name__ == '__main__': SAFP = 1 MacAddressBlock = 66 # 66 для части DB и 70 для части EB bEraseAll = 0 # 0 - стереть сектор, 1 - стереть все MAC_Address = [ 0xE000, 0xFE22, 0x3412 ] # значение MAC-адреса DriverPath = "C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\Blackfin\\Examples \\ADSP-BF537 EZ-Kit Lite\\Flash Programmer\\BF537EzFlashDriver.dxe" LdrPath = "C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\Blackfin\\Examples \\ADSP-BF537 EZ-Kit Lite\\Power_On_Self_Test\\1000320_AA0188-2004_M29W320DB_U24.ldr" ConfigFile = "C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\BF537_SAFP_config.ini" # Параметры для программирования файла EraseOption = 0x0 FileFormat = 0x0 VerifyWhileWriting = 0x1 if ( SAFP == 1 ): pFlash = win32com.client.Dispatch("VisualDSP.ADspSAFP") #### # Первое, что всегда надо сделать: установить наш файл конфигурации #### print 'Setting config File.' pFlash.ConfigFile = ConfigFile else: app = win32com.client.Dispatch("VisualDSP.ADspApplication") plugin = app.PluginList.Item("Flash Programmer") pFlash = plugin.Open() ####
# Загрузка драйвера программатора (flash programmer driver)
####
print 'Loading flash driver.' pFlash.LoadDriver( DriverPath ) ####
# Выполнить стирание:
####
if ( bEraseAll == 1 ): print 'Erase all of flash.' pFlash.EraseAll() else: print 'Erase block 0' pFlash.EraseBlock( 0 ) ####
# Запись нашего файла во flash:
####
print 'Loading file to flash' pFlash.LoadFile( LdrPath, FileFormat, VerifyWhileWriting, EraseOption, 0 ) ####
# Сравнение нашего файла с содержимым flash:
####
print 'Comparing file with flash' pFlash.CompareFlashWithFile( LdrPath, FileFormat, 0 ) ####
# Теперь запрограммируем MAC-адрес:
####
print 'Erase sector containing the MAC Address' pFlash.EraseBlock( 66 ) print 'Write our MAC address to flash' pFlash.FillFlash( 0x3F0000, 1, 1, MAC_Address[0] ) pFlash.FillFlash( 0x3F0002, 1, 1, MAC_Address[1] ) pFlash.FillFlash( 0x3F0004, 1, 1, MAC_Address[2] ) ####
# Команда, отправляемая здесь, должна вызвать сброс:
####
print 'Send a custom command' pFlash.SendCustom( 2 ) if ( SAFP == 0 ): plugin.Close( pFlash ) print 'Done' [ADspFunction] Объект представляет функцию на языке высокого уровня, загруженную в настоящий момент в память процессора. СвойстваName [ADspFunctionList] Этот объект представляет собой коллекцию объектов ADspFunction. СвойстваСледующий пример демонстрирует печать списка функций в окне консоли. C++/ATL: USES_CONVERSION; TCHAR szText[1024]; IADspApplicationPtr pApp( "VisualDSP.ADspApplication" ); IADspProcessorPtr pProc = pApp->ActiveSession->ActiveProcessor; IADspMemoryTypePtr pMem = pProc->MemoryTypeList->GetItem( long(0) ); IADspFunctionListPtr pList = pMem->FunctionList; for( long i=0; i < pList->Count; i++ ) { IADspFunctionPtr pFunction = pList->GetItem(i); sprintf( szText, "\n Function Name: %s\n" " FileName: %s(%d)\n" " Function Start: 0x%08x\n" " Body Start: 0x%08x\n" " Body End: 0x%08x\n" " Function End: 0x%08x\n" " Memory Type: %s", OLE2A(pFunction->Name), OLE2A(pFunction->FileName), pFunction>Line, pFunction>StartOfFunction, pFunction>StartOfBody, pFunction>EndOfBody, pFunction>EndOfFunction, OLE2A(pFunction->MemoryType->Name) ); pApp>PrintText( tabConsole, szText ); } Visual Basic: Dim app As Application Dim mem As ADspMemoryType Dim func As ADspFunction Set app = CreateObject("VisualDSP.ADspApplication") Set mem = app.ActiveSession.ActiveProcessor.MemoryTypeList(0) For Each func In mem.FunctionList app.PrintText tabConsole, vbCrLf & " Function Name: " & func.Name app.PrintText tabConsole, " FileName: " & func.FileName & "(" & str(func.Line) & ")" app.PrintText tabConsole, " Function Start: " & Hex(func.StartOfFunction) app.PrintText tabConsole, " Body Start: " & Hex(func.StartOfBody) app.PrintText tabConsole, " Body End: " & Hex(func.EndOfFunction) app.PrintText tabConsole, " Function End: " & Hex(func.EndOfBody) app.PrintText tabConsole, " Memory Type: " & func.MemoryType.Name Next
[ADspHardwareStack] Объект представляет аппаратный стек (hardware stack) наподобие стека программного счетчика (PC stack), стека цикла (loop stack), и. т. д. СвойстваМетодыСледующий пример демонстрирует получение содержимого стека PC и отображение его в окне консоли. C++/ATL: IADspApplicationPtr pApp; pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspProcessorPtr pProcessor = pSession->ProcessorList->GetItem( CComVariant( 0 ) ); IADspHardwareStackListPtr pHardwareStackList = pProcessor->HardwareStackList; if ( NULL == pHardwareStackList ) { pApp->PrintText( tabConsole, "Target does not support hardware stacks" ); } else { try { IADspHardwareStackPtr pHardwareStack = pHardwareStackList->GetItem( "PC Stack" ); if ( 0 == pHardwareStack->StackPointer ) { pApp->PrintText( tabConsole, "PC Stack is empty" ); } else { IADspValueListPtr pValueList = pHardwareStack->GetStack(); for ( long i = 0; i < pHardwareStack->StackPointer; i++ ) { IADspValuePtr pValue = pValueList->GetItem( i ); pApp->PrintText( tabConsole, pValue->ToString( "Hexadecimal" ) ); } } } catch ( _com_error err ) { pApp->PrintText( tabConsole, "Processor doesn't have a stack named \"PC Stack\"" ); } } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim processor As ADspProcessor Dim hardware_stack_list As ADspHardwareStackList Dim hardware_stack As ADspHardwareStack Dim value_list As ADspValueList Dim value As ADspValue Set app = CreateObject( "VisualDSP.ADspApplication" ) Set session = app.ActiveSession Set processor = session.ProcessorList( 0 ) Set hardware_stack_list = processor.HardwareStackList If (hardware_stack_list Is Nothing) Then app.PrintText tabConsole, "Target does not support hardware stacks" Else On Error GoTo GetItemFailed Set hardware_stack = hardware_stack_list( "PC Stack" ) If ( hardware_stack.StackPointer = 0 ) Then app.PrintText tabConsole, "PC Stack is empty" Else Set value_list = hardware_stack.GetStack For i = 0 To hardware_stack.StackPointer - 1 Set value = value_list( i ) app.PrintText tabConsole, value.ToString( "Hexadecimal" ) Next End If End If Exit Sub GetItemFailed: app.PrintText tabConsole, "Processor doesn't have a stack named ""PC Stack"""
[ADspHardwareStackList] Объект представляет набор аппаратных стеков, поддерживаемых процессором. СвойстваПример ниже выводит список аппаратных стеков и их свойства в окно консоли. C++/ATL: IADspApplicationPtr pApp;
TCHAR szBuffer[128];
pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspProcessorPtr pProcessor = pSession->ProcessorList->GetItem( CComVariant( 0 ) ); IADspHardwareStackListPtr pHardwareStackList = pProcessor->HardwareStackList; if ( NULL == pHardwareStackList ) { pApp->PrintText( tabConsole, "Target does not support hardware stacks" ); } else { for ( long i = 0; i < pHardwareStackList->Count; i++ ) { IADspHardwareStackPtr pHardwareStack = pHardwareStackList->GetItem( i ); sprintf( szBuffer, "Name = %s Width = %ld Depth = %ld", (char *) pHardwareStack->Name, pHardwareStack->Width, pHardwareStack->Depth ); pApp->PrintText( tabConsole, szBuffer ); } } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim hardware_stack_list As ADspHardwareStackList Dim hardware_stack As ADspHardwareStack Dim processor As ADspProcessor Set app = CreateObject( "VisualDSP.ADspApplication" ) Set session = app.ActiveSession Set processor = session.ProcessorList( 0 ) Set hardware_stack_list = processor.HardwareStackList If (hardware_stack_list Is Nothing) Then app.PrintText tabConsole, "Target does not support hardware stacks" Else For Each hardware_stack In hardware_stack_list app.PrintText tabConsole, _ "Name = " + hardware_stack.Name + _ " Width = " + CStr( hardware_stack.Width ) + _ " Depth = " + CStr(hardware_stack.Depth) Next End If Этот объект представляет плагин Image Viewer. Он используется для отображения растра графики (pixel data), которая сохранена в памяти процессора DSP. Пиксельные форматы включают поддержку Grayscale, RGB и YUV. Для дополнительной информации обратитесь к Image Viewer online help. Имейте в виду, что этот объект реализован во внешнем dll-файле ImageViewer.dll, находящимся в папке System каталога установки VisualDSP, не напрямую в IDDE. Если Вы используете среду разработки, которая требует библиотеку типов (C++ или .NET например), то должны указать этот библиотечный файл вместо Idde.exe. Обратите внимание, что этот объект должен быть получен из свойства PluginList объекта ADspApplication, как это показано в примерах ниже. Следующий пример демонстрирует загрузку картинки из файла и запись пиксельных данных в память процессора DSP. C++/ATL: try { IADspApplicationPtr pApp("VisualDSP.ADspApplication"); pApp->Interactive = FALSE; IADspPluginPtr pImageViewerPlugin = pApp->PluginList->GetItem("ImageViewer"); IADspImageViewerPtr pImageViewer = pImageViewerPlugin->Open(); pImageViewer->SourceLocation = sourceLocationFile; pImageViewer->WriteStream = FALSE; CComVariant var = "Blackfin Memory"; pImageViewer->put_MemoryType(var); pImageViewer->StartAddress = "0xF0000000"; pImageViewer->LoadImageFile("C:\\test.bmp"); pApp.Release(); } catch( _com_error err ) { AfxMessageBox("test failed"); } Visual Basic: Set App = CreateObject("VisualDSP.ADspApplication") App.Interactive = False Set ImageViewerPlugin = App.PluginList("ImageViewer") Set ImageViewer = ImageViewerPlugin.Open() ImageViewer.SourceLocation = sourceLocationFile ImageViewer.WriteStream = False ImageViewer.MemoryType = "Blackfin Memory" ImageViewer.StartAddress = "0xF0000000" ImageViewer.LoadImageFile ("C:\\test.bmp") СвойстваAutoRefreshEnable МетодыCopyImage [ADspInterrupt] Объект представляет прерывание процессора. СвойстваName [ADspInterruptList] Объект представляет набор прерываний процессора. Позволяет просмотреть список этих прерываний. СвойстваСледующий пример демонстрирует вывод прерываний и их свойств в окно консоли. C++/ATL: IADspApplicationPtr pApp;
TCHAR szBuffer[128];
pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspProcessorPtr pProcessor = pSession->ProcessorList->GetItem( CComVariant( 0 ) ); IADspInterruptListPtr pInterruptList = pProcessor->InterruptList; for ( long i = 0; i < pInterruptList->Count; i++ ) { IADspInterruptPtr pInterrupt = pInterruptList->GetItem( i ); sprintf(szBuffer, "Interrupt Name=%s Enabled=%d Min Cycles=%ld Max Cycles=%ld Delay Cycles=%ld", (char *)pInterrupt->Name, pInterrupt->Enabled, pInterrupt->MinCycles, pInterrupt->MaxCycles, pInterrupt->DelayCycles ); pApp->PrintText( tabConsole, szBuffer ); } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim interrupt_list As ADspInterruptList Dim interrupt As ADspInterrupt Dim processor As ADspProcessor Set app = CreateObject( "VisualDSP.ADspApplication" ) Set session = app.ActiveSession Set processor = session.ProcessorList( 0 ) Set interrupt_list = processor.InterruptList For Each interrupt In interrupt_list app.PrintText tabConsole, _ "Interrupt Name = " + interrupt.Name + _ " Enabled = " + CStr( interrupt.Enabled ) + _ " Min Cycles = " + CStr( interrupt.MinCycles ) + _ " Max Cycles = " + CStr( interrupt.MaxCycles ) + _ " Delay Cycles = " + CStr( interrupt.DelayCycles ) Next
[ADspMemorySegment] Объект представляет сегмент в карте памяти процессора. Если никакая программа не загружена, то карту памяти представляет вся доступная память процессора. Если программа загружена, то карта памяти это карта (map), определенная в секции MEMORY файла .LDF программы. СвойстваAccessType [ADspMemorySegmentList] Объект представляет набор объектов сегментов памяти. Он позволяет просмотреть карту памяти процессора. СвойстваСледующий пример демонстрирует вывод списка сегментов и их свойств в окно консоли. C++/ATL: IADspApplicationPtr pApp;
TCHAR szBuffer[256];
pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspProcessorPtr pProcessor = pSession->ProcessorList->GetItem( CComVariant( 0 ) ); IADspMemorySegmentListPtr pMemorySegmentList = pProcessor->MemorySegmentList; for ( long i = 0; i < pMemorySegmentList->Count; i++ ) { IADspMemorySegmentPtr pMemorySegment = pMemorySegmentList->GetItem( i ); sprintf( szBuffer, "Name=%s MemoryType=%s StartAddress=0x%lx EndAddress=0x%lx AccessType=%d", (char *) pMemorySegment->Name, (char *) pMemorySegment->MemoryType->Name, pMemorySegment->StartAddress, pMemorySegment->EndAddress, pMemorySegment->AccessType ); pApp->PrintText( tabConsole, szBuffer ); } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim memory_segment_list As ADspMemorySegmentList Dim memory_segment As ADspMemorySegment Dim processor As ADspProcessor Set app = CreateObject( "VisualDSP.ADspApplication" ) Set session = app.ActiveSession Set processor = session.ProcessorList( 0 ) Set memory_segment_list = processor.MemorySegmentList For Each memory_segment In memory_segment_list app.PrintText tabConsole, _ "Name = " + memory_segment.Name + _ " Memory Type = " + memory_segment.MemoryType.Name + _ " Start Address = 0x" + Hex( memory_segment.StartAddress ) + _ " End Address = 0x" + Hex( memory_segment.EndAddress ) + _ " Access Type = " + CStr(memory_segment.AccessType) Next
[ADspMemoryType] Объект представляет тип памяти, поддерживаемый процессором. Он позволяет читать, записывать и заполнять блок памяти. Примеры типов памяти включают "Program Memory (PM)" (память программы) и "Data Memory (DM)" (память данных). СвойстваConvertTypeWidth МетодыDumpMemoryToBinaryFile Следующий пример демонстрирует чтение памяти в процессоре и отображение прочитанного содержимого памяти в окне консоли. C++/ATL: IADspApplicationPtr pApp; pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspProcessorPtr pProcessor = pSession->ProcessorList->GetItem( CComVariant( 0 ) ); IADspMemoryTypeListPtr pMemoryTypeList = pProcessor->MemoryTypeList; try { IADspMemoryTypePtr pMemoryType = pMemoryTypeList->GetItem( "Data(DM) Memory" ); try { IADspValueListPtr pValueList=pMemoryType->GetMemory(0x30000, // начальный адрес 10, // количество ячеек 1 ); // шаг for ( long i = 0; i < pValueList->Count; i++ ) { IADspValuePtr pValue = pValueList->GetItem( i ); pApp->PrintText( tabConsole, pValue->ToString( "Hexadecimal" ) ); } } catch ( _com_error err ) { pApp->PrintText( tabConsole, "GetMemory failed" ); } } catch ( _com_error err ) { pApp->PrintText( tabConsole, "Processor doesn't have memory named \"Data(DM) Memory\"" ); } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim processor As ADspProcessor Dim memory_type_list As ADspMemoryTypeList Dim memory_type As ADspMemoryType Dim value_list As ADspValueList Dim value As ADspValue Set app = CreateObject( "VisualDSP.ADspApplication" ) Set session = app.ActiveSession Set processor = session.ProcessorList( 0 ) Set memory_type_list = processor.MemoryTypeList On Error GoTo GetItemFailed Set memory_type = memory_type_list( "Data(DM) Memory" ) On Error GoTo GetMemoryFailed Set value_list = memory_type.GetMemory( &h30000, 10, 1 ) For Each value In value_list app.PrintText tabConsole, value.ToString( "Hexadecimal" ) Next Exit Sub
GetItemFailed: app.PrintText tabConsole, "Processor doesn't have memory named ""Data(DM) Memory"" Exit Sub GetMemoryFailed:
app.PrintText tabConsole, "GetMemory failed"
[ADspMemoryTypeList] Объект представляет набор типов памяти, поддерживаемых процессором. СвойстваМетодыСледующий пример демонстрирует вывод списка типов памяти и их свойств в окно консоли. C++/ATL: IADspApplicationPtr pApp;
TCHAR szBuffer[128];
pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspProcessorPtr pProcessor = pSession->ProcessorList->GetItem( CComVariant( 0 ) ); IADspMemoryTypeListPtr pMemoryTypeList = pProcessor->MemoryTypeList; for ( long i = 0; i < pMemoryTypeList->Count; i++ ) { IADspMemoryTypePtr pMemoryType = pMemoryTypeList->GetItem( i ); sprintf( szBuffer, "Name = %s Width = %ld", (char *) pMemoryType->Name, pMemoryType->Width ); pApp->PrintText( tabConsole, szBuffer ); } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim memory_type_list As ADspMemoryTypeList Dim memory_type As ADspMemoryType Dim processor As ADspProcessor Set app = CreateObject( "VisualDSP.ADspApplication" ) Set session = app.ActiveSession Set processor = session.ProcessorList( 0 ) Set memory_type_list = processor.MemoryTypeList For Each memory_type In memory_type_list app.PrintText tabConsole, "Name = " + memory_type.Name + _ " Width = " + CStr( memory_type.Width ) Next
Этот объект позволяет плагинам VisualDSP++ добавлять свои собственные пункты меню к меню IDDE, и получить состояние этих пунктов меню. Следующий пример демонстрирует добавление пользовательского меню к меню приложения. C++/ATL: IADspApplicationPtr pApp; short menuid;
pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspMenuManagerPtr pMenuManager = pApp->MenuManager; menuid=pMenuManager->AddMenuTail("&Tools:&My Menu Item", "This is a custom menu item."); Visual Basic: Dim app As Application Dim WithEvents menumanager As ADspMenuManager Dim menuid As Integer Set app = CreateObject( "VisualDSP.ADspApplication" ) Set menumanager = app.MenuManager menuid = menumanager.AddMenuTail( "&Tools:&My Menu Item", _ "This is a custom menu item." ) МетодыAddMenuAfter События[ADspMPGroup] Объект представляет группу Multiprocessor (MP). Группа MP это группа процессоров, которая может принимать команды MP наподобие MP run, MP step, MP halt, и т. д. СвойстваМетодыAddProcToGroup В следующем примере подразумевается, что текущая сессия мультипроцессорная, и здесь демонстрируется создание новой группы MP, добавление в неё имеющихся процессоров, выполнение шага для группы процессоров, и затем удаление этой группы. C++/ATL: ADspApplicationPtr pApp; pApp.CreateInstance( "VisualDSP.ADspApplication" );
try { IADspMPGroupPtr pMPGroup; IADspDebugSessionPtr pSession = pApp->ActiveSession; try { IADspMPGroupListPtr pMPGroupList = pSession->MPGroupList; if ( NULL == pMPGroupList) { pApp->PrintText( tabConsole, "Current session is not multiprocessor!" ); } else { pMPGroup = pMPGroupList->CreateMPGroup( "My Group Name" ); // Добавление всех доступных процессоров в группу: for (long i = 0; i < pSession->ProcessorList->Count; i++ ) { pMPGroup->AddProcToGroup( CComVariant( i ) ); } pMPGroup->MPStepAsm(); pMPGroupList->RemoveGroup( "My Group Name" ); } } catch ( _com_error err ) { pApp->PrintText( tabConsole, "CreateMPGroup failed" ); } } catch ( _com_error err ) { pApp->PrintText( tabConsole, "CreateMPSession failed" ); } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim group As ADspMPGroup Dim group_list As ADspMPGroupList Dim i As Integer Set app = CreateObject( "VisualDSP.ADspApplication" ) On Error Resume Next Set session = app.ActiveSession If (session Is Nothing) Then app.PrintText tabConsole, "CreateMPSession failed" Else Set group_list = session.MPGroupList If (group_list Is Nothing) Then app.PrintText tabConsole, "Current session is not multiprocessor!" Else On Error GoTo CreateMPGroupFailed Set group = group_list.CreateMPGroup( "My Group Name" ) Rem добавление всех доступных процессоров в группу For i=0 To session.ProcessorList.Count-1 group.AddProcToGroup i Next group.MPStepAsm group_list.RemoveGroup "My Group Name" End If End If Exit Sub CreateMPGroupFailed: app.PrintText tabConsole, "CreateMPGroup failed" [ADspMPGroupList] Этот объект представляет набор групп Multiprocessor (MP). Он позволяет просматривать список набора, добавлять в него группы MP, или удалять их. СвойстваМетодыСледующий пример предполагает, что текущая сессия многопроцессорная, и здесь демонстрируется вывод в окно консоли списка имен групп MP. C++/ATL: IADspApplicationPtr pApp; Visual Basic: Dim app As Application Else For Each mpgroup In mpgroup_list app.PrintText tabConsole, mpgroup.Name Next [ADspMPGroupInfo] Этот объект представляет информацию о мультипроцессорной группе Multiprocessor (MP), которая была ранее создана в сессии отладки. Объект позволяет получить информацию о группе MP наподобие имени и списка процессоров в группе. Свойства[ADspMPGroupInfoList] Объект представляет список информации о мультипроцессорных группах. СвойстваСледующий пример демонстрирует печать в окне консоли списка сессий и списка мультипроцессорных групп (если они есть) для каждой сессии. C++/ATL: IADspApplicationPtr pApp; TCHAR szBuffer[256]; Visual Basic: Dim app As Application Объект представляет окно вывода IDDE. Он позволяет печатать текст в окно на закладке (консоль console или окно результата сборки build window) разными цветами, получить содержимое окна закладки, получить/установить состояние видимости выходного окна, получить/установить активную закладку, и сливать события, которые оповещают клиентов о смене состояния окна закладок, когда это изменение произойдет. Следующий пример демонстрирует отображение "Hello World!" в окне закладки консоли. C++/ATL: IADspApplicationPtr pApp; IADspOutputWindowPtr pOutputWindow; Visual Basic: Dim app As Application СвойстваМетодыСобытияОбъект позволяет получить доступ к генерации данных PGO [2] во время работы цели отладки target (обычно это симулятор). Имейте в виду, что этот объект реализован во внешнем dll-файле PgoEngine.dll, размещенном в папке System каталога установки VisualDSP, и не напрямую в IDDE. Если Вы используете среду разработки, которая требует библиотеку типов (C++ или .NET например), то должны указать этот библиотечный файл вместо Idde.exe. Обратите внимание, что ссылка на этот объект должен быть получен из свойства PluginList объекта ADspApplication, как это показано в примерах ниже. Следующий пример демонстрирует загрузку программы и сбор данных PGO, которые можно позже передать обратно компилятору, чтобы расширить возможности оптимизации. C++/ATL: IADspApplicationPtr pApp( "VisualDSP.ADspApplication" ); IADspProcessorPtr pProcessor = pApp->ActiveSession->ActiveProcessor; IADspPgoPluginPtr pPgoPlugin = pApp->PluginList->GetItem("PGO Engine")->Open(); VBScript: Set app = CreateObject( "VisualDSP.ADspApplication" ) Свойства[ADspPlatform] Объект представляет платформу в debug target. Это позволяет получить информацию о платформе наподобие имени, списка процессоров, и информацию о том, поддерживает ли платформа многопроцессорность. Платформа относится к конфигурации процессоров DSP, с которой обменивается данными target. Для симуляции платформа это обычно один или несколько DSP одного и того же типа. Для эмуляции Вы указываете платформу с помощью конфигуратора VisualDSP++. Эта платформа может быть любой комбинацией устройств. Платформа представляет аппаратуру, в которой находится оно или большее количество устройств. Вы обычно определяете платформу для конкретной цели. СвойстваIsLicensed [ADspPlatformList] Объект представляет набор платформ определенной цели отладки (debug target). СвойстваСледующий пример показывает печать в окне консоли списка установленных целей отладки (debug target), платформ в каждой debug target, и свойства каждой платформы. C++/ATL: IADspApplicationPtr pApp; TCHAR szBuffer[128]; Visual Basic: Dim app As Application [ADspPlugin] Объект представляет зарегистрированный плагин VisualDSP++ plugin. Плагины это DLL, которые интегрированы с VisualDSP++ IDDE, и предоставляют расширенный функционал, путем отображения окон для пользователя или мониторинга и ответа на события системы (system events). Объект ADspPlugin позволяет клиенту прочитать информацию о плагине, которую он предоставляет, открыть и закрыть плагин, и обмениваться информацией с запущенным плагином через его собственные интерфейсы автоматизации (automation interface). СвойстваAllowMultipleInstances МетодыСобытияСледующий пример демонстрирует печать в окне консоли информации о текущих зарегистрированных плагинах. C++/ATL: USES_CONVERSION; Visual Basic: Dim app As Application [ADspPluginList] Объект представляет набор зарегистрированных в VisualDSP++ плагинов. СвойстваСледующий пример демонстрирует печать в окне консоли списка зарегистрированных плагинов. C++/ATL: IADspApplicationPtr pApp("VisualDSP.ADspApplication"); Visual Basic: Dim app As Application [ADspProcessor] Объект представляет процессор. Это позволяет получить доступ к регистрам, памяти, стекам и точкам останова процессора. Также объект позволит Вам управлять процессором с помощью операций шага (step), запуска на выполнение кода (run), остановки (halt) и сброса (reset). СвойстваBreakpointList МетодыEvaluateToLong СобытияOnFileLoadCanceled Следующий пример показывает загрузку программы в процессор и запуск её. C++/ATL: IADspApplicationPtr pApp; Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim processor As ADspProcessor [ADspProcessorList] Этот объект представляет список процессоров в текущей сессии отладки. Однопроцессорная сессия будет иметь один процессор в списке. В многопроцессорной сессии процессоров в списке будет несколько. СвойстваСледующий пример демонстрирует печать в окне консоли списка имен и типов всех процессоров в текущей сессии. C++/ATL: IADspApplicationPtr pApp;
TCHAR szBuffer[128];
pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspProcessorListPtr pProcessorList = pSession->ProcessorList; for ( long i = 0; i < pProcessorList->Count; i++ ) { IADspProcessorPtr pProcessor = pProcessorList->GetItem( i ); sprintf( szBuffer, "Name = %s Type = %s", (char *) pProcessor->Name, (char *) pProcessor->Type ); pApp->PrintText( tabConsole, szBuffer ); } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim processor_list As ADspProcessorList Dim processor As ADspProcessor Set app = CreateObject( "VisualDSP.ADspApplication" ) Set session = app.ActiveSession Set processor_list = session.ProcessorList For Each processor In processor_list app.PrintText tabConsole, "Name = " + processor.Name + _ " Type = " + processor.Type Next
[ADspProfileExecutionUnit] Объект представляет адрес, который обрабатывается профайлером. Это используется для получения результатов профайлинга по указанному адресу. СвойстваAddress МетодыGetMetricCount [ADspProfileExecutionUnitList] Объект представляет список объектов ADspProfileExecutionUnit. Он составляется программой профилировщика, и используется для получения результатов профайлинга для каждого адреса, который обрабатывается. Смена сессии профилировщика удаляет все объекты из этого списка. Объекты в этом списке также удаляются вызовом ClearProfileData. СвойстваМетодыПример: C++/ATL: IADspApplicationPtr pApp;
TCHAR szBuffer[300];
pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspProcessorPtr pProcessor = pSession->ProcessorList->GetItem( CComVariant( 0 ) ); IADspProfileSessionListPtr pProfileSessionList = pProcessor->ProfileSessionList; IADspProfileSessionPtr pProfileSession = pProfileSessionList->GetItem( CComVariant( 0 ) ); pProfileSession->MemoryName = pProfileSessionList->MemoryNames->Item(0); pProfileSession->FilterType = profileEntireMemory; pProfileSession->DebugSamplesOnly = TRUE; pProcessor->LoadProgram("C:\\test\\debug\\mytest.dxe"); pProcessor->Run(TRUE); IADspProfileExecutionUnitListPtr pExecutionUnitList = pProfileSession->ExecutionUnitList; for( long i = 0; i < pExecutionUnitList->Count; i++ ) { IADspProfileExecutionUnitPtr pExecutionUnit = pExecutionUnitList->GetItem(i); sprintf(szBuffer, "0x%x, %d", pExecutionUnit->Address, pExecutionUnit->SampleCount); pApp->PrintText( tabConsole, szBuffer ); } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim profile_session_list As ADspProfileSessionList Dim processor As ADspProcessor Dim profile_session As ADspProfileSession Dim execution_unit_list As ADspProfileExecutionUnitList Dim execution_unit As ADspProfileExecutionUnit Set app = CreateObject("VisualDSP.ADspApplication") Set session = app.ActiveSession Set processor = session.ProcessorList(0) Set profile_session_list = processor.ProfileSessionList Set profile_session = profile_session_list(0) profile_session.MemoryName = profile_session_list.MemoryNames(0) profile_session.DebugSamplesOnly = True profile_session.FilterType = profileEntireMemory processor.LoadProgram ("C:\testlab\generic\test\debug\testsave.dxe") processor.Run (True) processor.Run (True) Set execution_unit_list = profile_session.ExecutionUnitList For Each execution_unit In execution_unit_list app.PrintText tabConsole, "0x" + Hex(execution_unit.Address) + _ ", " + CStr(execution_unit.SampleCount) Next
[ADspProfileFunction] Объект представляет функцию. Он содержит имя функции, имя файла, начальный адрес, конечный адрес и счетчик выборок (sample count). StartAddress, EndAddress и SampleCount доступны только если объект находится в FunctionList сессии профайлинга, или в диапазоне FunctionList. СвойстваEndAddress МетодыGetMetricCount [ADspProfileFunctionList] Этот объект представляет список объектов ADspProfileFunction. ADspProfileFunctionList используется для выбора нужных функций для профайлинга, а также для получения результатов профайлинга функций. Смена сессии профайлинга удаляет все результаты профайлинга, сохраненные в объектах этого списка. Результаты профайлинга, сохраненные в этих объектах этого списка, также удаляются вызовом ClearProfileData. СвойстваArrayOfFunctions МетодыC++/ATL: IADspApplicationPtr pApp; TCHAR szBuffer[300]; Visual Basic: Dim app As Application [ADspProfileRange] Объект представляет диапазон адресов профайлинга. Он содержит начальный адрес, конечный адрес, счетчик выборок (sample count) и список функций, попадающих в этот диапазон адресов. FunctionList и SampleCount доступны только если объект находится в AddressRangeList. СвойстваEndAddress МетодыGetMetricCount [ADspProfileRangeList] Этот объект представляет список объектов ADspProfileRange. Он используется как для установки диапазонов профайлинга, так и получения результатов из этих диапазонов. Смена сессии профайлинга удаляет все результаты профайлинга, сохраненные в объектах списка. Результаты профайлинга, сохраненные в этом списке, также удаляются вызовом ClearProfileData. СвойстваArrayOfRanges МетодыC++/ATL: IADspApplicationPtr pApp;
TCHAR szBuffer[300];
pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspProcessorPtr pProcessor = pSession->ProcessorList->GetItem( CComVariant( 0 ) ); IADspProfileSessionListPtr pProfileSessionList = pProcessor->ProfileSessionList; IADspProfileSessionPtr pProfileSession = pProfileSessionList->GetItem( CComVariant( 0 ) ); pProfileSession->MemoryName = pProfileSessionList->MemoryNames->Item(0); pProfileSession->FilterType = profileRanges; pProfileSession->DebugSamplesOnly = TRUE; pProcessor->LoadProgram("C:\\test\\debug\\mytest.dxe"); IADspProfileRangeListPtr pRangeList = pProfileSession->AddressRangeList; IADspProfileRangePtr pProfileRange;
pProfileRange.CreateInstance( "VisualDSP.ADspProfileRange" );
IADspSymbolListPtr pSymbolList = pProcessor->MemoryTypeList->FindSymbol( "foo" ); long lStart = pSymbolList->GetItem(0)->Address; pProfileRange->StartAddress = lStart; pSymbolList = pProcessor->MemoryTypeList->FindSymbol( "main" ); pProfileRange->EndAddress = pSymbolList->GetItem(0)->Address; pRangeList->Add(pProfileRange);
pProfileRange.CreateInstance( "VisualDSP.ADspProfileRange" );
pProfileRange->StartAddress = lStart; pSymbolList = pProcessor->MemoryTypeList->FindSymbol( "bar" ); pProfileRange->EndAddress = pSymbolList->GetItem(0)->Address; pRangeList->Add(pProfileRange);
pProcessor->Run(TRUE);
for (long i = 0; i < pRangeList->Count; i++) { IADspProfileRangePtr pRange = pRangeList->GetItem(i); sprintf(szBuffer, "The range starts at 0x%x, ends at 0x%x, has sample count %d", pRange->StartAddress, pRange->EndAddress, pRange->SampleCount); pApp->PrintText( tabConsole, szBuffer ); } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim profile_session_list As ADspProfileSessionList Dim processor As ADspProcessor Dim profile_session As ADspProfileSession Dim symbol_list As ADspSymbolList Dim range_list As ADspProfileRangeList Dim range As ADspProfileRange Set app = CreateObject("VisualDSP.ADspApplication") Set session = app.ActiveSession Set processor = session.ProcessorList(0) Set profile_session_list = processor.ProfileSessionList Set profile_session = profile_session_list(0) profile_session.MemoryName = profile_session_list.MemoryNames(0) profile_session.DebugSamplesOnly = True profile_session.FilterType = profileRanges processor.LoadProgram ("C:\\testlab\\generic\\test\\debug\\testsave.dxe")
Set range_list = profile_session.AddressRangeList Set range = New ADspProfileRange Set symbol_list = processor.MemoryTypeList.FindSymbol("foo") range.StartAddress = symbol_list(0).Address Set symbol_list = processor.MemoryTypeList.FindSymbol("main") range.EndAddress = symbol_list(0).Address range_list.Add range Set range = New ADspProfileRange Set symbol_list = processor.MemoryTypeList.FindSymbol("foo") range.StartAddress = symbol_list(0).Address Set symbol_list = processor.MemoryTypeList.FindSymbol("bar") range.EndAddress = symbol_list(0).Address range_list.Add range processor.Run (True)
For Each range In range_list app.PrintText tabConsole, "The range starts at 0x" + Hex(range.StartAddress) + _ ", ends at 0x" + Hex(range.EndAddress) + _ ", with sample count " + CStr(range.SampleCount) Next
[ADspProfileSession] Этот объект представляет сессию профайлера. При создании устанавливает настройки по умолчанию. Пользователь должен сконфигурировать нужные настройки перед запуском профайлинга, такие как выбор типа памяти, тип фильтра, опциональные метрики, и т. д. СвойстваAddressRangeList МетодыAverageProfileData СобытияOnCloseProfileSession [ADspProfileSessionList] Этот объект представляет список сессий профайлера, созданных для процессора. Это главным образом используется для создания новой сессии профайлинга, и перечисления всех сессий профайлинга. СвойстваМетодыCreateSession C++/ATL: IADspApplicationPtr pApp;
TCHAR szBuffer[300];
pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspProcessorPtr pProcessor = pSession->ProcessorList->GetItem( CComVariant( 0 ) ); IADspProfileSessionListPtr pProfileSessionList = pProcessor->ProfileSessionList; for ( long i = 0; i < pProfileSessionList->Count; i++ ) { IADspProfileSessionPtr pProfileSession = pProfileSessionList->GetItem( i ); BSTR pszName = pProfileSession->Name; CString csName = pszName; ::SysFreeString(pszName);
sprintf( szBuffer, "Profile session \"%s\" is %s", csName, pProfileSession->Enabled?"enabled":"disabled"); pApp->PrintText( tabConsole, szBuffer ); } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim profile_session_list As ADspProfileSessionList Dim profile_session As ADspProfileSession Dim processor As ADspProcessor Dim enabled As String Set app = CreateObject("VisualDSP.ADspApplication") Set session = app.ActiveSession Set processor = session.ProcessorList(0) Set profile_session_list = processor.ProfileSessionList For Each profile_session In profile_session_list If profile_session.Enabled Then enabled = "enabled" Else enabled = "disabled" End If app.PrintText tabConsole, "Profile session " + """" + _ profile_session.Name + """" + _ " is " + enabled Next
Объект используется для получения состояния прогресса разблокированной операции наподобие получения содержимого памяти, установки содержимого памяти, или загрузки программы. Он также используется для отмены этой операции. Следующий пример демонстрирует запуск чтения памяти. C++/ATL: IADspApplicationPtr pApp; pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspProcessorPtr pProcessor = pSession->ProcessorList->GetItem( CComVariant( 0 ) ); IADspMemoryTypeListPtr pMemoryTypeList = pProcessor->MemoryTypeList; try { IADspMemoryTypePtr pMemoryType = pMemoryTypeList->GetItem( "Data(DM) Memory" ); IADspProgressPtr pProgress; pProgress.CreateInstance( "VisualDSP.ADspProgress" ); try { pMemoryType->GetMemoryUnblocked( 0x30000, // начальный адрес 10000, // количество читаемых 1, // шаг pProgress, // объект прогресса 1024 ); // размер блока } catch ( _com_error err ) { pApp->PrintText( tabConsole, "GetMemoryUnblocked failed" ); } } catch ( _com_error err ) { pApp->PrintText(tabConsole,"Processor doesn't have memory named \"Data(DM) Memory\""); } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim processor As ADspProcessor Dim memory_type_list As ADspMemoryTypeList Dim memory_type As ADspMemoryType Dim progress As ADspProgress Set app = CreateObject( "VisualDSP.ADspApplication" ) Set session = app.ActiveSession Set processor = session.ProcessorList( 0 ) Set memory_type_list = processor.MemoryTypeList On Error GoTo GetItemFailed Set memory_type = memory_type_list( "Data(DM) Memory" ) On Error GoTo GetMemoryUnblockedFailed Set progress = new ADspProgress memory_type.GetMemoryUnblocked &h30000, 10000, 1, progress Exit Sub GetItemFailed: app.PrintText tabConsole, "Processor doesn't have memory named ""Data(DM) Memory""Exit Sub GetMemoryUnblockedFailed: app.PrintText tabConsole, "GetMemoryUnblocked failed" СвойстваМетодыСобытияOnCanceled [ADspProject] Объект представляет проект процессора DSP, который является набором исходных файлов, используемых в сборке проекта. Он обрабатывает большинство операций, относящихся к проекту, включая переключение конфигураций, обновление зависимостей (updating dependencies), сборку проекта (build), экспортирование makefile, изменение процессора или типа target, и т. д. СвойстваActive МетодыAddFile СобытияOnBuild Следующий пример демонстрирует создание нового проекта, добавление файла в проект и затем сборку проекта. C++/ATL: IADspApplicationPtr pApp; pApp.CreateInstance( "VisualDSP.ADspApplication" );
// Не будет показываться ни один диалог: pApp->Interactive = FALSE; IADspProjectListPtr pProjectList = pApp->ProjectList; try { IADspProjectPtr pProject=pProjectList->CreateProject("My Project", "c:\\examples\\test.dpj"); // Установка опций проекта: pProject->PutProcessor( "ADSP-21065L" ); pProject->PutTargetType( "Executable file" ); // Добавление исходного файла в проект: pProject->AddFile( "c:\\examples\\test.c", "" ); // Запуск сборки проекта: pProject->Build( TRUE ); } catch ( _com_error err ) { pApp->PrintText( tabConsole, "Failed to create project" ); } Visual Basic: Dim app As Application Dim project_list As ADspProjectList Dim project As ADspProject Set app = CreateObject( "VisualDSP.ADspApplication" ) Rem Не показывать диалоги: app.Interactive = False Set project_list = app.ProjectList On Error GoTo CreateProjectFailed Set project = project_list.CreateProject( "My Project", "c:\examples\test.dpj" ) Rem Установка опций проекта: project.Processor = "ADSP-21065L" project.TargetType = "Executable file" Rem Добавление исходного файла в проект: project.AddFile "c:\examples\test.c", "" Rem Запуск сборки проекта: project.Build True Exit Sub CreateProjectFailed: app.PrintText tabConsole, "Failed to create project" [ADspProjectList] Этот объект представляет коллекцию проектов. Он позволит Вам добавить существующий проект, создать новый проект, удалить проект из списка или получить информацию о том, какой проект в настоящее время активен. В настоящий момент это может быть только один проект в списке. СвойстваActiveProject МетодыAddProject СобытияOnProjectActivated Следующий пример демонстрирует печать в окне консоли списка имен проектов. C++/ATL: IADspApplicationPtr pApp; pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspProjectListPtr pProjectList = pApp->ProjectList; for ( long i = 0; i < pProjectList->Count; i++ ) { IADspProjectPtr pProject = pProjectList->GetItem( i ); pApp->PrintText( tabConsole, pProject->Name ); } Visual Basic: Dim app As Application Dim project_list As ADspProjectList Dim project As ADspProject Set app = CreateObject( "VisualDSP.ADspApplication" ) Set project_list = app.ProjectList For Each project In project_list app.PrintText tabConsole, project.Name Next
Объект представляет окно проекта в IDDE. Это позволяет Вам получить/установить список выбранных файлов или проектов, получить/установить состояние видимости окна проекта, и выбрасывать события, которые оповещают клиентов об изменении выбора. Следующий пример демонстрирует, как скрыть окно проекта. C++/ATL: IADspApplicationPtr pApp; IADspProjectWindowPtr pProjectWindow; pApp.CreateInstance( "VisualDSP.ADspApplication" ); pProjectWindow = pApp->ProjectWindow; pProjectWindow->Visible = FALSE; Visual Basic: Dim app As Application Dim projectWindow As ADspProjectWindow Set app = CreateObject( "VisualDSP.ADspApplication" ) Set projectWindow = app.ProjectWindow projectWindow.Visible = False СвойстваSelectedFiles События[ADspRegister] Объект представляет регистр процессора. Это позволяет Вам опросить атрибуты регистра наподобие имени, ширины или описания регистра. Также этот объект позволяет Вам получить или установить значение регистра. СвойстваBitPosition Следующий пример демонстрирует чтение значения регистра PC и отображение этого значения в окне консоли. C++/ATL: IADspApplicationPtr pApp;
TCHAR szBuffer[128];
pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspProcessorPtr pProcessor = pSession->ProcessorList->GetItem( CComVariant( 0 ) ); IADspRegisterListPtr pRegisterList = pProcessor->RegisterList; if ( NULL == pRegisterList ) { pApp->PrintText( tabConsole, "Target does not have any registers" ); } else { try { IADspRegisterPtr pRegister = pRegisterList->GetItem( "PC" ); IADspValuePtr pValue = pRegister->GetValue(); sprintf( szBuffer, "Value = %s Width = %d", (char *) pValue->ToString( "Hexadecimal" ), pValue->Width ); pApp->PrintText( tabConsole, szBuffer ); } catch ( _com_error err ) { pApp->PrintText( tabConsole, "Target does not have a PC register" ); } } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim register_list As ADspRegisterList Dim register As ADspRegister Dim processor As ADspProcessor Dim value As ADspValue Set app = CreateObject( "VisualDSP.ADspApplication" ) Set session = app.ActiveSession Set processor = session.ProcessorList( 0 ) Set register_list = processor.RegisterList If (register_list Is Nothing) Then app.PrintText tabConsole, "Target does not have any registers" Else On Error GoTo GetItemFailed Set register = register_list( "PC" ) Set value = register.Value app.PrintText tabConsole, "Value = " + value.ToString( "Hexadecimal" ) + _ " Width = " + CStr( value.Width ) End If Exit Sub GetItemFailed: app.PrintText tabConsole, "Target does not have a PC register" [ADspRegisterList] Объект представляет набор всех регистров процессора. Объект позволяет получить отдельные регистры или прочитать/записать блок регистров. СвойстваМетодыGetRegisterIndexByName Следующий пример показывает печать в окне консоли список регистров и их свойств. C++/ATL: IADspApplicationPtr pApp;
TCHAR szBuffer[128];
pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspProcessorPtr pProcessor = pSession->ProcessorList->GetItem( CComVariant( 0 ) ); IADspRegisterListPtr pRegisterList = pProcessor->RegisterList; if ( NULL == pRegisterList ) { pApp->PrintText( tabConsole, "Target does not have any registers" ); } else { for ( long i = 0; i < pRegisterList->Count; i++ ) { IADspRegisterPtr pRegister = pRegisterList->GetItem( i ); sprintf( szBuffer, "Name = %s Width = %ld", (char *) pRegister->Name, pRegister->Width ); pApp->PrintText( tabConsole, szBuffer ); } } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim register_list As ADspRegisterList Dim register As ADspRegister Dim processor As ADspProcessor Set app = CreateObject( "VisualDSP.ADspApplication" ) Set session = app.ActiveSession Set processor = session.ProcessorList( 0 ) Set register_list = processor.RegisterList If (register_list Is Nothing) Then app.PrintText tabConsole, "Target does not have any registers" Else For Each register In register_list app.PrintText tabConsole, "Name = " + register.Name + _ " Width = " + CStr( register.Width ) Next End If Объект дает доступ к некоторым полезным функциям программатора flash (stand-alone flash programmer, сокращенно SAFP), что дает возможность пользователю изменять память flash процессора без необходимости иметь лицензию VisualDSP++. Объект ADspSAFP реализован как внешний dll-файл WmSAFP.dll, находящийся в папке System каталога установки VisualDSP++. Если Вы используете среду разработки, которая требует библиотеку типов (C++ или .NET например), укажите на этот библиотечный файл вместо Idde.exe, как показано в примерах ниже. Пример использования плагина см. во врезке с описанием объекта ADspFlashProgrammer. МетодыCompareFlashWithFile СвойстваОбъект представляет систему обработки скриптов в приложении. Следующий пример демонстрирует установку языка перед загрузкой скрипта. C++/ATL: IADspApplicationPtr pApp; pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspScriptEnginePtr pScriptEngine = pApp->ScriptEngine; pScriptEngine->ScriptLanguage = "JScript"; try { pScriptEngine->LoadScript( "c:\\examples\\test.js" ); } catch ( _com_error err ) { pApp->PrintText( tabConsole, "Failed to load script" ); } Visual Basic: Dim app As Application Set app = CreateObject( "VisualDSP.ADspApplication" ) Set ScriptEngine = app.ScriptEngine ScriptEngine.ScriptLanguage = "JScript" On Error GoTo LoadFailed app.LoadScript "c:\examples\test.js" Exit Sub LoadFailed: app.PrintText tabConsole, "Failed to load script" СвойстваМетоды[ADspSession] Объект представляет ранее созданные сессии отладки. Это позволяет Вам получить информацию о сессии наподобие имени, цели отладки (debug target), выбранной платформе, выбранном процессоре или процессорах, и т. д. СвойстваDebugTargetName [ADspSessionList] Этот объект представляет коллекцию сессий, которые были ранее созданы в IDDE. СвойстваМетодыСледующий пример демонстрирует печать списка сессий в окне консоли. C++/ATL: IADspApplicationPtr pApp; pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspSessionListPtr pSessionList = pApp->SessionList; for ( long i = 0; i < pSessionList->Count; i++ ) { IADspSessionPtr pSession = pSessionList->GetItem( i ); pApp->PrintText( tabConsole, pSession->Name ); } Visual Basic: Dim app As Application Dim session_list As ADspSessionList Dim session As ADspSession Set app = CreateObject( "VisualDSP.ADspApplication" ) Set session_list = app.SessionList For Each session In session_list app.PrintText tabConsole, session.Name Next
[ADspSoftwareStack] Объект представляет коллекцию объектов ADspSoftwareStackFrame, каждый из которых представляет фрейм в текущем программном стеке (подобно тому, что Вы видите в окне call stack среды IDDE во время отладки программы). Свойства[ADspSoftwareStackFrame] Объект представляет запись фрейма программного стека высокоуровневого языка программирования для загруженного сейчас приложения. СвойстваСледующий пример демонстрирует печать в окне консоли текущего стека вызовов (call stack). C++/ATL: USES_CONVERSION; TCHAR szText[1024]; IADspApplicationPtr pApp( "VisualDSP.ADspApplication" ); IADspSoftwareStackPtr pStack = pApp->ActiveSession->ActiveProcessor->SoftwareStack; for( long i=0; i < pStack->Count; i++ ) { IADspSoftwareStackFramePtr pFrame = pStack->GetItem(i); sprintf( szText, "%s 0x%08x %s(%d)", OLE2A(pFrame->Function->Name), pFrame->Address, OLE2A(pFrame->FileName), pFrame->Line ); pApp->PrintText( tabConsole, szText ); } Visual Basic: Dim app As Application Dim stack As ADspSoftwareStack Dim frame As ADspSoftwareStackFrame Set app = CreateObject("VisualDSP.ADspApplication") Set stack = app.ActiveSession.ActiveProcessor.SoftwareStack For Each frame In stack app.PrintText tabConsole, _ frame.Function.Name & " " _ & Hex(frame.Address) _ & " " & frame.FileName _ & "(" & frame.Line & ")" Next
Объект представляет файл в проекте. Это позволяет Вам получить информацию о файле, такие как атрибуты, имя файла и выходная директория. Операции, которые обрабатывает объект, включают сборку файла, смену команд сборки и опций и т. д. Следующий пример подразумевает, что проект уже загружен. Здесь демонстрируется печать в окно консоли текущего списка исходных файлов в проекте. C++/ATL: IADspApplicationPtr pApp; pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspProjectListPtr pProjectList = pApp->ProjectList; IADspProjectPtr pProject = pProjectList->ActiveProject; if ( NULL == pProject ) { pApp->PrintText( tabConsole, "No project loaded" ); } else { for ( long i = 0; i < pProject->Count; i++ ) { IADspSourceFilePtr pSourceFile = pProject->GetItem( i ); pApp->PrintText( tabConsole, pSourceFile->FileName ); } } Visual Basic: Dim app As Application Dim project_list As ADspProjectList Dim project As ADspProject Dim src_file As ADspSourceFile Set app = CreateObject( "VisualDSP.ADspApplication" ) Set project_list = app.ProjectList Set project = project_list.ActiveProject If ( project Is Nothing ) Then app.PrintText tabConsole, "No project loaded" Else For Each src_file In project app.PrintText tabConsole, src_file.FileName Next End If СвойстваAttributes Методы[ADspStream] Этот объект представляет поток. СвойстваSourceType [ADspStreamList] Объект представляет набор потоков. Он позволяет получить список потоков, добавлять и удалять потоки. СвойстваCount МетодыAddFileToDeviceStream Следующий пример демонстрирует печать в окне консоли списка потоков и их свойств. C++/ATL: IADspApplicationPtr pApp; TCHAR szBuffer1[512]; TCHAR szBuffer2[512]; pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspStreamListPtr pStreamList = pSession->StreamList; for ( long i = 0; i < pStreamList->Count; i++ ) { IADspStreamPtr pStream = pStreamList->GetItem( i ); sprintf(szBuffer1,"Src: Type=%d Name=%s DevAdd=0x%lx FileFormat=%s IsCircular=%d Rewind=%d Processor=%s", pStream->SourceType, (char *) pStream->SourceName, pStream->SourceDeviceAddress, (char *) pStream->SourceFileFormat, pStream->SourceFileIsCircular, pStream->SourceFileRewind, (char *) pStream->SourceProcessor); sprintf(szBuffer2,"Dst: Type=%d Name=%s DevAdd=0x%lx FileFormat=%s Rewind=%d Processor=%s", pStream->DestinationType, (char *) pStream->DestinationName, pStream->DestinationDeviceAddress, (char *) pStream->DestinationFileFormat, pStream->DestinationFileRewind, (char *) pStream->DestinationProcessor); pApp->PrintText( tabConsole, szBuffer1 ); pApp->PrintText( tabConsole, szBuffer2 ); } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim stream_list As ADspStreamList Dim stream As ADspStream Set app = CreateObject("VisualDSP.ADspApplication") Set session = app.ActiveSession Set stream_list = session.StreamList For Each stream In stream_list app.PrintText tabConsole, "Source: Type = " + CStr(stream.SourceType) + _ " Name = " + stream.SourceName + _ " DeviceAddress = " + CStr(stream.SourceDeviceAddress) + _ " FileFormat = " + stream.SourceFileFormat + _ " IsCircular = " + CStr(stream.SourceFileIsCircular) + _ " Rewind = " + CStr(stream.SourceFileRewind) + _ " Processor = " + stream.SourceProcessor app.PrintText tabConsole, "Destination: Type = " + CStr(stream.DestinationType) + _ " Name = " + stream.DestinationName + _ " DeviceAddress = " + CStr(stream.DestinationDeviceAddress) + _ " FileFormat = " + CStr(stream.DestinationFileFormat) + _ " Rewind = " + CStr(stream.DestinationFileRewind) + _ " Processor = " + stream.DestinationProcessor Next
Объект представляет набор строк. Следующий пример демонстрирует создание списка строк и после этого печать его в окне консоли. C++/ATL: IADspApplicationPtr pApp; IADspStringListPtr pStringList; pApp.CreateInstance( "VisualDSP.ADspApplication" ); pStringList.CreateInstance( "VisualDSP.ADspStringList" ); pStringList->Add( "String 1" ); pStringList->Add( "String 2" ); pStringList->Add( "String 3" ); for ( long i = 0; i < pStringList->Count; i++ ) { pApp->PrintText( tabConsole, pStringList->Item( i ) ); } Visual Basic: Dim app As Application Dim string_list As ADspStringList Dim str As Variant Set app = CreateObject( "VisualDSP.ADspApplication" ) Set string_list = CreateObject( "VisualDSP.ADspStringList" ) string_list.Add( "String 1" ) string_list.Add( "String 2" ) string_list.Add( "String 3" ) For Each str In string_list app.PrintText tabConsole, str Next
СвойстваArrayOfStrings Методы[ADspSymbol] Объект представляет символ, загруженный в настоящее время в процессор. Объект позволяет получить его имя, адрес и тип памяти. Свойства[ADspSymbolList] Объект представляет набор символов, загруженных в настоящее время в процессор. СвойстваArrayOfSymbols Следующий пример демонстрирует отображение в окне консоли списка всех символов памяти программ Program (PM). C++/ATL: IADspApplicationPtr pApp;
TCHAR szBuffer[128];
pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspProcessorPtr pProcessor = pSession->ProcessorList->GetItem( CComVariant( 0 ) ); IADspMemoryTypeListPtr pMemoryTypeList = pProcessor->MemoryTypeList; try { IADspMemoryTypePtr pMemoryType = pMemoryTypeList->GetItem( "Program(PM) Memory" ); IADspSymbolListPtr pSymbolList = pMemoryType->SymbolList; if ( NULL == pSymbolList ) { pApp->PrintText( tabConsole, "No symbols in Program(PM) Memory" ); } else { for ( long i = 0; i < pSymbolList->Count; i++ ) { IADspSymbolPtr pSymbol = pSymbolList->GetItem(i); sprintf( szBuffer, "Symbol: %s Address: 0x%lx", (char *) pSymbol->Name, pSymbol->Address ); pApp->PrintText( tabConsole, szBuffer ); } } } catch ( _com_error err ) { pApp->PrintText( tabConsole, "Processor doesn't have memory named \"Program(PM) Memory\"" ); } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim processor As ADspProcessor Dim memory_type_list As ADspMemoryTypeList Dim memory_type As ADspMemoryType Dim symbol_list As ADspSymbolList Dim symbol As ADspSymbol Set app = CreateObject( "VisualDSP.ADspApplication" ) Set session = app.ActiveSession Set processor = session.ProcessorList( 0 ) Set memory_type_list = processor.MemoryTypeList On Error GoTo GetItemFailed Set memory_type = memory_type_list( "Program(PM) Memory" ) Set symbol_list = memory_type.SymbolList If ( symbol_list Is Nothing ) Then app.PrintText tabConsole, "No symbols in Program(PM) Memory" Else For Each symbol In symbol_list app.PrintText tabConsole, "Symbol: " + symbol.Name + _ " Address: 0x" + Hex(symbol.Address) Next End If Exit Sub GetItemFailed: app.PrintText tabConsole, "Processor doesn't have memory named ""Program(PM) Memory"" [ADspTool] Объект представляет утилиту командной строки наподобие ассемблера или компилятора. Объект позволяет получить информацию об этой утилите наподобие её типа, описания и расширений входных/выходных файлов. СвойстваDescription [ADspToolList] Объект представляет набор утилит (типа ассемблера, компилятора и т. п.), которые доступны для сборки этого проекта. Для каждого целевого процессора набор утилит может отличаться. СвойстваВ следующем примере подразумевается, что проект уже открыт, и здесь демонстрируется печать в окно консоли списка инструментов и их свойств. C++/ATL: IADspApplicationPtr pApp; pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspProjectListPtr pProjectList = pApp->ProjectList; if ( !pProjectList->Count ) { pApp->PrintText( tabConsole, "No project loaded" ); } else { // Получение объекта первого проекта: IADspProjectPtr pProject=pProjectList->GetItem(CComVariant(static_cast< long >(0))); // Просмотр списка инструментов и печать их свойств: IADspToolListPtr pToolList = pProject->ToolList; for ( long i = 0; i < pToolList->Count; i++ ) { TCHAR szBuffer[1024]; IADspToolPtr pTool = pToolList->GetItem( i ); sprintf( szBuffer, "Tool Type = %s Description = %s Info = %s", (char *) pTool->Type, (char *) pTool->Description, (char *) pTool->Info ); pApp->PrintText( tabConsole, szBuffer ); } } Visual Basic: Dim app As Application Dim project_list As ADspProjectList Dim project As ADspProject Dim tool_list As ADspToolList Dim tool As ADspTool Set app = CreateObject( "VisualDSP.ADspApplication" ) Set project_list = app.ProjectList If ( project_list.Count = 0 ) Then app.PrintText tabConsole, "No project loaded" Else Rem Получение объекта первого проекта: Set project = project_list( 0 ) Rem Просмотр списка инструментов и печать их свойств: Set tool_list = project.ToolList For Each tool In tool_list app.PrintText tabConsole, "Tool Type = " + tool.Type + _ " Description = " + tool.Description + _ " Info = " + tool.Info Next End If [ADspValue] Этот объект представляет собой слово процессора DSP, что может использоваться для получения значения из памяти или установки значения в памяти, получения или установки значения регистров или аппаратных стеков. СвойстваМетодыAnd [ADspValueList] Этот объект представляет список слов (значений) процессора DSP, куда будут прочитаны значения из памяти процессора, его регистров или стеков. Этот список также может быть создан и записан в память, регистры или стеки. СвойстваArrayOfValues МетодыAdd Следующий пример демонстрирует чтение памяти процессора и отображение прочитанного в окне консоли. C++/ATL: IADspApplicationPtr pApp; pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspProcessorPtr pProcessor = pSession->ProcessorList->GetItem( CComVariant( 0 ) ); IADspMemoryTypeListPtr pMemoryTypeList = pProcessor->MemoryTypeList; try { IADspMemoryTypePtr pMemoryType = pMemoryTypeList->GetItem( "Data(DM) Memory" ); try { IADspValueListPtr pValueList = pMemoryType->GetMemory( 0x30000, // начальный адрес 10, // количество ячеек 1 ); // шаг for ( long i = 0; i < pValueList->Count; i++ ) { IADspValuePtr pValue = pValueList->GetItem( i ); pApp->PrintText( tabConsole, pValue->ToString( "Hexadecimal" ) ); } } catch ( _com_error err ) { pApp->PrintText( tabConsole, "GetMemory failed" ); } } catch ( _com_error err ) { pApp->PrintText( tabConsole, "Processor doesn't have memory named \"Data(DM) Memory\"" ); } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim processor As ADspProcessor Dim memory_type_list As ADspMemoryTypeList Dim memory_type As ADspMemoryType Dim value_list As ADspValueList Dim value As ADspValue Set app = CreateObject( "VisualDSP.ADspApplication" ) Set session = app.ActiveSession Set processor = session.ProcessorList( 0 ) Set memory_type_list = processor.MemoryTypeList On Error GoTo GetItemFailed Set memory_type = memory_type_list( "Data(DM) Memory" ) On Error GoTo GetMemoryFailed Set value_list = memory_type.GetMemory( &h30000, 10, 1 ) For Each value In value_list app.PrintText tabConsole, value.ToString( "Hexadecimal" ) Next Exit Sub GetItemFailed: app.PrintText tabConsole, "Processor doesn't have memory named ""Data(DM) Memory"" Exit Sub GetMemoryFailed: app.PrintText tabConsole, "GetMemory failed" [ADspWatchpoint] Объект представляет просмотр выбранной точки останова по значению переменной (watchpoint), который установлен сейчас в цели отладки. Это позволит Вам получить такие атрибуты watchpoint, как условие остановки (halt condition), тип watchpoint, и т. д. Watchpoint остановит выполнение программы, когда будет удовлетворено условие watchpoint, такое как чтение памяти или выборка из стека. В отличие от точек останова (breakpoints), точки watchpoint не привязаны к определенному адресу. Точки watchpoints могут поддерживаться только симуляторами. СвойстваEndAddress [ADspWatchpointList] Этот объект представляет набор объектов watchpoint, что позволяет добавлять или удалять точки watchpoint. СвойстваМетодыAddHardwareStackWatchpoint Следующий пример демонстрирует печать в окне консоли текущего списка точек watchpoint и их свойств. C++/ATL: IADspApplicationPtr pApp;
TCHAR szBuffer[256];
pApp.CreateInstance( "VisualDSP.ADspApplication" ); IADspDebugSessionPtr pSession = pApp->ActiveSession; IADspProcessorPtr pProcessor = pSession->ProcessorList->GetItem( CComVariant( 0 ) ); IADspWatchpointListPtr pWatchpointList = pProcessor->WatchpointList; if ( NULL == pWatchpointList ) { pApp->PrintText( tabConsole, "Target does not support watchpoints" ); } else { for ( long i = 0; i < pWatchpointList->Count; i++ ) { IADspWatchpointPtr pWatchpoint = pWatchpointList->GetItem( i ); switch ( pWatchpoint->GetWatchpointType() ) { case watchpointMemoryInclusive: case watchpointMemoryExclusive: sprintf( szBuffer, "Memory = %s 0x%lx-0x%lx", (char *) pWatchpoint->MemoryType->Name, pWatchpoint->StartAddress, pWatchpoint->EndAddress ); if ( watchpointMemoryInclusive == pWatchpoint->GetWatchpointType() ) { strcat( szBuffer, ", Inclusive"); } else { strcat( szBuffer, ", Exclusive"); } break; case watchpointRegister: sprintf( szBuffer, "Register = %s", (char *) pWatchpoint->Register->Name ); break; case watchpointHardwareStack: sprintf( szBuffer, "Hardware Stack = %s", (char *) pWatchpoint->HardwareStack->Name ); break; default: strcpy( szBuffer, "Unknown" ); break; } strcat( szBuffer, " HaltCondition = " ); if ( pWatchpoint->HaltCondition & watchpointHaltOnReadData ) { strcat( szBuffer, "Read Data "); strcat( szBuffer, (char *) pWatchpoint->ReadValue->ToString( "Hexadecimal" ) ); strcat( szBuffer, ", "); } if ( pWatchpoint->HaltCondition & watchpointHaltOnWriteData ) { strcat( szBuffer, "Write Data "); strcat( szBuffer, (char *) pWatchpoint->WriteValue->ToString( "Hexadecimal" ) ); strcat( szBuffer, ", "); } if ( pWatchpoint->HaltCondition & watchpointHaltOnReadUndefined ) { strcat( szBuffer, "Read Uninitialized Data, "); } if ( pWatchpoint->HaltCondition & watchpointHaltOnWriteUndefined ) { strcat( szBuffer, "Write Uninitialized Data, "); } if ( pWatchpoint->HaltCondition & watchpointHaltOnReadAnyValue ) { strcat( szBuffer, "Read Any Data, "); } if ( pWatchpoint->HaltCondition & watchpointHaltOnWriteAnyValue ) { strcat( szBuffer, "Write Any Data, "); } if ( pWatchpoint->HaltCondition & watchpointHaltOnRegisterReadInComputation ) { strcat( szBuffer, "Register Read In Computation, "); } if ( pWatchpoint->HaltCondition & watchpointHaltOnRegisterWriteInComputation ) { strcat( szBuffer, "Register Write In Computation, "); } if ( pWatchpoint->HaltCondition & watchpointHaltOnUnderflow ) { strcat( szBuffer, "Underflow, "); } if ( pWatchpoint->HaltCondition & watchpointHaltOnOverflow ) { strcat( szBuffer, "Overflow, "); } // Избавление от последней запятой в конце строки: if ( szBuffer[ strlen( szBuffer ) - 2 ] == ',' ) szBuffer[ strlen( szBuffer ) - 2 ] = 0; pApp->PrintText( tabConsole, szBuffer ); } } Visual Basic: Dim app As Application Dim session As ADspDebugSession Dim watchpoint_list As ADspWatchpointList Dim watchpoint As ADspWatchpoint Dim processor As ADspProcessor Dim buffer As String Set app = CreateObject( "VisualDSP.ADspApplication" ) Set session = app.ActiveSession Set processor = session.ProcessorList( 0 ) Set watchpoint_list = processor.WatchpointList If (watchpoint_list Is Nothing) Then app.PrintText tabConsole, "Target does not support watchpoints" Else For Each watchpoint In watchpoint_list Select Case watchpoint.WatchpointType Case watchpointMemoryInclusive buffer = "Memory = " + watchpoint.MemoryType.Name + _ " 0x" + Hex(watchpoint.StartAddress) + _ "-0x" + Hex(watchpoint.EndAddress) + ", Inclusive" Case watchpointMemoryExclusive buffer = "Memory = " + watchpoint.MemoryType.Name + _ " 0x" + Hex(watchpoint.StartAddress) + _ "-0x" + Hex(watchpoint.EndAddress) + ", Exclusive" Case watchpointRegister buffer = "Register = " + watchpoint.Register.Name Case watchpointHardwareStack buffer = "Hardware Stack = " + watchpoint.HardwareStack.Name Case Else buffer = "Unknown" End Select buffer = buffer + " HaltCondition = " If ( watchpoint.HaltCondition And watchpointHaltOnReadData ) Then buffer = buffer + "Read Data " + _ watchpoint.ReadValue.ToString( "Hexadecimal" ) + ", " End If If ( watchpoint.HaltCondition And watchpointHaltOnWriteData ) Then buffer = buffer + "Write Data " + _ watchpoint.WriteValue.ToString( "Hexadecimal" ) + ", " End If If ( watchpoint.HaltCondition And watchpointHaltOnReadUndefined ) Then buffer = buffer + "Read Uninitialized Data, " End If If ( watchpoint.HaltCondition And watchpointHaltOnWriteUndefined ) Then buffer = buffer + "Write Uninitialized Data, " End If If ( watchpoint.HaltCondition And watchpointHaltOnReadAnyValue ) Then buffer = buffer + "Read Any Data, " End If If ( watchpoint.HaltCondition And watchpointHaltOnWriteAnyValue ) Then buffer = buffer + "Write Any Data, " End If If ( watchpoint.HaltCondition And watchpointHaltOnRegisterReadInComputation ) Then buffer = buffer + "Register Read In Computation, " End If If ( watchpoint.HaltCondition And watchpointHaltOnRegisterWriteInComputation ) Then buffer = buffer + "Register Write In Computation, " End If If ( watchpoint.HaltCondition And watchpointHaltOnUnderflow ) Then buffer = buffer + "Underflow, " End If If ( watchpoint.HaltCondition And watchpointHaltOnOverflow ) Then buffer = buffer + "Overflow, " End If Rem Избавление от последней запятой в конце строки: buffer = Left(buffer, Len(buffer) - 2) app.PrintText tabConsole, buffer Next End If [Константы и перечисления VisualDSP++ Automation API] В таблице ниже и последующих врезках приведены описания типов для констант. Все эти типы определены как перечисления, в которых находятся соответствующие константы, задающие различные значения.
Используется для обозначения состояния видимости точки останова в пользовательском интерфейсе IDDE, а также устанавливает тип точки останова (например аппаратная она или программная). Применяется к ADspBreakpointList.
Используется для указания типа аннотации компилятора. Применяется к ADspCompilerAnnotation.
Используется для указания ширины данных, которую поддерживает BTC [4]. Применяется к ADspBtcManager , ADspBtcChannel.
Используется для преобразования данных в традиционный (native) тип данных C/C++ или из него.
Используется для указания состояния целевого процессора.Used to specify the state of a target processor. Применяется к ADspProcessor.
Используется для указания порядка байт, в котором данные сохраняются в двоичный файл. Применяется к ADspMemoryType.
Задает различные атрибуты исходных файлов в проекте. Значения этого перечисления могут объединяться операцией ИЛИ. Применяется к ADspSourceFile.
Используется для установки типа автообновления, поддерживаемого плагином ImageViewer. Применяется к ADspImageViewer.
Используется для установки типа зеркалирования, поддерживаемого плагином ImageViewer. Применяется к ADspImageViewer.
Используется для установки формата исходных данных в памяти для плагина ImageViewer. Применяется к ADspImageViewer.
Используется для установки типа пикселя изображения. Применяется к ADspImageViewer.
Используется для установки типа PPM изображения при сохранении. Применяется к ADspImageViewer.
Используется для установки поворота изображения. Применяется к ADspImageViewer.
Используется для установки места расположения данных изображения. Применяется к ADspImageViewer.
Задает различные атрибуты сегмента памяти целевого процессора. Эти значения могут объединяться операцией ИЛИ. Применяется к ADspMemorySegment.
Используется, чтобы указать конкретную закладку, размещенную в окне вывода IDDE. Применяется к ADspOutputWindow.
Используется для указания стиля текста, когда он выводится на закладку окна в IDDE. Применяется к ADspOutputWindow.
Используется для указания поведения окна плагина, когда он загружен в первый раз. Применяется к ADspPlugin.
Используется для указания типа окна плагина. Применяется к ADspPlugin.
Используется для указания типа фильтра, который будет применен к результатам сессии профайлинга. Применяется к ADspProfileSession.
Используется для указания типа памяти, которая используется в сессии профайлинга. Применяется к ADspProfileSession.
Используется для указания формата, в котором будут сохраняться данные сессии профайлинга. Применяется к ADspProfileSession.
Используется для указания типа конечной точки, к которой подключен поток. Применяется к ADspStream.
Используется для указания случаев, в которых выполнение должно быть остановлено (halt), когда установлена точка просмотра (watchpoint). Значения из этого перечисления могут объединяться операцией ИЛИ. Применяется к ADspWatchpointList , ADspWatchpoint.
Используется для указания типа watchpoint, которую представляет объект ADspWatchpoint. Применяется к ADspWatchpointList .
[Ссылки] 1. VisualDSP API программирования FLASH для процессоров Blackfin. |