Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Данные в FLASH
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
IEC
Люди! Хелп!
Раскажите, как выделить кусок памяти в FLASH в С среды Keil под переменные?
В IARе для AVR это выглядело так
int __flash m[200];

А как это делается в арме? cranky.gif
aaarrr
По-идее, должно хватить const int m[200]; - линкер разместит RO-данные там, где надо.

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

А компилятор разве потом разрешит менять m[200]???? Если она const
aaarrr
Цитата(jorikdima @ Dec 28 2006, 13:45) *
А компилятор разве потом разрешит менять m[200]???? Если она const

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

Раскажите, как выделить кусок памяти в FLASH в С среды Keil под переменные?


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

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

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

Но проблема в том, как компилятору сообщить о занятости куска памяти?

Создать свою секцию данных, нужные данные направить туда соответствующей #pragm'ой и написать скрипт для линкера, где указать физическое положение и размер секции.


Спасибо! Совет наверное класный! Если можно, пожалуйста, вариант реализации. wub.gif
aaarrr
Цитата(IEC @ Jan 2 2007, 12:15) *
Спасибо! Совет наверное класный! Если можно, пожалуйста, вариант реализации. wub.gif

Для 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.
IEC
Большое спасибо! Попробую реализовать!
OlegHmt
Если можно, подскажите, пожалуйста, как такая же задача должна решаться в Rowley CrossWorks
boez
В кроссворксе гнутый компилятор. У него размещение по секциям делается директивой
__attribute__ ((section("section-name")))
В хелпе правда написано что это годится только для инициализированных переменных, но это вроде бы обходится атрибутом nocommon
boez
Да, а добавить секцию в кроссворксе оказывается совсем просто - там древовидная приблуда есть для этого - редактор плейсмент файла, а чтоб можно было править плейсмент файл - жмем правой кнопкой на корне дерева проекта - и там Import Section Placement (это в 1.6b3)
OlegHmt
На выходных я более-менее разобрался и запустил код. Не знаю полностью ли коректно, но заработало. Вот описаное того, что я сделал (процесор AT91SAM7X256):
1. Упомянутой приблудой добавил секцию на заданую страницу после других секций, по аналогии с существующими секциями;
2. Объявил нужные мне переменные записав атрибутом имя добавленой секции и задав им начальные значения;
Не знаю поможет ли атрибут nocommon но тогда переменные нормально читались, но записать в них ничего я не смог. Поэтому:
3. Добавил код записи страницы памяти согласно даташиту на процесор. То-есть по имени первой объявленной переменной я получил адрес страницы памяти, записал туда последовательность 32-битных данных и дал команду на запись этой страницы.

Небольшая особенность - код записи страницы в память я запихивал в SRAM (остальной код записан на Flash), потому что если код находился на флеше, то система подвисала после добирания до этого места, но вот не помню производилась ли при этом запись или нет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.