на просторах есть обрезанный образ вин10х64, называется "tiny10 b4 x64.iso". Памяти после загрузки 447мб занимает, на винте около 3Гб, процессов в диспетчере задач - всего 32. Пробовал на слабом ноутбуке - вполне норм. шевелится, VSCode там работал, а новая ардуино ИДЕ на такой же основе. Правда интерфейс английский, но мы ж программисты - народ мясистый, если Си и ассемблер знаем - значит и английский знаем.
Как-то уже пережевывали с ARV тему UNION... Однако глянул вот тут https://radiokot.ru/forum/viewtopic.php ... 0#p3990790 Да решил под адуринку проверить... (а заодно посмотреть куда выравнивает вомпилятор - к старшим или к младшим байтам)... То все теория "как разместить?" а кусманчика "как применить" и нету... Тем более, что симулятор (UnoArduSim 2.9.1) подобную конструкцию не понимает... Получился вот такой тестик симпатяшный: Спойлер
Код:
union { long my_long; struct { unsigned int my_int1; unsigned int my_int2; }; struct { unsigned char my_char1; unsigned char my_char2; unsigned char my_char3; unsigned char my_char4; }; } my_sptp;
void setup() { // put your setup code here, to run once: Serial.begin(9600); /* my_sptp.my_char1 = 1; my_sptp.my_char2 = 2; my_sptp.my_char3 = 3; my_sptp.my_char4 = 4; */ }
void loop() { // put your main code here, to run repeatedly:
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4599 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
BOB51, что от чего отличается ? Код разный ? Тогда причём тут компилятор ? Или код одинаковый, но результат разный ? Напиши всё в одном месте, связанно и осмысленно. Без ссылок туда-сюда и всяческих загадок ...
объявление UNION, создание экземпляра объединения в моем тесте
Код:
union { long my_long; struct { unsigned int my_int1; unsigned int my_int2; }; struct { unsigned char my_char1; unsigned char my_char2; unsigned char my_char3; unsigned char my_char4; }; } my_sptp;
экземпляры структур внутри UNION не создаются в основной программе обращение к элементам объединения к примеру my_sptp.my_int2 или my_sptp.my_char3....
и у AxisPod
Код:
#pragma pack(push, 1) union char_to_long { struct { char c1; char c2; char c3; char c4; } chars; long int value; } #pragma pack(pop)
а тут экземпляр структуры chars задан внутри объединения char_to_long
анонимные структуры и объединения поддерживаются не всеми версиями компиляторов, в некоторых для такой поддержки надо какие-то ключики/опции активировать. первый пример - с анонимными структурами, второй - кассический, с именованными.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4599 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
BOB51, и ? Что смутило ? Компилятор тут причём ?
В первом варианте - создан анонимный тип union, с анонимными структурами внутри, и объявлен его экземпляр. Во втором случае - создан именованный тип union, с именованными структурами внутри.
union my_sptp { long my_long; struct { unsigned int my_int1; unsigned int my_int2; }tests1; struct { unsigned char my_char1; unsigned char my_char2; unsigned char my_char3; unsigned char my_char4; }tests2; }; // my_sptp;
для компилятора недопустима - собственно участок с union проскочит, а вот при вызове переменных идут матюки.
т.е. вызвавший интерес пример должен бы по идее смотреться вот так: Спойлер
Код:
#pragma pack(push, 1) // union char_to_long { union { struct { char c1; char c2; char c3; char c4; } chars; long int value; } char_to_long; #pragma pack(pop)
....
Дополнительное замечание по тесту на ардуинке - нано (old bootloader)... При повторной загрузке во время работы тест-прожки иногда портит бутлоадер - приходится ставить на "внешний" SiProg+avrdudeshell давать общее стирание, затем грузить бутлоадер из-под ардуиноIDE+arduinoISP... Вероятная причина - сбой протокола в адуринке в случае когда старая программа использует UART на передачу данных при одновременном встречном потоке данных для бутлоадера. Замечено уже второй раз именно для old bootloader.
ПОПАЛСЯ БАГ! В принципе ситуация следующая. Программка в адуринке работает с отсылкой данных по UART. Куда - не столь важно, главное что используется тот же СОМ порт, что и при прошивке бутлоадера. А мы вознамерились эту платку перепрошить чем-то новеньким... Так вот, чтоб не возникало "заскоков" последовательность действий (по крайней мере на моей текущей 1.8.9 +ХР): 1. подключаем платку адуринки 2. запускаем IDE 3. независимо от необходимости В ОБЯЗАТЕЛЬНОМ ПОРЯДКЕ открываем монитор порта 4. запускаем компиляцию с последующей прошивкой. В этом случае IDE корректно остановит программу в платке перед последующим запуском прошивки. Если монитор порта не запускать - вот тогда и "заскоки" последуют.
В связи с интересом прокрутил пяток вариантов написания для UNION для адуринки... все проверены и компилятором и макетом и одинаково работоспособны а вот написание... иногда мозг таки мутит с непривычки...
Так с этой разницы вопрос и возник. Есть объявление объединения, но нет создания самого объединения (объекта). Да и вызов переменной с двумя точками в имени... как-то в примерах раньше не попадался... Тем более само применение комбинирования union+struct на практике редкость... Под ассемблером такой прием более часто применяется. Осталось еще enum переварить.
Если оставить только описание без создания объекта то ессно при обращении к переменным компилятор пошлет подальше... Хотя внешне весьма похоже на определение функции... Да и typedef... К имени или к объекту.?.. Ибо имя обьединения(структуры) по факту определяет тип и без дополнительного typedef
Код:
struct two_int { unsigned int my_int1; unsigned int my_int2; }; struct four_char { unsigned char my_char1; unsigned char my_char2; unsigned char my_char3; unsigned char my_char4; }; union my_union { long my_long; two_int tests1; four_char tests2; };
my_union my_sptp;
.... Кстати... А сколько (теоретически) может быть точек в имени переменной?
Последний раз редактировалось BOB51 Вс мар 07, 2021 19:37:23, всего редактировалось 1 раз.
А сколько (теоретически) может быть точек в имени переменной?
НИ ОДНОЙ
точка не является частью имени переменной, а служит разделителем между именами полей
в документации к каждому компилятору указываетс, какая длина у имени может быть. я головой не поручусь, но вроде бы GCC 32 символа допускает (остальные не анализируются, т.е. не участвуют в различении переменных)...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4599 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Цитата:
Есть объявление объединения, но нет создания самого объединения (объекта). Да и вызов переменной с двумя точками в имени... как-то в примерах раньше не попадался... Тем более само применение комбинирования union+struct на практике редкость... Под ассемблером такой прием более часто применяется. Осталось еще enum переварить.
Если оставить только описание без создания объекта то ессно при обращении к переменным компилятор пошлет подальше... Хотя внешне весьма похоже на определение функции... Да и typedef... К имени или к объекту.?.. Ибо имя обьединения(структуры) по факту определяет тип и без дополнительного typedef
BOB51, "Мая твая не панимай" (с) Ты строчишь какой-то непонятный набор слов, который осмыслить просто нереально. Приплетаешь сюда ассемблер, какие-то функции, ... Опиши чётко и внятно проблему. Получишь чёткий и внятный ответ. Без всяких там непонятных мыслей и ненужных фраз....
Допустим typedef относительно указателя на функцию штука вполне оправданная.... Но в случае с именованной структурой или именованным объединением это возможно излишне - и так уже присутствует тип соответствующий имени.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения