|
Модераторы: PILOT, ManiaK, Mazzi |
|
Курсант |
|
|||
Опытный Профиль Группа: Участник Сообщений: 338 Регистрация: 21.2.2009 Где: Балашиха или Воро неж Репутация: нет Всего: 4 |
Всем доброго времени суток!
У меня следующая проблема: я пересылаю пакет данных из микроконтроллера в компьютер через Ethernet по протоколу UDP. В пересылаемой структуре есть поле - число типа uint64_t, метка времени. В компьютер оно принимается как _int64, т.к. программа на ПК отказывается компилироваться с беззнаковой 64-разрядной переменной, некоторые функции ругаются на несоответствие типов. Число в микроконтроллере постепенно увеличивается от 0 до 4294967296, затем снова сбрасывается в ноль и снова увеличивается. На стороне ПК отображается принятое число от 0 до 2147483648, затем от - 2147483647 и до 0, хотя уже здесь есть вопросы, т.к. для 64-разрядного числа рановато наступает заполнение знакового бита. Ну, допустим, библиотечная функция в программе на ПК приводит 64-разрядный аргумент к 32-разрядному, тогда ладно... После этого я беру 64-разрядное число в контроллере, и перед отправкой делю его на 1000. В этом случае число на ПК должно увеличиваться от 0 до 4294967, и затем снова сбрасываться в ноль и т.п., т.к. знаковый бит будет не заполнен. Однако в реальности На стороне ПК отображается принятое число от 0 до 2147483, затем от - 2147483 и до 0. Тут я в ступоре, т.к. не могу понять, откуда это берётся? Может быть кто-нибудь сталкивался? Архитектура микроконтроллера Cortex-M0, т.е. для создания и обработки 64-разрядных переменных компилятор что-то химичит с двумя 32-разрядными переменными... |
|||
|
||||
Romikgy |
|
|||
Любитель-программер Профиль Группа: Участник Клуба Сообщений: 7325 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 3 Всего: 146 |
попробовать для дебага открпавлять этоже значение с контроллера на уарт, или посмотреть эзернет сниферов что именно в пакете....
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
baldman88 |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: 1 Всего: 7 |
Попробуйте на ПК, во время использования переменной, принудительно приводить ее к беззнаковому типу (просто поставьте перед ней (uint64_t)). Должно помочь, так как в двоичном виде число приходит правильно, но за счет того, что ПК трактует его как int64_t, получаются такие вещи.
Это сообщение отредактировал(а) baldman88 - 16.6.2016, 15:05 |
|||
|
||||
baldman88 |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: 1 Всего: 7 |
Кстати, у Вас число в пределах uint32_t (4294967296), так что лучше преобразовывать к нему, а не к uint64_t.
|
|||
|
||||
Курсант |
|
|||
Опытный Профиль Группа: Участник Сообщений: 338 Регистрация: 21.2.2009 Где: Балашиха или Воро неж Репутация: нет Всего: 4 |
Спасибо за ответы!
Вы сейчас забросаете меня помидорами, но причина в компиляторе. Функция, возвращающая тип данных uint64_t обрезает старшие 32 разряда возвращаемого значения... Компилятор Keil, версия среды 5.11. Может быть, конечно, и я ошибся, но всё указывает на то, что возвращаемое значение не то, что стоит в операторе return, а обрезанное. |
|||
|
||||
baldman88 |
|
||||
Бывалый Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: 1 Всего: 7 |
Давайте по порядку.
1. Для значений от 0 до 4294967296 достаточно иметь поле uint32_t. Так что, если даже компилятор и обрезает старшие биты (в это верится с трудом), то это ни на что, в данном случае, не влияет. Если есть возможность заменить это поле с uint64_t на uint32_t то можно получить некоторые приимущества. Во-первых, компилятор не будет ничего химичить. Во-вторых, пусть и не существенно, но экономится память. 2. Исходя из вот этого:
Ради интереса скомпилируйте и запустите вот это:
Чтобы лучше разобраться -- почитайте про представление знаковых чисел. Это сообщение отредактировал(а) baldman88 - 17.6.2016, 07:43 |
||||
|
|||||
Курсант |
|
||||
Опытный Профиль Группа: Участник Сообщений: 338 Регистрация: 21.2.2009 Где: Балашиха или Воро неж Репутация: нет Всего: 4 |
Хммм... Опять не понятно...
Вот такой кусок кода:
Приводит к тому, что в tmpTime записывается значение 0xFFFFFFFFAEA54000, а должно быть 0x00000002AEA54000... Что это за хрень? З.Ы. Проблема решена.
|
||||
|
|||||
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)" | |
|
На данный раздел помимо Правил форума распространяются текже следующие правила:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |