на просторах есть обрезанный образ вин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
Рейтинг сообщений: 1443
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4609 Откуда: Планета Земля
Рейтинг сообщения: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
Рейтинг сообщений: 1443
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4609 Откуда: Планета Земля
Рейтинг сообщения: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
Рейтинг сообщений: 1443
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4609 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Цитата:
Есть объявление объединения, но нет создания самого объединения (объекта). Да и вызов переменной с двумя точками в имени... как-то в примерах раньше не попадался... Тем более само применение комбинирования union+struct на практике редкость... Под ассемблером такой прием более часто применяется. Осталось еще enum переварить.
Если оставить только описание без создания объекта то ессно при обращении к переменным компилятор пошлет подальше... Хотя внешне весьма похоже на определение функции... Да и typedef... К имени или к объекту.?.. Ибо имя обьединения(структуры) по факту определяет тип и без дополнительного typedef
BOB51, "Мая твая не панимай" (с) Ты строчишь какой-то непонятный набор слов, который осмыслить просто нереально. Приплетаешь сюда ассемблер, какие-то функции, ... Опиши чётко и внятно проблему. Получишь чёткий и внятный ответ. Без всяких там непонятных мыслей и ненужных фраз....
Допустим typedef относительно указателя на функцию штука вполне оправданная.... Но в случае с именованной структурой или именованным объединением это возможно излишне - и так уже присутствует тип соответствующий имени.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения