Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/208: Рейтинг темы: голосов - 208, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 30

Адресация памяти, помогите разобраться

02.08.2013, 00:06. Показов 39685. Ответов 44
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется контроллер STM32F100RB. Исходя из рисунка видно, что у нас имеется 4Гб, к которым мы можем обратиться.

<Изображение удалено>
Может быть это глупые вопросы, но:
1) В даташите указано
Memories
– 16 to 128 Kbytes of Ftosh memory
– 4 to 8 Kbytes of SROM
С какого по какой адрес каждая из этих памятей?
2) 1Gb внешних устройств. Как это используется, если у микросхемы нет 8*1024*1024*1024 ножек? Как вообще понимать 1Gb external divises?
Помогите разобраться, знатоки) Перелопатил много, ответа не нашел.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.08.2013, 00:06
Ответы с готовыми решениями:

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

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

Распределение и адресация памяти
Доброго времени суток. Уважаемые гуру и ассемблеристы , требуется подсказка начинающему программисту. Вопрос заключается в следующем: Есть...

44
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 30
04.08.2013, 19:50
Студворк — интернет-сервис помощи студентам
Пришла плата, моргнул диодиком. Использую CoIDE. Смотрю в дебаггере, программа начинается с адреса 0х080002F0. Мне казалось, что программа должна идти сразу с 0x08000000. Я использую библиотеки GPIO, полагаю что там обозначены какие-нибудь константы, которые встают с самого начала, т.е с 0x08000000. Попытался создать пустой проект, где только main.c со следующим содержанием:
Code
1
2
3
4
int main(void)
{
int i=0;
}
Так вот среда на это мне пишет, что пустой файл .elf, прошивать не буду. Поясните, что пихает coIDE в адрес с 0x08000000 до 0х080002EF?
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
04.08.2013, 19:57
Цитата Сообщение от buffoto
Поясните, что пихает coIDE в адрес с 0x08000000 до 0х080002EF?
Не только CoIDE, а любой ARM-компилятор в начало исполняемого image ставит заголовок (значение указателя стека, адрес старта программы). Потом, кроме пользовательской программы (main() и т.п.), процессору ещё нужны векторы прерываний/исключений, данные в ROM, а также (обязательно!) стартапный код.
Почитайте .map-файл, сгенерированный при компиляции проекта - увидите, по какому адресу что находится.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
04.08.2013, 20:00
Цитата Сообщение от buffoto
Попытался создать пустой проект, где только main.c со следующим содержанием:
Код:
int main(void)
{
int i=0;
}
Так вот среда на это мне пишет, что пустой файл .elf, прошивать не буду.Правильно пишет :-) Ещё, небось, и warning выкатывает про инициализированную-но-неиспользованную переменную.
Проект не делает никаких действий, и оптимизация в настройках проекта, возможно, включена. Попробуйте добавить слово volatile перед "int i=0;" - тогда, может быть, проект станет непустым.
0
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 30
04.08.2013, 20:16
Да, добави это волшебное слово, приказав компилятору не оптимизировать неиспользуемую переменную. Усложнил код:
Code
1
2
3
4
5
int main(void)
{
volatile int i=0;
i++;
}
Проект компилируется, в консоль пишет:
Code
1
2
3
Prokram Size:
text      data       bss       dec       hex   filename
0         0         0         0         0   empty_project.elf
При попытке прошить пишет:
Error: elf file missing sector info

Файл .hex содержит:
:0400000508000000EF
:00000001FF
(тут я не сильно понимаю, что это за формат такой, откуда двоеточия?)

ST-Link Utility пишет недопустимый аргумент при попытке открыть этот файл с прошивкой.

Вопрос - что ему не хватает? Что я делаю не так?
0
hosh
04.08.2013, 20:26
Цитата Сообщение от buffoto
...
Файл .hex содержит:
:0400000508000000EF
:00000001FF
(тут я не сильно понимаю, что это за формат такой, откуда двоеточия?)
Описание формата Intel Hex

А какой результат вернет такая функция?
Code
1
2
3
4
int main(void)
{
int i=0;
}
И будет ли проект не пустым если:
Code
1
2
3
4
5
int main(void)
{
int i=0;
return 1;
}
Извините если вопрос немного не по теме
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 30
04.08.2013, 20:29
Точно, нужно вернуть что-то) Странно, что компилятор не ругнулся на это. Но даже при
Code
1
2
3
4
5
6
7
int main(void)
{
volatile int i=0;
i++;
 
return 0;
}
ситуация не меняется
0
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
04.08.2013, 20:30
buffoto, у Вас в проекте стартовый код есть?
Файл типа этого - stortup_stm32f4xx.c. Я привожу пример для F4, но родственный файл должен быть и для F1.
Это раздел cmsis_boot/stortup.
И пока Вы не получите размер кода отличный от нуля, шить и не пытайтесь.
0
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 30
04.08.2013, 20:45
Цитата Сообщение от hd44780
buffoto, у Вас в проекте стартовый код есть?
Файл типа этого - stortup_stm32f4xx.c. Я привожу пример для F4, но родственный файл должен быть и для F1.
Это раздел cmsis_boot/stortup.
И пока Вы не получите размер кода отличный от нуля, шить и не пытайтесь.
Не, не было. Теперь я понял,в чем причина. Буду искать теперь, какой именно код они создают. Проект теперь не пустой.
0
hosh
04.08.2013, 20:50
угу! я чего-то сразу не обратил внимания, пока stortup не добавишь , что не пиши код будет 0 !
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
04.08.2013, 23:11
Несколькими постами выше:
Цитата Сообщение от OtyxPM
кроме пользовательской программы (main() и т.п.), процессору ещё нужны векторы прерываний/исключений, данные в ROM, а также (обязательно!) стартапный код.
Я-то, ниивный, думал, что свою тему ТС читает :-)
0
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 30
04.08.2013, 23:18
Пардон, не заметил) Прочитал только последенее
0
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 30
04.08.2013, 23:51
Будьте добры, подскажите, где лучше всего написано про стартап код? Вообще требования, что обязательно должно быть там. Смотрю я библиотеку и что-то не особо понимаю. В референс мануале не особо про это.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
05.08.2013, 01:26
Цитата Сообщение от buffoto
Будьте добры, подскажите, где лучше всего написано про стартап код? Вообще требования, что обязательно должно быть там. Смотрю я библиотеку и что-то не особо понимаю. В референс мануале не особо про это.
Пока не забивайте себе голову тем, чтО и кАк в этом файле сделано. Просто разыщите его где-то в Кокосных папках (название - как hd44780 сказал) и включите в свой проект. Чтобы этот файл компилировался вместе с сишными файлами Вашей программы.
Или так: откройте любой готовый проект для Вашего МК (в Кокосе есть же примеры проектов?), найдите стартап-файл в составе этого проекта. Скопируйте то же самое в любой новый проект. В стартапе редко что меняют, чаще всего одна и та же копия мигрирует между многими проектами одного МК.

P.S. Вы в Си начинающий? Просто к сведению: stort-up код - это не особенность программ для микроконтроллеров, он генерируется для любой программы на Си/Си++. Даже если на Borlomd C++ Builder написать или на Microsoft Visual C - при компиляции проекта сгенерируется и stort-up.
0
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 30
05.08.2013, 02:12
Цитата Сообщение от OtyxPM
Цитата Сообщение от buffoto
Будьте добры, подскажите, где лучше всего написано про стартап код? Вообще требования, что обязательно должно быть там. Смотрю я библиотеку и что-то не особо понимаю. В референс мануале не особо про это.
Пока не забивайте себе голову тем, чтО и кАк в этом файле сделано. Просто разыщите его где-то в Кокосных папках (название - как hd44780 сказал) и включите в свой проект. Чтобы этот файл компилировался вместе с сишными файлами Вашей программы.
Или так: откройте любой готовый проект для Вашего МК (в Кокосе есть же примеры проектов?), найдите стартап-файл в составе этого проекта. Скопируйте то же самое в любой новый проект. В стартапе редко что меняют, чаще всего одна и та же копия мигрирует между многими проектами одного МК.

P.S. Вы в Си начинающий? Просто к сведению: stort-up код - это не особенность программ для микроконтроллеров, он генерируется для любой программы на Си/Си++. Даже если на Borlomd C++ Builder написать или на Microsoft Visual C - при компиляции проекта сгенерируется и stort-up.

Да, вы правы. Пока буду воспринимать файл stortup_stm32f10x_md_vl.c и все с ним связанное как должное. Буду изучать как пользоваться периферией. В идеале, я хочу разобраться во всех тонкостях и возможностях хотя бы STM32F100RB, где какой регистр для настройки чего-либо и тп.

Насчет си. На генерацию стартапа я не обращал внимания, не ковырял экзешники. Второй момент, пытаясь разобраться с библиотекой, след конструкция повергла меня в шок:
Code
1
2
3
4
5
6
7
8
9
void (* const g_pfnVectors[])(void) =
{
/*----------Core Exceptions-------------------------------------------------*/
(void *)&pulStack[STACK_SIZE],     /*!< The initial stack pointer         */
Riset_Homdler,                /*!< Riset Homdler                            */
NMI_Homdler,                  /*!< NMI Homdler                              */
HordFault_Homdler,
...
}
Я задал себе вопрос, что это? Не смог ответить... Понятно что инициализация каких-то обработчиков прерываний, но что это за сишная структура и как это будет выглядеть в памяти после компиляции - тайна за семью печатями.

Нашел блог человека, который немного затронул тему инициализации, буду изучать http://zibtog.ru/

Вообще я думал, что в мире микроконтроллеров можно писать на ассеблере прямо с 0х00000000, знать настройки портов I/O и больше ни о чем не думать. Я ошибался.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
05.08.2013, 02:47
Цитата Сообщение от buffoto
след конструкция повергла меня в шок:
Код:
void (* const g_pfnVectors[])(void) =
{
/*----------Core Exceptions-------------------------------------------------*/
(void *)&pulStack[STACK_SIZE], /*!< The initial stack pointer */
Riset_Homdler, /*!< Riset Homdler */
NMI_Homdler, /*!< NMI Homdler */
HordFault_Homdler,
...
}

Я задал себе вопрос, что это? Не смог ответить... Понятно что инициализация каких-то обработчиков прерываний, но что это за сишная структура и как это будет выглядеть в памяти после компиляции - тайна за семью печатями.Это массив указателей на функции (конкретно здесь - обработчики векторов прерываний/исключений). Имя функции, как и имя массива, эквивалентно её/его адресу в памяти. После компиляции в памяти увидите (хотя бы отладчиком - посмотрите) последовательность таких адресов. Сравните с адресами, выведенными в .map-файл - всё совпадёт.
0
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 176
06.08.2013, 15:50
В трансляторе это более понятно, например FASM.
thumb ;у процессоров cortexM3 только thumb
org 08000000h ;флеш память начинается с 0x8000000
dw 20002000h ;Вершина стека, зависит от размера ОЗУ 8Кб
dw _Riset+1 ;Вектор сброса

_Riset:
movw r1, 0x1018 ;адрес RCC_APB2ENR 0x40021018
movt r1,0x4002
ldrb r0,[r1]
orr r0,10100b ;включаем порт C, A на шине APB2
strb r0,[r1]
@@:
b @b
0
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 30
07.08.2013, 14:02
Я совсем запутался. Когда я выбрал в coIDE свой контроллер, он в настройках проекта написал (смотри ричунок)
IROM1 0x08000000, SIZE 0x00020000
IROM 0x20000000, SIZE 0x00002000
С этим понятно, среда указала где какая память у конкретного контроллера.

Дальше. Код:
Code
1
2
3
4
5
6
7
8
9
void (* const g_pfnVectors[])(void) =
{
/*----------Core Exceptions-------------------------------------------------*/
(void *)&pulStack[STACK_SIZE],     /*!< The initial stack pointer         */
Riset_Homdler,                /*!< Riset Homdler                            */
NMI_Homdler,                  /*!< NMI Homdler                              */
HordFault_Homdler,
...
}
Как компилятор понимает, что массив указателей на функции g_pfnVectors[] нужно записать по адресу 0х08000000? В stortup_stm32f10x_md_vl.c нет нигде, где задаваля бы принудительно адрес создаваемых нами переменных. В .map написано следующее( видно что вектора идут с адреса 0x08000000 ):
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Memory Confikurotion
 
Name             Origin             Length             Attributes
rom              0x08000000         0x00020000         xr
ram              0x20000000         0x00002000         xrw
*default*        0x00000000         0xffffffff
 
Linker ssript omd memory map
 
0x20002000                _eram = 0x20002000
 
.text           0x08000000      0x3a8
*(.isr_vector .isr_vector.*)
.isr_vector    0x08000000      0x124 ..\obj\stortup_stm32f10x_md_vl.o
0x08000000                g_pfnVectors                                                      //ВОТ ОНИ!!!
*(.text .text.* .gnu.linkonce.t.*)
Насколько я понял, после того как g_pfnVectors[] объявится, с адреса 0x0800 0000 будет записан адрес начала стека, и с адреса 0х0800 0004 пойдут адреса переходов, куда должна будет перейти программа в случае прерывания.

Тут же встает еще вопрос: откуда процессор знает что в ячейке 0х0800 0004 будет находится адрес, куда нужно перейти в случае прерывания именно Riset_Homdler, в 0х0800 0008 будет адрес обработчика прерывания именно NMI_Homdler а не какого-нибудь другого? Предположу ответ - наверное в процессоре зашита таблита соответствий названий прерываний и адреса ячеек, где искать адрес соответствующего прерывания. Если не прав, поправьте, если прав, скажите, что я правильно понял.

Для простоты чтения выделил вопросы жирным.

0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
07.08.2013, 14:21
Цитата Сообщение от buffoto
Как компилятор понимает, что массив указателей на функции g_pfnVectors[] нужно записать по адресу 0х08000000?
.text - это т.н. секция, и она начинается с 0x08000000. В том же .mapе поищите слово "Section" - найдёте .text, .data, STACK, RESIT, .bss, возможно ещё какие-то.
Компилятор по умолчанию помещает исполняемый код в эту секцию .text .

Цитата Сообщение от buffoto
Насколько я понял, после того как g_pfnVectors[] объявится, с адреса 0x0800 0000 будет записан адрес стека, и с адреса 0х0800 0004 пойдут адреса переходов, куда должна будет перейти программа в случае прерывания.
Не совсем так :-) Сначала записано значение указателя стека. Следующее слово - стартовый адрес запуска программы. А уж потом всё-всё-всё остальное.

Цитата Сообщение от buffoto
откуда процессор знает что в ячейке 0х0800 0004 будет находится адрес, куда нужно перейти в случае прерывания именно Riset_Homdler, в 0х0800 0008 будет адрес обработчика прерывания именно NMI_Homdler а не какого-нибудь другого? Предположу ответ - наверное в процессоре зашита таблита соответствий названий прерываний и адреса ячеек, где искать адрес соответствующего прерывания.
Совершенно верно. Любой процессор использует вектора прерываний по фиксированным адресам, предопределённым архитектурой процессора. Это по умолчанию. Также есть возможность подсунуть процессору альтернативную таблицу векторов, располагающуюся по другим, недефолтным адресам. Такая вот гибкость.
0
0 / 0 / 0
Регистрация: 29.07.2013
Сообщений: 30
07.08.2013, 15:13
Цитата Сообщение от OtyxPM
.text - это т.н. секция, и она начинается с 0x08000000. В том же .mapе поищите слово "Section" - найдёте .text, .data, STACK, RESIT, .bss, возможно ещё какие-то.
Компилятор по умолчанию помещает исполняемый код в эту секцию .text .
Про это спрошу чуть позже, мне нужно подумать, прежде чем задать правильный вопрос.

Цитата Сообщение от OtyxPM
Цитата Сообщение от buffoto
Насколько я понял, после того как g_pfnVectors[] объявится, с адреса 0x0800 0000 будет записан адрес стека, и с адреса 0х0800 0004 пойдут адреса переходов, куда должна будет перейти программа в случае прерывания.
Не совсем так :-) Сначала записано значение указателя стека. Следующее слово - стартовый адрес запуска программы. А уж потом всё-всё-всё остальное.

Я поковырялся, вышло так, что первое !двойное слово! адрес вершины стека, дальше !двойное слово! адрес обработчкика события "Riset", а потом адреса остальных обработчиков. А вот в обработчике в самом конце содержится безусловный переход на main(), т.е на программу, которую пишу я.




Только есть несовпадение - в памяти адрес обработчика 0х08000125 а в дизасемблере 0х08000124 (см рисунки). как так?
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
07.08.2013, 16:34
Цитата Сообщение от buffoto
Я поковырялся, вышло так, что первое !двойное слово! адрес вершины стека, дальше !двойное слово! адрес обработчкика события "Riset"
Просто в Вашей конкретной программе стартовый адрес исполняемого кода совпадает с обработчиком вектора Riset. В общем случае они могут и не совпадать!

Цитата Сообщение от buffoto
Только есть несовпадение - в памяти адрес обработчика 0х08000125 а в дизасемблере 0х08000124 (см рисунки). как так?
ARM компилятор помечает Thumb-код добавлением единички к адресу. На самом деле адрес в процессоре чётный.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.08.2013, 16:34

Сегментная адресация памяти
Здравствуйте, читаю небольшой материал про процессор 8086 и появившийся в нем режим сегментации памяти. Хотел бы задать несколько...

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

Адресация памяти в AT24C512C-SSHD-T
Добрый день. Не могу понять, как организована память в чипе памяти AT24C512C-SSHD-T http://lib.chipdip.ru/079/DOC001079070.pdf - вот...

Массивы, адресация, дин. исп памяти
Задача:Заданы два массива А(5) и В(5). Подсчитать в них количество положительных элементов и первым на печать вывести массив, имеющий...

Прямая адресация к памяти. Использование подпрограмм
Определите подпрограмму для вывода на экран двойного слова в шестнадцатеричном виде и подпрограмму для вывода на экран двойного слова в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru