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

Переменная во флеш памяти в GCC

2 minutes ago, dimka76 said:

Или сразу после таблицы

В таком случае понадобится модификация скрипта линкера, а автор хочет уйти от этого.

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


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

On 12/19/2022 at 10:09 AM, haker_fox said:

В таком случае понадобится модификация скрипта линкера, а автор хочет уйти от этого.

Не понадобится.

В конец таблицы добавить еще один элемент (вектор)

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


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

23 минуты назад, dimka76 сказал:

В конец таблицы добавить еще один элемент (вектор)

Что-то я не подумал, что стартап и таблица векторов это тоже одно из табу на редактирование :)))

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


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

47 minutes ago, dimka76 said:

В конец таблицы добавить еще один элемент (вектор)

Я воспринял Ваше предложение

1 hour ago, dimka76 said:

Или сразу после таблицы

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

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


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

20 hours ago, jenya7 said:
#pragma location = 0x00003FD8

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

Описал физическую память своего МК, глядя в даташит и исходя из своих потребностей:

* 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_prog :
  {
    /*. = ALIGN(2);*/
    KEEP (*(.plc_prog))
                    
    . = ALIGN(2);
  } >SECTOR_1_2 

И спокойно помещаешь свои данные в нужную секцию:

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

При переносе на другой МК, имеющий другую структуру и адреса памяти, достаточно изменить адреса в скрипте линкёра, не трогая программу.

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


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

Линковщик раблтает в пределах одной прошивки. А требуется чтобы сторонняя прошивка по какому-то фиксированному адресу нашла нужные данные.

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


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

On 12/19/2022 at 8:23 AM, VladislavS said:

Magic Number проще всего положить в незадействованый вектор в таблице векторов прерываний.

интересно. но таблица векторов read only. 

void (* const g_pfnVectors[])(void) = {
    // Core Level - CM4
    &_vStackTop,                       // The initial stack pointer
    ResetISR,                          // The reset handler
    NMI_Handler,                       // The NMI handler
    HardFault_Handler,                 // The hard fault handler
    MemManage_Handler,                 // The MPU fault handler
    BusFault_Handler,                  // The bus fault handler
    UsageFault_Handler,                // The usage fault handler
  
    0,                                 // Reserved - 7 - magic number
  
    0,                                 // Reserved
    0,                                 // Reserved
    0,                                 // Reserved
    SVC_Handler,                       // SVCall handler
    DebugMon_Handler,                  // Debug monitor handler
    0,                                 // Reserved
    PendSV_Handler,                    // The PendSV handler
    SysTick_Handler,                   // The SysTick handler
  
    //и так далее
}

к тому же это таблица указателей на обработчики прерываний.

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


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

17 минут назад, jenya7 сказал:

интересно. но таблица векторов read only. 

А вам эти данные еще и менять надо было? В исходной задаче об этом ни слова.

17 минут назад, jenya7 сказал:

к тому же это таблица указателей на обработчики прерываний.

Обратите внимание на ее первый элемент. Что там? Неужто указатель на обработчик? Оставим пока за скобками авторов этих файлов, ниасиливших описать этот участок памяти в виде структуры из правильных типов.

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


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

On 12/19/2022 at 3:29 PM, Сергей Борщ said:

А вам эти данные еще и менять надо было? В исходной задаче об этом ни слова.

Обратите внимание на ее первый элемент. Что там? Неужто указатель? Оставим пока за скобками авторов этих файлов, ниасиливших описать этот участок памяти в виде структуры из правильных типов.

первый элемент? extern void _vStackTop(void); не указатель?

ну если только так

void (* const g_pfnVectors[])(void) = {
  ..........
    (void *)0x1234,                            // Reserved - 7 - magic number
 ...........
  }

и потом

if (g_pfnVectors[7] == (void*) 0x1234)

 

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

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


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

3 hours ago, VladislavS said:

А требуется чтобы сторонняя прошивка по какому-то фиксированному адресу нашла нужные данные.

Ну так достаточно разместить нужную секцию по известному адресу, например, так:

 

3 hours ago, tonyk_av said:
 SECTOR_4            (rx)    : ORIGIN = 0x08010000, LENGTH = 64K /* Reserved */

 

1 hour ago, jenya7 said:

но таблица векторов read only.

Это она в секции, находящейся во флэш только для чтения. У меня, например, таблица векторов находятся в ОЗУ, куда перемещается после старта:

  /* 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
////////////////////////////////////////////////////////////////////////////////
//
//  startup_stm32f407xx.cpp
//
////////////////////////////////////////////////////////////////////////////////

.....

	#if defined( __VECTORS_IN_RAM__) || defined( __DEBUG_SRAM__ )
            IRQ::moveVectorsToRAM();
        #endif
......

Нет никаких проблем, чтобы изменить адрес вектора  в ОЗУ и скинуть их обратно во флэш. Один вопрос: нафига? Зарезервируй под свои нужды сектор или сегмент в ОЗУ, и пиши в него сколько хочешь.

 

Единственное неудобство есть у STM32F4 и F7 с их большим размерами секторов, что делает не всегда удобным обновление нескольких байт во флэш.

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


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

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

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

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

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

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

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

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

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

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