реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> помещение объекта в конец секции RO
toweroff
сообщение Aug 23 2011, 12:51
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Что-то никак не могу положить константу в конец всего кода во флеш (RO секция)

Код
const unsigned long test_ending __attribute__ ((section("ENDOF"))) = 0x12345678;


и скаттер
Код
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x20000000 0x00080000  {  ; load region size_region
  ER_IROM1 0x20000000 0x00080000  {; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   *.o (ENDOF, +Last)
  }
  RW_IRAM1 0x80000000 UNINIT 0x0000E000  {; RW data
   .ANY (+RW +ZI)
  }
}


вот конец описания того, что легло во флеш
Код
    0x20000fc8   0x0000000c   Code   RO          257    .text               c_5.l(libspace.o)
    0x20000fd4   0x0000000c   Code   RO          316    .text               c_5.l(rt_fp_status_addr_intlibspace.o)
    0x20000fe0   0x0000000c   Code   RO          320    .text               c_5.l(sys_exit.o)
    0x20000fec   0x00000000   Code   RO          333    .text               c_5.l(indicate_semi.o)
    0x20000fec   0x00000014   Code   RO          303    x$fpl$fpinit        fz_5s.l(fpinit.o)
    0x20001000   0x00001000   Data   RO           52    .constdata          fx2lp.o
    0x20002000   0x00000010   Data   RO          385    Region$$Table       anon$$obj.o
    0x20002010   0x00000004   Data   RO          117    ENDOF               boot.o


    Execution Region RW_IRAM1 (Base: 0x80000000, Size: 0x0000dff4, Max: 0x0000e000, ABSOLUTE, UNINIT)

    Base Addr    Size         Type   Attr      Idx    E Section Name        Object


родная секция ENDOF в аккурат в конце. Ура!
Но не тут-то было

Почему fromelf, создавая BIN, кладет после этой константы еще 5 int (20 байт)?

Понял, но не знаю, как поправить - эти 20 байт есть RW Data
Go to the top of the page
 
+Quote Post
kovigor
сообщение Aug 23 2011, 14:22
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(toweroff @ Aug 23 2011, 15:51) *
Что-то никак не могу положить константу в конец всего кода во флеш (RO секция)

Код
const unsigned long test_ending __attribute__ ((section("ENDOF"))) = 0x12345678;


Keil ?

Я пользуюсь вот такой конструкцией, работает железно ...
Код
const unsigned int csr_dword __attribute__((at(0x000001fc))) = 0x87654321;


Вы же все равно знаете начальный и конечный адреса секции, вот и задайте адрес явно ...

Сообщение отредактировал kovigor - Aug 23 2011, 14:23
Go to the top of the page
 
+Quote Post
toweroff
сообщение Aug 23 2011, 14:43
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



ну дык положить константу по адресу не проблема biggrin.gif
вот ее бы в конец бинарника, чтобы потом CRC туда перед прошивкой положить
Go to the top of the page
 
+Quote Post
kovigor
сообщение Aug 23 2011, 15:22
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(toweroff @ Aug 23 2011, 17:43) *
ну дык положить константу по адресу не проблема biggrin.gif
вот ее бы в конец бинарника, чтобы потом CRC туда перед прошивкой положить


Клал описанным мной способом CRC в бинарник, правда, не в конец, а в произвольные места внутри бинарника. Проблем не было. В исходнике писал указанную выше строку. Компилятор генерировал .hex, а затем я его преобразовывал в .bin утилитой H-Converter из состава H-JTAG. Странно, какие там могут быть проблемы ?
Go to the top of the page
 
+Quote Post
toweroff
сообщение Aug 23 2011, 15:29
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(kovigor @ Aug 23 2011, 19:22) *
Клал описанным мной способом CRC в бинарник, правда, не в конец, а в произвольные места внутри бинарника. Проблем не было. В исходнике писал указанную выше строку. Компилятор генерировал .hex, а затем я его преобразовывал в .bin утилитой H-Converter из состава H-JTAG. Странно, какие там могут быть проблемы ?

да еще раз
с атрибутом __attribute__ ((at(CONST))) я всегда имею атрибут __attribute__ ((got_problem("NO")))
речь идет о _постоянном_, вне зависимости от того, что еще напихалось в код, получать размещение секции "ENDOF" ровно (!) в конце бинарника
Go to the top of the page
 
+Quote Post
kovigor
сообщение Aug 23 2011, 15:48
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(toweroff @ Aug 23 2011, 18:29) *
вне зависимости от того, что еще напихалось в код, получать размещение секции "ENDOF" ровно (!) в конце бинарника


Ладно. Попробуем иначе. Скаттер вам в этом деле не нужен. Создаем "Memory Area":

Project -> Options for Target xxx -> заполняем поля IROM1 и IROM2 (в IROM2 указываете адрес и размер вашего блока CRC):

http://zalil.ru/31597069[/url]

Затем создает отдельный .с - файл, помещаете в него вашу константу (атрибуты писать не надо, только саму константу) и в меню проекта? щелкнув по этому файлу правой кнопкой, указываете, в какую именно область (т.е., в IROM2) положить RO - данные этого файла:

http://zalil.ru/31597080[/url]

Подходит ?

Сообщение отредактировал kovigor - Aug 23 2011, 15:49
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
toweroff
сообщение Aug 23 2011, 16:49
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



kovigor, спасибо за желание помочь
Но галка "Use memory Layout from Target dialog" у меня отключена, и давно
Я прошу помощи в одном - как, задавая размещение конкретных блоков в конкретной ОБЛАСТИ, заставить линкер поместить эту ОБЛАСТЬ в самый хвост прошивки

Цитата(toweroff @ Aug 23 2011, 16:51) *
Понял, но не знаю, как поправить - эти 20 байт есть RW Data

нет не понял
повыбрасывал определения глобальных переменных вида
int var = 0;
передал все инициализации в соответствующие функции, RW секция изменилась, но все равно в конце злосчастные 20 байт нулей sad.gif


Прям как в черновике sad.gif
Все-таки добавляемая область == RW Data точно
повставлял в fromelf все ключи, какие можно, для анализа где что находится
Никак не могу найти, что же помещается в RW секцию по адресам > секции ENDOF
Go to the top of the page
 
+Quote Post
toweroff
сообщение Aug 23 2011, 18:01
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



объявив все глобальные переменные (их и было-то по пальцам, счетчики в прерываниях да флаги там же) как __attribute__ ((zero_init)), получил размер секции RW=0, посему моя константа в секции ENDOF легла как надо, что и требовалось

И еще проще
не объявлять константу как const, пусть ляжет в RW, для нее в секции прописано +Last
Go to the top of the page
 
+Quote Post
toweroff
сообщение Aug 23 2011, 19:32
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(kovigor @ Aug 23 2011, 19:22) *
Клал описанным мной способом CRC в бинарник, правда, не в конец, а в произвольные места внутри бинарника. Проблем не было.
... Странно, какие там могут быть проблемы ?

А можно вопрос - как CRC потом считалась?
Go to the top of the page
 
+Quote Post
kovigor
сообщение Aug 24 2011, 11:30
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(toweroff @ Aug 23 2011, 22:32) *
А можно вопрос - как CRC потом считалась?


Посторонней программкой на Delphi
Go to the top of the page
 
+Quote Post
toweroff
сообщение Aug 24 2011, 11:51
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(kovigor @ Aug 24 2011, 15:30) *
Посторонней программкой на Delphi

я не о том
сама программа, когда считала CRC себя самой, это вставленное значение "обходила", а потом сравнивала?
я пытался добиться размещения CRC в самом конце, чтобы при сверке получить 0
Go to the top of the page
 
+Quote Post
kovigor
сообщение Aug 25 2011, 08:11
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(toweroff @ Aug 24 2011, 14:51) *
сама программа, когда считала CRC себя самой, это вставленное значение "обходила", а потом сравнивала?


СRC двоичного файла прошивки подсчитывалась по всему файлу и укладывалась в конец этого же файла моей программкой на Delphi. А потом я этот двоичный файл шил в МК. А уже он проверял, получается ли нулевое значение CRC при расчете CRC по всей прошивке, или не получается. Или я вопроса не понял ?
Go to the top of the page
 
+Quote Post
toweroff
сообщение Aug 25 2011, 08:56
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(kovigor @ Aug 25 2011, 12:11) *
СRC двоичного файла прошивки подсчитывалась по всему файлу и укладывалась в конец этого же файла моей программкой на Delphi. А потом я этот двоичный файл шил в МК. А уже он проверял, получается ли нулевое значение CRC при расчете CRC по всей прошивке, или не получается. Или я вопроса не понял ?

все верно, для этого я и пытался зарезервировать место в конце файла

просто смутило Ваше же заявление:
Цитата(kovigor)
Клал описанным мной способом CRC в бинарник, правда, не в конец, а в произвольные места внутри бинарника.

Go to the top of the page
 
+Quote Post
kovigor
сообщение Aug 25 2011, 09:41
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(toweroff @ Aug 25 2011, 11:56) *
все верно, для этого я и пытался зарезервировать место в конце файла

просто смутило Ваше же заявление:


Да, клал. В программе нужно была использовать модифицируемые в процессе работы устройства блоки Flash - памяти. Т.е., часть Flash использовалась в качестве EEPROM. Каждый используемый в таком качестве блок защищался CRC, 32 разряда которой укладывались в конец этого блока. В прошитом "на заводе" устройстве блоки заполнялись значениями по умолчанию. После чего бинарная прошивка подавалась на вход моей программы, она рассчитывала CRC блоков "EEPROM" и клала их в конец этих блоков, а затем рассчитывала CRC всей прошивки вообще и клала эту CRC в последние 4 байта прошивки ...
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Aug 29 2011, 12:21
Сообщение #15


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Никак не могу разобраться до конца со скаттер-файлом. Дабы не плодить похожих тем решил спросить здесь. Поясните, пожалуйста, значение этой строки:
Цитата
*(InRoot$$Sections)

В Keil'овском хелпе пишут, что это "section selector" и он нужен, чтобы: "to place all sections that must be in a root region, i.e. _main.o, _scatter.o...". Но если закомментировать эту строку - ничего не меняется - секция main.0 и scatter.o располагаются по тем же адресам, что и в случае, если эту строчку оставить незакомментированной. В чем подвох? Что я неправильно понимаю?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 13:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.0177 секунд с 7
ELECTRONIX ©2004-2016