Перейти к содержанию
    

Если люди умеют пользоваться поиском по форуму и внимательно читают темы, то у них и так вопросы не возникнут.

Да и что, собственно, плохого в вопросах.

По поводу статьи - почему бы и нет. Но это наверное к админам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу все же вернуться к вопросу о "принудительном размещении" фукций в определенных областях RWWS и NRWWS.

Еще больше интересует - возможно ли разместить функцию по определенному адресу?

Это необходимо для обеспечения возможности МК самостоятельно генерировать код для построения сигнала. Сигнал двоичный, но зависит от поведения пользователя, и достачточно высокой частоты - вариант с if не подходит по скорости.

 

Основная идея - разместить по определенному адресу "заглушку", которую МК будет сам перепрограммировать и передавать ей управление.

 

Так вот вопрос: Как разместить функцию по четко заданному адресу в RWWS?

Изменено пользователем _Alfred_

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если не хотите искать на форуме и посмотреть пример в текущем топике, то читайте хелп на IAR (он встроен в программу). Там и как значение и как функцию и группу функций (для группы задается область) разместить по адресу есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

посмотреть пример в текущем топике

В примере весь код размещается в NRWWS. Там нет функциций размещенных в RWWS.

 

читайте хелп на IAR (он встроен в программу). Там и как значение и как функцию и группу функций (для группы задается область) разместить по адресу есть.

Со значением все ясно, я говорю о функциях.

 

В EWAVR_CompilerReference.pdf ниписано:

Function placement into named segments

It is possible to place functions into named segments using either the @ operator or the

#pragma location directive. When placing functions into segments, the segment is

specified as a string literal.

Example

void f(void) @ "MYSEGMENT";

void g(void) @ "MYSEGMENT"

{

}

#pragma location="MYSEGMENT"

void h(void);

Добавил в файл lnkm16s.xcl (у меня mega16, memory - small) строки:

-Z(CODE}MY_SOURCE=100-200
-Z(CODE}MY_MAIN=201-1BFF
-Z(CODE}MY_LOADER=1C00-1FFF

Пишу:

...
void test(void) @ "MY_LOADER";
...

В результате:

Fatal Error[e72]: Segment MY_LOADER must be defined in a segment definition option (-Z, -b or -P)

 

Пишу:

...
#pragma segment = "MY_LOADER"
void test(void) @ "MY_LOADER";
...

результат тот же.

 

Пишу в Options->Linker->Extra Options:

-Z(CODE}MY_SOURCE=100-200
-Z(CODE}MY_MAIN=201-1BFF
-Z(CODE}MY_LOADER=1C00-1FFF

В результате:

Error[e102]: No such segment type: -Z(CODE}MY_SOURCE=100-200

 

Где-то какая-то мелочь, а какая - не пойму.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все, разобрался. Дело было как обычно в мельницах.

 

Если в Options->Linker->Extra Options поставить правильные скобки то все работает без проблем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тут столько всего написано...Про функции самопрограммирования мне понятно(ну или может почти)...

Никак не могу понять как и что нужно настроить в ИАРе, чтобы все заработало.Мне нужно работать с 4 страницами во флеше меги 8.Читать могу, а вот записать не получается

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тут столько всего написано...Про функции самопрограммирования мне понятно(ну или может почти)...

Никак не могу понять как и что нужно настроить в ИАРе, чтобы все заработало.Мне нужно работать с 4 страницами во флеше меги 8.Читать могу, а вот записать не получается

Ничего особенного вроде как в настройках писать не пришлось - тип процессора, модель памяти (Small), фрмат генерируемого файла.

Еще я прописывал Options->Linker->Extra Options:

-Z(CODE)MY_MAIN=200-4FFF
-Z(CODE)MY_SOURCE=5000-6F7F
-Z(CODE)MY_DELAYS=6F80-6FFF
-Z(CODE)MY_LOADER=7000-7FFF

но это что б размещать код по определенным адресам.

 

Для записи использовал пример из AVR109, файл fаlash.h и брал за основу функцию Update_Page(), написанную arttabом в bootloader_IAR.pdf.

 

Использовал IAR 4.11A, МК ATmega32.

Изменено пользователем _Alfred_

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я уже могу писать, но почему-то только в конце загрузчика.Как сделать, так, чтобы выделить под запись 2 страницы перед областью загрузчика?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я уже могу писать, но почему-то только в конце загрузчика.Как сделать, так, чтобы выделить под запись 2 страницы перед областью загрузчика?

что имеется в виду под "концом загрузчика" и "перед областью загрузчика"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

sergik_vrn

Наверное под "концом загрузчика" имеется ввиду конец NRWW section, а под "перед областью загрузчика" - RWW section.

 

Len_OK

В NRWW section писать не было необходимости - поэтому сказать ничего не могу, а вот с записью в RWW section проблемм не возникало - несколько раз менял расположение модифицируемой части и все было в порядке. Разве что в начале производилась запись не совсем туда, куда нужно, из-за того, что напутал где адрес в байтах, а где в словах. Может Вы тоже наступили на эта грабли?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

всё никак не получается

пишу Options->Linker->Extra Options:

-Z(CODE)main = 01C0-1B00

-Z(CODE)loader = 1C26-1FFF

 

а мне в ответ:

 

Error[e12]: Unable to open file '= 01C0-1B00'

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

всё никак не получается

пишу Options->Linker->Extra Options:

-Z(CODE)main = 01C0-1B00

-Z(CODE)loader = 1C26-1FFF

 

а мне в ответ:

 

Error[e12]: Unable to open file '= 01C0-1B00'

Пробелы лишние (а лучше все) поубирайте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

извините конечно!!! Но что это за ошибка?Подскажите,PLZ!!!! :unsure:

 

Error[e16]: Segment CODE (size: 0x40c align: 0x1) is too long for segment definition. At least 0x32 more

bytes needed. The problem occurred while processing the segment placement command

"-Z(CODE)CODE=1C26-1FFF", where at the moment of placement the available memory ranges were

"CODE:1c26-1fff"

Reserved ranges relevant to this placement:

CODE:1c26-1fff CODE

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

извините конечно!!! Но что это за ошибка?Подскажите,PLZ!!!!
Вроде ясно написано - получившийся сегмент CODE не влезает в отведенное для него место. Не хватает 0x32 байт

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...