|
|
  |
Keil: Размещение массива обьявленного квалификатором 'const' |
|
|
|
Jun 3 2014, 07:53
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Интересует под Keil где описывается правило размещения данных или массива данных обьявленных как const. Размещаются ли они в ОЗУ или в памяти программ ? Например: Код const u8 CodeKey[12]={1,4,7,11,2,5,8,10,3,6,9,12};
|
|
|
|
|
Jun 3 2014, 08:32
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 13-09-12
Пользователь №: 73 530

|
Если используется скрипт компоновщика (linker), то это задается в нем. Если скрипты явно не используются, то либо это настраивается через параметры командной строки компоновщика, либо Keil сам втихую генерирует скрипт на основе настроек проекта и втихую передает компоновщику, я точно не помню. В общем все упирается в компоновщик и настройку расположения секции, в которую помещаются константные данные (не помню в какую).
Сообщение отредактировал menzoda - Jun 3 2014, 08:33
|
|
|
|
|
Jun 3 2014, 08:52
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 13-09-12
Пользователь №: 73 530

|
Цитата(MaxiMuz @ Jun 3 2014, 16:03)  Размещаются ли они в ОЗУ или в памяти программ ? Добавлю, что по идее данные размещаются в памяти программ, а во время исполнения копируются в ОЗУ и дальнейшая работа происходит именно с копией массива в ОЗУ.
|
|
|
|
|
Jun 3 2014, 08:59
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(MaxiMuz @ Jun 3 2014, 16:03)  Интересует под Keil где описывается правило размещения данных или массива данных обьявленных как const. Размещаются ли они в ОЗУ или в памяти программ ? Например: Код const u8 CodeKey[12]={1,4,7,11,2,5,8,10,3,6,9,12}; расположится во флеш. Можно проверить, посмотрев .map-файл Цитата(menzoda @ Jun 3 2014, 17:02)  Добавлю, что по идее данные размещаются в памяти программ, а во время исполнения копируются в ОЗУ и дальнейшая работа происходит именно с копией массива в ОЗУ. это если не объявлено const и содержимое массива можно изменять
|
|
|
|
|
Jun 3 2014, 10:26
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 13-09-12
Пользователь №: 73 530

|
Цитата(toweroff @ Jun 3 2014, 17:09)  это если не объявлено const и содержимое массива можно изменять Да, действительно.
|
|
|
|
|
Jun 4 2014, 04:43
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(MaxiMuz @ Jun 4 2014, 11:55)  Вывод: независимо от квалификатора const массив адресуется из флеш-памяти. А Вы в своем коде значение ячеек массива изменяете? И выводы делаете по map файлу?
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Jun 4 2014, 05:29
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Цитата(Lotor @ Jun 4 2014, 11:53)  А Вы в своем коде значение ячеек массива изменяете? И выводы делаете по map файлу? Значение ячеек не меняю и вывод делаю по : Цитата Program Size: Code=4372 RO-data=320 RW-data=72 ZI-data=1776 размеры областей не мяняются
|
|
|
|
|
Jun 4 2014, 06:45
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(MaxiMuz @ Jun 4 2014, 13:39)  Значение ячеек не меняю Если не использовать массив, то компилятор проявит смекалку и "соптимизирует" его помножив на ноль. Поэтому и советую (не только я) Вам делать выводы по map файлу.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Jun 4 2014, 06:47
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
в общем так. Код const unsigned char __test[] = { 0xC2, 0x47, 0x05, 0x31, 0x21, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x00, 0x02, 0x07, 0x6F, 0x00, 0x03, 0x00, 0x33, 0x02, 0x09, 0xCC, 0x00, 0x03, 0x00, 0x43, 0x02, 0x06, 0x00, 0x00, 0x03, 0x00, 0x53, 0x02, 0x06, 0x00, 0x03, 0xFF, 0x00, 0x80, 0x90, 0xE6, 0xB9, 0xE0, 0x70, 0x03, 0x02, 0x01, 0x5C, 0x14, 0x70, 0x03, 0x02, 0x02, 0x05, 0x24, 0xFE, 0x70, 0x03, 0x02, 0x02, 0x9D, 0x24, 0xFB, 0x70, 0x03, 0x02, 0x01, 0x56, 0x14, 0x70, 0x03, 0x02, 0x01, 0x50, 0x14, 0x70, 0x03, 0x02, 0x01, 0x44, 0x14, 0x70, 0x03, 0x02, 0x01, 0x4A, 0x24, 0x05, 0x60, 0x03, 0x02, 0x03, 0x0E, 0x12, 0x09, 0xD5, 0x40, 0x03, 0x02, 0x03, 0x1A, 0x90, 0xE6, 0xBB, 0xE0, 0x24, 0xFE, 0x60, 0x2C, 0x14, 0x60, 0x47, 0x24, 0xFD, 0x60, 0x16, 0x14, 0x60, 0x31, 0x24, 0x06, 0x70, 0x66, 0xE5, 0x23, 0x90, 0xE6 }; Сейчас проверил - даже если массив глобальный, но к нему нет обращения, компилятор его просто выбрасывает, о чем честно говорит в map-файле: Код Removing start.o(.constdata), (128 bytes) Код Program Size: Code=19456 RO-data=1456 RW-data=180 ZI-data=7132 Если же я явно указываю место размещения, компилятору уже некуда деваться и он просто обязан разместить массив во флэш: Код const unsigned char __test[] __at(0x00007000) = { ... mapКод __test 0x00007000 Data 128 start.o(.ARM.__AT_0x00007000) результат Код Program Size: Code=19456 RO-data=9344 RW-data=180 ZI-data=7132
|
|
|
|
|
Jun 4 2014, 09:20
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
Цитата(Lotor @ Jun 4 2014, 13:55)  Если не использовать массив, то компилятор проявит смекалку и "соптимизирует" его помножив на ноль. Поэтому и советую (не только я) Вам делать выводы по map файлу. Обьявлял массив в прерывании , и там же читал из него в глобальную volatile-переменную , которая использовалась в main-е. При этом в map файле упоминания массива я не нашел. Потом, переместил массив в обл.глобальных переменных, RO увеличилось на несколько единиц, но в map-файле указание на область data - это значит область данных ? Код CodeKey 0x0800125e Data 12 Цитата(MaxiMuz @ Jun 4 2014, 16:20)  но в map-файле указание на область data - это значит область данных ? А, понял! адрес 0x0800125e - область кода. Как только убираю const , переменная перемещается в SRAM
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|