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

5 hours ago, KARLSON said:

И тут проблема - компилятор создаёт бинарник размером в 300 Мб

Переписанный под мои нужды скрипт из Куба. Размещает по порядку 192 байта параметров ПЛК и 16000 байт программы начиная с адреса сектора 1.

Скрипт линкёра.

Spoiler
/**
 ******************************************************************************
 * @file      LinkerScript.ld
 *  Abstract    : Linker script for Discovery-F407xx Board embedding STM32F407xx
 *                device from stm32f4 series
 
                512Kbytes FLASH
 *              192Kbytes RAM (112+16+64)
 *
 *            Set heap size, stack size and stack location according
 *            to application requirements.
 *
 *            Set memory bank area and size if external memory is used
 ******************************************************************************
 * @attention
 *
 * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
 * All rights reserved.</center></h2>
 *
 * This software component is licensed by ST under BSD 3-Clause license,
 * the "License"; You may not use this file except in compliance with the
 * License. You may obtain a copy of the License at:
 *                        opensource.org/licenses/BSD-3-Clause
 *
 ******************************************************************************
 */

/* Entry Point */
ENTRY(Reset_Handler)

/* Highest address of the user mode stack */
_estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of "RAM" Ram type memory */

_Min_Heap_Size = 0x800;   /* required amount of heap  */
_Min_Stack_Size = 2K;   /* required amount of stack */

/* Memories definition */
MEMORY
{
    RAM                 (xrw)   : ORIGIN = 0x20000000, LENGTH = 128K
    
    SECTOR_0            (rx)    : ORIGIN = 0x08000000, LENGTH = 16K
    SECTOR_1_2          (rx)    : ORIGIN = 0x08004000, LENGTH = 32K
    SECTOR_3            (rx)    : ORIGIN = 0x0800C000, LENGTH = 16K  
    SECTOR_4            (rx)    : ORIGIN = 0x08010000, LENGTH = 64K /* Reserved */  
    SECTOR_5_7          (rx)    : ORIGIN = 0x08020000, LENGTH = 384K  
}

/* Sections */
SECTIONS
{
  /* The startup code into "FLASH" Rom type memory */
  .isr_vector_FLASH :
  {
    . = ALIGN(4);
    KEEP(*(.isr_vector_FLASH)) /* Startup code */
    . = ALIGN(4);
  } >SECTOR_0

  .plc_params :
  {
    . = ALIGN(2);
    
    KEEP (*(.plc_params))
                    
    /*. = ALIGN(2);*/
  } >SECTOR_1_2
  
  .plc_prog :
  {
    /*. = ALIGN(2);*/
    KEEP (*(.plc_prog))
                    
    . = ALIGN(2);
  } >SECTOR_1_2
     
  .plc_D8xxx :
  {
    . = ALIGN(2);
    
    KEEP (*(.plc_D8xxx))
                    
    . = ALIGN(2);
  } >SECTOR_1_2
        
  .plc_data_regs :
  {
    . = ALIGN(2);
    
    KEEP (*(.plc_data_regs))
                    
    . = ALIGN(2);
  } >SECTOR_3
        
  /* The program code and other data into "FLASH" Rom type memory */
  .text :
  {
    . = ALIGN(4);
    *(.text)           /* .text sections (code) */
    *(.text*)          /* .text* sections (code) */
    *(.glue_7)         /* glue arm to thumb code */
    *(.glue_7t)        /* glue thumb to arm code */
    *(.eh_frame)

    KEEP (*(.init))
    KEEP (*(.fini))

    . = ALIGN(4);
    _etext = .;        /* define a global symbols at end of code */
  } >SECTOR_5_7

  /* Constant data into "FLASH" Rom type memory */
  .rodata :
  {
    . = ALIGN(4);
    *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
    . = ALIGN(4);
  } >SECTOR_5_7

  .ARM.extab   : { 
    . = ALIGN(4);
    *(.ARM.extab* .gnu.linkonce.armextab.*)
    . = ALIGN(4);
  } >SECTOR_5_7
  
  .ARM : {
    . = ALIGN(4);
    __exidx_start = .;
    *(.ARM.exidx*)
    __exidx_end = .;
    . = ALIGN(4);
  } >SECTOR_5_7

  .preinit_array     :
  {
    . = ALIGN(4);
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
    . = ALIGN(4);
  } >SECTOR_5_7
  
  .init_array :
  {
    . = ALIGN(4);
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
    . = ALIGN(4);
  } >SECTOR_5_7
  
  .fini_array :
  {
    . = ALIGN(4);
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(SORT(.fini_array.*)))
    KEEP (*(.fini_array*))
    PROVIDE_HIDDEN (__fini_array_end = .);
    . = ALIGN(4);
  } >SECTOR_5_7
  
  _sidata = LOADADDR(.data);

  /* Initialized data sections into "RAM" Ram type memory */
  .isr_vector_RAM :
  {
    . = ALIGN(4);
    KEEP(*(.isr_vector_RAM))
    PROVIDE_HIDDEN ( __isr_vector_RAM = .);
    . = ALIGN(4);
  } >RAM

  
  .data : 
  {
    . = ALIGN(4);
    _sdata = .;        /* create a global symbol at data start */
    *(.data)           /* .data sections */
    *(.data*)          /* .data* sections */

    . = ALIGN(4);
    _edata = .;        /* define a global symbol at data end */
    
  } >RAM AT> SECTOR_5_7

  /* Uninitialized data section into "RAM" Ram type memory */
  . = ALIGN(4);
  .bss :
  {
    /* This is used by the startup in order to initialize the .bss section */
    _sbss = .;         /* define a global symbol at bss start */
    __bss_start__ = _sbss;
    *(.bss)
    *(.bss*)
    *(COMMON)

    . = ALIGN(4);
    _ebss = .;         /* define a global symbol at bss end */
    __bss_end__ = _ebss;
  } >RAM

  /* User_heap_stack section, used to check that there is enough "RAM" Ram  type memory left */
  ._user_heap_stack :
  {
    . = ALIGN(8);
    PROVIDE ( end = . );
    PROVIDE ( _end = . );
    . = . + _Min_Heap_Size;
    . = . + _Min_Stack_Size;
    . = ALIGN(8);
  } >RAM

  /* Remove information from the compiler libraries */
  /DISCARD/ :
  {
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
  }

  .ARM.attributes 0 : { *(.ARM.attributes) }
}

 

В программе.

Spoiler

const uint8 __PLC_params[ SIZE_BYTE_PARAMS ] \
    __attribute__ ( (section( ".plc_params" ), used ) ) =
{
    MAX_STEP / 1000, 0x00,  // 00 0x0000 -- SIZE IN STEP 16000
    0x00, 0x00,             // 02        --
    0x00, 0x00,             // 04        --
.......
}

const uint16 __PLC_prog[ MAX_STEP ] \
    __attribute__ ( (section( ".plc_prog" ), used ) ) =
{
    0x2800, 0xC801, 0x001C, // -|M0|-(M1)-
    0xFFFF,                 // ----[FEND]-
    0x000F                  // -----[END]-
};

 

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

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


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

1 hour ago, tonyk_av said:

ПЛК

А Вы программу для ПЛК генерируете какой программой (beremiz, openPLC, ...) ?

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


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

2 hours ago, x893 said:
3 hours ago, tonyk_av said:

 

А Вы программу для ПЛК генерируете какой программой (beremiz, openPLC, ...) ?

GX Works2

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


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

В 20.06.2023 в 02:29, jcxz сказал:

В IAR, чтобы оно правильно работало, кроме префикса __no_init у переменных, у вас в командном файле компоновщика для этой секции должно быть указано:

do not initialize  {section .SettingsSection};

По аналогии с IAR, можно предположить, что и здесь в скрипте компоновщика нужно указать нечто аналогичное. Вангую, что нужную инструкцию искать нужно в мануале на компоновщик.

В общем, да.

Теперь секция выглядит так

  /*KEEP(*(.SettingsSection))
  *(.SettingsSection)*/
  .markerSettings  (0x20000000) (NOLOAD):
  {
  KEEP(*(.SettingsSection))
  } >RAM 

И бинарник теперь нормальной величины)

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


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

В 14.06.2023 в 19:45, dimka76 сказал:

У Eclipse есть настройка Stop on first build error

ну настройка то есть. только она не работает 😈 индусы в своем репертуаре

image.thumb.png.0d5f8837b0cfef1a67fc62e7646da8d2.png

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


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

36 minutes ago, RusikOk said:

ну настройка то есть. только она не работает 😈 индусы в своем репертуаре

image.thumb.png.0d5f8837b0cfef1a67fc62e7646da8d2.png

Скорее всего гуру программирования в своём репертуаре.

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


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

27 минут назад, x893 сказал:

Скорее всего гуру программирования в своём репертуаре

Вы действительно считаете, что это нормальное поведение? загружать левую прошивку

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


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

14 minutes ago, RusikOk said:

Вы действительно считаете, что это нормальное поведение? загружать левую прошивку

Если нужно загрузить - значит нормальное.

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


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

13 минут назад, x893 сказал:

Если нужно загрузить - значит нормальное.

1) Вы пытаетесь уйти от ответа (скорее всего сами понимаете, что это не нормальное поведение компилятора)

2) кому нужно? мне такое уж точно не нужно. да и сомневаюсь что кому то нужен мусор во флеше контроллера

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


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

4 minutes ago, RusikOk said:

1) Вы пытаетесь уйти от ответа (скорее всего сами понимаете, что это не нормальное поведение компилятора)

2) кому нужно? мне такое уж точно не нужно. да и сомневаюсь что кому то нужен мусор во флеше контроллера

Столько раз уже я здесь читал ошибки в компиляторах, IDE, процессорах и прочее.

А в результате оказалось всё как в пословице - Дело было не в бобине, ... сидел в кабине.

Кому нужно ? Тому кто сидит между стулом и клавиатурой.

Дисскуссия ни о чём.

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


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

59 минут назад, x893 сказал:

здесь читал ошибки в компиляторах, IDE, процессорах и прочее

Ага, некоторые "чрезвычайно хорошие" программисты при первой же ошибке клянут компилятор или баги в железе. Знакомая ситуация, недавно даже тут на этом форуме рассматривалась - чел заявил, что это несомненно баг в железе, а оказалось, что "чрезвычайно хороший" программист банально накосячил, склеивая куски копипащеного кода и микроконтроллер, встретив косяк в коде, исполнял этот косяк - стирал всю прошивку полностью 🙂 Автор топика так же упорно сопротивлялся и валил вину на что угодно, только не на косячного программиста.

Вообще-то, при попытке залить прошивку с ошибкой, IDE вначале спросит - "действительно хотите загрузить с ошибкой компиляции"? 

А та галочка работает так: встретив первую ошибку компиляции (красный кружочек), дальнейшую сборку проводить не будет. А вот загрузка прошивки - это уже другая фаза.

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


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

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

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


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

2 часа назад, EdgeAligned сказал:

Вообще-то, при попытке залить прошивку с ошибкой, IDE вначале спросит - "действительно хотите загрузить с ошибкой компиляции"?

Назовите нам компилятор, который всё же создаёт загрузочный образ, при наличии хотя бы одной ошибки компиляции? А то что-то не верится в существование такового.  :unknw:

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


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

2 minutes ago, jcxz said:

Назовите нам компилятор, который всё же создаёт загрузочный образ, при наличии хотя бы одной ошибки компиляции? А то что-то не верится в существование такового.  :unknw:

Да остается у него образ от последней удачной компиляции. Он его и грузит. Сделать Clean ... и Build. И не будет никаких прошивок. Какую то хрень обсуждаете.

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


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

4 минуты назад, x893 сказал:

Да остается у него образ от последней удачной компиляции. Он его и грузит. Сделать Clean ... и Build. И не будет никаких прошивок. Какую то хрень обсуждаете.

Обсуждаем то, что написано. А написано было следующее:

2 часа назад, EdgeAligned сказал:

залить прошивку с ошибкой

"Образ от последней удачной компиляции", это не "образ с ошибкой компиляции".

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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