Darth Vader 0 16 апреля, 2020 Опубликовано 16 апреля, 2020 · Жалоба Облазил книжку Дж. Ю по ядру 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 16 апреля, 2020 Опубликовано 16 апреля, 2020 · Жалоба Так ведь 0х08000000 - это и есть нулевой адрес программной память. Разве нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 16 апреля, 2020 Опубликовано 16 апреля, 2020 · Жалоба 54 минуты назад, Darth Vader сказал: Вопрос: каким образом ядро обращается к моей таблице векторов, расположенной по адресу 0х08000000, если согласно документации оно должно работать с таблицей, расположенной по адресу 0х00000000? Ядро не обращается по адресу 0x08000000. При штатной загрузке CPU адресное пространство, начиная с 0x08000000 отображается на адрес 0x00000000. Т.е., процессору не требуется знать, по какому реально физическому адресу находится Flash-память. Он стартует всегда с 0x00000000. А в силу того, что на этот адрес отображено содержимое памяти с адреса 0x08000000...(вся Flash), фактически, по "нулевым" адресам ляжет и таблица векторов. P.S. Например, в том же STM32, выбор области, отображаемой в "нулевые" адреса, управляется BOOTn-выводами (аппаратно при старте МК). И программно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 17 апреля, 2020 Опубликовано 17 апреля, 2020 · Жалоба 5 hours ago, Arlleex said: Он стартует всегда с 0x00000000. OFF: это же std::nullptr! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 17 апреля, 2020 Опубликовано 17 апреля, 2020 (изменено) · Жалоба 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. Про размер отображаемой области не уточняется: вся флеш или не вся, а только начало. Изменено 17 апреля, 2020 пользователем Darth Vader Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 17 апреля, 2020 Опубликовано 17 апреля, 2020 · Жалоба 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-битного адресного пространства МК? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 17 апреля, 2020 Опубликовано 17 апреля, 2020 · Жалоба 4 часа назад, Darth Vader сказал: Про размер отображаемой области не уточняется: вся флеш или не вся, а только начало. RM0316, стр. 54 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 Четко написано что, сколько и куда отображается 4 часа назад, Darth Vader сказал: Вот я тоже это поедположил и хотел найти подтверждение или просто описание процесса в официальной документации на ядро. И не смог. Выходит, что это вендорозавистмая часть? Да. С чего ей быть в документации на ядро? В документации на ядро есть фиксированная карта памяти. И в этой карте памяти четко обозначена граница Flash. Это весь диапазон 0x00000000-0x1FFFFFFFF. Производителю МК всего лишь нужно расположить Flash где-то в этом адресном пространстве. Но, поскольку ядро гарантирует старт с 0x00000000, вендор должен обеспечить доступ к Flash с "нуля". В STM32 Flash расположили физически по стартовому адресу 0x08000000. Соответственно, должны были (и, собственно, так и есть) позаботиться об отображении этих адресов на 0x00000000. В других МК может быть по-разному. В том же XMC4, например, одна и та же Flash-память видна из двух адресных диапазонов: кэшируемого и некэшируемого. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
misyachniy 0 18 апреля, 2020 Опубликовано 18 апреля, 2020 · Жалоба 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 это начальное значение стека. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 18 апреля, 2020 Опубликовано 18 апреля, 2020 · Жалоба 2 часа назад, misyachniy сказал: То есть хранится не адрес, а смещение от начала flash. Где в процитированном вами тексте такое сказано? Хранится именно адрес. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
misyachniy 0 18 апреля, 2020 Опубликовано 18 апреля, 2020 · Жалоба Я прочитал Vector table OFFSET register. Перевел, как принято в английском, задом наперед - регистр смещения таблицы векторов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 18 апреля, 2020 Опубликовано 18 апреля, 2020 · Жалоба Да, OFFSET == смещение. Но от нуля, а не от начала flash :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 18 апреля, 2020 Опубликовано 18 апреля, 2020 · Жалоба 3 часа назад, misyachniy сказал: То есть хранится не адрес, а смещение от начала flash. К тому же первое слово flash это начальное значение стека. Смотрю в книгу, вижу - фигу Ни слова о том, что начальное слово 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. В инглише вообще все интересно, и, бывает, нужно понимать термин не в буквально переведенном смысле. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
misyachniy 0 18 апреля, 2020 Опубликовано 18 апреля, 2020 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 18 апреля, 2020 Опубликовано 18 апреля, 2020 · Жалоба 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 в данном случае). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
misyachniy 0 18 апреля, 2020 Опубликовано 18 апреля, 2020 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться