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

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

02.08.2013, 00:06. Показов 39539. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru