Как определить, почему задача уничтожается, VxWorks?

У меня есть приложение VxWorks, работающее на ARM uC.

Сначала позвольте мне подвести итог заявки;

Приложение состоит из стороннего стека и шлюзового приложения. Мы реализовали уровень абстракции операционной системы для поддержки независимости от ОС.

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

Например ; мы не выполняем напрямую malloc / new, free / delete. Вместо этого мы вызываем процедуры уровня OSA, и он получает память от ОС и помещает ее в список, а затем возвращает эту память приложению (процедуры: XXAlloc, XXFree, XXReAlloc).

И при освобождении памяти мы снова используем XXFree.

На самом деле этот блок является структурой, которая имеет

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

С помощью этой структуры блоков стек может проверить, поврежден ли блок или нет.

Также у нас есть библиотека pthread, портированная из Linux, которую мы используем для -создания / завершения потоков (в настоящее время их 22) -синхронизация объектов (событий, мьютексов ..)

Существует основная задача, которая вызывается taskSpawn, и позже эта задача создала другие потоки.

это было описание приложения и его интерфейса VxWorks.

Проблема в :

VxWorks внезапно уничтожает одну из задач, не давая информации о том, что не так. У меня также есть отладчик jtag, и он запускает подпрограмму VxWorks taskDestoy (), но стек вызовов не дает никакой информации ни о ПК, ни о r14.

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

Я думаю, что ОС обнаруживает и исключение и выполняет его обработку молча.

любая помощь будет отличной

С уважением

27.07.2009 11:37:48
предложение немного переформатировать вопрос: постановка проблемы в начале и справочная информация после этого. Таким образом, читателям не нужно читать всю историю, чтобы узнать, соответствует ли она.
Adriaan 6.08.2009 08:05:19
3 ОТВЕТА

Если ваша задача завершается, вызывается taskDestroy (). Если вы подозрительно относитесь к огромному xxAlloc, убедитесь, что код выделения не вызывает exit (), когда память исчерпана. Я был укушен этим поведением в стороннем OSAL раньше.

0
27.07.2009 22:54:55
Другая похожая возможность состоит в том, что точка входа задачи просто возвращается. (Или похожая на выход функция называется ... abort ()?) Я также видел подобное поведение в случае повреждения стека или переполнения стека.
bstpierre 28.07.2009 13:24:03

Похоже, вы отлаживаете после интеграции; это может быть адской работой. Я предлагаю разбить проблему на более мелкие кусочки.

Обработать

1) вы можете получить больше информации, используя инструмент и / или используя VxWorks (в зависимости от того, какая версия). Это позволяет вам лучше видеть происходящее. Обязательно запишите все в файл, чтобы вы вернулись во времени с того момента, когда задача заканчивается. Инструментарий - это выгодное вложение, так как оно пригодится в большинстве случаев. Интересные хуки в VxWorks: Taskhooklib

2) Распределение / освобождение памяти является очень фундаментальной функциональностью. Это был бы мой первый кандидат для тщательного (модульного) тестирования в четко определенной многопоточной среде. Если вы сделали это, и никаких ошибок не было найдено, я сначала начал бы смотреть, почему работа закончилась.

другие возможные причины

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

И некоторые версии VxWorks имеют поддержку MMU, что необходимо учитывать.

0
6.08.2009 08:03:30
РЕШЕНИЕ

Это решено.

Я сделал изолированный тест. Выделил 20 МБ с malloc и memset с 0x55 и остановил поток моего приложения.

И я написал другой поток, который проверяет мои 20 МБ, если записаны какие-либо данные, кроме 0x55.

И вот что! какой-то другой поток, который принадлежит другим компонентам в CPU (кто-то еще их разработал) записывает мое выделенное пространство.

Спасибо 4 ваша помощь

1
15.08.2009 21:16:03
И теперь вы можете принять ответ и удалить свой вопрос из
zxcat 4.09.2009 06:14:35