Этот документ описывает интерфейс автоматизации, встроенный в систему разработки 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).
Примечание: PGO расшифровывается как "Profile Guided Optimization", т. е. это данные, относящиеся к специальному виду оптимизации. Подробнее см. описание этой технологии в статье [2].
Как только были импортированы библиотеки типов, Вы можете получить ссылку на них использованием метода CreateInstance() объекта в случае объекта ADspApplication, или использованием объекта Plugin в случае вызовов API, которые реализованы в библиотеках плагинов.
// Создание объекта 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:
...
return0;
}
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).
Свойства это атрибуты, которые описывают объект. Например, свойства объекта регистра это имя (name), ширина в битах (width), значение (value), и так далее.
Методы это операции (функции), которые выполняют какое-то действие, связанное с объектом. Например, методы объекта списка точек останова (breakpoint list) включают установку breakpoint, очистку breakpoint, и так далее.
События подобны callback-функции. Когда происходит событие, рабочее окружение VisualDSP++ вызовет код обработчика события клиента, оповещая его тем самым о возникновении события. Например, если процессор остановился, то сработает событие OnHalted().
Ниже в таблице приведено краткое описание объектов VisualDSP++ Automation.
Функция
Описание
ADspApplication
Этот объект служит точкой входа для плагина, или контроллера автоматизации наподобие программы на Visual Basic.
ADspBreakpoint, ADspBreakpointList
Объект, представляющий установленную точку останова процессора, и объект, дающий доступ к набору точек останова, установленных в настоящее время в процессоре.
ADspBtcChannel, ADspBtcChannelList
Первый объект представляет канал BTC [4], определенный в настоящее время программой, загруженной в процессор. Второй объект определяет набор таких каналов.
ADspBtcManager
Объект позволяет получить доступ к памяти процессора, когда он работает или остановлен.
Первый объект представляет аннотацию компилятора к загруженной в настоящий момент программе .dxe. Второй представляет доступ к списку таких аннотаций.
ADspContextMenu
Этот объект позволяет плагинам VisualDSP++ добавлять свои собственные пункты меню в контекстное меню, которое всплывает, когда пользователь делает правые клики мышью на окно плагина.
ADspCoreFileManager
Этот объект предоставляет средства создания файла ядра (core file) для процессора и загрузку файла ядра в процессор, связанный с ним.
Первый объект представляет блок памяти для записи в файл ядра. Второй объект представляет список таких объектов. Он позволяет добавлять, удалять, перечислять объекты в списке.
ADspDebugSession
Объект представляет сессию отладки.
ADspDebugTarget, ADspDebugTargetList
Первый объект представляет установленную цель отладки (процессор), второй представляет набор таких целей отладки.
ADspDocument, ADspDocuments
Первый объект представляет открытый документ, второй список таких документов.
ADspFlashProgrammer
Объект предоставляет доступ к некоторым полезным функциям плагина flash programmer, которые дают возможность пользователю изменять содержимое памяти процессора [1].
ADspFunction, ADspFunctionList
Первый объект представляет функцию, загруженную в память процессора, второй набор таких функций.
ADspHardwareStack, ADspHardwareStackList
Первый объект представляет аппаратный стек процессора (наподобие PC stack, loop stack и т. п.), второй представляет набор таких стеков.
ADspImageViewer
Этот объект представляет плагин Image Viewer. Image Viewer используется для отображения растровых данных точек, сохраненных в памяти процессора. Поддерживаются растровые форматы Grayscale, RGB и YUV.
ADspInterrupt, ADspInterruptList
Первый объект представляет прерывание, второй набор таких прерываний.
ADspMemorySegment, ADspMemorySegmentList
Первый объект представляет сегмент в карте памяти процессора. Второй представляет набор таких сегментов.
ADspMemoryType, ADspMemoryTypeList
Первый объект представляет тип памяти, поддерживаемый процессором, второй набор таких типов.
ADspMenuManager
Этот объект позволяет плагинам VisualDSP++ добавлять свои пункты меню в меню среды разработки VisualDSP++, и получить или установить состояние этих пунктов меню.
ADspMPGroup, ADspMPGroupList
Первый объект представляет собой группу процессоров, Multiprocessor (MP), второй набор таких групп.
ADspMPGroupInfo, ADspMPGroupInfoList
Первый объект предоставляет информацию о группе MP, предварительно созданной в сессии отладки, второй представляет набор таких объектов.
ADspOutputWindow
Объект представляет окно вывода среды разработки VisualDSP++.
ADspPgoManager
Объект дает доступ к генерации данных PGO [2], в то время как работает цель отладки (обычно это симулятор).
ADspPlatform, ADspPlatformList
Первый объект представляет платформу цели отладки, второй набор таких платформ для определенной цели отладки.
ADspPlugin, ADspPluginList
Первый объект представляет плагин, зарегистрированный в рабочем окружении VisualDSP++, второй набор таких зарегистрированных плагинов.
ADspProcessor, ADspProcessorList
Первый объект представляет процессор, второй набор таких процессоров.
Первый объект представляет адрес блока кода, анализируемого профайлером, второй список таких блоков.
ADspProfileFunction, ADspProfileFunctionList
Первый объект представляет обрабатываемую профайлером функцию, второй список таких функций.
ADspProfileRange, ADspProfileRangeList
Первый объект представляет диапазон адресов обрабатываемого профайлинга, второй список таких диапазонов.
ADspProfileSession, ADspProfileSessionList
Первый объект представляет сессию профайлера, второй список таких сессий.
ADspProgress
Этот объект используется для получения значения прогресса или состояния разблокированной операции наподобие получения содержимого памяти, заполнения памяти, или загрузки программы.
ADspProject, ADspProjectList
Первый объект представляет проект DSP (набор файлов исходного кода, используемых при сборке проекта, второй набор таких проектов.
ADspProjectWindow
Объект представляет окно проекта в среде разработки VisualDSP++.
ADspRegister, ADspRegisterList
Первый объект представляет регистр процессора, второй набор таких регистров.
ADspSAFP
Этот объект дает доступ к некоторым полезным функциям отдельного программатора, что дает пользователю возможность изменять память flash процессора без необходимости наличия лицензии VisualDSP++.
ADspScriptEngine
Объект представляет систему обработки скриптов.
ADspSession, ADspSessionList
Первый объект представляет ранее созданную сессию отладки, второй представляет набор таких сессий, ранее созданных в среде разработки VisualDSP++.
ADspSoftwareStack
Этот объект представляет набор фреймов программного стека.
ADspSoftwareStackFrame
Объект представляет фрейм программного стека.
ADspSourceFile
Объект представляет файл в проекте.
ADspStream, ADspStreamList
Первый объект представляет поток, второй набор таких объектов.
ADspStringList
Объект представляет набор строк.
ADspSymbol, ADspSymbolList
Первый объект представляет символ, загруженный сейчас в процессор, второй набор таких символов.
ADspTool, ADspToolList
Первый объект представляет утилиту командной строки наподобие компилятора или ассемблера (доступную для сборки проекта), второй набор таких утилит.
ADspValue, ADspValueList
Первый объект представляет слово процессора, которое может использоваться для чтения или записи памяти, регистров или стеков, второй список таких объектов.
ADspWatchpoint, ADspWatchpointList
Первый объект представляет наблюдаемое значение переменной отлаживаемой цели, второй набор таких объектов.
Это точка входа в плагин VisualDSP++ или контроллер автоматизации, находящийся вне процесса, наподобие программы Visual Basic. Это позволяет клиенту создать новый объект сессии, получить активную сессию, ли вывести что-то в одну из закладок выходного окна. Также этот объект позволяет пользователю создать новый список проекта, открыть существующий список проекта, или получить активный список проекта.
Ниже показан пример, демонстрирующий печать версию IDDE в окне консоли.
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
ForEach breakpoint In breakpoint_list
app.PrintText tabConsole, "File Name = "+ breakpoint.FileName + _
" Line Number = "+CStr( breakpoint.LineNumber ) + _
" Address = 0x"+ Hex(breakpoint.Address)
Next
Объект представляет набор установленных для процессора в настоящий момент точек останова. Объект позволяет перебрать точки останова в списке (см. пример выше). Также он позволяет установить или удалить точки останова.
Этот объект представляет канал BTC, определенный загруженной в настоящий момент программой. Он позволяет Вам читать и записывать память, связанную с каналом (подробнее о том, что такое канал BTC, см. [4]).
Имейте в виду, что этот объект реализован во внешнем dll-файле WmBtcEngine.dll, который находится в папке System каталога установки системы VisualDSP++, не напрямую в IDDE. Если Вы используете окружение разработки, которое требует библиотеку типов (например, C++ или .NET), то должны указать на эту библиотеку вместо Idde.exe. Обратите внимание, что ссылка на этот объект должна быть получена из свойства PluginList объекта ADspApplication, как это показано в примерах ниже.
Следующий пример демонстрирует печать свойств канала. Также демонстрируется запись и чтение памяти процессора, и затем отображают результаты этих данных в окне консоли.
Объект представляет набор каналов в виде объектов ADspBtcChannel, определенных программой, загруженной в настоящий момент в процессор. Примеры выше показывают, как осуществить печать в окне консоли списка каналов и их свойств.
Объект предоставляет доступ к памяти процессора, когда он работает или остановлен. Доступ осуществляется через каналы, которые определяет программа, работающая на процессоре.
Имейте в виду, что этот объект реализован во внешнем dll-файле WmBtcEngine.dll, который находится в папке System каталога установки системы VisualDSP++, не напрямую в IDDE. Если Вы используете окружение разработки, которое требует библиотеку типов (например, C++ или .NET), то должны указать на эту библиотеку вместо Idde.exe. Обратите внимание, что ссылка на этот объект должна быть получена из свойства PluginList объекта ADspApplication, как это показано в примерах ниже.
Пример кода, использующего объект ADspBtcManager, см. во врезке с описанием объекта канала ADspBtcChannel.
for ( long i =0; i < pCompilerAnnotationList->Count; i++ )
{
IADspCompilerAnnotationPtr pADspCompilerAnnotation = pCompilerAnnotationList->GetItem( i );
Объект позволяет плагинам VisualDSP++ добавлять свои собственные пункты в контекстное меню, которое всплывает по правому клику на окне плагина. Следующий пример демонстрирует добавление пользовательских пунктов в контекстное меню.
C++/ATL:
STDMETHODIMP CPlugin::ExtendContextMenu( LPDISPATCH pIADspContextMenu )
{
// IDDE вызовет этот метод автоматически, когда пользователь сделает// правый клик в окне плагина. Это дает возможность добавить любые// пункты в контекстное меню.
Объект предоставляет способ создать файл ядра (core file) для процессора, и загрузить этот файл ядра в процессор, связанный с ним.
Имейте в виду, что этот объект реализован во внешнем dll-файле CoreFileSupport.dll, который находится в папке System каталога установки системы VisualDSP++, не напрямую в IDDE. Если Вы используете окружение разработки, которое требует библиотеку типов (например, C++ или .NET), то должны указать на эту библиотеку вместо Idde.exe. Обратите внимание, что ссылка на этот объект должна быть получена из свойства PluginList объекта ADspApplication, как это показано в примерах ниже.
Следующий пример демонстрирует создание файла ядра для процессора, который может быть загружен впоследствии.
Объект представляет сессию отладки. Он содержит информацию о цели отладки (target), платформе и процессорах, которые подключены к IDDE. При этом используется доступ к списку процессоров и групп MP (если они имеются).
В следующем примере подразумевается, что у Вас имеется установленный симулятор SHARC, и демонстрируется создание сессии симулятора SHARC с одним процессором ADSP-21065L.
Объект представляет установленную цель отладки (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.
// Получение списка установленных в целей отладки (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 Проход по списку целей отладки и отображение имени каждого:
ForEach debug_target In debug_target_list
app.PrintText tabConsole, debug_target.Name
Объект представляет открытый документ (обычно это модуль исходного кода). Это позволяет клиенту перейти на строку и столбец документа по номеру, редактировать текст, сохранить текст в файл, вывести текст на печать или закрыть документ.
Объект представляет список открытых в настоящий момент документов. Это дает клиенту возможность просмотра списка документов, создать новый документ, или закрыть все документы.
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
ForEach document In document_list
app.PrintText tabConsole, document.Name
Объект позволяет получить доступ к некоторым полезным свойствам плагина программатора flash (flash programmer plug-in), что позволяет пользователю изменять содержимое памяти flash процессора.
Обратите внимание, что этот объект реализован во внешнем dll-файле WmFlashProgrammer.dll, находящемся в папке System каталога установки VisualDSP, а не напрямую в самой IDDE. Если Вы используете окружение разработки, которое требует библиотеку типов (например, C++ или .NET) то Вы должны сослаться на этот dll-файл вместо Idde.exe. Имейте в виду, что ссылка на этот объект должна быть получена из свойства PluginList объекта ADspApplication, как это показано в следующих примерах.
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.");
return1;
}
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.");
return1;
}
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;
}
FileFormat =0' формат Intel HEX
VerifyWhileWriting =1' проверить память после записи
EraseOption =0' стирать только задействованные сектора памяти
StartAddress =0' этот параметр игнорируется для Intel HEX
if SAFP ThenSet pFlash = CreateObject("VisualDSP.ADspSAFP")
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
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 IsNothing) Then
app.PrintText tabConsole, "Target does not support hardware stacks"ElseOnErrorGoTo GetItemFailed
Set hardware_stack = hardware_stack_list( "PC Stack" )
If ( hardware_stack.StackPointer =0 ) Then
app.PrintText tabConsole, "PC Stack is empty"ElseSet value_list = hardware_stack.GetStack
For i =0To hardware_stack.StackPointer -1Set value = value_list( i )
app.PrintText tabConsole, value.ToString( "Hexadecimal" )
NextEndIfEndIfExitSub
GetItemFailed:
app.PrintText tabConsole, "Processor doesn't have a stack named ""PC Stack"""
[ADspHardwareStackList]
Объект представляет набор аппаратных стеков, поддерживаемых процессором.
Этот объект представляет плагин 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.
Объект представляет сегмент в карте памяти процессора. Если никакая программа не загружена, то карту памяти представляет вся доступная память процессора. Если программа загружена, то карта памяти это карта (map), определенная в секции MEMORY файла .LDF программы.
Объект представляет тип памяти, поддерживаемый процессором. Он позволяет читать, записывать и заполнять блок памяти. Примеры типов памяти включают "Program Memory (PM)" (память программы) и "Data Memory (DM)" (память данных).
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 GoToGetItemFailedSet memory_type = memory_type_list( "Data(DM) Memory" )
On Error GoToGetMemoryFailedSet 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
Этот объект позволяет плагинам VisualDSP++ добавлять свои собственные пункты меню к меню IDDE, и получить состояние этих пунктов меню. Следующий пример демонстрирует добавление пользовательского меню к меню приложения.
Объект представляет группу Multiprocessor (MP). Группа MP это группа процессоров, которая может принимать команды MP наподобие MP run, MP step, MP halt, и т. д.
В следующем примере подразумевается, что текущая сессия мультипроцессорная, и здесь демонстрируется создание новой группы MP, добавление в неё имеющихся процессоров, выполнение шага для группы процессоров, и затем удаление этой группы.
Dim app As Application
Dim session As ADspDebugSession
Dim group As ADspMPGroup
Dim group_list As ADspMPGroupList
Dim i AsInteger
Set app = CreateObject( "VisualDSP.ADspApplication" )
OnErrorResumeNextSet session = app.ActiveSession
If (session IsNothing) Then
app.PrintText tabConsole, "CreateMPSession failed"ElseSet group_list = session.MPGroupList
If (group_list IsNothing) Then
app.PrintText tabConsole, "Current session is not multiprocessor!"ElseOnErrorGoTo CreateMPGroupFailed
Set group = group_list.CreateMPGroup( "My Group Name" )
Rem добавление всех доступных процессоров в группуFor i=0To session.ProcessorList.Count-1
group.AddProcToGroup i
Next
group.MPStepAsm
group_list.RemoveGroup "My Group Name"EndIfEndIf
if ( NULL== pMPGroupList ) {
pApp->PrintText( tabConsole, "Current session is not multiprocessor" );
} else {
for ( long i =0; i < pMPGroupList->Count; i++ ) {
IADspMPGroupPtr pMPGroup = pMPGroupList->GetItem( i );
pApp->PrintText( tabConsole, pMPGroup->Name );
}
}
Visual Basic:
Dim app As Application Dim session As ADspDebugSession Dim mpgroup_list As ADspMPGroupList Dim mpgroup As ADspMPGroup
Set app = CreateObject( "VisualDSP.ADspApplication" ) Set session = app.ActiveSession Set mpgroup_list = session.MPGroupList If (mpgroup_list IsNothing) Then
app.PrintText tabConsole, "Current session is not multiprocessor"
ElseForEach mpgroup In mpgroup_list
app.PrintText tabConsole, mpgroup.Name
Next EndIf
Этот объект представляет информацию о мультипроцессорной группе Multiprocessor (MP), которая была ранее создана в сессии отладки. Объект позволяет получить информацию о группе MP наподобие имени и списка процессоров в группе.
for ( long i =0; i < pSessionList->Count; i++ )
{
IADspSessionPtr pSession = pSessionList->GetItem( i );
pApp->PrintText( tabConsole, pSession->Name );
IADspMPGroupInfoListPtr pMPGroupInfoList = pSession->MPGroupInfoList;
if ( pMPGroupInfoList !=NULL)
{
for ( long j =0; j < pMPGroupInfoList->Count; j++ )
{
IADspMPGroupInfoPtr pMPGroupInfo = pMPGroupInfoList->GetItem( j );
sprintf( szBuffer, " MP Group Name = %s", (char*) pMPGroupInfo->Name );
pApp->PrintText( tabConsole, szBuffer );
}
}
}
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
ForEach session In session_list
app.PrintText tabConsole, session.Name
If ( not session.MPGroupInfoList isNothing ) ThenForEach mpgroupinfo In session.MPGroupInfoList
app.PrintText tabConsole, " MP Group Name = "+ mpgroupinfo.Name
NextEndif Next
Объект представляет окно вывода IDDE. Он позволяет печатать текст в окно на закладке (консоль console или окно результата сборки build window) разными цветами, получить содержимое окна закладки, получить/установить состояние видимости выходного окна, получить/установить активную закладку, и сливать события, которые оповещают клиентов о смене состояния окна закладок, когда это изменение произойдет.
Следующий пример демонстрирует отображение "Hello World!" в окне закладки консоли.
Объект позволяет получить доступ к генерации данных PGO [2] во время работы цели отладки target (обычно это симулятор).
Имейте в виду, что этот объект реализован во внешнем dll-файле PgoEngine.dll, размещенном в папке System каталога установки VisualDSP, и не напрямую в IDDE. Если Вы используете среду разработки, которая требует библиотеку типов (C++ или .NET например), то должны указать этот библиотечный файл вместо Idde.exe. Обратите внимание, что ссылка на этот объект должен быть получен из свойства PluginList объекта ADspApplication, как это показано в примерах ниже.
Следующий пример демонстрирует загрузку программы и сбор данных PGO, которые можно позже передать обратно компилятору, чтобы расширить возможности оптимизации.
Объект представляет платформу в debug target. Это позволяет получить информацию о платформе наподобие имени, списка процессоров, и информацию о том, поддерживает ли платформа многопроцессорность.
Платформа относится к конфигурации процессоров DSP, с которой обменивается данными target. Для симуляции платформа это обычно один или несколько DSP одного и того же типа. Для эмуляции Вы указываете платформу с помощью конфигуратора VisualDSP++. Эта платформа может быть любой комбинацией устройств. Платформа представляет аппаратуру, в которой находится оно или большее количество устройств. Вы обычно определяете платформу для конкретной цели.
Следующий пример показывает печать в окне консоли списка установленных целей отладки (debug target), платформ в каждой debug target, и свойства каждой платформы.
// Проход по списку целей отладки и получение имени каждой цели: for ( long i =0; i < pDebugTargetList->Count; i++ )
{
IADspDebugTargetPtr pDebugTarget = pDebugTargetList->GetItem( i );
pApp->PrintText( tabConsole, pDebugTarget->Name ); // Получение списка платформ цели:
IADspPlatformListPtr pPlatformList = pDebugTarget->PlatformList; // Проход по списку платформ каждой цели и отображение имени// каждой платформы:for ( long j =0; j < pPlatformList->Count; j++ )
{
IADspPlatformPtr pPlatform = pPlatformList->GetItem( j );
sprintf( szBuffer, " Platform Name = %s", (char*) pPlatform->Name );
pApp->PrintText( tabConsole, szBuffer );
}
}
Visual Basic:
Dim app As Application Dim debug_target_list As ADspDebugTargetList Dim debug_target As ADspDebugTarget Dim platform_list As ADspPlatformList Dim platform As ADspPlatform
Set app = CreateObject( "VisualDSP.ADspApplication" )
Rem Получение списка установленных целей отладки (debug target): Set debug_target_list = app.DebugTargetList
Rem Проход по списку целей отладки и получение имени каждой цели: ForEach debug_target In debug_target_list
app.PrintText tabConsole, debug_target.Name Rem Получение списка платформ цели:Set platform_list = debug_target.PlatformList Rem Проход по списку платформ каждой цели и отображение имениRem каждой платформы:ForEach platform In platform_list
app.PrintText tabConsole, " Platform Name = "+ platform.Name
Next Next
Объект представляет зарегистрированный плагин VisualDSP++ plugin. Плагины это DLL, которые интегрированы с VisualDSP++ IDDE, и предоставляют расширенный функционал, путем отображения окон для пользователя или мониторинга и ответа на события системы (system events).
Объект ADspPlugin позволяет клиенту прочитать информацию о плагине, которую он предоставляет, открыть и закрыть плагин, и обмениваться информацией с запущенным плагином через его собственные интерфейсы автоматизации (automation interface).
Объект представляет процессор. Это позволяет получить доступ к регистрам, памяти, стекам и точкам останова процессора. Также объект позволит Вам управлять процессором с помощью операций шага (step), запуска на выполнение кода (run), остановки (halt) и сброса (reset).
ExitSub LoadFailed:
app.PrintText tabConsole, "Failed to load program"
[ADspProcessorList]
Этот объект представляет список процессоров в текущей сессии отладки. Однопроцессорная сессия будет иметь один процессор в списке. В многопроцессорной сессии процессоров в списке будет несколько.
Объект представляет список объектов ADspProfileExecutionUnit. Он составляется программой профилировщика, и используется для получения результатов профайлинга для каждого адреса, который обрабатывается. Смена сессии профилировщика удаляет все объекты из этого списка. Объекты в этом списке также удаляются вызовом ClearProfileData.
Объект представляет функцию. Он содержит имя функции, имя файла, начальный адрес, конечный адрес и счетчик выборок (sample count). StartAddress, EndAddress и SampleCount доступны только если объект находится в FunctionList сессии профайлинга, или в диапазоне FunctionList.
Этот объект представляет список объектов ADspProfileFunction. ADspProfileFunctionList используется для выбора нужных функций для профайлинга, а также для получения результатов профайлинга функций. Смена сессии профайлинга удаляет все результаты профайлинга, сохраненные в объектах этого списка. Результаты профайлинга, сохраненные в этих объектах этого списка, также удаляются вызовом ClearProfileData.
for ( long i =0; i < pLoadedFunctions->Count; i++ )
{
IADspFunctionPtr pFunc = pLoadedFunctions->GetItem(i); IADspProfileFunctionPtr pProfileFunc;
pProfileFunc.CreateInstance( "VisualDSP.ADspProfileFunction" );
pProfileFunc->Name = pFunc->Name;
pProfileFunc->FileName = pFunc->FileName; pFunctionList->Add(pProfileFunc);
} pProcessor->Run(TRUE);
for ( i =0; i < pFunctionList->Count; i++)
{
IADspProfileFunctionPtr pProfileFunc = pFunctionList->GetItem(i); BSTR pszTmp = pProfileFunc->Name;
CString csFuncName = pszTmp;
::SysFreeString(pszTmp); pszTmp = pProfileFunc->FileName;
CString csFileName = pszTmp;
::SysFreeString(pszTmp); sprintf(szBuffer, "\"%s\" in file \"%s\" has sample count %d",
csFuncName, csFileName,
pProfileFunc->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 loaded_functions As ADspFunctionList Dim func As ADspFunction Dim function_list As ADspProfileFunctionList Dim profile_function As ADspProfileFunction
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 = profileFunctions processor.LoadProgram ("C:\testlab\generic\test\debug\testsave.dxe") Set symbol_list = processor.MemoryTypeList.FindSymbol("main") Set loaded_functions = symbol_list(0).MemoryType.FunctionList Set profile_function =New ADspProfileFunction Set function_list = profile_session.FunctionList
ForEach func In loaded_functions
Set profile_function =New ADspProfileFunction
profile_function.Name = func.Name
profile_function.FileName = func.FileName
function_list.Add profile_function Next processor.Run (True)
ForEach profile_function In function_list
app.PrintText tabConsole,
""""+ profile_function.Name + _
""""+" in file "+ _
""""+ profile_function.FileName + _
""""+" has sample count "+CStr(profile_function.SampleCount) Next
Объект представляет диапазон адресов профайлинга. Он содержит начальный адрес, конечный адрес, счетчик выборок (sample count) и список функций, попадающих в этот диапазон адресов. FunctionList и SampleCount доступны только если объект находится в AddressRangeList.
Этот объект представляет список объектов ADspProfileRange. Он используется как для установки диапазонов профайлинга, так и получения результатов из этих диапазонов. Смена сессии профайлинга удаляет все результаты профайлинга, сохраненные в объектах списка. Результаты профайлинга, сохраненные в этом списке, также удаляются вызовом ClearProfileData.
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 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)
ForEach 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)
Этот объект представляет сессию профайлера. При создании устанавливает настройки по умолчанию. Пользователь должен сконфигурировать нужные настройки перед запуском профайлинга, такие как выбор типа памяти, тип фильтра, опциональные метрики, и т. д.
Этот объект представляет список сессий профайлера, созданных для процессора. Это главным образом используется для создания новой сессии профайлинга, и перечисления всех сессий профайлинга.
for ( long i =0; i < pProfileSessionList->Count; i++ )
{
IADspProfileSessionPtr pProfileSession = pProfileSessionList->GetItem( i );
BSTR pszName = pProfileSession->Name;
CString csName = pszName;
Объект используется для получения состояния прогресса разблокированной операции наподобие получения содержимого памяти, установки содержимого памяти, или загрузки программы. Он также используется для отмены этой операции.
Следующий пример демонстрирует запуск чтения памяти.
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
OnErrorGoTo GetItemFailed
Set memory_type = memory_type_list( "Data(DM) Memory" )
Объект представляет проект процессора DSP, который является набором исходных файлов, используемых в сборке проекта. Он обрабатывает большинство операций, относящихся к проекту, включая переключение конфигураций, обновление зависимостей (updating dependencies), сборку проекта (build), экспортирование makefile, изменение процессора или типа target, и т. д.
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
OnErrorGoTo 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 TrueExitSub
CreateProjectFailed:
app.PrintText tabConsole, "Failed to create project"
[ADspProjectList]
Этот объект представляет коллекцию проектов. Он позволит Вам добавить существующий проект, создать новый проект, удалить проект из списка или получить информацию о том, какой проект в настоящее время активен. В настоящий момент это может быть только один проект в списке.
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
ForEach project In project_list
app.PrintText tabConsole, project.Name
Объект представляет окно проекта в IDDE. Это позволяет Вам получить/установить список выбранных файлов или проектов, получить/установить состояние видимости окна проекта, и выбрасывать события, которые оповещают клиентов об изменении выбора.
Следующий пример демонстрирует, как скрыть окно проекта.
Объект представляет регистр процессора. Это позволяет Вам опросить атрибуты регистра наподобие имени, ширины или описания регистра. Также этот объект позволяет Вам получить или установить значение регистра.
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 IsNothing) Then
app.PrintText tabConsole, "Target does not have any registers"ElseOnErrorGoTo GetItemFailed
Set register = register_list( "PC" )
Set value = register.Value
app.PrintText tabConsole, "Value = "+ value.ToString( "Hexadecimal" ) + _
" Width = "+CStr( value.Width )
EndIf
ExitSub
GetItemFailed:
app.PrintText tabConsole, "Target does not have a PC register"
[ADspRegisterList]
Объект представляет набор всех регистров процессора. Объект позволяет получить отдельные регистры или прочитать/записать блок регистров.
Объект дает доступ к некоторым полезным функциям программатора flash (stand-alone flash programmer, сокращенно SAFP), что дает возможность пользователю изменять память flash процессора без необходимости иметь лицензию VisualDSP++.
Объект ADspSAFP реализован как внешний dll-файл WmSAFP.dll, находящийся в папке System каталога установки VisualDSP++. Если Вы используете среду разработки, которая требует библиотеку типов (C++ или .NET например), укажите на этот библиотечный файл вместо Idde.exe, как показано в примерах ниже.
Пример использования плагина см. во врезке с описанием объекта ADspFlashProgrammer.
Dim app As Application
Set app = CreateObject( "VisualDSP.ADspApplication" )
Set ScriptEngine = app.ScriptEngine
ScriptEngine.ScriptLanguage ="JScript"
Объект представляет ранее созданные сессии отладки. Это позволяет Вам получить информацию о сессии наподобие имени, цели отладки (debug target), выбранной платформе, выбранном процессоре или процессорах, и т. д.
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
ForEach session In session_list
app.PrintText tabConsole, session.Name
Объект представляет файл в проекте. Это позволяет Вам получить информацию о файле, такие как атрибуты, имя файла и выходная директория. Операции, которые обрабатывает объект, включают сборку файла, смену команд сборки и опций и т. д.
Следующий пример подразумевает, что проект уже загружен. Здесь демонстрируется печать в окно консоли текущего списка исходных файлов в проекте.
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 IsNothing ) Then
app.PrintText tabConsole, "No project loaded"
ElseForEach src_file In project
app.PrintText tabConsole, src_file.FileName
Next
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
OnErrorGoTo GetItemFailed
Set memory_type = memory_type_list( "Program(PM) Memory" )
Set symbol_list = memory_type.SymbolList
If ( symbol_list IsNothing ) Then
app.PrintText tabConsole, "No symbols in Program(PM) Memory"ElseForEach symbol In symbol_list
app.PrintText tabConsole, "Symbol: "+ symbol.Name + _
" Address: 0x"+ Hex(symbol.Address)
NextEndIf
ExitSub
GetItemFailed:
app.PrintText tabConsole, "Processor doesn't have memory named ""Program(PM) Memory""
Объект представляет утилиту командной строки наподобие ассемблера или компилятора. Объект позволяет получить информацию об этой утилите наподобие её типа, описания и расширений входных/выходных файлов.
Объект представляет набор утилит (типа ассемблера, компилятора и т. п.), которые доступны для сборки этого проекта. Для каждого целевого процессора набор утилит может отличаться.
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"
ElseRem Получение объекта первого проекта:Set project = project_list( 0 )
Rem Просмотр списка инструментов и печать их свойств:Set tool_list = project.ToolList
ForEach tool In tool_list
app.PrintText tabConsole, "Tool Type = "+ tool.Type + _
" Description = "+ tool.Description + _
" Info = "+ tool.Info
Next
Этот объект представляет собой слово процессора DSP, что может использоваться для получения значения из памяти или установки значения в памяти, получения или установки значения регистров или аппаратных стеков.
Этот объект представляет список слов (значений) процессора DSP, куда будут прочитаны значения из памяти процессора, его регистров или стеков. Этот список также может быть создан и записан в память, регистры или стеки.
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
OnErrorGoTo GetItemFailed
Set memory_type = memory_type_list( "Data(DM) Memory" )
OnErrorGoTo GetMemoryFailed
Set value_list = memory_type.GetMemory( &h30000, 10, 1 )
ForEach value In value_list
app.PrintText tabConsole, value.ToString( "Hexadecimal" )
Next
ExitSub
GetItemFailed:
app.PrintText tabConsole, "Processor doesn't have memory named ""Data(DM) Memory""
Объект представляет просмотр выбранной точки останова по значению переменной (watchpoint), который установлен сейчас в цели отладки. Это позволит Вам получить такие атрибуты watchpoint, как условие остановки (halt condition), тип watchpoint, и т. д.
Watchpoint остановит выполнение программы, когда будет удовлетворено условие watchpoint, такое как чтение памяти или выборка из стека. В отличие от точек останова (breakpoints), точки watchpoint не привязаны к определенному адресу.
Точки watchpoints могут поддерживаться только симуляторами.
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 AsString
Set app = CreateObject( "VisualDSP.ADspApplication" )
Set session = app.ActiveSession
Set processor = session.ProcessorList( 0 )
Set watchpoint_list = processor.WatchpointList
If (watchpoint_list IsNothing) Then
app.PrintText tabConsole, "Target does not support watchpoints"
ElseForEach watchpoint In watchpoint_list
SelectCase 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
CaseElse
buffer ="Unknown"EndSelect
buffer = buffer +" HaltCondition = "If ( watchpoint.HaltCondition And watchpointHaltOnReadData ) Then
buffer = buffer +"Read Data "+ _
watchpoint.ReadValue.ToString( "Hexadecimal" ) +", "EndIfIf ( watchpoint.HaltCondition And watchpointHaltOnWriteData ) Then
buffer = buffer +"Write Data "+ _
watchpoint.WriteValue.ToString( "Hexadecimal" ) +", "EndIfIf ( watchpoint.HaltCondition And watchpointHaltOnReadUndefined ) Then
buffer = buffer +"Read Uninitialized Data, "EndIfIf ( watchpoint.HaltCondition And watchpointHaltOnWriteUndefined ) Then
buffer = buffer +"Write Uninitialized Data, "EndIfIf ( watchpoint.HaltCondition And watchpointHaltOnReadAnyValue ) Then
buffer = buffer +"Read Any Data, "EndIfIf ( watchpoint.HaltCondition And watchpointHaltOnWriteAnyValue ) Then
buffer = buffer +"Write Any Data, "EndIfIf ( watchpoint.HaltCondition And watchpointHaltOnRegisterReadInComputation ) Then
buffer = buffer +"Register Read In Computation, "EndIfIf ( watchpoint.HaltCondition And watchpointHaltOnRegisterWriteInComputation ) Then
buffer = buffer +"Register Write In Computation, "EndIfIf ( watchpoint.HaltCondition And watchpointHaltOnUnderflow ) Then
buffer = buffer +"Underflow, "EndIfIf ( watchpoint.HaltCondition And watchpointHaltOnOverflow ) Then
buffer = buffer +"Overflow, "EndIfRem Избавление от последней запятой в конце строки:
buffer = Left(buffer, Len(buffer) -2)
app.PrintText tabConsole, buffer
Next
EndIf
[Константы и перечисления VisualDSP++ Automation API]
В таблице ниже и последующих врезках приведены описания типов для констант. Все эти типы определены как перечисления, в которых находятся соответствующие константы, задающие различные значения.
Функция
Описание
adspBreakpointType
Используется для того, чтобы задать состояние видимости точки останова в интерфейсе среды разработки VisualDSP++, а также типа точки останова (например, аппаратная она или программная).
adspCompilerAnnotationsType
Используется для указания типа аннотации компилятора.
adspBtcDataWidth
Используется для указания ширины данных, которая поддерживается BTC [4].
adspConvertType
Используется для преобразования типа данных из типа native C/C++ (или в этот тип).
adspDebugState
Используется для указания состояния целевого процессора.
adspEndianFormat
Используется для указания порядка следования байт при сохранении данных в двоичный файл.
adspFileAttributeMasks
Задает различные атрибуты исходных файлов в проекте.
adspImageAutoRefreshType
Задает тип автообновления, поддерживаемый ImageViewer.
adspImageFlip
Используется для того, чтобы задать тип поворота изображения в ImageViewer.
adspImageMemSourceFormat
Используется для установки формата данных исходных данных для ImageViewer.
adspImagePixelFormat
Используется для установки типа кодирования данных в точке.
adspImagePpmType
Используется для установки PPM сохраняемого типа изображения.
adspImageRotate
Используется для установки поворота изображения.
adspImageSourceLocation
Используется, чтобы установить или получить место размещения данных изображения.
adspMemoryAccessTypeMasks
Задает различные атрибуты сегмента памяти целевого процессора. Эти значения могут объединяться операцией ИЛИ.
adspOutputWindowTab
Используется для указания определенной закладки выходного окна среды разработки VisualDSP++.
adspOutputWindowTextType
Используется для указания стиля отображаемого текста, когда он печатается на закладке окна в среде разработки VisualDSP++.
adspPluginStartupStyle
Используется для указания типа поведения, которое окно плагина показывает при первой своей загрузке.
adspPluginWindowType
Используется для указания типа окна, в котором работает плагин.
adspProfileFilterType
Используется для указания типа фильтра, накладываемого на результаты сессии профайлинга.
adspProfileMemoryType
Используется для указания типа памяти, используемой в сессии профайлинга.
adspSaveProfileFormat
Используется для указания формата, в котором будут сохранены данные сессии профайлинга.
adspStreamType
Используется для указания типа конечной точки, к которой подключен поток.
adspWatchpointHaltConditionMasks
Используется для указания случаев, в которых выполнение должно быть остановлено (halt), когда установлена точка просмотра (watchpoint). Значения из этого перечисления могут объединяться операцией ИЛИ.
adspWatchpointType
Используется для указания типа точки просмотра (watchpoint), которую представляет объект ADspWatchpoint.
Используется для обозначения состояния видимости точки останова в пользовательском интерфейсе IDDE, а также устанавливает тип точки останова (например аппаратная она или программная).
Указывает, что точка останова публичная, и видима в пользовательском интерфейсе IDDE.
breakpointPrivate
1
Указывает, что точка останова приватная, и она скрыта в пользовательском интерфейсе IDDE.
breakpointHardware
2
Указывает, что точка останова аппаратная, в отличие от программной точки останова. Это значение может быть объединено операцией ИЛИ со значением breakpointPublic и breakpointPrivate, чтобы указать видимость точки останова.
Сегмент памяти является памятью только для чтения (Read-Only Memory, ROM). Если маска не установлена, то сегмент памяти является памятью с произвольным доступом, ОЗУ (Random Access Memory, RAM).
memoryAcessTypeInternal
0x02
Сегмент относится к внутренней памяти. Если эта маска не установлена, то сегмент памяти относится к внешней памяти.
Обычное окно, не привязанное к отдельному процессору. Окно может быть плавающим в главном окне или рабочем столе, или быть присоединяемым (dockable).
wndtypeSpecific
1
Окно, относящееся к процессору (т. е. прикрепленное к отдельному процессору), наподобие окна регистров. Окно может быть плавающим в главном окне или рабочем столе, или быть присоединяемым (dockable). Также окно может быть прикрепленным к процессору в сессии Multiprocessor.
Используется для указания случаев, в которых выполнение должно быть остановлено (halt), когда установлена точка просмотра (watchpoint). Значения из этого перечисления могут объединяться операцией ИЛИ.