Цитата(d7d1cd @ Nov 9 2013, 08:51)

Спасибо за ответ. Что значит 2 точки в коде:
Код
-D_..X_FLASH_BOOT=F000
-Z(CODE)BOOT=_..X_FLASH_BOOT-_..X_FLASH_END
То есть задается только адрес начала размещения?
Нет, здесь задается именно сегмент памяти от сих до сих, где будут размещены ВСЕ функции, которые к данному сегменту приписаны. Т.е. если у вас несколько функций приписаны к сегменту BOOT, то все они в него попадут друг за дружкой. И тогда строго формально нельзя будет предсказать, с какого адреса одна из тех функций начинается, хотя практически линкер укладывает их тела в тот сегмент в порядке упоминания в тексте программы. Поэтому, чтобы разместить функцию строго по определенному адресу, вам придется сделать
уникальный сегмент только для нее! Тогда уж она точно окажется в том ряду первой и попадет на начало сегмента.
Точки и подчеркивание, думаю, нечего не означают, просто придают именам уникальность, чтобы те случайно не совпали с именами каких-то объектов в программе.
Т.е.
_..X_FLASH_BOOT
- это одно имя целиком, а директива D (от слова define) лишь приписывает ей значение.
Само же определение сегмента задано во второй строке, после директивы Z.
Вообще-то, я сама глубоко с этим не разбиралась, а просто механически переделала под свое имя (BOOT) определение какого-то другого сегмента в том же самом стиле (это видно в xcl-файле для данного типа МК). Рисковать не хотелось, а надо было сделать по-быстрому.
Думаю, что в данном случае вполне годилось бы самое примитивное определение без всяких дефиниций:
-Z(CODE)BOOT=F000-F100
где задается имя сегмента, а его границы выставлены прямо в числах.
Определения имени границ сегментов нужны в файле конфигурации только затем, чтобы связать все сегменты в одну цепочку. Поэтому там каждое имя повторяется по меньшей мере 2 раза - в качестве конца предыдущего сегмента и начале последующего. Мой случай был в этом отношении примитивным, т.к. загрузочная область была заведомо пуста. В вашем случае дело может вылиться в то, что придется переписывать файл конфигурации под себя. Тогда его надо скопировать его в свой проект из:
\Program Files\IAR Systems\Embedded Workbench 6.5\430\config\lnk430f5529.xcl
(так этот файл называется для MSP430F5529, но у вас может быть другой МК)
переключить проект на него вместо умолчания, а потом внести в него исправления. Редактировать исходный файл конфигурации нельзя, можно только копию!
Проблема тут в том, что вся память уже поделена на сегменты! А потому свой сегмент придется буквально вклинивать между существующими, раздвинув в каком-то месте границы. Тут ситуация, как на политической карте мира - вам не создать нового государства, не потеснив в границах соседей, поскольку вся земля уже поделена.
Однако разбираться в том файле, уж тем более редактировать его, довольно противно. А потому попытайте сначала самый легкий способ - на числах, вдруг сработает?
Цитата(d7d1cd @ Nov 9 2013, 08:51)

А что будет, если скомпилированный код не умещается от указанного места расположения до конца флешь памяти?
В этом случае линкер ошибку должен выдать. Примерно такую же, когда код слишком велик для памяти данного МК.
Цитата(d7d1cd @ Nov 9 2013, 08:51)

При попытке компиляции IAR выдает ошибку Fatal Error[e163]: The command line symbol "_..X_FLASH_END" in -Z(CODE)BOOT=_..X_FLASH_BOOT-_..X_FLASH_END is not defined.
Дефиниции границ сегментов могут довольно сильно отличаться по именам у разных МК. Советую вам найти xcl-файл именно для своего типа МК и сделать определение, подобное тому, как там определены сегменты кода.