Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
lezh1k
36 / 36 / 5
Регистрация: 03.06.2010
Сообщений: 120
1

Работа с памятью AVR C

21.03.2016, 20:40. Просмотров 1276. Ответов 3
Метки нет (Все метки)

Добрый вечер.
RTFM помогает, но как-то медленно. У меня есть таблица знакогенератора для дисплея. Занимает она 760 байт...
Выглядит это так :
C
1
PROGMEM static const uint8_t ASCII[][5]
Без директивы PROGMEM у меня программка не компиллировалась и жаловалась на недостаток памяти (хотя ее вроде 4К) . Сейчас компилируется, но я всё равно не понял почему. Вроде как это данные только для чтения и должны располагаться во флэш памяти. И я думал в секции .data.
Но на выходе компиллятора :

Program Memory Usage : 976 bytes 47,7 % Full
Data Memory Usage : 8 bytes 6,3 % Full

Эти 216 байт появляются, когда я использую еще 3 строки. Типа таких :
C
1
static const char str_hello[] PROGMEM = "    Hello";
Понятия не имею почему добавляется так много. Там этих символов 33 учитывая 0 на конце каждой строки. Может быть это просто добавляется код, который использует эти строки.

Мне нужно расположить в памяти изменяемый буфер... И , видимо, у меня это не получается сделать, потому что уже есть буфер знакогенератора?

Может кто-нибудь мне доступно объяснить где и почему располагаются данные программы ? :-D
Пишу сюда только потому, что ртфм реально медленно помогает )))
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2016, 20:40
Ответы с готовыми решениями:

Работа с памятью MCS-51
Здравствуйте. Изучаю МК MSC-51 . В процессе возник вопрос . Как записать число или массив чисел во...

Работа с памятью другого МК
У меня есть два МК С помощью одного надо прочитать память второго как это сделать? Такое вообще...

AVR, работа с RS-485
Нужно написать программу для МК AVR (какая модель будет пока не знаю), которая будет общаться с...

AVR работа с указателями
Помогите разобраться с кодом. Нужно считать строку из порта и отправить ее обратно. Отправить...

Работа с портами в AVR
Здравствуйте! Столкнулся с задачей и не знаю как реализовать, надеюсь на вашу помощь. ...

3
Voland_
1699 / 1043 / 98
Регистрация: 04.01.2010
Сообщений: 3,535
21.03.2016, 21:10 2
lezh1k,
1) Указывайте компилятор. Оно-то понятно что это Atmel Studio и GCC, но отсюда, естесно, не видать, а подходы компиляции проектов из разных компиляторов тоже разные

2) Для управления расположения данных констант в AVR используются PROGMEM и др. Эти директивы указывают ту память, которая будет использоваться для хранения данных. В частности эта разница обусловлена различными методами чтения FLASH, EEPROM и RAM, которые применяются в AVR. Соответственно, для GCC есть разница где находится константа и переменная - в RAM, FLASH или EEPROM, т.к. и указатели на нее будут разными, и чтение/запись выполняться тоже по-разному. К слову, в CodeVision AVR вся эта "мутотень" немного упрощена для новичков.

3) Почитать за применение спец.слов, равно как и их дальнейшего использования вы можете в штатном хелпе IDE по соответствующим ключевым словам.
1
lezh1k
36 / 36 / 5
Регистрация: 03.06.2010
Сообщений: 120
22.03.2016, 07:32  [ТС] 3
Да, использую Atmel Studio и GCC.
Вот PROGMEM вроде понятно. Там хранятся какие-то константные данные типа строк, матриц и прочего. А какие другие есть директивы? Там в хэдере я нашел __attribute__((__const__)), __attribute__((__pure__)) и __attribute__((__progmem__)).

Еще один вопрос сразу : нельзя ли как-то указать, какой сегмент я использую для чего? Когда на асме пишу там же есть возможность указать .DSEG, .CSEG и т.д? Вот для IAR используется специальный файл (для линкера), в котором перечислены сегменты (там даже свои названия можно указать) и там только задать надо, с какого и по какой адрес будет располагаться этот сегмент. А затем просто указывается ...ну, типа такого объявления:
static byte_t test_arr[12] @ "CodeSegment";
Может сейчас чуть-чуть переврал с синтаксисом, но смысл был такой. В AVR GCC нет какой-нибудь такой опции?

Простите за дилетантские вопросы
0
Voland_
1699 / 1043 / 98
Регистрация: 04.01.2010
Сообщений: 3,535
22.03.2016, 10:55 4
Цитата Сообщение от lezh1k Посмотреть сообщение
А какие другие есть директивы?
lezh1k, нет особого интереса цитировать GCC.
Цитата Сообщение от lezh1k Посмотреть сообщение
Вот для IAR используется специальный файл (для линкера), в котором перечислены сегменты (там даже свои названия можно указать) и там только задать надо, с какого и по какой адрес будет располагаться этот сегмент.
Linker Script используется и для GCC, используйте его, конечно. Создавайте секции в разных типах памяти и адресуйте свои данные в разные секции, как вам нужно, с помощью указания конкретных атрибутов к переменным. Но желательно, конечно, всякий раз убеждаться, что линкер понял вас правильно и реально разместил переменную куда надо. Потому что иногда бывают "коллизии", когда один атрибут не дает реализовать другой и т.д. Это зависит во многом от компилятора и целевой платформы.
1
22.03.2016, 10:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2016, 10:55

Работа с ATMega128 . AVR studio
Всем привет! Я написал код на ассемблере , но не знаю как написать точно такой же код на C....

Работа таймера/счетчика AVR
Для чего 2 регистра OCR0A и OCR0B? Если счетчик достиг 1-го зачения записанного в одном из этих...

Работа с портами AVR в CodeVision
Народ, подскажите пожалуйста, может ли AVR например установить два бита порта одновременно, не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru