Программирование DSP VDK: коды и значения ошибок Thu, November 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


VDK: коды и значения ошибок Печать
Добавил(а) microsin   

Текущее состояние VDK можно узнать в при запуске отладки, если открыть окно VDK Status Window через меню View -> VDK Windows -> Status. Это окно предоставляет информацию для расшифровки состояния ядра VDK (VDK Kernel Status). Коды и значения ошибок VDK можно узнать в даташите "VisualDSP++ 5.0 VDK (Kernel) User’s Guide" [1], раздел VDK API Reference -> VDK Error Codes and Error Values -> Table 5-22. Ниже приведена эта таблица, где в каждой строке указан соответствующий вызов VDK API функции (столбец Имя функции, имена функций указаны в алфавитном порядке) вместе с декодированными мнемониками ошибки (столбец Error Code), которые могут дать соответствующие вызовы API или какие-то ошибочные события ядра. Дополнительная информация предоставлена (если она имеется), в виде числового значения (столбец Error Value), смысл которого зависит от кода ошибки.

Таблица 5-22. Коды ошибки API-функций VDK (Error Codes) и соответствующие им значения (Error Values).

Имя функции Error Code Error Value Описание
Все функции kAPIUsedfromISR Для процессоров Blackfin это значение IPEND1. Для процессоров SHARC это IMASKP2. Для процессоров TigerSHARC значение будет равно 0. API-функция была ошибочно вызвана из ISR.
kThreadStackOverflow Если ошибка вызвана при определении компилятором переполнения стека: для процессоров Blackfin это значение RETS, для процессоров SHARC это значение PCSTK. Если ошибка была детектирована во время выполнения, когда произошло вытесняющее переключение контекста, то для всех процессоров здесь будет Thread ID. Переполнение стека потока.
AcquireMutex() kInvalidMutexID inMutexID Недопустимый идентификатор мьютекса.
kDbgPossibleBlockInRegion Количество вложенных необслуживаемых (unsheduled) регионов. Возможна блокировка в необслуживаемом регионе кода.
kBlockInInvalidRegion Блокировка в недопустимом для блокировке необслуживаемом регионе кода.
kInvalidMutexOwner Владелец MutexID Недопустимый владелец мьютекса.
ClearEventBit() kUnknownEventBit inEventBitID Неизвестный бит события.
ClearInterruptMaskBitsEx() kInvalidMaskBit Бит, который не относится к биту маски прерывания. Недопустимый бит маски.
CloseDevice() kBadDeviceDescriptor inDD Неправильный дескриптор устройства (возможно, что устройство уже закрыто).
CreateDeviceFlag() kDeviceFlagCreationFailure -1 Ошибка создания флага устройства.
CreateMessage() kErrorMallocBlock Количество свободных блоков в пуле, зарезервированных для сообщений. Ошибка выделения блока.
CreateMutex() kMutexCreationFailure Размер структуры мьютекса. Ошибка создания мьютекса.
CreatePool() kPoolCreationFailure 0 Ошибка создания пула.
kInvalidPoolParms 0 Недопустимые параметры пула.
CreatePoolEx() kPoolCreationFailure 0 Ошибка создания пула
kInvalidPoolParms 0 Недопустимые параметры пула.
CreateSemaphore() kMaxCountExceeded -1 Достигнуто максимально возможное количество созданных семафоров.
kSemaphoreCreationFailure -1 Ошибка создания семафора.
CreateThread() kUnknownThreadType inType Неизвестный тип потока.
kThreadCreationFailure Ошибка создания потока.
CreateThreadEx() kUnknownThreadType inOutTCB –> Template ID Неизвестный тип потока.
kThreadCreationFailure Ошибка создания потока.
CreateThreadEx2() kIncompatibleArguments inFieldsRequired Несовместимые аргументы.
kInvalidPointer inOutTCB –> pTemplate, если ошибка связана с плохим шаблоном или inOutTCB –> stack_pointer, если ошибка была связана с неправильно выровненным указателем стека. Недопустимый указатель.
kThreadCreationFailure inOutTCB –> Template ID Ошибка создания потока.
kUnknownThreadType Неизвестный тип потока.
DestroyDeviceFlag() kInvalidDeviceFlag inDeviceFlagID Недопустимый флаг устройства.
DestroyMessage() kInvalidMessageID inMessageID Недопустимый идентификатор сообщения.
kMessageInQueue Сообщение находится в очереди.
kInvalidMessageOwner Недопустимый владелец сообщения.
DestroyMessageAndFreePayload() kInvalidMessageID inMessageID Недопустимый идентификатор сообщения.
kMessageInQueue Сообщение находится в очереди.
kInvalidMessageOwner Недопустимый владелец сообщения.
DestroyMutex() kInvalidMutexID inMutexID Недопустимый идентификатор мьютекса.
kMutexDestructionFailure Ошибка уничтожения мьютекса.
DestroyPool() kErrorPoolNotEmpty inPoolID Пул не пустой.
kInvalidPoolID Недопустимый идентификатор пула.
DestroySemaphore() kSemaphoreDestructionFailure inSemaphoreID Ошибка уничтожения семафора.
kUnknownSemaphore Неизвестный семафор.
DestroyThread() kInvalidThread inThreadID Недопустимый поток.
kUnknownThread Неизвестный поток.
DeviceIOCtl() kBadDeviceDescriptor inDD Ошибочный дескриптор устройства.
ForwardMessage() kInvalidMessageID inMessageID Недопустимый идентификатор сообщения.
kMessageInQueue Сообщение находится в очереди.
kInvalidMessageOwner Недопустимый владелец сообщения.
FreeBlock() kInvalidPoolID inPoolID Недопустимый идентификатор пула.
  kInvalidBlockPointer inBlockPtr Недопустимый указатель на блок.
FreeMessagePayload() kInvalidMessageID inMessageID Недопустимый идентификатор сообщения.
kMessageInQueue Сообщение находится в очереди.
kInvalidMessageOwner Недопустимый владелец сообщения.
GetAllDeviceFlags() kInvalidPointer 0 Недопустимый указатель.
GetAllMemoryPools()
GetAllMessages()
GetAllSemaphores()
GetAllThreads()
GetDevFlagPendingThreads()
GetSemaphorePendingThreads()
GetBlockSize() kInvalidPoolID inPoolID Недопустимый идентификатор пула.
GetEventBitValue() kUnknownEventBit inEventBitID Неизвестный бит события.
GetEventData() kUnknownEvent inEventID Неизвестное событие.
GetEventValue()
GetHeapIndex() kInvalidHeapID inHeapID Недопустимый идентификатор кучи.
GetMessageDetails() kInvalidMessageID inMessageID Недопустимый идентификатор сообщения.
kMessageInQueue Сообщение находится в очереди.
kInvalidMessageOwner Недопустимый владелец сообщения.
GetMessagePayload() kInvalidMessageID inMessageID Недопустимый идентификатор сообщения.
kMessageInQueue Сообщение находится в очереди.
kInvalidMessageOwner Недопустимый владелец сообщения.
GetMessageReceiveInfo() kInvalidMessageID inMessageID Недопустимый идентификатор сообщения.
kMessageInQueue Сообщение находится в очереди.
kInvalidMessageOwner Недопустимый владелец сообщения.
GetNumAllocatedBlocks() kInvalidPoolID inPoolID Недопустимый идентификатор пула.
GetNumFreeBlocks()
GetPriority() kUnknownThread inThreadID Неизвестный поток.
GetSemaphoreValue() kUnknownSemaphore 0 Неизвестный семафор.
GetThreadStackUsage() kUnknownThread inThreadID Неизвестный поток.
GetThreadStack2Usage()
LoadEvent() kUnknownEvent inEventID Неизвестное событие.
LocateAndFreeBlock() kInvalidBlockPointer inBlkPtr Недопустимый указатель на блок.
MakePeriodic() kInvalidPeriod inPeriod Недопустимый период.
kUnknownSemaphore inSemaphoreID Неизвестный семафор.
kInvalidDelay inDelay Недопустимая задержка.
kAlreadyPeriodic inSemaphoreID Семафор уже сделан периодическим ранее.
MallocBlock() kInvalidPoolID inPoolID Недопустимый идентификатор пула.
kErrorMallocBlock NumFreeBlocks Ошибка выделения блока.
MessageAvailable() kInvalidThread 0 Недопустимый поток.
kInvalidMessageChannel inMsgChannelMask Недопустимый канал сообщения.
OpenDevice() kBadIOID inIDNum Недопустимый идентификатор ввода/вывода.
kOpenFailure Ошибка открытия устройства.
PendDeviceFlag() kDeviceTimeout inTimeout Таймаут устройства.
kBlockInInvalidRegion Количество вложенных необслуживаемых регионов кода. Блокировка в недопустимом регионе.
kInvalidDeviceFlag inFlagID Недопустимый флаг устройства.
kInvalidTimeout inTimeout Недопустимый таймаут.
PendEvent() kDbgPossibleBlockInRegion Количество вложенных необслуживаемых регионов кода. В регионе возможна блокировка.
kBlockInInvalidRegion Блокировка в недопустимом регионе.
kEventTimeout inTimeout Таймаут события.
kUnknownEvent inEventID Неизвестное событие.
kInvalidTimeout inTimeout Недопустимый таймаут.
PendMessage() kInvalidThread 0 Недопустимый поток.
kInvalidTimeout inTimeout Недопустимый таймаут.
kDbgPossibleBlockInRegion Количество вложенных необслуживаемых регионов кода. В регионе возможна блокировка.
kInvalidMessageChannel inMessageChannelMask Недопустимый канал сообщения.
kBlockInInvalidRegion Количество вложенных необслуживаемых регионов кода. Блокировка в недопустимом регионе.
kMessageTimeout inTimeout Таймаут сообщения.
kInvalidMessageID 0 Недопустимый идентификатор сообщения.
PendSemaphore()     kInvalidTimeout inTimeout Недопустимый таймаут.
kDbgPossibleBlockInRegion Количество вложенных необслуживаемых регионов кода. В регионе возможна блокировка.
kUnknownSemaphore inSemaphoreID Неизвестный семафор.
kSemaphoreTimeout inTimeout Таймаут семафора.
kBlockInInvalidRegion Количество вложенных необслуживаемых регионов кода. Блокировка в недопустимом регионе.
PopCriticalRegion() kDbgPopUnderflow kFromPopCriticalRegion Опустошение вложений регионов.
PopNestedCriticalRegions() kFromPopNestedCriticalRegions
PopNestedUnscheduledRegions() kFromPopNestedUnscheduledRegions
PopUnscheduledRegion() kFromPopUnscheduledRegion
PostDeviceFlag() kInvalidDeviceFlag inFlagID Недопустимый флаг устройства.
PostMessage() kInvalidMessageChannel inChannel Недопустимый канал сообщения.
kInvalidTargetDSP dstNode (только для многоядерных конфигураций) Недопустимый целевой процессор.
kInvalidMessageOwner Владелец MessageID Недопустимый владелец сообщения.
kInvalidMessageRecipient ThreadID получателя сообщения. Недопустимый получатель сообщения.
kMessageInQueue Владелец MessageID Сообщение находится в очереди.
kInvalidMessageID inMessageID Недопустимый идентификатор сообщения.
kUnknownThread inRecipient Неизвестный поток.
PostSemaphore() kUnknownSemaphore inSemaphoreID Неизвестный семафор.
ReleaseMutex() kInvalidMutexID inMutexID Недопустимый мьютекс.
kMutexNotOwned 0 У мьютекса нет владельца.
kNotMutexOwner Владелец MutexID Не является владельцем мьютекса.
RemovePeriodic() kUnknownSemaphore inSemaphoreID Неизвестный семафор.
kNonperiodicSemaphore Семафор не периодический.
ResetPriority() kInvalidThread inThreadID Недопустимый поток.
kUnknownThread Неизвестный поток.
SetEventBit() kUnknownEventBit inEventBitID Неизвестный бит события.
SetInterruptMaskBitsEx() kInvalidMaskBit Бит, который не относится к биту маски прерывания. Недопустимый бит маски.
SetMessagePayload() kInvalidMessageID inMessageID Недопустимый идентификатор сообщения.
kMessageInQueue Сообщение находится в очереди.
kInvalidMessageOwner Недопустимый владелец сообщения.
SetPriority() kInvalidPriority inPriority Недопустимый приоритет.
kUnknownThread inThreadID Неизвестный поток.
kInvalidThread Недопустимый поток.
Sleep() kBlockInInvalidRegion Количество вложенных необслуживаемых регионов кода. Блокировка в недопустимом регионе.
  kInvalidDelay inSleepTicks Недопустимая задержка.
SyncRead() kBadDeviceDescriptor inDD Ошибочный дескриптор устройства
SyncWrite()
Yield() kBlockInInvalidRegion Количество вложенных необслуживаемых регионов кода. Блокировка в недопустимом регионе.

Примечания:

1. Группы прерываний IVG15 и reschedule ISR (IVG14) маскируются так, что не появляются в этом значении.
2. Приоритет reschedule ISR (SFT2I) маскируется так, что не появляется в этом значении.

Когда используется функционал VDK для обмена сообщениями в многопроцессорной конфигурации, функции маршрутизации запуска потоков (Routing Thread Run functions) делают диспетчеризацию ошибок, когда это необходимо. В таблице 5-23 обобщаются возможные коды ошибок (Error Code), диспетчеризируемые маршрутизацией потоков (Routing Threads), вместе со связанным значением ошибки (Error Value).

Таблица 5-23. Коды ошибки и значения функции маршрутизации запуска потоков (Routing Thread Run Function).

Error Code Error Value Описание
kBadIOID IOID Ошибочный идентификатор ввода/вывода.
kInvalidMarshalledType Тип полезной нагрузки Недопустимый маршалируемый тип.
kInvalidMessageID 0 Недопустимый идентификатор сообщения.
kMaxCountExceeded Тип полезной нагрузки. Превышено максимальное значение счетчика.
kOpenFailure IOID Ошибка открытия.

[Kernel Panic: kUnhandledException]

Окно View -> VDK Windows -> Status предоставляет информацию для расшифровки состояния ядра VDK (VDK Kernel Status). Необработанные исключения VDK (Unhandled VDK exceptions) перехватываются через KernelPanic, и среда VisualDSP++ показывает код (Code), ошибку (Error), связанное с ошибкой значение (Value) и программный счетчик (PC).

VDK Status kUnhandledException

Когда выполнение попадает в Kernel Panic с кодом ошибки kUnhandledException, то это означает, что обработчик по умолчанию UserExceptionHandler попытался обработать исключение, но не нашел код, который соответствовал бы этому исключению. 

В этом случае обработчик сохранит значение регистра EXCAUSE в поле Value ошибки (в данном примере, показанном на скриншоте, 0x2a = Instruction Fetch Misaligned Address Violation, т. е. нарушение выравнивание адреса при попытке выборки инструкции). Просмотрите Program Sequencer: секцию Hardware Errors and Exception Handling руководства по программированию процессора (Blackfin Processor Programming Reference Manual, которое можно найти на сайте analog.com). Коды ошибок в регистре EXCAUSE можно найти в Приложении A статьи [2].

Для других случаев ошибки Kernel Panic расшифроваываются автоматически (коды этих ошибок показаны в таблице 5-22).

[Ссылки]

1. VisualDSP++ 5.0 VDK (Kernel) User’s Guide (including the ADSP-BFxxx, ADSP-21xxx, ADSP-TSxxx) site:analog.com.
2EE-307: советы по отладке для Blackfin.

 

Добавить комментарий


Защитный код
Обновить

Top of Page