Доброго времени суток, форумчане!
Имеется следующая проблема.
Разрабатываю stand-alone приложение под процессор AT91SAM9XE512, IDE - IAR Embedded Workbench версия 6.21.1.2846.
Сделал собственную реализацию стека протоколов TCP/IP, на плате поднят TCP-сервер. (Производительность uIP не устраивала)
В зависимости от запроса с клинетского компьютера необходимо дернуть ногой процессора (сделать отрицательный строб). Задача сама по себе тривиальная, на уровне "Hello, world!".
Но у меня возникла проблема...приблизительно в 10% случаев строб отсутствует, смотрю осциллографом, непосредственно на ноге процессора.
Проблема не в реализации стека протоколов TCP/IP, все пакеты обрабатываются без сбоев.
Пин дергаю следующей парой команд:
Соответственно, скорфигурирован этот пин следующим образом:
Объявление OE_PIN_MASK:
Самое интересное, что вычитав значение AT91C_BASE_PIOA->PIO_PDSR я увидел что значение регистра соответствует правде, то есть соответствующим бит сброшен в 0... а на выходе сигнал как был в единице так и остался. И это я наблюдаю в 10% случаев, в остальных 90% - строб формируется замечательно. AT91C_BASE_PIOA->PIO_CODR = OE_PIN_MASK;
printf("%x\r\n", AT91C_BASE_PIOA->PIO_PDSR);
AT91C_BASE_PIOA->PIO_SODR = OE_PIN_MASK;
В реализации TCP/IP стека я использовал прерывания от RTT и от EMAC, грешу на них, но не понимаю как это возможно.
Если кто с подобным сталкивался, прошу помощи! В такие чудеса не верю=)
Буду очень признателен за дельные советы.
для чистоты картины выведите содержимое всех регистров "причастных" к этому GPIO - может "случайно" происходит перепрограммирование режима пина..
и нет ли другой периферии, которая может использовать этот пин, допустим в режиме multifunction?
Вы имели ввиду muliplexing? Я правильно Вас понял?
На этот пин мультиплексировано периферийное устройство, но данная периферия не используется, точнее используется в другом режиме, где данный пин не задействован.
Подобное поведение я наблюдал на разных портах GPIO: А, В, С, так что маловероятно что это из-за периферийных устройств.
Да, само собой PMC сконфигурирован для работы с PIO.
вариант, только маловероятно, конечно, вечером обязательно проверю, сейчас платы под рукой нету к сожалению....
Может быть есть еще какие то идеи?
Очень признателен за помощь!
ну тогда я в задумчивости..
вот тут, по линку пример, где нога дрыгается гарантированно, хоть и линукс, но апликуха автономная, 9g45 и хе512 по регистрам д.б. совместимы, только офсеты разные..
кстати, раз у вас стандалоне, то за свои хидеры вы уверены? там все смещения и регистры правильно прописаны?
Ногой я дрыгал из stand-alone и из линуха, все замечательно получается... До тех пор пока не прикрутил TCP/IP.
По поводу заголовочных файлов - атмеловские "классические" хидеры для xe512.
Вот думаю, что где то есть глюк с работой с памятью. Помню было такое что если привести адрес выровненный не по 0x4 к int то получалась очень не стабильная работа приложения, особенно если в компиляторе включал оптимизацию. Но для этого придется расковырять все и вся
тогда надо "копать" в эту сторону.. если порассуждать логически - раньше работало стабильно, после изменения стабильность пропала - значит что-то изменилось в этот промежуток..
железо из поисков можно отбросить - оно исправно, остается программная часть
сделайте отладочную версию - перед стробированием пина сбрасывайте в лог состояние блока PIOA и проконтролируйте что число обращений к п/п строба совпало с числом ее реального вызова
может тут поможет низкоуровневая отладка (я не владею технологией)
(имхо) чудес - не бывает - должно работать
Уже порезал как только мог проект, убрал весь стек протоколов, баг остался на уровне обработчика EMAC прерывания, формирование строба я перенес непосредственно в обработчик.
Железо имеет смысл отложить, но не отбросить, потому что и там бывают глюки;)
Для отладки использую JTAG, блок формирования строба отрабатывает нормально, в смысле команды выполняются последовательно без сбоев.
Как я и говорил в регистры все пишется, контрольная вычитка регистров статуса говорит что все записывается в регистр замечательно....
По поводу чудес с Вами согласен, по крайней мере таких точно не бывает))
Сейчас еще порежу лишние конструкции в проекте... может натолкнусь на проблему...
Если Вы работаете со средой IAR и у Вас есть "немного";) времени могу выложить исходники урезанного проекта, может быть Вы увидите ляп какой?