Easyelectronics.ru

Электроника для всех
Текущее время: 22 янв 2021, 12:20

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 24 ] 
Автор Сообщение
 Заголовок сообщения: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 09 дек 2019, 14:21 
Заглядывает иногда

Зарегистрирован: 09 ноя 2015, 01:22
Сообщения: 37
Добрый день.
Имеется AVR-GCC версии 9.1.0 под винду и Atmega8. Пишу примерно такой код
Код:

typedef struct
{
    uint8_t st_pin;
    uint8_t clk_pin;
    uint8_t data_pin;
    volatile uint8_t *ddr;
    volatile uint8_t *port;
    volatile uint8_t *pin;
} Serial_data;

Serial_data *input;

int main ()
{
    input -> st_pin = 0;
    input -> clk_pin = 1;
    input -> data_pin = 2;
    input -> ddr = &DDRC;
    input -> port = &PORTC;
    input -> pin = &PINC;
}


Это упрощённо, но в момент компиляции всё происходит именно так. Так вот. Компилятор выделяет под указатель адрес 0х0000! То есть все переменные начинают писаться сначала в r0, потом r1, потом в r2 и т.д. Это я дурак или что-то тут не так? Разве не должен компилятор выдать под адрес указателя первую ячейку свободной от регистров памяти 0х0060?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 09 дек 2019, 14:33 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2900
Откуда: Санкт-Петербург
А кто указателю значение присваивать будет?

Вам бы начальный курс Си какой пройти... Вот, вроде этот https://www.intuit.ru/studies/courses/97/97/info ничего так, судя по главе про указатели. Правда, кажется, даже до динамического выделения памяти не доходит, но на МК зачастую и не надо :-), особенно на 8-битках с минимумом памяти.

Show Можно так:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 09 дек 2019, 15:11 
Заглядывает иногда

Зарегистрирован: 09 ноя 2015, 01:22
Сообщения: 37
Что-то пошло не так.


Последний раз редактировалось RollerBob 09 дек 2019, 15:19, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 09 дек 2019, 15:19 
Заглядывает иногда

Зарегистрирован: 09 ноя 2015, 01:22
Сообщения: 37
Дело в том, что в данном месте сама переменная не нужна. Она передаётся дальше, в другую функцию, и работа с ней идёт уже там. Я как старый советский еврей хотел сэкономить несколько байт. План был такой.
1) Объявляю структуру.
2) Объявляю указатель на неё
3) Заполняю структуру через указатель данными.
4) Отправляю этот указатель в другую функцию.
5) Там я присваиваю этот указатель другому указателю.
6) Вспоминаю как несколько лет назад я говорил "Да ну нахер этот си! Там указатель на указатель в массиве указателей через указатель ссылается на указатель. Не в жизть!"
7) И внутри уже той функции я имею локальную переменную которая изначально ссылается на кусок памяти из main()
8) .......
9) Экономия ОЗУ!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 09 дек 2019, 15:33 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3047
Всё верно, только вы п.1 не сделали. Вам уже выше же подсказали.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 09 дек 2019, 15:40 
Заглядывает иногда

Зарегистрирован: 09 ноя 2015, 01:22
Сообщения: 37
Уже всё исправил.
Сначала описание структуры, потом создаю экземпляр структуры, передаю указатель на него в функцию, а там уже присваиваю этот указатель локальному.
Всё заработало. Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 09 дек 2019, 15:40 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1394
RollerBob писал(а):
9) Экономия ОЗУ!

Чтобы экономить ОЗУ нужно или структуру хранить во флеше или вообще на шаблонах переписать, будет 0 байт RAM и пины не будут привязаны к одному порту.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 09 дек 2019, 15:43 
Заглядывает иногда

Зарегистрирован: 09 ноя 2015, 01:22
Сообщения: 37
Это условная библиотека. Поэтому нужно было избежать хардкода на дефайнах и сохранить возможность инициализации на любых пинах любого порта.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 09 дек 2019, 15:49 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1394
RollerBob писал(а):
Это условная библиотека. Поэтому нужно было избежать хардкода на дефайнах и сохранить возможность инициализации на любых пинах любого порта.

Пина, я так понимаю, там три, а порт один, так что на любых пинах не получится. Но дело твое, просто немного странно когда имея gcc 9 его продвинутые возможности используются на 20%.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 09 дек 2019, 15:54 
Заглядывает иногда

Зарегистрирован: 09 ноя 2015, 01:22
Сообщения: 37
Имелось в виду, что задача стояла реализовать функционал на любых трёх пинах одного любого порта. Раскидывать пины по разным портам задачи не было.
Если не сложно, хотелось бы услышать о каких таких продвинутых возможностях идёт речь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 09 дек 2019, 15:57 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3047
Цитата:
передаю указатель на него в функцию, а там уже присваиваю этот указатель локальному.

Зачем присваивать, когда можно просто работать с аргументом функции?
Код:
typedef struct
{
    uint8_t st_pin;
    uint8_t clk_pin;
    uint8_t data_pin;
    volatile uint8_t *ddr;
    volatile uint8_t *port;
    volatile uint8_t *pin;
} Serial_data;

Serial_data input;

void myF(Serial_data *in_data) {
  in_data->st_pin = 3;
}

int main ()
{
    input.st_pin = 0;
    input.clk_pin = 1;
    input.data_pin = 2;
    input.ddr = &DDRC;
    input.port = &PORTC;
    input.pin = &PINC;

    myF(&input);

    while(true) {};
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 09 дек 2019, 16:08 
Заглядывает иногда

Зарегистрирован: 09 ноя 2015, 01:22
Сообщения: 37
Ну тут я неправильно выразился. Там не одна функция работает с этими данными. Грубо говоря - несколько функций внутри одного файла работают с этими данными.
Код:
serial.c

Serial_data *_data;
void init(Serial_data *data)
{
    _data = data;
}

void update (void)
{
    что-то делаю с _data;
}

и т.д.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 09 дек 2019, 16:33 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1394
RollerBob писал(а):
Если не сложно, хотелось бы услышать о каких таких продвинутых возможностях идёт речь.

Си практически не развивается, возьми gcc 5 и для программистов на Си мало что с тех пор изменилось, т.е. практически все развитие компилятора сводится к добавлению поддержки новых стандартов С++, а улучшений там просто огромное количество. На плюсах ты свою структур/класс можешь сделать шаблонной, в таком случая она просто будет содержать набор констант и типов, в частности можно сделать такой класс для пинов, потом три пина передать в шаблонный класс Serial_data, а его самого передать еще дальше, в очередной шаблонный класс или функцию. Выглядеть это может как-то так(при условии, что класс пинов уже есть):
Код:
template<Pin St, Pin Clk, Pin Data>
struct SerialData
{
   using st_pin = St;
   using clk_pin = Clk;
   using data_pin = Data;
};

template<typename Serial>
void myfunc()
{
    Serial::clk_pin::set();
.....
}

using serial = SerialData<PC0, PC1, PB5>;
myfunc<serial>();

Если это скомпилировать, я могу проверить только на STM32, то получим 3 инструкции, точно такие же как и для строки:
Код:
GPIOC->BSRR = 1 << 1;

И это еще очень простой пример без никакой шаблонной магии, зато написать такое может практически каждый, было бы желание.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 09 дек 2019, 16:40 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2900
Откуда: Санкт-Петербург
RollerBob писал(а):
6) Вспоминаю как несколько лет назад я говорил "Да ну нахер этот си! Там указатель на указатель в массиве указателей через указатель ссылается на указатель. Не в жизть!"


Ага. "If I may be so brash, it has been my humble experience that there are two things traditionally taught in universities as a part of a computer science curriculum which many people just never really fully comprehend: pointers and recursion." https://www.joelonsoftware.com/2005/12/ ... schools-2/ (сорри, раньше в сети был перевод этого цикла статей на русский, но куда-то делся).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 01 фев 2020, 17:49 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 04 янв 2013, 20:16
Сообщения: 72
Откуда: Нижний Новгород
RollerBob писал(а):
Добрый день.
Имеется AVR-GCC версии 9.1.0 под винду и Atmega8. Пишу примерно такой код

Добрый день, подскажите пожалуйста где добыли AVR-GCC версии 9.1.0 под винду ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 02 фев 2020, 05:34 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3047
https://blog.zakkemble.net/avr-gcc-builds/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 02 фев 2020, 20:21 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 04 янв 2013, 20:16
Сообщения: 72
Откуда: Нижний Новгород
NStorm писал(а):
https://blog.zakkemble.net/avr-gcc-builds/

увы, та сборка (9.2) не работает и Zak знает об этом но относится к этому философски :-/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 02 фев 2020, 22:21 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3047
Как это не работает? Что не работает? У меня вроде как всё работает оттуда.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 03 фев 2020, 19:49 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 04 янв 2013, 20:16
Сообщения: 72
Откуда: Нижний Новгород
NStorm писал(а):
Как это не работает? Что не работает? У меня вроде как всё работает оттуда.


У меня такая ошибка вываливалась:
c:\arduino-pr-beta1.9-build-80\hardware\tools\avr\bin../lib/gcc/avr/8.2.0/../../../../avr/bin/ar.exe: unable to rename ‘C:\Users\Support\AppData\Local\Temp\arduino_build_442983\core\core.a’; reason: File exists

... I tried 32bits build on Win7 and 64bits on Win10 running as Admin, with disabled antiviruses and using various Arduino folders compiling empty project but got ...
Пришлось откатываться на 7.3.0 как Zak порекомендовал.

Расскажите пожалуйста до какой версии вам удалось обновиться и как именно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 03 фев 2020, 21:09 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3047
Я не с арудиной его использую и проблем нет. А с ардуино какой смысл обновляться? Чего вы хотите добиться заменой тулчейна?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 03 фев 2020, 23:19 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 04 янв 2013, 20:16
Сообщения: 72
Откуда: Нижний Новгород
NStorm писал(а):
Я не с арудиной его использую и проблем нет. А с ардуино какой смысл обновляться? Чего вы хотите добиться заменой тулчейна?


Я использую в Atmel Studio 7.0 и с ардуиновским загрузчиком/библиотеками и без, по-разному, с ардуиновским вариантом удалось заставить работать GCC 7.3.0. Позже и сами ардуиновцы подсуетились и GCC у себя в IDE обновили. В коде использую относительно новые фичи C++ потому и GCC нужен по-новее : if constrexp, fold expressions, lambdas, auto, using, scoped enums, ranged for, inline variables и т.п.

Расскажите пожалуйста как ставили-то и какую версию?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 04 фев 2020, 00:16 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3047
Что ставить? Я не пользуюсь студией и ардуино. Я просто распаковал архив и прописал PATH к нему. Собираю через Makefile обычно.
Ваш вопрос в том, как подружить Arduino Core и новый тулчейн. Это вопрос более глубокий, чем просто "поставить".
А вот почему у вас _без_ ардуиновских библиотек и загрузчиков не работает - вопрос другой. Ошибка, что вы привели выше, явно о случае _с_ ними. Что без них у вас не работает?
И разве перечисленное все не относится к C++17, которое уже было в GCC 7.3.0?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 04 фев 2020, 00:42 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 04 янв 2013, 20:16
Сообщения: 72
Откуда: Нижний Новгород
NStorm писал(а):
Ваш вопрос в том, как подружить Arduino Core и новый тулчейн.

Спасибо, дружить Arduino Core с GCC 7.3.0 не надо, там и было хорошо (нужно было просто папочки с бинарниками поменять) и стало неплохо (там по-дефолту стал ставиться GCC 7.3.0).
Но вопрос не про Ардуино, речь про "чистый" AVR в Atmel Studio 7.0
Видимо, придётся через Makefile


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR-GCC и указатель на структуру.
СообщениеДобавлено: 04 фев 2020, 01:03 
Старожил

Зарегистрирован: 08 авг 2013, 09:43
Сообщения: 3047
Хорошо, покажите в чем ошибка у вас возникает в чистом AS7. Я завтра попробую проверить.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB