AVR studio в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 93
Зарегистрирован: Чт апр 26, 2012 14:30:40
Откуда: под Москвой

Сообщение _dark »

Кто нибудь знает, можно ли разместить переменную по фиксированному адресу?
знаю, что для IAR это как-то возможно, а для AS?
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18682
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

можно, для чего следует разместить переменную в отдельной секции памяти при помощи атрибута .section, а затем при линковке задать нужный адрес начала этой секции - переменная там и окажется.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 93
Зарегистрирован: Чт апр 26, 2012 14:30:40
Откуда: под Москвой

Сообщение _dark »

Задачка чуть шире, необходимо разместить несколько (обычно до 100) переменных по фиксированным адресам,
обычно эти адреса идут последовательно (или поледовательно несколькими групами), и переменные могут быть разными 1...4 байтные.

...хотя можно наверное все свалить в struct, а уже структуру загнать в отдельную секцию...
что-то типа

Код: Выделить всё

typedef struct{
	uint8_t a;
	uint8_t b;
	uint16_t c;
	uint16_t d;
	}misk;
только обращение к ним через misk.name_var немного напрягает
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Ну, это если вся проблема во внешнем виде, это легко исправить макросами
struct{
uint8_t _var1; #define var1 fixvars._var1
uint8_t _var2; #define var2 fizvars._var2
}fixvars;
А не секрет, для чего понадобилось размещать множество переменных по фиксированным адресам?
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Аватара пользователя
Сообщения: 93
Зарегистрирован: Чт апр 26, 2012 14:30:40
Откуда: под Москвой

Сообщение _dark »

COKPOWEHEU ага годится, спасибо!

Один из вариантов реализации протокола MODBUS RTU. Чтобы не писать длиный swith{case:....break;...} при дешифрации адреса ячеек (регистров и пр. переменных),
хочу их держать последовательно в памяти. Тогда резко сокращаяется код обработки команды, достаточно по адресу который передается в команде вычислить смещение и скопировать в буфер ответа запрошенное количество
регистров (ячеек, входов и пр.). Учитывая, что стандарт предусматривает запрос несколькоих регистров подряд (сколько определяет пользователь), то это еще более экономит память, не нужна будет сборка ответа из разрозненых переменных.


Кажется получилось

Код: Выделить всё

volatile typedef struct{
	uint8_t a;
	uint8_t b;
	uint16_t c;
	uint16_t d;
	}misk;
	
misk var __attribute__((section(".my_data"))) = {1,2,3,4};	

Код: Выделить всё

LDFLAGS += -Wl,-section-start=.my_data=0x800300
map
.my_data 0x00800300 0x6
.my_data 0x00800300 0x6 Variables.o
0x00800300 var
Добавлено after 29 minutes 1 second:
как правильно инициировать структуру значениями по умолчанию?
код ниже не работает (в части инициализации)...

Код: Выделить всё

volatile misk my_var __attribute__((section(".my_data"))) = {1,2,3,4};	
Последний раз редактировалось _dark Пт дек 16, 2016 18:30:52, всего редактировалось 1 раз.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

а так?

Код: Выделить всё

volatile misk my_var __attribute__((section(".my_data"))) = {.a=1, .b=2, .c=3, .d=4};
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 93
Зарегистрирован: Чт апр 26, 2012 14:30:40
Откуда: под Москвой

Сообщение _dark »

нет, не работает

вот так да, но это не то

Код: Выделить всё

my_var.a = 1;	my_var.b = 2; 	my_var.c = 3; 	my_var.d = 4; 
странно, вот здесь советовали по простому и это похоже работало...
http://radiokot.ru/forum/viewtopic.php?p=962848

зы
не пойму где засада, это нюансы GCC или у меня каша в голове?
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

_dark писал(а):как правильно инициировать структуру значениями по умолчанию?
код ниже не работает (в части инициализации)...
Код:
volatile misk my_var __attribute__((section(".my_data"))) = {1,2,3,4};   
Может как-то атрибут мешает :dont_know: ? Например у меня при объявлении структуры все отлично инициализируется именно такой записью, но никаких атрибутов не применял.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18682
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

даже и не знаю: мне ничего не мешает, у меня все отлично инициализируется :) и атрибут можно в любое место ставить... avr-gcc-5.2.1

какая ошибка-то хоть у вас вводится?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 93
Зарегистрирован: Чт апр 26, 2012 14:30:40
Откуда: под Москвой

Сообщение _dark »

нет ошибок,
Build succeeded.
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========
просто ерунда в данных

Код: Выделить всё

volatile __attribute__((section(".my_data"))) misk my_var = {1,2,3,4};
....
//	my_var.a = 1; 
	__eePUT(0x40, my_var.a);	//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//	my_var.b = 2; 
	__eePUT(0x41, my_var.b);	//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//	my_var.c = 3; 
	__eePUT(0x42, my_var.c);	//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//	my_var.d = 4; 
	__eePUT(0x43, my_var.d);	//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	if(my_var.a < my_var.b) my_var.c = my_var.d + 1;
	__eePUT(0x44, my_var.c);	//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
выдает результат с 40 адреса:
00 00 00 78 00

если

Код: Выделить всё

volatile __attribute__((section(".my_data"))) misk my_var = {1,2,3,4};
...
	my_var.a = 1; 
	__eePUT(0x40, my_var.a);	//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	my_var.b = 2; 
	__eePUT(0x41, my_var.b);	//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	my_var.c = 3; 
	__eePUT(0x42, my_var.c);	//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	my_var.d = 4; 
	__eePUT(0x43, my_var.d);	//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	if(my_var.a < my_var.b) my_var.c = my_var.d + 1;
	__eePUT(0x44, my_var.c);	//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
то все ок:
01 02 03 04 05

AVR GCC 4.6.2

не везде, после фигурных скобок атрибут поставить нельзя - ругается

Z_h_e да мешает атрибут, без него все ок.
Но в нем то весь смысл, о чем здесь речь идет....
Последний раз редактировалось _dark Пт дек 16, 2016 20:04:43, всего редактировалось 1 раз.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

А что за МК у Вас? Вроде как нет AVR, у которой ОЗУ начинается с адреса меньшим 0x60.

Адрес сегмента как определен у Вас? Возможно его надо определять как 0x00800060 для адреса 0x0060. Это нюансы Си и гарвардской архитектуры.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Встал на лапы
Аватара пользователя
Сообщения: 93
Зарегистрирован: Чт апр 26, 2012 14:30:40
Откуда: под Москвой

Сообщение _dark »

Mega168PA 1к SRAM

секция начинается с 0x200
LDFLAGS += -Wl,-section-start=.my_data=0x800200
Добавлено after 5 minutes:
ARV свой код инициализации с атрибутом не выложите?
вместе с определением структуры
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18682
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

да я ваш скопировал :) но чистым этот тест не назовешь - я только убедился в отсутствии ошибок компиляции, в память я не смотрел, что там получалось. некогда, да и лень :roll:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 93
Зарегистрирован: Чт апр 26, 2012 14:30:40
Откуда: под Москвой

Сообщение _dark »

ну ладно закончу эти экзерцисы,
в принципе понятно как без доп. секций все реализовать только на структурах...

Всем кто откликнулся Спасибо! :beer:

Добавлено after 39 minutes:
Я собственно о чем подумал, похоже дело в том, что

.my_data не является секцией .data ( глубокая мысль :))) ) и поэтому нет начальной инициализации.
вот если объявить .my_data как подсекцию .data, тогда наверное все должно получиться...

но как это сделать?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18682
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

я, честно говоря, уже не очень четко помню... но по-моему, инициализируемая область ОЗУ - это секция .bss, а .data - это остальное ОЗУ, точнее вообще все ОЗУ, включая .bss...
ща попробую все-таки собрать более-менее адекватный тест... терпение :)

Добавлено after 1 hour 12 minutes 43 seconds:
в общем, дело такое...
во-первых, я все сказал наоборот: .bss - это область ОЗУ глобальных переменных, не имеющая начальных данных (обнуляется по умолчанию), а .data - это как раз проинициализированные переменные
во-вторых, при выделении отдельной секции под переменную, она оказывается именно по этому адресу... но как ее проинициализировать "по умолчанию", я так и не понял... похоже, что никак... либо я просто слишком туп, чтоб понять, как.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Доброго воскресного времени суток.
Существует ли возможность настроить AS6 так, чтобы он имя HEXа назначал по какому-то правилу. Например добавлял время или что-то выдергивал из исходника и добавлял к имени. И если да, то как это сделать.
Я makefile ручками не пишу, пользуюсь автоматизацией студии, мне бы как-нибудь там же и настроить это дело.
Спасибо.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

Поставил AVR Studio 4.19 и AVR Toolchain 3.3.0
При отладке появляется следующее окошко.
Что нужно сделать? Какую папку указать?
Изображение
Вложения
foldsrc.png
(10.27 КБ) 881 скачивание
Никакая контра не уйдёт от нас
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18682
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

боюсь, что так не выйдет. я на 100% не уверен, но все предыдущие версии AVR Studio не умели "автоматически" работать ни с каким компилятором, кроме WinAVR. поэтому я могу вам дать не очень правильный совет: сначала установить WinAVR, а затем просто поверх ее папок перезаписать файлами из AVR Toolchain. студия будет думать, что это WinAVR, но фактически будет работать с новым компилятором.

как сделать совсем правильно - не знаю, к сожалению...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь

Сообщение prinv »

AVR Toolchain это WinAVR и есть, только более новых версий.
Никакая контра не уйдёт от нас
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18682
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

prinv писал(а):AVR Toolchain это WinAVR и есть, только более новых версий
нет, это не совсем так.
WinAVR - это прежде всего инсталлятор, который делает такие изменения в окружении Windows, которые позволяют студии автоматически обнаружить его присутствие и соответственно предлагать создание проектов для WinAVR. о наличии toolchain студия, похоже, самостоятельно узнать не может, а как ей помочь - я не в курсе (точнее, сказал, как делал я)

кроме того, AVR Toolchain не содержит документации по avr-libc и вообще по avr-gcc, а WinAVR содержит все "из коробки".

функционально - да, это версии компилятора под AVR, но комплектность разная. в частности, мне очень не нравится формат вывода сводки о размере полученного кода, который выдает avr-size в toolchain последних версий, приходится применять версию из WinAVR
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

Вернуться в «AVR»