Полная версия этой страницы:
Данные в FLASH
Люди! Хелп!
Раскажите, как выделить кусок памяти в FLASH в С среды Keil под переменные?
В IARе для AVR это выглядело так
int __flash m[200];
А как это делается в арме?
aaarrr
Dec 28 2006, 13:28
По-идее, должно хватить const int m[200]; - линкер разместит RO-данные там, где надо.
Или определять секции и писать скрипт для линкера.
jorikdima
Dec 28 2006, 13:45
Цитата(aaarrr @ Dec 28 2006, 13:28)

По-идее, должно хватить const int m[200]; - линкер разместит RO-данные там, где надо.
А компилятор разве потом разрешит менять m[200]???? Если она const
aaarrr
Dec 28 2006, 13:49
Цитата(jorikdima @ Dec 28 2006, 13:45)

А компилятор разве потом разрешит менять m[200]???? Если она const
Нет, разумеется. А как он может модифицировать флеш память, о которой ему ничего не известно?
jorikdima
Dec 28 2006, 13:52
А вопрос был
Цитата
Раскажите, как выделить кусок памяти в FLASH в С среды Keil под переменные?
aaarrr
Dec 28 2006, 13:58
Цитата(jorikdima @ Dec 28 2006, 13:52)

А вопрос был
Цитата
Раскажите, как выделить кусок памяти в FLASH в С среды Keil под переменные?
А Вам известно, что переменные бывают
константными?
Просто хотелось бы выделить несколько страниц памяти, а потом ее изменять. Но что_бы компилятор контролировал наползание кода!
aaarrr
Dec 28 2006, 15:10
Цитата(IEC @ Dec 28 2006, 15:05)

Просто хотелось бы выделить несколько страниц памяти, а потом ее изменять. Но что_бы компилятор контролировал наползание кода!
Так выделить надо под константы? Или программно менять планируете?
Менять! Обязательно менять!
Изменение будет производиться постраничной записью.
Но проблема в том, как компилятору сообщить о занятости куска памяти?
aaarrr
Dec 28 2006, 15:36
Цитата(IEC @ Dec 28 2006, 15:28)

Но проблема в том, как компилятору сообщить о занятости куска памяти?
Создать свою секцию данных, нужные данные направить туда соответствующей #pragm'ой и написать скрипт для линкера, где указать физическое положение и размер секции.
Цитата(aaarrr @ Dec 28 2006, 15:36)

Цитата(IEC @ Dec 28 2006, 15:28)

Но проблема в том, как компилятору сообщить о занятости куска памяти?
Создать свою секцию данных, нужные данные направить туда соответствующей #pragm'ой и написать скрипт для линкера, где указать физическое положение и размер секции.
Спасибо! Совет наверное класный! Если можно, пожалуйста, вариант реализации.
Цитата(IEC @ Jan 2 2007, 12:15)

Спасибо! Совет наверное класный! Если можно, пожалуйста, вариант реализации.

Для RVCT:
Объявление блока данных:
Код
#pragma arm section rodata = "my_data"
const int m[200] = {0x01, 0x02, 0x03, 0x04};
#pragma arm section rodata
Скрипт линкера:
Код
FLASH 0x00000000 0x00010000
{
FLASH 0x00000000 0x0000f000
{
start.o (startup, +First)
* (+RO)
}
FLASH1 0x0000f000 FIXED 0x00001000
{
* (my_data)
}
RAM 0x00200000 0x00004000
{
* (+RW, +ZI)
}
}
Данные секции my_data всегда будут размещаться по адресу 0x0000f000.
Большое спасибо! Попробую реализовать!
OlegHmt
Jan 13 2007, 18:06
Если можно, подскажите, пожалуйста, как такая же задача должна решаться в Rowley CrossWorks
В кроссворксе гнутый компилятор. У него размещение по секциям делается директивой
__attribute__ ((section("section-name")))
В хелпе правда написано что это годится только для инициализированных переменных, но это вроде бы обходится атрибутом nocommon
Да, а добавить секцию в кроссворксе оказывается совсем просто - там древовидная приблуда есть для этого - редактор плейсмент файла, а чтоб можно было править плейсмент файл - жмем правой кнопкой на корне дерева проекта - и там Import Section Placement (это в 1.6b3)
OlegHmt
Jan 15 2007, 14:29
На выходных я более-менее разобрался и запустил код. Не знаю полностью ли коректно, но заработало. Вот описаное того, что я сделал (процесор AT91SAM7X256):
1. Упомянутой приблудой добавил секцию на заданую страницу после других секций, по аналогии с существующими секциями;
2. Объявил нужные мне переменные записав атрибутом имя добавленой секции и задав им начальные значения;
Не знаю поможет ли атрибут nocommon но тогда переменные нормально читались, но записать в них ничего я не смог. Поэтому:
3. Добавил код записи страницы памяти согласно даташиту на процесор. То-есть по имени первой объявленной переменной я получил адрес страницы памяти, записал туда последовательность 32-битных данных и дал команду на запись этой страницы.
Небольшая особенность - код записи страницы в память я запихивал в SRAM (остальной код записан на Flash), потому что если код находился на флеше, то система подвисала после добирания до этого места, но вот не помню производилась ли при этом запись или нет.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.