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

GCC vs. KEIL (ARM) - printf изменяемой константы.

18 minutes ago, KnightIgor said:

Фирма купила

Please contact your supplier.

Но я уже запутался в этих надуманных проблемах.

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


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

22 minutes ago, x893 said:

Please contact your supplier.

Но я уже запутался в этих надуманных проблемах.

Фирма йок. Все досталось мне в наследство.

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


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

6 hours ago, Сергей Борщ said:

Даже развернуте объяснение на пальцах не все "гуру" осиливают.  SII, процитируйте себя для самых невнимательных еще раз, выделив

жирным текстом, курсивом, ядовито-синим цветом, что ли. А то вам еще две страницы будут приводить цитаты стандартов и интернета.

Была такая мысля, но решил флуд не разводить. Кто хотел понять -- понял если не с первого раза, то хотя б со второго.

2 hours ago, KnightIgor said:

Где взять, чтобы без ограничений?

Так можно ж вполне официально скачать без всяких лицензий и использовать в качестве пробной -- Вам же пока что проверить надо. Вот если в новой версии всё работает, тогда можно подумать о покупке...

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


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

8 hours ago, KnightIgor said:

Фирма йок. Все досталось мне в наследство.

Возьмите Windows VPS на месяц (10$), поставьте последнюю версию Keil, введите ключ и мучайте её.
Это если так боитесь поставить её на своём локальном компьютере.

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


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

5 hours ago, x893 said:

Возьмите Windows VPS на месяц (10$), поставьте последнюю версию Keil, введите ключ и мучайте её.
Это если так боитесь поставить её на своём локальном компьютере.

Как-нибудь. А вот мой второй вопрос в процессе обсуждения остался незамечен: так все-таки, может ли компоновщик ld из пакета gcc генерировать символы без указания в скрипте? Если не ясно, о чем я, поясню:

под KEIL, если я размещу константы в именованной секции, например, "INI_MAIN_TABLE", то в коде С я могу ссылаться на них через предопределенные имена в виде (void*)&INI_MAIN_TABLE$$Base - адрес начала, и (uint32_t)&INI_MAIN_TABLE$$Length - размер секции, и мне не нужно что-то писать в скрипте компоновщика. С ld такая штука не прошла. Мне пришлось ручками вписать в скрипт компоновщика эти вещи, причем я обнаружил, что

 .initable :
  {
          . = ALIGN(4);
          INI_MAIN_TABLE$$Base = .;
        KEEP (*(INI_MAIN_TABLE))
  } >ROM
  INI_MAIN_TABLE$$Length = SIZEOF(.initable);

 

работает, а вот моя изначальная попытка:

 

 .initable :
  {
          . = ALIGN(4);
          INI_MAIN_TABLE$$Base = .;
        KEEP (*(INI_MAIN_TABLE))

        INI_MAIN_TABLE$$Length = . - INI_MAIN_TABLE$$Base;
  } >ROM

 

не ругается, программа собирается, но под (uint32_t)&INI_MAIN_TABLE$$Length находится полная чушь, все летит к чертям. Ну ладно, первый вариант работает, и прекрасно. А вот необходимость явного указания символов в скрипте напрягает.

Я чего-то не доглядел?

 

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


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

6 hours ago, x893 said:

Возьмите Windows VPS на месяц (10$), поставьте последнюю версию Keil, введите ключ и мучайте её.
Это если так боитесь поставить её на своём локальном компьютере.

В общем, скачал 6.6 компилятора и поставил ее под KEIL. Сначала он ругался на лицензию, но вот это помогло. К счастью, в настройках KEIL есть возможность указать вообще и для проекта в частности, какой компилятор использовать, поэтому можно экспериментировать. Так вот, пока собрать с помощью 6.6 не удалось, т.к. компилятор... не находит файлы! Диагностика типа "не могу найти файл srcadc.c", который фактически есть, но находится в src\adc.c. То есть, что-то не срабатывает при вызове компилятора, и обратная косая "проглатывается", из-за чего src\adc.c "плавно превращается" (RIP Жванецкий) в "srcadc.c". Буду смотреть дальше.

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

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


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

39 минут назад, KnightIgor сказал:

Я чего-то не доглядел?

Погуглил - все верно: надо добавлять свои символы в скрипт. Тут описана недокументированная возможность, но она не работает с именами секций, содержащими точки.

Про вашу изначальную попытку: я определяю длину приложения так:

	.text : 
	{
		_image_start = .;
		KEEP(*(.isr_vector))

		LONG((_image_end - _image_start) / 4);	/* application size, in 4-byte words */

        ..........
          
	} > TEXT

      ......
      
	.text.crc :
	{
		. = . + 4;
		_image_end = .;
	} > TEXT

В таком виде оно у меня работает. Трудно сказать, почему у вас не работает, надо внимательно изучать .map.

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


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

8 minutes ago, Сергей Борщ said:

Погуглил - все верно: надо добавлять свои символы в скрипт.

Не всё коту масленица.

По поводу скрипта.

LONG((_image_end - _image_start) / 4);	/* application size, in 4-byte words */

        

Я, кажется, понял. Эта команда РАЗМЕЩАЕТ слово в образе, а не создает символ. Наверное, "моя" команда

INI_MAIN_TABLE$$Length = . - INI_MAIN_TABLE$$Base;
  

Также размещает слово в секции, а не создает символ, равный чему-то там. Хотя я не уверен.

 

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


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

1 час назад, KnightIgor сказал:

Наверное, "моя" команда


INI_MAIN_TABLE$$Length = . - INI_MAIN_TABLE$$Base;
  

Также размещает слово в секции, а не создает символ, равный чему-то там. Хотя я не уверен.

Нет, тут все веселее. Добавил к себе в скрипт такие строки:

        text_length0 = .;
        text_length1 = text_length0 - _image_start;
        text_length2 = . - _image_start; 
	} > TEXT
	
    text_length3 = .; 
    text_length4 = . - _image_start; 

Наблюдаю в .map:

.text           0x0000000008002800    0x18b60
                0x0000000008002800                _image_start = .
...........
                0x000000000801b360                . = ALIGN (0x4)
                0x000000000801b360                text_length0 = .
                0x000000000801b360                text_length1 = (text_length0 - _image_start)
                0x000000000801b360                text_length2 = (. - _image_start)
                0x000000000801b360                text_length3 = .
                0x0000000000018b60                text_length4 = (. - _image_start)

Чешу репу. Что-то я об этом читал в документации на ld, попробую найти.

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


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

57 минут назад, Сергей Борщ сказал:

Чешу репу

Вроде накопал. Попробуйте так:


 .initable :
  {
          . = ALIGN(4);
          INI_MAIN_TABLE$$Base = ABSOLUTE(.);
        KEEP (*(INI_MAIN_TABLE))

        INI_MAIN_TABLE$$Length = . - INI_MAIN_TABLE$$Base;
  } >ROM

Добавлено:

или так:

 .initable :
  {
          . = ALIGN(4);
          INI_MAIN_TABLE$$Base = .;
        KEEP (*(INI_MAIN_TABLE))

        INI_MAIN_TABLE$$Length = ABSOLUTE(. - INI_MAIN_TABLE$$Base);
  } >ROM

 

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


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

32 minutes ago, Сергей Борщ said:

Вроде накопал. Попробуйте так:



 .initable :
  {
          . = ALIGN(4);
          INI_MAIN_TABLE$$Base = ABSOLUTE(.);
        KEEP (*(INI_MAIN_TABLE))

        INI_MAIN_TABLE$$Length = . - INI_MAIN_TABLE$$Base;
  } >ROM

 

В принципе, моя конструкция:

.initable :
  {
          . = ALIGN(4);
          INI_MAIN_TABLE$$Base = .;
        KEEP (*(INI_MAIN_TABLE))
  } >ROM
  INI_MAIN_TABLE$$Length = SIZEOF(.initable);

Мне логически и визуально нравится больше и работает без ABSOLUTE(). Собственно, я считаю эту проблему решенной. Основной вопрос, что стоял передо мной, делает ли ld что-то самостоятельно, как это делает KEIL, или таки надо всё ручками. Частности вылезли позже.

Вообще, неспособность ld генерировать символы "по-умолчанию" меня расстраивает, т.к. разрушает мою концепцию модульной сборки программы.
В моих проектах есть модули, которые обеспечивают приложению ту или иную функциональность простым включением в или исключением их исходника из компиляции. Чтобы модули сами себя инициализировали, они сами макросом включались в таблицу инициализации в именованной секции, и мне не надо было добавлять в части инициализации программы явные вызовы к этим модулям. Так же эти модули подключались в диспетчеру. Ну, допустим, поскольку такие секции едины в приложении, их можно раз и навсегда прописать в .*ld. Но у меня есть модули, которые общаются между собой посредством подобных таблиц. Такие таблицы создавались автоматически без прописывания в скрипт. Теперь, надо это делать ручками...

Еще вопрос к гуру.
Это, скорее, касается Эклипсы вообще и ST32CubeIDE в частности: есть возможность устанавливать >порядок< компиляции и сборки? Для сравнения и понимания: под KEIL IDE можно перетягивать файлы в дереве проекта и, тем самым, определять порядок сборки. STM32CubeIDE мне файлики по алфавиту упорядочивает. Навскидку возможности IDE пересортировать файлы не нашёл. Только не надо рекомендовать файлы переименовывать! :biggrin:

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

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


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

4 часа назад, KnightIgor сказал:

Это, скорее, касается Эклипсы вообще и ST32CubeIDE в частности: есть возможность устанавливать >порядок< компиляции и сборки?

Зачем???

Работоспособность программы не должна зависеть от порядка сборки её исходных файлов. Если у Вас не так - это надо исправлять, а не искать костыли.

Современные компиляторы вообще могут компилировать в несколько потоков параллельно.

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


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

On 11/8/2020 at 10:04 PM, jcxz said:

Зачем???

Работоспособность программы не должна зависеть от порядка сборки её исходных файлов. Если у Вас не так - это надо исправлять, а не искать костыли.

Современные компиляторы вообще могут компилировать в несколько потоков параллельно.

Вопросом на вопрос - была преррогатива М. Жванецкого (RIP). Есть ответ по существу?

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


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

25 минут назад, KnightIgor сказал:

Есть ответ по существу?

Порядок сборки модулей программы не должен влиять на её работу. Если это не так - ищите ошибку.

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


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

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

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

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

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

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

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

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

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

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