|
Данные в FLASH, Вопрос по Keil |
|
|
|
Dec 28 2006, 13:03
|
Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598

|
Люди! Хелп! Раскажите, как выделить кусок памяти в FLASH в С среды Keil под переменные? В IARе для AVR это выглядело так int __flash m[200]; А как это делается в арме?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 16)
|
Dec 28 2006, 13:58
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(jorikdima @ Dec 28 2006, 13:52)  А вопрос был Цитата Раскажите, как выделить кусок памяти в FLASH в С среды Keil под переменные?
А Вам известно, что переменные бывают константными?
|
|
|
|
|
Jan 2 2007, 12:15
|
Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598

|
Цитата(aaarrr @ Dec 28 2006, 15:36)  Цитата(IEC @ Dec 28 2006, 15:28)  Но проблема в том, как компилятору сообщить о занятости куска памяти?
Создать свою секцию данных, нужные данные направить туда соответствующей #pragm'ой и написать скрипт для линкера, где указать физическое положение и размер секции. Спасибо! Совет наверное класный! Если можно, пожалуйста, вариант реализации.
|
|
|
|
|
Jan 2 2007, 12:46
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(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.
|
|
|
|
|
Jan 13 2007, 18:06
|
Участник

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

|
Если можно, подскажите, пожалуйста, как такая же задача должна решаться в Rowley CrossWorks
|
|
|
|
|
Jan 15 2007, 14:29
|
Участник

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

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