реклама на сайте
подробности

 
 
> Данные в FLASH, Вопрос по Keil
IEC
сообщение Dec 28 2006, 13:03
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598



Люди! Хелп!
Раскажите, как выделить кусок памяти в FLASH в С среды Keil под переменные?
В IARе для AVR это выглядело так
int __flash m[200];

А как это делается в арме? cranky.gif
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 16)
aaarrr
сообщение Dec 28 2006, 13:28
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Или определять секции и писать скрипт для линкера.
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Dec 28 2006, 13:45
Сообщение #3


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



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

А компилятор разве потом разрешит менять m[200]???? Если она const
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 28 2006, 13:49
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Нет, разумеется. А как он может модифицировать флеш память, о которой ему ничего не известно?
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Dec 28 2006, 13:52
Сообщение #5


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



А вопрос был
Цитата
Раскажите, как выделить кусок памяти в FLASH в С среды Keil под переменные?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 28 2006, 13:58
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(jorikdima @ Dec 28 2006, 13:52) *
А вопрос был
Цитата

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


А Вам известно, что переменные бывают константными?
Go to the top of the page
 
+Quote Post
IEC
сообщение Dec 28 2006, 15:05
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598



Просто хотелось бы выделить несколько страниц памяти, а потом ее изменять. Но что_бы компилятор контролировал наползание кода!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 28 2006, 15:10
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Так выделить надо под константы? Или программно менять планируете?
Go to the top of the page
 
+Quote Post
IEC
сообщение Dec 28 2006, 15:28
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598



Менять! Обязательно менять!
Изменение будет производиться постраничной записью.
Но проблема в том, как компилятору сообщить о занятости куска памяти?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Dec 28 2006, 15:36
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(IEC @ Dec 28 2006, 15:28) *
Но проблема в том, как компилятору сообщить о занятости куска памяти?

Создать свою секцию данных, нужные данные направить туда соответствующей #pragm'ой и написать скрипт для линкера, где указать физическое положение и размер секции.
Go to the top of the page
 
+Quote Post
IEC
сообщение Jan 2 2007, 12:15
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598



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

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

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


Спасибо! Совет наверное класный! Если можно, пожалуйста, вариант реализации. wub.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 2 2007, 12:46
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(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.
Go to the top of the page
 
+Quote Post
IEC
сообщение Jan 5 2007, 14:21
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598



Большое спасибо! Попробую реализовать!
Go to the top of the page
 
+Quote Post
OlegHmt
сообщение Jan 13 2007, 18:06
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 70
Регистрация: 5-12-06
Пользователь №: 23 146



Если можно, подскажите, пожалуйста, как такая же задача должна решаться в Rowley CrossWorks
Go to the top of the page
 
+Quote Post
boez
сообщение Jan 15 2007, 11:36
Сообщение #15


Частый гость
**

Группа: Новичок
Сообщений: 79
Регистрация: 1-11-06
Пользователь №: 21 868



В кроссворксе гнутый компилятор. У него размещение по секциям делается директивой
__attribute__ ((section("section-name")))
В хелпе правда написано что это годится только для инициализированных переменных, но это вроде бы обходится атрибутом nocommon
Go to the top of the page
 
+Quote Post
boez
сообщение Jan 15 2007, 12:56
Сообщение #16


Частый гость
**

Группа: Новичок
Сообщений: 79
Регистрация: 1-11-06
Пользователь №: 21 868



Да, а добавить секцию в кроссворксе оказывается совсем просто - там древовидная приблуда есть для этого - редактор плейсмент файла, а чтоб можно было править плейсмент файл - жмем правой кнопкой на корне дерева проекта - и там Import Section Placement (это в 1.6b3)
Go to the top of the page
 
+Quote Post
OlegHmt
сообщение Jan 15 2007, 14:29
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 70
Регистрация: 5-12-06
Пользователь №: 23 146



На выходных я более-менее разобрался и запустил код. Не знаю полностью ли коректно, но заработало. Вот описаное того, что я сделал (процесор AT91SAM7X256):
1. Упомянутой приблудой добавил секцию на заданую страницу после других секций, по аналогии с существующими секциями;
2. Объявил нужные мне переменные записав атрибутом имя добавленой секции и задав им начальные значения;
Не знаю поможет ли атрибут nocommon но тогда переменные нормально читались, но записать в них ничего я не смог. Поэтому:
3. Добавил код записи страницы памяти согласно даташиту на процесор. То-есть по имени первой объявленной переменной я получил адрес страницы памяти, записал туда последовательность 32-битных данных и дал команду на запись этой страницы.

Небольшая особенность - код записи страницы в память я запихивал в SRAM (остальной код записан на Flash), потому что если код находился на флеше, то система подвисала после добирания до этого места, но вот не помню производилась ли при этом запись или нет.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 21:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01502 секунд с 7
ELECTRONIX ©2004-2016