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

Связь значения VTOR и адреса размещения таблицы векторов в Cortex-M3

Облазил книжку Дж. Ю по ядру Cortex-M3 и документ "Cortex-M3 devices generic user guide" от ARM и не нашел ответа.

Имеем из указанных книжек:

1. После системного сброса таблица векторов располагается по адресу 0х00000000

2. Значение регистра VTOR показывает смещение базового адреса таблицы векторов относительно адреса 0х00000000

3. Значение регистра VTOR после сброса 0х00000000

Имеем на практике

1. Микроконтроллер с ядром Cortex-M3. Область флеш-памяти начинается с адреса 0х08000000, область статического ОЗУ с адреса 0х20000000

2. Программа для него написана так, что таблица векторов располагается с адреса 0х08000000. Это видно и в map-файле.

Что непонятно

После сброса в VTOR лежит 0х00000000 - вижу в отладчике и это соответствует документации. Вижу свою таблицу векторов в отладчике с адреса 0х08000000.

Вопрос: каким образом ядро обращается к моей таблице векторов, расположенной по адресу 0х08000000, если согласно документации оно должно работать с таблицей, расположенной по адресу 0х00000000?

 

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


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

Так ведь 0х08000000 - это и есть нулевой адрес программной память. Разве нет?

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


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

54 минуты назад, Darth Vader сказал:

Вопрос: каким образом ядро обращается к моей таблице векторов, расположенной по адресу 0х08000000, если согласно документации оно должно работать с таблицей, расположенной по адресу 0х00000000?

Ядро не обращается по адресу 0x08000000.

При штатной загрузке CPU адресное пространство, начиная с 0x08000000 отображается на адрес 0x00000000.

Т.е., процессору не требуется знать, по какому реально физическому адресу находится Flash-память. Он стартует всегда с 0x00000000.

А в силу того, что на этот адрес отображено содержимое памяти с адреса 0x08000000...(вся Flash), фактически, по "нулевым" адресам ляжет и таблица векторов.

 

P.S. Например, в том же STM32, выбор области, отображаемой в "нулевые" адреса, управляется BOOTn-выводами (аппаратно при старте МК). И программно.

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


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

5 hours ago, Arlleex said:

Он стартует всегда с 0x00000000.

OFF: это же std::nullptr!

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


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

7 hours ago, Arlleex said:

При штатной загрузке CPU адресное пространство, начиная с 0x08000000 отображается на адрес 0x00000000.

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

Пошел искать ответ в RM на серию МК.

RM0316 от STM (первый попался под руку):

Boot from main Flash memory: the main Flash memory is aliased in the boot memory space (0x0000 0000), but still accessible from its original memory space (0x0800 0000). In other words, the Flash memory contents can be accessed starting from address 0x0000 0000 or 0x0800 0000.

Про размер отображаемой области не уточняется: вся флеш или не вся, а только начало.

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

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


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

2 часа назад, Darth Vader сказал:

Boot from main Flash memory: the main Flash memory is aliased in the boot memory space (0x0000 0000), but still accessible from its original memory space (0x0800 0000). In other words, the Flash memory contents can be accessed starting from address 0x0000 0000 or 0x0800 0000.

Про размер отображаемой области не уточняется: вся флеш или не вся, а только начало.

Вроде всё ясно - раз не указано никаких ограничений, значит их нет. Да и какой практический смысл отображать "не всю" флешь? Думаете на что-то не хватит 32-битного адресного пространства МК?  :wink:

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


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

4 часа назад, Darth Vader сказал:

Про размер отображаемой области не уточняется: вся флеш или не вся, а только начало.

RM0316, стр. 54

image.thumb.png.9f681e8788a063c356944c13baaaca6d.png

 

RM0316, стр. 62

Цитата

Boot from main Flash memory: the main Flash memory is aliased in the boot memory space (0x0000 0000),
but still accessible from its original memory space (0x0800 0000). In other words, the Flash memory contents
can be accessed starting from address 0x0000 0000 or 0x0800 0000.

 

DS9118, стр. 53

image.png.bdbb324f18af4d139a0a79d1af65fdf9.png

 

Четко написано что, сколько и куда отображается:smile:

 

4 часа назад, Darth Vader сказал:

Вот я тоже это поедположил и хотел найти подтверждение или просто описание процесса в официальной документации на ядро. И не смог. Выходит, что это вендорозавистмая часть?

Да. С чего ей быть в документации на ядро? В документации на ядро есть фиксированная карта памяти.

И в этой карте памяти четко обозначена граница Flash. Это весь диапазон 0x00000000-0x1FFFFFFFF.

Производителю МК всего лишь нужно расположить Flash где-то в этом адресном пространстве.

Но, поскольку ядро гарантирует старт с 0x00000000, вендор должен обеспечить доступ к Flash с "нуля".

В STM32 Flash расположили физически по стартовому адресу 0x08000000.

Соответственно, должны были (и, собственно, так и есть) позаботиться об отображении этих адресов на 0x00000000.

 

В других МК может быть по-разному. В том же XMC4, например, одна и та же Flash-память видна из двух адресных диапазонов: кэшируемого и некэшируемого.

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


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

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0321a/BIHHDGBC.html

4.11. Vector table configuration - Vector Table Offset Register (VTOR)

On the Cortex-M3 and Cortex-M4 processors, the location of the vector table is determined by the setting of VTOR (SCB->VTOR). This register is within the SCS and access to this register is Strongly-ordered.

То есть хранится не адрес, а смещение  от начала flash.

К тому же первое слово flash это начальное значение стека.

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


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

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

То есть хранится не адрес, а смещение  от начала flash.

Где в процитированном вами тексте такое сказано? Хранится именно адрес.

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


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

Я прочитал Vector table OFFSET register.

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

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


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

3 часа назад, misyachniy сказал:

То есть хранится не адрес, а смещение  от начала flash.

К тому же первое слово flash это начальное значение стека.

Смотрю в книгу, вижу - фигу:this:

 

Ни слова о том, что начальное слово Flash это начальное значение SP.

Может, удивлю, но начальное значение SP может быть расположено вовсе не во Flash.

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

 

ARMv7-M Architecture Reference Manual, стр. 597

Цитата

B3.2.5 Vector Table Offset Register, VTOR
The VTOR characteristics are:
Purpose                  Holds the vector table address.
Usage constraints  One or two of the high-order bits of the TBLOFF field can be implemented as RAZ/WI, 
                               reducing the supported address range. For example,if two bits are implemented as RAZ/WI, 
                               then TBLOFF[29:7] defines bits[29:7] of the address.
Configurations       Always implemented.
Attributes              See Table B3-4 on page B3-592.
An implementation can include configuration input signals that determine the reset value of  the TBLOFF field, otherwise it resets to zero.

 

Для пояснений также нужно почитать параграф B1.5.3 The vector table. Там, в общем-то, все написано.

 

P.S. В инглише вообще все интересно, и, бывает, нужно понимать термин не в буквально переведенном смысле.

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


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

14 minutes ago, AHTOXA said:

Да, OFFSET == смещение. Но от нуля, а не от начала flash :)

От нуля по Цельсию или по Фаренгейту? ;-)

https://developer.arm.com/docs/dui0553/a/cortex-m4-peripherals/system-control-block/vector-table-offset-register

Quote

 

Vector table base offset field. It contains bits[29:7] of the offset of the table base from the bottom of the memory map.

Note Bit[29] determines whether the vector table is in the code or SRAM memory region:

0 = code

1 = SRAM.

 

 

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


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

12 минут назад, misyachniy сказал:

От нуля по Цельсию или по Фаренгейту? ;-)

https://developer.arm.com/docs/dui0553/a/cortex-m4-peripherals/system-control-block/vector-table-offset-register

 

:-) Ну там прямо по вашей ссылке в самом начале:
 

Цитата

The VTOR indicates the offset of the vector table base address from memory address 0x00000000

Зачем они дальше обозвали ноль bottom-ом, не знаю, наверное, чтобы не повторяться :-)

Ну и, как правильно заметил выше коллега @Arlleex, читать нужно первоисточник (Architecture Reference Manual в данном случае).

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


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

6 minutes ago, Arlleex said:

Ни слова о том, что начальное слово Flash это начальное значение SP.

https://community.arm.com/developer/ip-products/processors/f/cortex-m-forum/6182/cortex-m3-what-happen-to-the-stack-pointer-sp-when-setting-vtor/20270#20270

Quote

The Main stack pointer is loaded from the vector table by the processor at reset time only.

https://www.sciencedirect.com/topics/engineering/reset-handler

Quote

After reset and before the processor starts executing the program, the Cortex-M processors read the first two words from the memory (Figure 4.30). The beginning of the memory space contains the vector table, and the first two words in the vector table are the initial value for the Main Stack Pointer (MSP)

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka16214.html

Quote

With uninitialized memory at address zero (for example, unprogrammed Flash or uninitialized RAM), the processor will read a spurious initial Main Stack Pointer value from address zero and a spurious code entry point (Reset vector) from address 0x4

 

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


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

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

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

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

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

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

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

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

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

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