Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Знатокам CrossWorks
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
OlegS
Делаю с CW 1.5b2 под AT91RM9200 (на evm9200)

Флэшку победил, лоадер сделал свой по образу и подобию когентовского сампла.
Но начинаются приколы!!!
Причем если проект заработал, то прошивается и стартует, как в отладчике, так и самостоятельно с флэшки без проблем. НО. Очень не стабильно собираются проекты и отлаживаются.

1.Если править memorymap файл из IDE, то после правки ИДЕ вылетает сославшись на внутреннюю ошибку и запускается только если восстановить родной мем-мап для проца (он почему-то усекается до нескольких кб)
2.BIN. Если делать не только эльф, то почему-то иногда проект клинит, так что надо создавать новый. А косяк такой : размер бина = 512 или 256 Мб !!! Если делать хекс, то и он кривой хоть и маленький.
3.В проект добавляю скрипт загрузчика, в ИДЕ не дает менять тип файла и при отладке периодически ругается что типа не найден объект во второй строке. Лечиться правкой файла проекта руками, путем установки типа файла
4.Самое гнустное. Допустим, добавляю в прогу обычный printf и когда в отладчике пытаюсь его пройти, то все клинит (естественно _putchar переопределил, да и адреса вызовов на первый взгляд нормальные). Делаю новый проект с теми-же файлами и настройками и … все ОК! Но иногда эта хрень повторяется заново и сама же может и пропасть, как и п.2. Хотя такое происходит и со своими функциями, но реже.
5.Захотел в SDRAM выделить себе буферок под 10 Мб (ну надо!), ну и чтобы по игротски описал его, как сегмент без конкретного адреса, но с размером. Пока нормально – компилится размещается. Описываю в проге на него ссылку типа extern unsigned int __seg_start__; далее использую это число как адрес начала буфера. И вот тута начинается. Дохожу отладчиком на место присвоения адреса своему указателю и:
a.Подвожу курсор на переменную сегмента – адрес совпадает на 100%
b.А переменной присваивается на 26 меньше, хотя бывают и другие расхождения.

В принципе бывают и другие «радости».

Знатоки, может подскажете? Что и как……
Или переходить под IAR, жалко, нравится сама среда CW, да и другие прелести есть…

Пробовал на Win2003 и XPsp2. С виглером и с MT-линком. Может просто глюки из за этих осей – типа подавай ей ME или просто XP.
AndyBig
Цитата
1.Если править memorymap файл из IDE, то после правки ИДЕ вылетает сославшись на внутреннюю ошибку и запускается только если восстановить родной мем-мап для проца (он почему-то усекается до нескольких кб)

Есть такое, побороться так же не удалось. Видимо, глюк самой среды.
Цитата
2.BIN. Если делать не только эльф, то почему-то иногда проект клинит, так что надо создавать новый. А косяк такой : размер бина = 512 или 256 Мб !!! Если делать хекс, то и он кривой хоть и маленький.

Угу. Если программа предназначена для работы из SDRAM и линкеру выставлены соответствующие настройки, то в BIN он пихает весь диапазон изпользованных адресов - от 0х00000000 (векторы) до последнего использованного адреса SDRAM (0х2.......), отсюда и такой размер бинарника. Я обошел эту фичу следующим образом: помещаю в опциях линкера вектора в начальный адрес SDRAM, а при инициализации контролера (после инициализации стеков) копирую область 0х20000000-0х2000003F (вектора и адреса исключений) в SRAM по адресу 0х00000000. Область 0x00000000 0х0000003F я выделил в отдельный сегмент, что бы линкер его не трогал.
Цитата
3.В проект добавляю скрипт загрузчика, в ИДЕ не дает менять тип файла и при отладке периодически ругается что типа не найден объект во второй строке. Лечиться правкой файла проекта руками, путем установки типа файла

Тоже столкнулся и тоже не нашел путей обхода, кроме как ручной правки файла проекта.
Цитата
5.Захотел в SDRAM выделить себе буферок под 10 Мб (ну надо!), ну и чтобы по игротски описал его, как сегмент без конкретного адреса, но с размером. Пока нормально – компилится размещается. Описываю в проге на него ссылку типа extern unsigned int __seg_start__; далее использую это число как адрес начала буфера. И вот тута начинается. Дохожу отладчиком на место присвоения адреса своему указателю и:
a.Подвожу курсор на переменную сегмента – адрес совпадает на 100%
b.А переменной присваивается на 26 меньше, хотя бывают и другие расхождения.

А вот это уже странно. Вообще, это легко обходится созданием указателя сразу в виде массива - uinsigned int pt[1] __attribute__ ((segment ("__seg_start__"))); (могу ошибиться в точном синтаксисе).
Но должен срабатывать и Ваш подход. Можно кусок исходников с инициализацией адреса и присвоением адреса указателю?
OlegS
Цитата
Можно кусок исходников с инициализацией адреса и присвоением адреса указателю?

исходняки остались в конторе, а инет отвалился. Сегодня сделал так и сработало:

extern BYTE * __seg_start__;
void F()
{
...
register BYTE * tmp asm("r8");
BYTE *seg_pointer;
asm("ldr r8, =__seg_start__");
seg_pointer = tmp;
...
}

Цитата
Если программа предназначена для работы из SDRAM и линкеру

Про SDRAM намек понял! Буду попробовать. Но у меня такая хрень и с флешовым вариантом angry.gif
Опять таки сегодня копал flash_plasement переставлял туда-сюда, в конце концов вернул все в зад и ... стал нормально строить бинарник!!! Ну что ты будеш делать???!

Но самое гнустное остается это п.4

Чего они пьяные все были, когда писали эту версию CW?
Если их самплы не работают как надо.

Но вообще СПАСИБО, особливо за SDRAM.
AndyBig
Цитата
Про SDRAM намек понял! Буду попробовать. Но у меня такая хрень и с флешовым вариантом

Значит какие-то данные (константы, например) сидят в области SDRAM. В общем, в получающемся бинарнике есть что-то, что должно при заливке помещаться в SDRAM. Посмотрите MAP после линковки.

Цитата
Но самое гнустное остается это п.4

С этим я не работал, так что не могу ничего сказать sad.gif.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.