Нескольно простых вопросов о программировании AVR на Си.

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение FreshMan »

c2n, спасибо :)
и какой же талант писателя в тебе сохнет...., эх.... :))
Tell Me The Truth
Реклама
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение FreshMan »

как известно размер массива при инициализации можна не указывать

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

char arr[] = {0,5,56,7,78,7};
компилятор сам его вычислит
а почему такой фокус не проходит с двумерными массивами ?
тоесть почему не допускается запись

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

char file_name[] [] = {          
	"kapitan.wav",
	"markiza.wav",
	"razb.wav",
	"casablan.wav"
};
а вот запись такого вида компилятор с радостью принимает

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

char file_name[][15] = {      
	"kapitan.wav",
	"markiza.wav",
	"razb.wav",
	"casablan.wav"
};
Tell Me The Truth
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение Z_h_e »

Если не ошибся, то вот так

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

char file_name[] [] = {          
   {"kapitan.wav"},
   {"markiza.wav"},
   {"razb.wav"},
   {"casablan.wav"},
};
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение FreshMan »

компилятор выдает
array type has incomplete element type
Tell Me The Truth
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение WiseLord »

FreshMan писал(а):тоесть почему не допускается запись

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

char file_name[] [] = {          
	"kapitan.wav",
	"markiza.wav",
	"razb.wav",
	"casablan.wav"
};
А это массив 2x2 или 1x4? Или 4x1? Или ещё любой другой размерности, но просто ещё неполный?
Реклама
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение FreshMan »

это массив где хранятся имена wav файлов
и все
Tell Me The Truth
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение WiseLord »

Но Вы его объявляете двумерным, а размерность не указываете. Как компилятор догадается, сколько под каждого измерение выделять? Те же "casablan.wav" и "razb.wav" требуют разного числа байтов для хранения.
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение FreshMan »

в том ведь и вопрос
почему в одномерном массиве размерность можна не указывать а в двумерном уже так не сойдет ?
Tell Me The Truth
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение WiseLord »

Потому что в одномерном одно измерение. И char x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} - это однозначно вектор из 12 элементов

А вот char x[][] может быть и 1x12, и 2x6, и 3x4, и 4x3, и 6x2, и 12x1. Как компилятору понять, что Вы от него хотите? Остаться неопределённым может только одно (первое) измерение, оно может быть вычислено компилятором по общему количеству элементов + размерностям других измерений.

Скажем, char x[][3] = {1, 2, ....N} - тут компилятор однозначно понимает, что это массив из нескольких групп по 3 char-а. Вычислить, сколько групп понадобится, несложно. А просто char[][] - непонятно, сколько групп по сколько элементов имеются в виду.

P.S. Если так уж приспичило в данном конкретном случае (со строками), то объявляйте это не как массив массивом char, а как массив строк:

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

    char *file_name[] = {
       "kapitan.wav",
       "markiza.wav",
       "razb.wav",
       "casablan.wav"
    };
Это вполне себе одномерный массив строк (точнее - одномерный массив указателей на char). Его ещё и const можно сделать при необходимости.
xVekx
Встал на лапы
Сообщения: 125
Зарегистрирован: Вс мар 01, 2009 20:41:19

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение xVekx »

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

struct sText
{
	char *text;
};

struct sText ArrayText[] =
{
	{ .text = "12345"},
	{ .text = "123"},
	{ .text = "1465445"}
};

#define ARRAY_SIZE(x)			(sizeof(x) / sizeof((x)[0]))
Зато можно так, ...
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение Аlex »

И чем Ваш пример отличается от обычного одномерного массива указателей ? Для чего этот гемор со структурами ?

Добавлено after 1 minute 33 seconds:

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

char* ArrayText[] =
{
   "12345",
   "123",
   "1465445"
};
:dont_know:
Аватара пользователя
c2n
Сверлит текстолит когтями
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение c2n »

Свежий!
Вот эта "превед" воспринимается как 'п' 'р' 'е' 'в' 'е' 'д' '\n' где \n = 0
Так что твои массивы строк это уже как бы двумерные массивы.
В голом си нет понятия строка.
Я выходил из положения - определял через typedefы строки, и этот свой тип загонял в массив. Изврат конечно, но начальнику понравилось, а компилятору - не очень. 8 килограм прошивки и 512 байт еепрона скушалось моментально.

Оптимизировал потом под конечную длинну строки, и жЫть стало легче. И вывод на ИКран стал более равномерным, без переодических залипаний.

Лучше разбери механизм переменная-указатель. Даст бонус к быстродействию кода.
Керниган-Ритчи в помощь)))

Оффтопом: мелкие кристаллы и гиганские задачи на них - руки правят на ура))))
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение WiseLord »

c2n писал(а):Вот эта "превед" воспринимается как 'п' 'р' 'е' 'в' 'е' 'д' '\n' где \n = 0
Вы немножко путаете. '\n' и 0 - это совсем разные вещи. Ну а "превед" - это массив из 'п' 'р' 'е' 'в' 'е' 'д' '\0', а уже '\0' и просто 0 - одно и то же.
Аватара пользователя
c2n
Сверлит текстолит когтями
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение c2n »

А. Да. Напутал)))) строка завершается не '\n', а '\0'
Надеюсь и с этой оплошностью всеравно идея ясна.
По сути строка "превед" в массиве хранится как указатель на некоторый адрес в прошивке, и не более того. Да и вообще - использование безразмерных массивов - тупо жрет память, т.к. компилятор начинает нарезать все свободное пространство под такие безобразия. Некоторые компиляторы умеют ограничивать сами себя, а некоторые - жрут все подряд.
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение Siarzhuk »

c2n писал(а):[...] - использование безразмерных массивов - тупо жрет память, т.к. компилятор начинает нарезать все свободное пространство под такие безобразия.
А что вы имеете ввиду под безразмерными С массивами? Пример можно?
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
alex68md
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение alex68md »

поиск не помог а именно:

на каком ресурсе можно почитать о языке C для AVR но полную версию языка со всеми возможными вариантами . Наподобие ресурса arduino.cc php.org и др. где указанны примеры, полный перечень аргументов, пояснения и тп. Потому что например открываю , официальный ресурс C (наверно разновидность ATMEL) на котором хочу детально прочитать про sleep его режимы, как пользоваться и тд и что я вижу
http://www.atmel.com/webdoc/avrlibcrefe ... sleep.html

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

set_sleep_mode(<mode>);
какие такие моде ? это что секретная информация ? почему не указанны все варианты модов с примерами и т.д. короче какойто непонятный ресурс.

Вот есть вприроде ресурс про C для AVR c полным описанием ?
Последний раз редактировалось alex68md Вт мар 14, 2017 15:10:03, всего редактировалось 1 раз.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение ARV »

alex68md писал(а):Вот есть вприроде ресурс про C для AVR c полным описанием ?
ну вот как бы я старался: http://www.simple-devices.ru/index.php? ... &Itemid=10

на английском почти то же самое: http://nongnu.org/avr-libc/user-manual/
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
alex68md
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение alex68md »

забыл линк на атмел (наверно единственно официальный ресурс?) кинуть. обновил предыдущее сообщение. как видим сайт очень и очень неполный несмотря на то что с притензией на оф. ресурс по языку для их процессоров.

ARV можно и английский. спасибо. сейчас посматрю ваши линки

Добавлено after 2 hours 37 minutes 42 seconds:
получается у каждого компилятора свой язык...

ARV, а если я в ардуиновский компилятор подсуну код с _BV(x), он его поймет?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение ARV »

alex68md писал(а):если я в ардуиновский компилятор подсуну код с _BV(x), он его поймет?
должен по идее, ведь ардуино компилирует тем же самым AVR-GCC, о котором я все и писал... а если не поймет, просто добавьте в самом начале своего файла #define _BV(x) (1<<(x)) и после этого уже проблем не будет
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение Ярослав555 »

К вопросу о двумерных массивах. Вспомнилась лекция по С из ютюба, где лектор рассказывает о том, что в итоговом коде не существует массивов размерностью больше 1. Любой многомерный массив переводится в строку и хранится в таком виде в памяти. А если нашаманить с указателями то можно получить интересные эффекты :))) .

К вопросу о среде. Я агитирую за IAR. Изначально привык к среде и переход на стмки был не так ужасен. Кроме того, в один прекрасный момент, Вы захотите попробовать С++, а в avr-gcc его поддержка не полная. Кроме того, в другой прекрасный момент, Вы захотите запустить пошаговое исполнение кода в Proteus. И опа! А ваша 7я студия с ее gcc не может нормально сгенерировать elf файл, надо откатиться на 6ю. Потом Вы решите, а ну его, этот Proteus. Есть же JTAG! Покупать фирменный 3-й айс за 200 у.е. для хобби как-то не ок. Нагуглите 1-й айс, самодельный, ну или купите за 10 у.е. И тут снова засада - 7я студия не поддерживает такое, только 4я.

Но купив за 20 у.е. стмовскую дискавери Вы получаете отладочную плату, программатор, джитаг-отладчик. Вот Вам и Атмел. :)))

P.S. Когда писал одну прожку под stm, мне ядро исключение кидало, когда я по невнимательности, через указатель, выходил за пределы своего массива. Это к вопросу о надежности кода. А чего стоят точки останова исполнения по изменению ячейки памяти :love: . Тебе исключение с жалобой на ячейку памяти, а ты туда брекпоинт и сидишь, ждешь - кто же попытается ее изменить.

Добавлено after 16 minutes 44 seconds:
alex68md писал(а):получается у каждого компилятора свой язык...
Это Вам по молодости так кажется. Вы просто еще не разбираетесь в хидерах, макросах и директивах компилятора. Язык у всех один С или С++. А вот надстройки над этим языком в виде макросов и директив уже индивидуальны. Макросы можно легко переносить в собственный хидер. А директивы, как правило, имеют полные аналогии - будь то иаровкое __interrupt_vector или студиевское ISR(...).
Читайте, смотрите лекции по С. Тогда Вы поймете какие "костыли" применяются для адаптации С к авр, откуда берутся названия регистров в компиляторе и т.п.
Можно и по другому выразиться - создавая новый проект в среде, Вы не получаете чистый лист. Вы получаете заготовку. С хидерами. В которых что-то уже определено, при помощи того же С.
Ответить

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