Перемещение вниз по isr_vector в stm32 с помощью GCC

Мне нужно переместить isr_vector, чтобы освободить место для двух переменных, которые мне нужно там сохранить.

Я попробовал это в скрипте компоновщика

/* Specify the memory areas */
MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 92K
RAM2 (xrw)     : ORIGIN = 0x10000000, LENGTH = 32K
FLASH0 (rx)    : ORIGIN = 0x08000000, LENGTH = 4K
FLASH (rx)     : ORIGIN = 0x08001000, LENGTH = 1020K
my_ram (xrw)   : ORIGIN = 0x20017000, LENGTH = 4K
}
/* Define output sections */
SECTIONS
{
  /* CUSOTM SECTION */
  .myBufBlock(NOLOAD) :

  {

    KEEP(*(.myRAM)) /* keep my variable even if not referenced */

  } > my_ram

    .crcBlock :
  {
    . = ALIGN(8);
    KEEP(*(.myCrcSection)) /* Startup code */
    . = ALIGN(8);
  } >FLASH0

  /* The startup code goes first into FLASH */
  .isr_vector :
  {
    . = ALIGN(8);
    KEEP(*(.isr_vector)) /* Startup code */
    . = ALIGN(8);
  } >FLASH

И изменил смещение на 0x1000:

SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET;
VECT_TAB_OFFSET = 0x1000;
VECT_TAB_BASE_ADDRESS = 0x08000000UL;

Когда я это делаю, программа на stm32 не запускается, что я делаю не так?

Где изменить таблицу векторов? в основной()? Вы вообще добираетесь до главного? Можно ли мигать светодиодом? В конце концов, базовая программа мигания не требует прерываний, поэтому наличие мигающего светодиода будет означать, что по крайней мере запуск прошел правильно. Вы не показали, где находится исполняемый файл .text. Где на самом деле находится ваш обычный исполняемый код?

Ilya 25.04.2024 14:31

Не было бы разумнее переместить ваши пользовательские переменные вместо того, чтобы настаивать на «по причинам-...». В MCU не может быть ничего более важного, чем таблица векторов, поэтому я никогда не понимаю, почему все настаивают на ее перемещении.

Lundin 25.04.2024 14:32

По крайней мере, ваш вектор сброса должен находиться в начале флэш-памяти, иначе как процессор узнает, какую инструкцию выполнить первой?

pmacfarlane 25.04.2024 15:59

Ваша идея неверна

gulpr 27.04.2024 22:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
94
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это невозможно — начальный указатель стека хранится во флэш-памяти со смещением 0 (*), а вектор сброса — со смещением 4.

Когда вы включаете систему, ЦП всегда будет загружать SP и ПК с этих смещений, чтобы он мог начать выполнение вашего кода. Нет никакого способа изменить это. (Вы можете переместить таблицу векторов позже, после запуска кода, но не раньше.)

Я бы предложил поместить ваш CRC или любые другие данные, которые у вас есть, с некоторым фиксированным смещением после таблицы векторов.

(*) Обратите внимание, что вы можете использовать загрузочные контакты (и регистры конфигурации загрузочных контактов) для сопоставления SRAM или системного загрузчика по адресу 0x00000000, но здесь это вам не поможет.

Ответ принят как подходящий

Я понял, что мне нужно сначала разместить Isr_vector в памяти, а затем поместить мои данные, а затем остальной пользовательский код.

Другие вопросы по теме