VDK API для получения информации состояния приложения Печать
Добавил(а) microsin   

Состояние приложения включает информацию о потоках (использование стека, метки времени), объектах блокировки (семафоры, флаги, сообщания, события), буфере истории и другие данные приложения. Во время отладки эта информация доступна, если остановить сессию отладки, и открыть информационное окно VDK Status среды разработки VisualDSP++  (открывается через меню View -> VDK Windows -> Status).

VDK Status window1 VDK Status window2

Перечисленные ниже функции дают возможность получить эту информацию, не останавливая отладчик, прямо из кода приложения. Большинство этих функций требует наличия сборки с полной инструментальной поддержки со стороны библиотек VDK (закладка Kernel свойств проекта VDK, раздел System -> Instrumentation Level -> выбор Full Instrumentation).

Функция Краткое описание Thread Kernel ISR Startup
GetAllDeviceFlags Получение информации об имеющихся флагах устройств. + + - -
GetAllMemoryPools Получение информации об имеющихся пулах памяти. + + - -
GetAllMessages Получение информации об имеющихся сообщениях. + + - -
GetAllSemaphores Получение информации об имеющихся семафорах. + + - -
GetAllThreads Получение информации об имеющихся потоках. + + - -
GetCurrentHistoryEventNum Возврат текущего номера (индекса кольцевого буфера) события истории. + + - -
GetDevFlagPendingThreads Получение информации о потоках, заблокированных на флаге устройства. + + - -
GetEventPendingThreads Получение информации о потоках, заблокированных на ожидании события. + + - -
GetHistoryBufferSize Получение размера буфера истории. + + - -
GetHistoryEvent Извлекает информацию события по индексу из буфера истории. + + - -
GetMessageStatusInfo Получение полного набора атрибутов, связанных с объектом сообщения. + - - -
GetNumTimesRun Возвратит количество запусков потока (сколько раз ему было передано управление). + + - -
GetPoolDetails Возвратит информацию о пуле памяти. + + - -
GetSemaphoreDetails Возвратит информацию о семафоре. + + - -
GetSemaphorePendingThreads Возвратит информацию о потоках, заблокированных на семафоре. + + - -
GetSharcThreadCycleData Возвратит информацию о времени выполнения потока в единицах тактов таймера ядра. Функция относится только к процессорам SHARC. + + - -
GetThreadBlockingID Получение идентификатора объекта, на котором заблокирован поток. + + - -
GetThreadCycleData Возвратит информацию о времени выполнения потока в единицах тактов таймера ядра. Функция относится только к процессорам TigerSHARC и Blackfin. + + - -
GetThreadStackDetails Возвратит информацию о стеке потока. + - - -
GetThreadStack2Details Возвратит информацию о втором стеке потока. Функция относится только к процессорам ADSP-TSxxx. + - - -
GetThreadTemplateName Возвратит имя шаблона потока. + + - -
GetThreadTickData Возвратит информацию о времени выполнения потока в тиках системы. + + - -

//Прототип на языке C:
int VDK_GetAllDeviceFlags(VDK_DeviceFlagID outDevFlagIDArray[],
                          int inArraySize);
 
//Прототип на языке C++:
int VDK::GetAllDeviceFlags(VDK::DeviceFlagID outDevFlagIDArray[],
                           int inArraySize);

Вернет текущее количество флагов устройств в системе, и заполнит предоставленный массив соответствующими идентификаторами флагов устройств. Когда количество флагов устройств больше количества ячеек в предоставленном массиве, функция заполнит этот массив полностью и выполнит возврат. В зоне ответственности пользователя выделить достаточно памяти для этого вызова API. Макрос VDK_kMaxNumActiveDevFlags, определенный в VDK.h, установлен на максимальное количество флагов устройств, которое разрешено иметь в системе, как это определено на закладке Kernel свойств проекта VDK. По значению из этого макроса можно задать размер массива.

Функция не запускает планировщик, и время её работы заранее не определено.

[Параметры]

outDevFlagIDArray указывает на массив, в котором будут возвращены флаги устройств, идентифицированных в системе. Память под этот массив должна быть выделена до вызова этой функции (статически или динамически). Если размер массива недостаточен для того, чтобы разместить все идентифицированные флаги устройств, то до возврата функции в массив будет записано столько идентификаторов DeviceFlagID, сколько поместится.

Обратите внимание, что предоставленный массив не будет заполнен в каком-то определенном порядке. Идентификаторы DeviceFlagID будут записаны в массив так, как они были идентифицированы в системе.

inArraySize это количество элементов DeviceFlagID, которое может поместиться в предоставленный массив. Если inArraySize == 0 (массив не предоставлен), то функция только определит и вернет количество флагов устройств в системе.

Обработка ошибок с применением инструментальной сборки: значение ошибки kInvalidPointer покажет, что outDevFlagIDArray равен NULL, и inArraySize не равен 0.

//Прототип на языке C:
int VDK_GetAllMemoryPools(VDK_PoolID outPoolIDArray[],
                          int inArraySize);
 
//Прототип на языке C++:
int VDK::GetAllMemoryPools(VDK::PoolID outPoolIDArray[],
                           int inArraySize);

Вернет текущее количество пулов в системе, и заполнит предоставленный массив соответствующими идентификаторами пулов. Когда количество пулов памяти больше количества ячеек в предоставленном массиве, функция заполнит этот массив полностью и выполнит возврат. В зоне ответственности пользователя выделить достаточно памяти для этого вызова API. Макрос VDK_kMaxNumActiveMemoryPools, определенный в VDK.h, установлен в максимальное количество пулов памяти, которое разрешено иметь в системе, как это определено на закладке Kernel свойств проекта VDK. По значению из этого макроса можно задать размер массива.

Функция не запускает планировщик, и время её работы заранее не определено.

[Параметры]

outPoolIDArray указывает на массив для возврата пулов памяти, идентифицированных в системе. Память для этого массива должна быть выделена до вызова этой API-функции. Если размер массива недостаточен для того, чтобы удержать в себе все идентифицированные пулы памяти, то массив будет заполнен полностью идентификаторами PoolID, и функция выполнит возврат.

Обратите внимание, что предоставленный массив не будет заполнен в каком-то определенном порядке. Идентификаторы PoolID будут записаны в массив так, как они были идентифицированы в системе.

inArraySize это количество элементов PoolID в предоставленном массиве. Если inArraySize == 0 (массив не предоставлен), то функция только определит и вернет количество пулов памяти в системе.

Обработка ошибок с применением инструментальной сборки: значение ошибки kInvalidPointer покажет, что outPoolIDArray равен NULL, и inArraySize не равен 0.

//Прототип на языке C:
int VDK_GetAllMessages(VDK_MessageID outMessageIDArray[],
                       int inArraySize);
 
//Прототип на языке C++:
int VDK::GetAllMessages(VDK::MessageID outMessageIDArray[],
                        int inArraySize);

Вернет текущее количество сообщений в системе, и заполнит предоставленный массив соответствующими идентификаторами сообщений. Когда количество идентифицированных сообщений больше количества ячеек в предоставленном массиве, функция заполнит этот массив полностью и выполнит возврат. В зоне ответственности пользователя выделить достаточно памяти для этого вызова API. Макрос VDK_kMaxNumActiveMessages, определенный в VDK.h, установлен на максимальное количество сообщений, которое разрешено иметь в системе, как это определено на закладке Kernel свойств проекта VDK. По значению из этого макроса можно задать размер массива.

Функция не запускает планировщик, и время её работы заранее не определено.

[Параметры]

outMessageIDArray указывает на массив для возврата сообщений, идентифицированных в системе. Память для этого массива должна быть выделена до вызова этой API-функции. Если размер массива недостаточен для того, чтобы удержать в себе все идентифицированные сообщения, то массив будет заполнен полностью идентификаторами MessageID, и функция выполнит возврат.

Обратите внимание, что предоставленный массив не будет заполнен в каком-то определенном порядке. Идентификаторы MessageID будут записаны в массив так, как они были идентифицированы в системе.

inArraySize это количество элементов MessageID в предоставленном массиве. Если inArraySize == 0 (массив не предоставлен), то функция только определит и вернет текущее количество сообщений в системе.

Обработка ошибок с применением инструментальной сборки: значение ошибки kInvalidPointer покажет, что outMessageIDArray равен NULL, и inArraySize не равен 0.

//Прототип на языке C:
int VDK_GetAllSemaphores(VDK_SemaphoreID outSemaphoreIDArray[],
                         int inArraySize);
 
//Прототип на языке C++:
int VDK::GetAllSemaphores(VDK::SemaphoreID outSemaphoreIDArray[],
                          int inArraySize);

Вернет текущее количество семафоров в системе, и заполнит предоставленный массив соответствующими идентификаторами семафоров. Когда количество идентифицированных семафоров больше количества ячеек в предоставленном массиве, функция заполнит этот массив полностью и выполнит возврат. В зоне ответственности пользователя выделить достаточно памяти для этого вызова API. Макрос VDK_kMaxNumActiveSemaphores, определенный в VDK.h, установлен на максимальное количество сообщений, которое разрешено иметь в системе, как это определено на закладке Kernel свойств проекта VDK. По значению из этого макроса можно задать размер массива.

Функция не запускает планировщик, и время её работы заранее не определено.

[Параметры]

outSemaphoreIDArray указывает на массив для возврата семафоров, идентифицированных в системе. Память для этого массива должна быть выделена до вызова этой API-функции. Если размер массива недостаточен для того, чтобы удержать в себе все идентифицированные семафоры, то массив будет заполнен полностью идентификаторами SemaphoreID, и функция выполнит возврат.

Обратите внимание, что предоставленный массив не будет заполнен в каком-то определенном порядке. Идентификаторы SemaphoreID будут записаны в массив так, как они были идентифицированы в системе.

inArraySize это количество элементов SemaphoreID в предоставленном массиве. Если inArraySize == 0 (массив не предоставлен), то функция только определит и вернет текущее количество семафоров в системе.

Обработка ошибок с применением инструментальной сборки: значение ошибки kInvalidPointer покажет, что outSemaphoreIDArray равен NULL, и inArraySize не равен 0.

//Прототип на языке C:
int VDK_GetAllThreads(VDK_ThreadID outThreadIDArray[],
                      int inArraySize);
 
//Прототип на языке C++:
int VDK::GetAllThreads(VDK::ThreadID outThreadIDArray[],
                       int inArraySize);

Вернет текущее количество потоков в системе, и заполнит предоставленный массив соответствующими идентификаторами потоков. Когда количество идентифицированных потоков больше количества ячеек в предоставленном массиве, функция заполнит этот массив полностью и выполнит возврат. В зоне ответственности пользователя выделить достаточно памяти для этого вызова API. Макрос VDK_kMaxNumThreads, определенный в VDK.h, установлен на максимальное количество потоков, которое разрешено иметь в системе, как это определено на закладке Kernel свойств проекта VDK. По значению из этого макроса можно задать размер массива.

Функция не запускает планировщик, и время её работы заранее не определено.

[Параметры]

outThreadArray указывает на массив для возврата потоков, идентифицированных в системе. Память для этого массива должна быть выделена до вызова этой API-функции. Если размер массива недостаточен для того, чтобы удержать в себе все идентифицированные потоки, то массив будет заполнен полностью идентификаторами ThreadID, и функция выполнит возврат.

Обратите внимание, что предоставленный массив не будет заполнен в каком-то определенном порядке. Идентификаторы ThreadID будут записаны в массив так, как они были идентифицированы в системе.

inArraySize это количество элементов ThreadID в предоставленном массиве. Если inArraySize == 0 (массив не предоставлен), то функция только определит и вернет текущее количество потоков в системе.

Обработка ошибок с применением инструментальной сборки: значение ошибки kInvalidPointer покажет, что outThreadIDArray равен NULL, и inArraySize не равен 0.

//Прототип на языке C:
unsigned int VDK_GetCurrentHistoryEventNum(void);
 
//Прототип на языке C++:
unsigned int VDK::GetCurrentHistoryEventNum(void);

Возвращает текущий номер события истории. Это номер события, который подготовлен для следующей записи, а не номер последнего записанного события. Возвращенное значение это индекс события в буфере истории. Эта API-функция может быть вызвана только для варианта сборки fully instrumented библиотек VDK.

Функция не запускает планировщик, и время её работы постоянное.

//Прототип на языке C:
VDK_SystemError VDK_GetDevFlagPendingThreads(VDK_DeviceFlagID inDevFlagID,
                                             int *outNumThreads,
                                             VDK_ThreadID outThreadArray[],
                                             int inArraySize);
 
//Прототип на языке C++:
VDK::SystemError VDK::GetDevFlagPendingThreads(VDK::DeviceFlagID inDevFlagID,
                                               int *outNumThreads,
                                               VDK::ThreadID outThreadArray[],
                                               int inArraySize);

Вернет текущее количество потоков, ожидающих флага устройства, и заполнит предоставленный массив соответствующими идентификаторами потоков. Массив будет заполнен потоками в том же порядке, в каком потоки находятся в очереди ожидания (pending queue). Когда количество идентифицированных потоков больше количества ячеек в предоставленном массиве, функция заполнит этот массив полностью. В зоне ответственности пользователя выделить достаточно памяти для этого вызова API. Макрос VDK_kMaxNumThreads, определенный в VDK.h, установлен на максимальное количество потоков, которое разрешено иметь в системе, как это определено на закладке Kernel свойств проекта VDK.

Функция не запускает планировщик, и время её работы заранее не определено.

[Параметры]

inDevFlagID это идентификатор флага устройства, который опрашивается.

outNumThreads заполнится количеством потоков, идентифицированных как ожидающие на этом флаге устройства.

outThreadArray указывает на массив для возврата идентификаторов потоков, которые ожидают на флаге устройства. Память для этого массива должна быть выделена до вызова этой API-функции. Если размер массива недостаточен для того, чтобы удержать в себе все идентифицированные потоки, то массив будет заполнен полностью идентификаторами ThreadID, и функция выполнит возврат.

inArraySize это количество элементов ThreadID в предоставленном массиве. Если inArraySize == 0 (массив не предоставлен), то функция только определит и вернет текущее количество потоков в очереди.

[Возвращаемое значение]

Обработка ошибок с применением инструментальной сборки:

• kUnknownSemaphore, если в параметре inDevFlagID указан недопустимый идентификатор.
• kInvalidPointer, если в параметре outThreadArray указан NULL, и inArraySize не равен 0.
• Иначе kNoError (ошибок нет).

Без библиотек с проверкой ошибок: kNoError.

//Прототип на языке C:
VDK_SystemError VDK_GetEventPendingThreads(VDK_EventID inEventID,
                                           int *outNumThreads,
                                           VDK_ThreadID outThreadArray[],
                                           int inArraySize);
 
//Прототип на языке C++:
VDK::SystemError VDK::GetEventPendingThreads(VDK::EventID inEventID,
                                             int *outNumThreads,
                                             VDK::ThreadID outThreadArray[],
                                             int inArraySize);

Вернет текущее количество потоков, которые ожидают событие, и заполнит предоставленный массив соответствующими идентификаторами этих потоков. Массив заполняется потоками в том же порядке, в каком они находятся в очереди ожидания (pending queue). Когда количество идентифицированных потоков больше, чем размер предоставленного массива, массив будет заполнен полностью. В зоне ответственности пользователя предоставить достаточно памяти для вызова этой API-функции. Макрос VDK_kMaxNumThreads, определенный в VDK.h, будет установлен на максимальное количество потоков, которое разрешено иметь в системе, aкак это определено на закладке Kernel свойств проекта VDK.

Функция не запускает планировщик, и время её работы заранее не определено.

[Параметры]

inEventID это идентификатор опрашиваемого события (EventID).

outNumThreads заполняется количеством потоков, которые идентифицированы как ожидающие на этом событии.

outThreadArray указывает на массив для возврата идентификаторов потоков, которые ожидают указанного события. Память для этого массива должна быть выделена до вызова этой API-функции. Если размер массива недостаточен для того, чтобы удержать в себе все идентифицированные потоки, то массив будет заполнен полностью идентификаторами ThreadID, и функция выполнит возврат. Массив outThreadArray заполняется в том же порядке, в каком потоки находятся в очереди ожидания: поток более высоким приоритетом будет расположен ближе к началу массива.

inArraySize это количество элементов ThreadID в предоставленном массиве. Если inArraySize == 0 (массив не предоставлен), то функция только определит и вернет текущее количество потоков в очереди.

[Возвращаемое значение]

Обработка ошибок с применением инструментальной сборки:

• kUnknownSemaphore, если в параметре inDevFlagID указан недопустимый идентификатор.
• kInvalidPointer, если в параметре outThreadArray указан NULL, и inArraySize не равен 0.
• Иначе kNoError (ошибок нет).

Без библиотек с проверкой ошибок: kNoError.

//Прототип на языке C:
unsigned int VDK_GetHistoryBufferSize(void);
 
//Прототип на языке C++:
unsigned int VDK::GetHistoryBufferSize(void);

Вернет максимальное количество событий, которое может содержать буфер истории (history buffer). Эта API-функция может быть вызвана только для варианта сборки fully instrumented библиотек VDK.

Функция не запускает планировщик, и время её работы постоянное.

//Прототип на языке C:
VDK_SystemError VDK_GetHistoryEvent(unsigned int inHistEventNum,
                                    VDK_HistoryEvent *outHistoryEvent);
 
//Прототип на языке C++:
VDK::SystemError VDK::GetHistoryEvent(unsigned int inHistEventNum,
                                      VDK::HistoryEvent *outHistoryEvent);

Вернет событие истории из буфера истории VDK по индексу события в буфере. Эта API-функция может быть вызвана только для варианта сборки fully instrumented библиотек VDK.

Функция не запускает планировщик, и время её работы постоянное.

[Параметры]

inHistEventNum это индекс требуемого события истории. Индексы начинают увеличиваться от 0 до размера буфера истории минус 1.

outHistoryEvent в случае успешного выполнения функции заполняется нужным событием истории.

[Возвращаемое значение]

В случае успеха будет возвращено значение kNoError. Если inHistEventNum больше, чем максимальное значение индекса для имеющегося размер буфера истории, то будет возвращено значение kMaxHistoryEventExceeded.

//Прототип на языке C:
VDK_SystemError VDK_GetMessageStatusInfo(VDK_MessageID inMessageID,
                                         VDK_MessageDetails *outMessageDetails,
                                         VDK_PayloadDetails *outPayloadDetails);
 
//Прототип на языке C++:
VDK::SystemError VDK::GetMessageStatusInfo(VDK::MessageID inMessageID,
                                           VDK::MessageDetails *outMessageDetails,
                                           VDK::PayloadDetails *outPayloadDetails);

Эта API-функция выполняет все то же самое, что и VDK::GetMessageDetails(), но при этом не диспетчеризирует ошибку, если вызвавший поток не является владельцем этого сообщения.

Что делает GetMessageDetails: она извлекает полный набор атрибутов, связанных с объектом сообщения. Результат вызова состоит из информации о сообщении (канал, отправитель и получатель) и информации о полезной нагрузке (тип, размер и адрес).

Смысл атрибутов сообщения соответствует аргументам последней публикации сообщения. Смысл значений полезной нагрузки зависит от специфики приложения, и соответствует аргументам, которые были переданы в вызов CreateMessage().

Только тот поток, который является владельцем сообщения, может анализировать атрибуты полезной нагрузки. Если другие потоки вызовут функцию GetMessageDetails, то будет диспетчеризирована ошибка, и содержимое *outMessageDetails and *outPayloadDetails останется не измененным. GetMessageStatusInfo не вызывает такой ошибки.

Функция не запускает планировщик, и время её работы постоянное.

[Параметры]

inMessageID указывает идентификатор опрашиваемого сообщения (MessageID).

outMessageDetails это указатель на структуру типа MessageDetails. Параметр outMessageDetails может быть равен NULL, в этом случае е будет возвращена детальная информация о сообщении.

outPayloadDetails указатель на тип PayloadDetails. Эта информация та же самая, как и информация, запрашиваемая API-вызовом GetMessagePayload(). Параметр outPayloadDetails также может быть NULL, в таком случае дополнительная информация о полезной нагрузке сообщения возвращена не будет.

[Возвращаемое значение]

Вернет kInvalidMessageID, если MessageID недопустимый идентификатор; иначе вернет kNoError.

//Прототип на языке C:
VDK_SystemError VDK_GetNumTimesRun(VDK_ThreadID inThreadID,
                                   unsigned int *outRunCount);
 
//Прототип на языке C++:
VDK::SystemError VDK::GetNumTimesRun(VDK::ThreadID inThreadID,
                                     unsigned int *outRunCount);

Запрашивает количество раз, сколько был запущен поток (сколько раз планировщик передал управление в его функцию Run). Эта API-функция может быть вызвана только при наличии fully instrumented библиотек VDK, поскольку соответствующая информация недоступна для вариантов сборок "Error Checking" и "None".

Функция не запускает планировщик, и время её работы постоянное.

[Параметры]

inThreadID это идентификатор требуемого потока (ThreadID).

outRunCount заполняется числом, равным количеству передач управления (переключений контекста) в тело функции Run() указанного потока.

[Возвращаемое значение]

Вернет kUnknownThread, если ThreadID недопустимый идентификатор потока; иначе вернет kNoError.

//Прототип на языке C:
VDK_SystemError VDK_GetPoolDetails(VDK_PoolID inPoolID,
                                   unsigned int *outNumBlocks,
                                   void **outMemoryAddress);
 
//Прототип на языке C++:
VDK::SystemError VDK::GetPoolDetails(VDK::PoolID inPoolID,
                                     unsigned int *outNumBlocks,
                                     void **outMemoryAddress);

Вернет набор атрибутов объекта пула памяти, количество блоков в пуле и начальный адрес пула. Функция не запускает планировщик, и время её работы постоянное.

[Параметры]

inPoolID идентификатор опрашиваемого пула (PoolID).

outNumBlocks заполняется общим количеством блоков в пуле, включая те блоки, которые свободны, и те, которые выделены. Параметр outNumBlocks может быть NULL, в таком случае количество блоков в пуле памяти возвращено не будет.

outMemoryAddress заполняется начальным адресом опрашиваемого пула. Параметр outMemoryAddress также может быть NULL, тогда начальный адрес пула памяти возвращен не будет.

[Возвращаемое значение]

Обработка ошибок с применением инструментальной сборки: вернет kInvalidPoolID, если PoolID недопустимый идентификатор; иначе вернет kNoError.

Без библиотек с проверкой ошибок: kNoError.

//Прототип на языке C:
VDK_SystemError VDK_GetSemaphoreDetails(VDK_SemaphoreID inSemID,
                                        VDK_Ticks *outPeriod,
                                        unsigned int *outMaxCount);
 
//Прототип на языке C++:
VDK::SystemError VDK::GetSemaphoreDetails(VDK::SemaphoreID inSemID,
                                          VDK::Ticks *outPeriod,
                                          unsigned int *outMaxCount);

Вернет набор параметров, связанных с объектом семафора. Функция не запускает планировщик, и время её работы постоянное.

[Параметры]

inSemID указывает семафор (SemaphoreID), который нужно опросить.

outPeriod сюда будет заполнен период семафора. Этот параметр может быть NULL, тогда период семафора возвращен не будет.

outMaxCount сюда будет заполнено максимальное количество счетчика для этого семафора. Этот параметр также может быть NULL, тогда максимальное значение счетчика для этого семафора возвращено не будет.

[Возвращаемое значение]

Обработка ошибок с применением инструментальной сборки: вернет kUnknownSemaphore, если SemaphoreID недопустимый идентификатор; иначе вернет kNoError.

Без библиотек с проверкой ошибок: kNoError.

//Прототип на языке C:
VDK_SystemError VDK_GetSemaphorePendingThreads(VDK_SemaphoreID inSemID,
                                               int *outNumThreads,
                                               VDK_ThreadID outThreadArray[],
                                               int inArraySize);
 
//Прототип на языке C++:
VDK::SystemError VDK::GetSemaphorePendingThreads(VDK::SemaphoreID inSemID,
                                                 int *outNumThreads,
                                                 VDK::ThreadID outThreadArray[],
                                                 int inArraySize);

Вернет текущее количество потоков, ожидающих указанного семафора, и заполнит предоставленный массив соответствующими идентификаторами потоков. Массив заполняется потоками в том же порядке, в каком они находятся в очереди ожидания (pending queue). Когда количество идентифицированных потоков больше, чем размер предоставленного массива, то массив будет заполнен полностью. В зоне ответственности пользователя предоставить достаточно памяти для вызова этой API-функции. Макрос VDK_kMaxNumThreads, определенный в VDK.h, будет установлен на максимальное количество потоков, которое разрешено иметь в системе, aкак это определено на закладке Kernel свойств проекта VDK.

Функция не запускает планировщик, и время её работы заранее не известно.

[Параметры]

inSemID это идентификатор опрашиваемого семафора (SemaphoreID).

outNumThreads заполняется количеством потоков, которые были определены ожидающими на указанном семафоре.

outThreadArray указывает на массив, который будет заполнен идентификаторами потоков ThreadID, которые заблокированы (ожидают) на этом семафоре. Память для этого массива должна быть выделена перед вызовом API-функции. Если размер массива недостаточен для того, чтобы сохранить все идентифицированные потоки, то он будет заполнен до конца при возврате из функции.

Массив outThreadArray заполняется в том же порядке, в каком потоки находятся в очереди ожидания: поток с более высоким приоритетом (который ждал больше времени) будет помещен ближе к началу массива.

inArraySize это количество элементов ThreadID в предоставленном массиве. Если inArraySize == 0, то функция вернет только количество потоков в очереди.

[Возвращаемое значение]

Обработка ошибок с применением инструментальной сборки:

• kUnknownSemaphore, если SemaphoreID недопустимый идентификатор.
• kInvalidPointer, если outThreadArray == NULL, и inArraySize не равен 0.
• Иначе вернет kNoError.

Без библиотек с проверкой ошибок: kNoError.

//Прототип на языке C:
VDK_SystemError VDK_GetSharcThreadCycleData (VDK_ThreadID inThreadID,
                                             unsigned int outCreationTime[2],
                                             unsigned int outStartTime[2],
                                             unsigned int outLastTime[2],
                                             unsigned int outTotalTime[2]);
 
//Прототип на языке C++:
VDK::SystemError VDK::GetSharcThreadCycleData (VDK::ThreadID inThreadID,
                                               unsigned int outCreationTime[2],
                                               unsigned int outStartTime[2],
                                               unsigned int outLastTime[2],
                                               unsigned int outTotalTime[2]);

Запрашивает информацию о выполняемых циклах для указанного потока. Эта API-функция может быть вызвана только при наличии fully instrumented библиотек VDK, поскольку соответствующая информация недоступна для вариантов сборок "Error Checking" и "None".

Функция не запускает планировщик, и время её работы постоянное.

Внимание: API-функция GetSharcThreadCycleData() доступна только для процессоров SHARC. Для других процессоров используйте GetThreadCycleData().

[Параметры]

inThreadID это идентификатор опрашиваемого потока (ThreadID).

outCreationTime сюда будет помещено количество счетчика циклов в момент создания потока. Параметр outCreationTime может быть NULL, тогда не будет возвращено время создания потока.

outStartTime заполняется счетчиком тактов, который был в момент, когда управление контекстом первый раз перешло к этому потоку. Параметр outStartTime может быть NULL, тогда информация о времени запуска потока не будет возвращена.

outLastTime заполняется счетчиком тактов в момент последнего выполнения потока. Параметр outLastTime может быть NULL, в таком случае количество счетчика тактов не будет возвращено.

outTotalTime заполняется кумулятивным количеством тактов счетчика, которым он инкрементировался во все время выполнения потока с момента его создания. Параметр outTotalTime может быть равен NULL, в таком случае общая информация о времени выполнения не будет возвращена.

Массивы заполняются таким образом, что старшее слово (где находятся наиболее значимые данные) счетчика данных находится в первом элементе, и младшее слово (наименее значимое) находится во втором элементе.

//Прототип на языке C:
VDK_SystemError VDK_GetThreadBlockingID(VDK_ThreadID inThreadID,
                                        int *outBlockingID);
 
//Прототип на языке C++:
VDK::SystemError VDK::GetThreadBlockingID(VDK::ThreadID inThreadID,
                                          int *outBlockingID);

Вернет идентификатор из перечисления объекта VDK, на котором поток был последний раз заблокирован, или вернет маску канала сообщения, если поток был заблокирован на ожидании сообщения. Тип объекта может быть определен из статуса потока, т. е. если статус потока kSemaphoreBlocked, то эта API-функция вернет идентификатор семафора. Этот атрибут обновляется только когда поток блокируется, но не когда поток разблокируется. Рекомендуется использовать GetThreadBlockingID() вместе с GetThreadStatus().

Функция не запускает планировщик, и время её работы постоянное.

[Параметры]

inThreadID указывает опрашиваемый поток (ThreadID).

outBlockingID заполняется идентификатором объекта, на котором поток был последний раз заблокирован, или маской канала сообщения, если поток был заблокирован на ожидании сообщения.

[Возвращаемое значение]

Обработка ошибок с применением инструментальной сборки: вернет kUnknownThread, если ThreadID недопустимый идентификатор; иначе вернет kNoError.

Без библиотек с проверкой ошибок: kNoError.

//Прототип на языке C:
VDK_SystemError VDK_GetThreadCycleData (VDK_ThreadID inThreadID,
                                        unsigned long long int *outCreationTime,
                                        unsigned long long int *outStartTime,
                                        unsigned long long int *outLastTime,
                                        unsigned long long int *outTotalTime);
 
//Прототип на языке C++:
VDK::SystemError VDK::GetThreadCycleData (VDK::ThreadID inThreadID,
                                          unsigned long long int *outCreationTime,
                                          unsigned long long int *outStartTime,
                                          unsigned long long int *outLastTime,
                                          unsigned long long int *outTotalTime);

Запрашивает информацию со счетчиками циклов для указанного потока. Эта API-функция может быть вызвана только при наличии fully instrumented библиотек VDK, поскольку соответствующая информация недоступна для вариантов сборок "Error Checking" и "None".

Функция не запускает планировщик, и время её работы постоянное.

Внимание: API-функция VDK_GetThreadCycleData() поддерживается только для процессоров TigerSHARC и Blackfin. Чтобы получить данные тактов для процессора SHARC, используйте GetSharcThreadCycleData().

[Параметры]

inThreadID это идентификатор опрашиваемого потока (ThreadID).

outCreationTime сюда будет помещено количество счетчика циклов в момент создания потока. Параметр outCreationTime может быть NULL, тогда не будет возвращено время создания потока.

outStartTime заполняется счетчиком тактов, который был в момент, когда управление контекстом первый раз перешло к этому потоку. Параметр outStartTime может быть NULL, тогда информация о времени запуска потока не будет возвращена.

outLastTime заполняется счетчиком тактов в момент последнего выполнения потока. Параметр outLastTime может быть NULL, в таком случае количество счетчика тактов не будет возвращено.

outTotalTime заполняется кумулятивным количеством тактов счетчика, которым он инкрементировался во все время выполнения потока с момента его создания. Параметр outTotalTime может быть равен NULL, в таком случае общая информация о времени выполнения не будет возвращена.

Вернет kUnknownThread, если в параметре ThreadID передан недопустимый идентификатор; иначе вернет kNoError.

//Прототип на языке C:
VDK_SystemError VDK_GetThreadStackDetails(VDK_ThreadID inThreadID,
                                          unsigned int *outStackSize,
                                          void **outStackAddress);
 
//Прототип на языке C++:
VDK::SystemError VDK::GetThreadStackDetails(VDK::ThreadID inThreadID,
                                            unsigned int *outStackSize,
                                            void **outStackAddress);

Возвращает атрибуты стека указанного потока: размер и начальный адрес. Функция не запускает планировщик, и время её работы постоянное.

[Параметры]

inThreadID задает опрашиваемый поток (ThreadID).

outStackSize вернет размер стека в 32-битных словах. Параметр outstackSize может быть равен NULL, в таком случае не будет возвращена информация о размере стека.

outStackAddress вернет начальный адрес стека потока в памяти. Параметр outStackAddress может быть равен NULL, в таком случае начальный адрес стека возвращен не будет.

[Возвращаемое значение]

Обработка ошибок с применением инструментальной сборки: вернет kUnknownThread, если ThreadID недопустимый идентификатор; иначе вернет kNoError.

Без библиотек с проверкой ошибок: kNoError.

//Прототип на языке C:
VDK_SystemError VDK_GetThreadStack2Details(VDK_ThreadID inThreadID,
                                           unsigned int *outStackSize,
                                           void **outStackAddress);
 
//Прототип на языке C++:
VDK::SystemError VDK::GetThreadStack2Details(VDK::ThreadID inThreadID,
                                             unsigned int *outStackSize,
                                             void **outStackAddress);

Делает все то же самое, что и функция GetThreadStackDetails (описание в предыдущей врезке) с только лишь тем отличием, что возвратит информацию о втором стеке (stack2). Эта функция применима только для процессоров с двумя стеками, в настоящее время это только лишь процессоры семейства ADSP-TSxxx.

//Прототип на языке C:
VDK_SystemError VDK_GetThreadTemplateName(VDK_ThreadID inThreadID,
                                          char **outName);
 
//Прототип на языке C++:
VDK::SystemError VDK::GetThreadTemplateName(VDK::ThreadID inThreadID,
                                            char **outName);

Эта API-функция запрашивает адрес строки, завершенной нулем (null-terminated), которая содержит имя шаблона указанного потока.

Функция не запускает планировщик, и время её работы заранее не известно.

[Параметры]

inThreadID задает опрашиваемый поток (ThreadID).

outName заполнится указателем на строку имени шаблона для указанного потока.

[Возвращаемое значение]

Обработка ошибок с применением инструментальной сборки: вернет kUnknownThread, если ThreadID недопустимый идентификатор; иначе вернет kNoError.

Без библиотек с проверкой ошибок: kNoError.

Пример получения списка потоков в системе:

VDK::ThreadID *outThreadIDArray = 
   (VDK::ThreadID *)heap_malloc(1, VDK_kMaxNumThreads * sizeof(VDK::ThreadID));
int totalthreads = VDK::GetAllThreads (outThreadIDArray, VDK_kMaxNumThreads);
char *outName;
for (int idx=0; idx<totalthreads; idx++)
{
   VDK::GetThreadTemplateName(outThreadIDArray[idx], &outName);
   puart->uprintf ("%i: %s\n", outThreadIDArray[idx], outName);
}
heap_free(1, outThreadIDArray);

В результате будет выведен список наподобие следующего:

0: Idle Thread
1: kmainthread
2: kuartRXthread
3: kuartTXthread
4: kscreenthread
5: kreadbattvoltage
6: kkeybrdthread
7: kDSPthread

//Прототип на языке C:
VDK_SystemError VDK_GetThreadTickData(VDK_ThreadID inThreadID,
                                      VDK_Ticks *outCreationTime,
                                      VDK_Ticks *outStartTime,
                                      VDK_Ticks *outLastTime,
                                      VDK_Ticks *outTotalTime);
 //Прототип на языке C++:
VDK::SystemError VDK::GetThreadTickData(VDK::ThreadID inThreadID,
                                        VDK::Ticks *outCreationTime,
                                        VDK::Ticks *outStartTime,
                                        VDK::Ticks *outLastTime,
                                        VDK::Ticks *outTotalTime);

Функция запрашивает информацию о тиках для указанного потока. Эта API-функция может быть вызвана только при наличии fully instrumented библиотек VDK, поскольку соответствующая информация недоступна для вариантов сборок "Error Checking" и "None".

[Параметр]

inThreadID задает опрашиваемый поток (ThreadID).

outCreationTime заполняется счетчиком тиков (Ticks) в момент создания потока. Параметр outCreationTime может быть NULL, в таком случае время создания потока не возвращается.

outStartTime заполняется счетчиком тиков (Ticks), когда выполнение впервые было передано в этот поток. Параметр может быть NULL, в таком случае не будет возвращено время начала работы потока.

outLastTime заполняется счетчиком тиков, когда поток выполнялся в последний раз. Параметр outLastTime может быть NULL, в таком случае время последнего выполнения потока не будет возвращено.

outTotalTime заполняется кумулятивным количеством тиков, которое поток выполнялся с момента его создания. Параметр outTotalTime может быть NULL, в таком случае общее время выполнения потока не будет возвращено.

Функция не запускает планировщик, и время её работы постоянное.

Функция вернет kUnknownThread, если в параметре ThreadID передан недопустимый идентификатор; иначе вернет kNoError.

[Ссылки]

1. VisualDSP++ 5.0 Kernel (VDK) User’s Guide site:analog.com.
2. VisualDSP: работа с динамически выделяемой памятью.
3. Конфигурирование и отладка проектов VDK.
4. EE-307: советы по отладке для Blackfin.
5. VDK API для получения информации инструментальной сборки.