Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/29: Рейтинг темы: голосов - 29, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
1

Вопрос по синтаксису atmel studio

09.11.2013, 02:11. Показов 5668. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
почему такая строка работает
Код
run_data.timer = pgm_read_byte(&data01[run_data.index].delay);
а такая работает не правильно
Код
run_data.timer = pgm_read_byte(&run_data.data[run_data.index].delay);
run_data.data содержит ссылку на data01[]

определения:
Код
typedef struct {
uint8_t color;
uint8_t   delay;
} tid_data;

const tid_data data01[] PROGMEM = {
{ tid_kriim, 200 }
};
volatile struct {
uint8_t         index;
uint8_t         timer;
const tid_data*   data;
uint8_t         size;
} run_data;
присвоение
Код
void stort(const tid_data d[], uint8_t size) {
run_data.data = d;
run_data.index = 0;
run_data.size = size;
switchLed(pgm_read_byte(&run_data.data[0].color), 1);
run_data.timer = pgm_read_byte(&run_data.data[0].delay);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.11.2013, 02:11
Ответы с готовыми решениями:

Вопрос юзерам Atmel Studio
при попытке запустить программу на отладку выходит сообщение <Изображение удалено> Что делать...

Atmel Studio 6 v 6.0.1843 Вопрос по отладке
Здравствуйте, С НОВЫМ ГОДОМ! Только зарегистрировался и сразу с вопросами, да еще и в неподходящее...

Почему AVR Studio 4, а не Atmel Studio 6?
По какой причине большинство специалистов по AVR микроконтроллерам в основном используют AVR Studyo...

Вопрос по синтаксису С++
Изучаю с++ по книге Джесса Либерти " Освой самостоятельно С++ за 21 день" Он в начале главы пишет...

9
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
09.11.2013, 02:32 2
Цитата Сообщение от oxytt
почему такая строка работает ... &data01[run_data.index].delay
а такая работает не правильно ... &run_data.data[run_data.index].delay

run_data.data содержит ссылку на data01[]
Вот смотрИте:
data01 и run_data.data - одного типа, это указатели на структуру (или массив структур).
Но run_data.data и run_data.data[run_data.index] - уже не одного типа. Поэтому Ваши два выражения не эквивалентны.

P.S. Справедливости ради :-) Атмеловская студия тут ни при чём. Вопрос чисто сишный.
0
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
09.11.2013, 02:36 3
посмотрите строки
правильно сравнивать data01[run_data.index] и run_data.data[run_data.index]
они одного типа

я предположил, что вопрос проблема может быть из-за PROGMEM, а это уже чисто avr GCC/atmel studyo
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
09.11.2013, 02:53 4
Цитата Сообщение от oxytt
посмотрите строки
правильно сравнивать data01[run_data.index] и run_data.data[run_data.index]
они одного типа
Не жалейте круглых скобок, особенно когда нет уверенности в приоритете операций "&", ".", "[]" в сложной цепочке. Поставьте круглые скобки везде, где можно и посмотрите, что выйдет.

Задумка-то какая была - получить (run_data.data)[run_data.index] ?

Цитата Сообщение от oxytt
я предположил, что вопрос проблема может быть из-за PROGMEM, а это уже чисто avr GCC/atmel studyo
Чтобы избавиться от подозрения на PROGMEM или подтвердить его - предлагаю проверить сначала без PROGMEM, только сами длинные выражения. И разместить их можно не в PROGMEM (для проверки: влияет ли это).
0
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
09.11.2013, 03:00 5
Цитата Сообщение от OtyxPM
Не жалейте круглых скобок, особенно когда нет уверенности в приоритете операций "&", ".", "[]" в сложной цепочке. Поставьте круглые скобки везде, где можно и посмотрите, что выйдет.
скобки добавлял - не помогло

Задумка-то какая была - получить (run_data.data)[run_data.index] ?
задумка такая - по таймеру выбирается последовательность данных из массива data01 и обрабатывается через временные интервалы заданные в самом data01.
если я указываю в коде таймера напрямую data01 - все работает
но мне хотелось добавить гибкости, чтобы например переключать режим - менять data01 на какой-нибудь data02
для этого я попытался прописать в коде таймера не прямое обращение к data01, а через ее адрес хранящийся в run_data.data
пока не удалось сделать этот код рабочим

Чтобы избавиться от подозрения на PROGMEM или подтвердить его - предлагаю проверить сначала без PROGMEM, только сами длинные выражения. И разместить их можно не в PROGMEM (для проверки: влияет ли это).
тоже думал об этом, но у меня размер data01 равен размеру всей памяти МК ))) так не полетит
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
09.11.2013, 03:04 6
Цитата Сообщение от oxytt
у меня размер data01 равен размеру всей памяти МК )))
И поэтому размер массива tid_data[] не указан в коде?

С каким параметром size вызываете функцию stort() ?
0
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
09.11.2013, 03:06 7
я просто для простоты сократил содержание data01 до одного элемента
вызываю так:
stort(data01, sizeof(data01)/sizeof(data01[0]));
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
09.11.2013, 03:10 8
Цитата Сообщение от oxytt
я просто для простоты сократил содержание data01 до одного элемента
вызываю так:
stort(data01, sizeof(data01)/sizeof(data01[0]));
А вот ещё вопрос: есть ли смысл гонять через стек весь массив... 8-0
Почему не сделать первым параметром указатель на структуру?
void stort(/*вместо const tid_data d[]*/const tid_data *d, uint8_t size);
0
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
09.11.2013, 03:13 9
Цитата Сообщение от OtyxPM
Почему не сделать первым параметром указатель на структуру?
void stort(/*вместо const tid_data d[]*/const tid_data *d, uint8_t size);
изначально так и было объявлено, изменил в попытке найти рабочий вариант
может ошибаюсь, но по идее между этими двумя конструкциями не должно быть разницы, ведь имя массива в Си это указатель
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
09.11.2013, 03:19 10
Цитата Сообщение от oxytt
может ошибаюсь, но по идее между этими двумя конструкциями не должно быть разницы, ведь имя массива в Си это указатель
Но компилятор-то засунет весь массив на стек? В случае параметра-указателя на стеке гарантированно окажется только указатель.

Поскольку время позднее, закину совет заранее - завтра обсудим:
разделите сомнительное место на две логические половины - отдельной строкой вычисляйте (и присваивайте переменной-указателю) параметр для pgm_read_byte(), а уже другой строкой вызывайте pgm_read_byte() с вычисленным параметром. Так проще разобраться. Можете даже обоими способами (см.первый пост) вычислить указатель и сличить.
0
09.11.2013, 03:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.11.2013, 03:19
Помогаю со студенческими работами здесь

вопрос по синтаксису
у меня есть <input type="text" name="text" > var name1 = obj.text.value; -- не работает...

вопрос по синтаксису
Здравствуйте, объясните пожалуйста запись: next(,):-(Y is I+1;Y is I-1),road(Y,J). next(,):-(X...

Вопрос по синтаксису
У меня на форме несколько объектов. Я хочу применить для них всех одну процедуру. Например, есть...

Вопрос по синтаксису С++.
имеется класс gui class gui { public: class subwindow { public: void open(void); //...

Вопрос по синтаксису
Народ подскажите где можно прочесть про такие фишки. или растолкуйте почему индекс и имя массива...

Вопрос по синтаксису
x1:integer; x1:=StrToInt(edt1.Text); http://rghost.ru/38097209.view screen Что не...

Вопрос по синтаксису перечислений
Какой из наборов перечисляемых значений записан правильно: 1. enum {a, b = 3, c, d } 2. enum { a,...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru