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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
AHTOXA
сообщение Aug 3 2011, 08:53
Сообщение #31


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



В моей рекомендации и так все строчки initX исправлены. Там дальше идут finiX - они в принципе не нужны sm.gif
Вы с ключами-то разобрались? Если да, то попробуйте убрать KEEP() и откомпилируйте. Увидите сильное уменьшение размера программы (даже чересчур).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
aliko
сообщение Aug 3 2011, 09:10
Сообщение #32


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 23-11-05
Пользователь №: 11 254



Цитата(AHTOXA @ Aug 3 2011, 12:53) *
Вы с ключами-то разобрались? Если да, то попробуйте убрать KEEP() и откомпилируйте. Увидите сильное уменьшение размера программы (даже чересчур).

ключи мои вот:
Код
ldflags        := -mmcu=$(cpu) -Wl,-Map="$(mapfile)",--cref -W1,--gc-sections


еще пробовал вот так
Код
ldflags        := -mmcu=$(cpu) -Wl,-Map="$(mapfile)",--cref -W1,--gc-sections -Wl


Не совсем понял какие именно KEEP() убрать, убрал все что стоят перед каждым initX. На размер кода это влияния не оказало sad.gif

UPD
Все получилось. у меня было --cref -W1 вместо --cref -Wl (L маленькая) %)

Сообщение отредактировал aliko - Aug 3 2011, 09:13
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 3 2011, 09:14
Сообщение #33


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Аминьsm.gif

ЗЫ. Раз уж вы начали писать в рассылку mspgcc, может напишете про этот баг?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
aliko
сообщение Aug 3 2011, 09:15
Сообщение #34


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 23-11-05
Пользователь №: 11 254



А каков смысл редактирования KEEP поясните пожалуйста? Размер кода уменьшается и без их добавления/убирания. Или это вы ошибку нашли в сборке mspgcc которую надо поправить?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 3 2011, 09:17
Сообщение #35


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
aliko
сообщение Aug 3 2011, 10:09
Сообщение #36


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 23-11-05
Пользователь №: 11 254



Цитата(AHTOXA @ Aug 3 2011, 13:17) *
Без KEEP выкидывается не только неиспользуемый код, но и часть нужного. И результат получается неработоспособный.

Похоже что и с KEEP выкидывается часть нужного. В моем случае размер кода не зависит от того прописал ли я эти KEEP или нет. И да, код становится неработоспособным... sad.gif


Написал в рассылку посвященную msp430.gcc
Ответил некий Peter Bigot по всей видимости один из разработчиков этого компилятора. Ниже вольный перевод:

Цитата
Нет никаких причин использовать --gc-sections. Как вы выяснили он скорее всего уберет те вещи которые посчитает неиспользуемыми поскольку текущий скрипт линковщика говорит ему неправду.

Покрайней мере некоторые из этих "неправд" будут откорректированы в течение несольких часов когда я закончу перемещение все разработческих веток чтобы они базировались на GCC 4.6.0 и отправлю изменения которые я собрал у себя, тем не менее я не вижу никаких причин использовать этот флаг с mspgcc.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 3 2011, 11:26
Сообщение #37


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(aliko @ Aug 3 2011, 16:09) *
Похоже что и с KEEP выкидывается часть нужного. В моем случае размер кода не зависит от того прописал ли я эти KEEP или нет. И да, код становится неработоспособным... sad.gif

Наверняка какой-нибудь скобочки не хватаетsm.gif (У меня есть разница в размере кода с KEEP и без. Надо будет найти железку и проверить живьём...)

Цитата(aliko @ Aug 3 2011, 16:09) *
Написал в рассылку посвященную msp430.gcc
Ответил некий Peter Bigot по всей видимости один из разработчиков этого компилятора.

Собственно, это нормальная реакция разработчика на рапорт вида "почему-то не работает" sm.gif Надо же было написать, в чём причина! Тогда он скорее всего поправит.


---
Хм. Странно... Я до этого редактировал копию файла msp430.x, и явно указывал её в качестве линкерного скрипта (через LD_FLAGS += -T$(LD_SCRIPT) ). Теперь попробовал исправить оригинальный файл, и ничего не вышло. Пока не понимаю почему.


Короче, я так и не понял, в чём там дело. Похоже эти скрипты (20110716\msp430\lib\ldscripts\msp430.x*) лежат там чисто для справки. Даже их удаление ни на что не влияет.
Единственный рабочий вариант - сделать копию скрипта, (вставить руками в неё инклюды от соответствующего контроллера), сделать в ней исправления (KEEP) и указать её в качестве скрипта линкеру. При таких условиях -gc-sections работает нормально (проверил в железе).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
aliko
сообщение Aug 3 2011, 11:29
Сообщение #38


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 23-11-05
Пользователь №: 11 254



Цитата(AHTOXA @ Aug 3 2011, 15:26) *
Единственный рабочий вариант - сделать копию скрипта, (вставить руками в неё инклюды от соответствующего контроллера), сделать в ней исправления (KEEP) и указать её в качестве скрипта линкеру. При таких условиях -gc-sections работает нормально (проверил в железе).

Я тоже могу подтвердить. Мое железо тоже заработало! sm.gif
Экономия в размере прошивки составила 22% что весьма не мало...

Сообщение отредактировал aliko - Aug 3 2011, 11:29
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 5 2011, 04:57
Сообщение #39


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Закоммитил исправления в pre-4.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
aliko
сообщение Aug 5 2011, 08:27
Сообщение #40


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 23-11-05
Пользователь №: 11 254



Цитата(AHTOXA @ Aug 5 2011, 08:57) *
Закоммитил исправления в pre-4.

Для mspgcc сегодня тоже были опубликованы патчи исправляющие ошибку с gc-sections.
Полезное получилось обсуждение sm.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 8 2011, 08:44
Сообщение #41


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (AHTOXA @ Aug 3 2011, 11:34) *
Нашёл в чём дело. В линкерном скрипте почему-то убраны KEEP от секций initX.
А вот не все так просто. Там была хитрая задумка - в секции .init были ссылки на остальные секции .initX (если память не изменяет - в виде extern <метка>, другого способа я не нашел), поэтому она тянула за собой все секции инициализации. Если же пользователь переопределял точку входа по вектору сброса - не линковалась библиотечное содержимое секции .init и, следовательно, и содержимое остальных .initX тоже - весь стартап отключался разом. Видимо в новой версии binutils что-то изменили и этот механизм работать перестал. Так что я бы не стал утверждать, что это ошибка линкерных скриптов - там все это было сделано осознанно. Теперь для замены стартапа придется переопределать метки точек входа всех .initX секций.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 8 2011, 09:52
Сообщение #42


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Сергей Борщ @ Aug 8 2011, 14:44) *
А вот не все так просто.

Возможно. Но поменять линкерный скрипт было в моих силах, а бинутилс - нетsm.gif
Вроде как Peter Bigot уже сознался, что это был недавно привнесённый баг, и опубликовал патчи. Но поскольку я использовал для тестирования готовую сборку под винду, то патчи эти принесли мне в основном моральное удовлетворение.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
aliko
сообщение Aug 29 2011, 10:56
Сообщение #43


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 23-11-05
Пользователь №: 11 254



Проблемы с GCC кажется продолжаются.
При компиляции проекта последними версиями компилятора получается глючная прошивка. Под отладчиком все работает первый раз нормально, но после перезагрузки начинает сыпать мусор на ЖКИ устройства. В то же время при использовании старой версии компилятора (MSPGCC4 на базе GCC 4.4) подобного не наблюдается и программа работает стабильно. Беда в том что в старом mspgcc4 есть свои глюки в частности не работает printf.
Интересный момент: при открытии прошивки олимесковской программой она предупреждает : "Found data at address anavailable in the device" (Найдены данные по адресу недоступному на устройстве). При этом на прошивку полученную от компилятора mspgcc4 и которая работает нормально так не ругается. Я использую контроллер msp430f1611
Ниже я приведу дамп комманды readelf -e для бинарника который глючит. Может кто-то кто хорошо разбирается скажет есть ли в нем что-то не то из-за чего олимекс может так ругаться и программа глючить? К сожалению сам не особо силен в анализе этих данных...(
Код
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 ff 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            Standalone App
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Texas Instruments msp430 microcontroller
  Version:                           0x1
  Entry point address:               0x4000
  Start of program headers:          52 (bytes into file)
  Start of section headers:          288708 (bytes into file)
  Flags:                             0x10000000
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         6
  Size of section headers:           40 (bytes)
  Number of section headers:         36
  Section header string table index: 33

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al

  [ 0]                   NULL            00000000 000000 000000 00      0   0  0

  [ 1] .text             PROGBITS        00004000 000bae 007840 00  AX  0   0  2

  [ 2] .data             PROGBITS        00001100 0083ee 000014 00  WA  0   0  2

  [ 3] .bss              NOBITS          00001114 008402 000a99 00  WA  0   0  2

  [ 4] .noinit           NOBITS          00001bae 008402 0000c2 00  WA  0   0  2

  [ 5] .vectors          PROGBITS        0000ffe0 008402 000020 00  AX  0   0  1

  [ 6] .debug_aranges    PROGBITS        00000000 008424 00039c 00      0   0  4

  [ 7] .debug_pubnames   PROGBITS        00000000 0087c0 001fd8 00      0   0  1

  [ 8] .debug_info       PROGBITS        00000000 00a798 01fbc8 00      0   0  1

  [ 9] .debug_abbrev     PROGBITS        00000000 02a360 007bbf 00      0   0  1

  [10] .debug_line       PROGBITS        00000000 031f1f 005233 00      0   0  1

  [11] .debug_frame      PROGBITS        00000000 037152 001a1a 00      0   0  2

  [12] .debug_str        PROGBITS        00000000 038b6c 005270 01  MS  0   0  1

  [13] .debug_loc        PROGBITS        00000000 03dddc 006087 00      0   0  1

  [14] .debug_pubtypes   PROGBITS        00000000 043e63 00205f 00      0   0  1

  [15] .debug_ranges     PROGBITS        00000000 045ec2 000654 00      0   0  1

  [16] .rodata._ZL7xfCon PROGBITS        00001c70 0000f4 000058 00   A  0   0  2

  [17] .rodata._ZL10HART PROGBITS        00001cc8 00014c 00006a 00   A  0   0  2

  [18] .rodata.small_fon PROGBITS        00001d32 0001b6 00000e 00   A  0   0  2

  [19] .rodata._ZL16font PROGBITS        00001d40 0001c4 0003a8 00   A  0   0  1

  [20] .rodata._ZL24font PROGBITS        000020e8 00056c 000100 00   A  0   0  1

  [21] .rodata._ZL23font PROGBITS        000021e8 00066c 000138 00   A  0   0  2

  [22] .rodata._ZL23font PROGBITS        00002320 0007a4 000138 00   A  0   0  2

  [23] .rodata.big_font  PROGBITS        00002458 0008dc 00000e 00   A  0   0  2

  [24] .rodata._ZL19font PROGBITS        00002466 0008ea 000128 00   A  0   0  1

  [25] .rodata._ZL22font PROGBITS        0000258e 000a12 000100 00   A  0   0  1

  [26] .rodata._ZL20font PROGBITS        0000268e 000b12 00000d 00   A  0   0  1

  [27] .rodata._ZL21font PROGBITS        0000269c 000b20 00001a 00   A  0   0  2

  [28] .rodata._ZL21font PROGBITS        000026b6 000b3a 00001a 00   A  0   0  2

  [29] .rodata._ZL12adc_ PROGBITS        000026d0 000b54 000005 00   A  0   0  1

  [30] .rodata._ZL11cons PROGBITS        000026d5 000b59 000040 00   A  0   0  1

  [31] .rodata._ZL8bits_ PROGBITS        00002715 000b99 000010 00   A  0   0  1

  [32] .rodata._ZL8bits_ PROGBITS        00002725 000ba9 000005 00   A  0   0  1

  [33] .shstrtab         STRTAB          00000000 046516 0002ab 00      0   0  1

  [34] .symtab           SYMTAB          00000000 046d64 0026e0 10     35 147  4

  [35] .strtab           STRTAB          00000000 049444 002ae1 00      0   0  1

Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x000000 0x00001b7c 0x00001b7c 0x00b1f 0x00b1f R   0x1
  LOAD           0x000b20 0x0000269c 0x0000269c 0x0008e 0x0008e R   0x1
  LOAD           0x000bae 0x00004000 0x00004000 0x07840 0x07840 R E 0x1
  LOAD           0x0083ee 0x00001100 0x0000b840 0x00014 0x00aad RW  0x1
  LOAD           0x008402 0x00001bae 0x0000b854 0x00000 0x000c2 RW  0x1
  LOAD           0x008402 0x0000ffe0 0x0000ffe0 0x00020 0x00020 R E 0x1

Section to Segment mapping:
  Segment Sections...
   00     .noinit .rodata._ZL7xfConfD .rodata._ZL10HART_confD .rodata.small_font
.rodata._ZL16font_small_table .rodata._ZL24font_small_mapping_table .rodata._ZL
23font_small_offset_table .rodata._ZL23font_small_detail_table .rodata.big_font
.rodata._ZL19font_big_char_table .rodata._ZL22font_big_mapping_table .rodata._ZL
20font_big_width_table
   01     .rodata._ZL21font_big_offset_table .rodata._ZL21font_big_detail_table
.rodata._ZL12adc_channels .rodata._ZL11const_types .rodata._ZL8bits_cnt .rodata.
_ZL8bits_msk
   02     .text
   03     .data .bss
   04     .noinit
   05     .vectors


Сообщение отредактировал aliko - Aug 29 2011, 10:57
Go to the top of the page
 
+Quote Post
aliko
сообщение Aug 30 2011, 08:35
Сообщение #44


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 23-11-05
Пользователь №: 11 254



Похоже я понял в чем проблема. Злобный компилятор зачем-то кладет мои константы (секция rodata) в оперативную память и после первого перезапуска девайса все эти данные благополучно исчезают... sad.gif
Go to the top of the page
 
+Quote Post
aliko
сообщение Aug 30 2011, 12:16
Сообщение #45


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 23-11-05
Пользователь №: 11 254



Причина ошибки во флаге -fdata-sections который неправильно как-то обрабатывается последними версиями компилятора... лучше пока воздержаться от его использования...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 21:12
Рейтинг@Mail.ru


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