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

А как программа/компилятор поймет это РАМ или флаш, если обращение будет к 0х00000100 ?

А им зачем? Сказано, в 100, значит, в 100. Это пусть процессор мучается, он же знает, как его запустили.

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


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

А им зачем? Сказано, в 100, значит, в 100. Это пусть процессор мучается, он же знает, как его запустили.

 

Ну а процессор что делать будет?

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


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

Ну а процессор что делать будет?

Он уже включен железно так, как задано. Может, вам мануал почитать? :rolleyes:

 

Мысль, что по нулевым адресам ничего нет, мне нравится больше.

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


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

Он уже включен железно так, как задано. Может, вам мануал почитать? :rolleyes:

Да, не надо нашим людям помогать. Тебя же потом и по кумполу.

Зря влез.

До свидания.

 

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


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

Особенно когда люди даже прочитать не могут, а сразу строчат в форум в надежде, что им разжуют всё (однокашники).

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


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

Может ли Cortex-M3 выполнять программу из внешней памяти?

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


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

Да ему пофиг какой адрес - что указано в 8000004 или 20000004 (от BOOT0/1 зависит) туда и перейдет.

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

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


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

Ой ли? Надо по шинам посмотреть в руководстве.

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


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

Без Ой-ли. Только hardfault можно получить, если не туда куда можно.

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


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

Предыдущий оратор путается в показаниях. То у него "без ой-ли", то HardFault.

Есть у кого-нибудь подтверженное практикой мнение, или и так всем ясно (что нельзя)?

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


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

Есть у кого-нибудь подтверженное практикой мнение, или и так всем ясно (что нельзя)?

Cortex™-M3 Technical Reference Manual от ARM

утверждает что исполнение кода запрещено только из старших 1/2 Гигабайта адресного пространства (от 0xE0000000 и до упора).

Так что при желании можно поисполнять даже содержимое регистров периферийных устройств.

Т.е. архитектура ARM не запрещает, но конкретно у STM32F1xx не получится, выборка кода запрещена для адресов 0x40000000- 0x5FFFFFFF и от 0xA0000000 до конца памяти.

 

Под внешнюю память отведен диапазон адресов 0x60000000 - 0x9FFFFFFF, если контроллер внешней памяти настроить соответствующим образом, то можно и из внешней памяти код исполнять.

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


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

Судя по рисунку, STM32F20X может выполнять программу из внешней памяти. А также и из внутренней OTP Flash, наверное.

 

А еще под картинкой написано:

S2: S-bus

This bus connects the system bus of the Cortex®-M3 core to a BusMatrix. This bus is used

to access data located in a peripheral or in SRAM. Instructions may also be fetch on this bus

(less efficient than ICode). The targets of this bus are the 112 KB & 16 KB internal SRAMs,

the AHB1 peripherals including the APB peripherals, the AHB2 peripherals and the external

memories through the FSMC.

 

То есть, можно команды выбирать откуда хочешь!? :rolleyes:

post-10362-1424775067_thumb.jpg

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


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

Что-то не выходит у меня запустить скомпилированную со сдвигом программу.

Сделал загрузчик, пока только переход на основную программу. Занял нулевой сектор.

В основном проекте задал в Кейле в свойствах проекта начало ПЗУ 0x8004000, размер 0x3C000 (отобрал нулевой сектор для загрузчика), соответственно задал и диапазон для Flash Download. Скомпилировал, зашил. Вижу в ST-Link Utility свое зашитое. Могу и в отладчике в проекте загрузчика посмотреть память. Вроде, все как надо. Но основной проект не работает. Предполагаю, в загрузчике дело. Что-то не так. Вот фрагмент, переход.

/* Если есть SP для приложения */
  if (((*(__IO uint32_t *)APPL_ADDR) & 0x2FFE0000) == 0x20000000) {
/* Адрес таблицы */
    SCB->VTOR = 0x08004000; 
    // NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);
/* Указатель на приложение */
    pFunc_t JumpAppl = (pFunc_t)(*(__IO uint32_t *)(APPL_ADDR + 4));
    __set_MSP(*(__IO uint32_t *)APPL_ADDR);
    JumpAppl();
  }
  while (true);
}

 

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


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

Но основной проект не работает. Предполагаю, в загрузчике дело. Что-то не так.

NVIC_SetVectorTable() в загрузчике не особо нужен.

Это надо в самой запущенной программе сделать, потому что по умолчанию в SystemInit() регистр SCB->VTOR устанавливается на начало флеша.

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


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

NVIC_SetVectorTable() в загрузчике не особо нужен.

Это надо в самой запущенной программе сделать, потому что по умолчанию в SystemInit() регистр SCB->VTOR устанавливается на начало флеша.

Это я из примеров выше в теме (или подобных) вытянул. Не использую, такой функции в CMSIS и нет. А SystemInit у меня своя, и ничего с VTOR не делает.

Плохо, в отладчике оба проекта не видны. Дохожу в загрузчике до JumpAppl() и улетаю незнамо куда, в 0xBFFFXXXX.

 

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


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

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

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

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

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

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

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

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

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

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