Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Непонятно работает LINKER IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Beginning
Суть проблемы в следующем. Есть область памяти с сбойными 16 байтами, где-то в районе 16 кил. И мне надо обходить эту область. Я применял два способа. Первый задавал в XLINK для CODE (40-3ff0,400F-FFFF) сегмента два диапазона с дыркой в этих байтах, и второй резервировал данные по этому адресу:
#pragma location=0x3FF0
const uint8 bag[16];
Оба способа приводили к следующей непонятности. По адресу x160 код заканчивался, далее все нули, и начинался только с x4010. В общем 16 кил в трубу. Перепробовал все типы компиляции (оптимизация по скорости и по коду), баг пропадал только при max hight speed. Но этот тип оптимизации мне не нужен. В чём может быть проблема?
Alexey Bishletov
Линкер размещает целые сегменты в имеющуюся память. Сегмент размещается целиком. Т.е. у тебя получался большой сегмент и он не умещался в 40-3ff0, поэтому линкер клал его дальше, а это место оказывалось свободным. Что бы этого небыло надо создавать сегменты с разными именами.
scifi
Посмотрите на опцию -P: очень похоже, что она делает то, что Вам нужно.
Beginning
С разными именами можно, но по пойму лишние сложности. Т.е. я должен одни функции расположить в сегменте, например CODE1, а оставшиеся в сегменте CODE2? При этом я должен чётко определить си следить за размерами скомпелированной программы, что бы она влазила в сегменты? Почему LINKER не делает бональный goto (ASM B END_BAG)?
alexander55
Цитата(Beginning @ Oct 8 2007, 11:50) *
С разными именами можно, но по пойму лишние сложности. Т.е. я должен одни функции расположить в сегменте, например CODE1, а оставшиеся в сегменте CODE2? При этом я должен чётко определить си следить за размерами скомпелированной программы, что бы она влазила в сегменты? Почему LINKER не делает бональный goto (ASM B END_BAG)?

Точно так или вариант замены поддохшей микросхемы (и не мучиться). Тем более процесс уже пошел.
Alexey Bishletov
Цитата(Beginning @ Oct 8 2007, 11:50) *
С разными именами можно, но по пойму лишние сложности. Т.е. я должен одни функции расположить в сегменте, например CODE1, а оставшиеся в сегменте CODE2? При этом я должен чётко определить си следить за размерами скомпелированной программы, что бы она влазила в сегменты? Почему LINKER не делает бональный goto (ASM B END_BAG)?

Линкер не может разделить одну целую часть сегмента, сделанную компилятором на две. Компилятор не делит одну функцию на две части сегмента. Каждая функция является отдельной целой частью сегмента. Т.е. что бы место не пропадало, надо в проекте иметь сравнительно небольшие функции и, как уже написали, использовать опцию -Р вместо -Z, тогда линкер сможет перетасовать части, что бы они лучше подходили к имеющейся памяти.
Beginning
Огромное спасибо всем кто ответил. Параметр –P решил проблему и снизил патерю байт до 590, что уже вполне приемлемо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.