DmitryTDF 0 24 января, 2017 Опубликовано 24 января, 2017 · Жалоба Здравствуйте! Пишу для STM32F4xx некоторые фрагменты кода на ассемблере. При объявлении в подключаемом файле констант, заметил, что маски по ИЛИ не всегда работают. Например: ... #define OBJECT_CLASS_PIPE 1 << 16;Класс объекта - канал сообщений ... #define OBJECT_SUBCLASS_PIPE_BYTE 1 << 24;Субкласс объекта - канал, работающий с байтами ... #define RE 1;Флаг, символизирующий о том, что буфер пуст ... Использую в коде: ... LDR R0,=OBJECT_CLASS_PIPE|OBJECT_SUBCLASS_PIPE_BYTE|RE ... В отладчике, в результате выполнения инструкции, в R0 оказывается 0x00010000, а должно быть 0x01010001 При перестановке некоторых масок местами: ... LDR R0,=RE|OBJECT_CLASS_PIPE|OBJECT_SUBCLASS_PIPE_BYTE ... R0 становится равным 0x00010001, что уже немного лучше, нежели первый результат. Также заметил, что в случае присвоения этим же константам имен "const1", "const2", "const3" - в регистре R0 оказывается значение 0x01010001, то есть, правильное. Если кто-то сталкивался с подобным - как боролись? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 24 января, 2017 Опубликовано 24 января, 2017 · Жалоба В скобочки возьмите выражения в define. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryTDF 0 24 января, 2017 Опубликовано 24 января, 2017 (изменено) · Жалоба У вас комментарии тоже попадают в define. Уберите их на другую строку. Прошу прощения, получилось так, что убрал табуляции, расположенные перед точкой с запятой. На самом деле там есть отступ (в виде табуляций) ... #define OBJECT_CLASS_PIPE 1 << 16 ;Класс объекта - канал сообщений ... Изменено 24 января, 2017 пользователем DmitryTDF Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 24 января, 2017 Опубликовано 24 января, 2017 · Жалоба Я уже тоже поправил своё сообщение:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryTDF 0 24 января, 2017 Опубликовано 24 января, 2017 (изменено) · Жалоба Я уже тоже поправил своё сообщение:) Спасибо вам, сейчас попробую и напишу результат! UPD: Поместил значения в скобки: ... #define OBJECT_CLASS_PIPE (1 << 16) ;Класс объекта - канал сообщений ... Результат не изменился. Подозреваю, что все же что-то с ограничениями, накладываемыми на имена констант (подчеркивания, "длинные" имена и пр.) Изменено 24 января, 2017 пользователем DmitryTDF Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 24 января, 2017 Опубликовано 24 января, 2017 · Жалоба Проглядел, это asm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 24 января, 2017 Опубликовано 24 января, 2017 · Жалоба Результат не изменился. Подозреваю, что все же что-то с ограничениями, накладываемыми на имена констант (подчеркивания, "длинные" имена и пр.) Тогда всё же попробуйте убрать комментарии. -- Почитал повнимательнее первоначальный вопрос. Если при смене имён вы получаете правильный результат, то дело наверное в них. То есть, ваша теория насчёт каких-то ограничений на имена, скорее всего, верна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 24 января, 2017 Опубликовано 24 января, 2017 · Жалоба У вас комментарий тоже в #define лезет, вот всякая кака и получается! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DmitryTDF 0 25 января, 2017 Опубликовано 25 января, 2017 (изменено) · Жалоба У вас комментарий тоже в #define лезет, вот всякая кака и получается! Комментарий отделен от определения табуляциями, в первом посте табуляции не скопировались, дело точно не в этом. Пока промежуточным решением использую короткие имена констант, но это, безусловно, не лучший вариант. Господа АНТОХА и Эдди, большое спасибо вам за наводки. Все заработало, причина была действительно в комментариях, расположенных в одной строке с именами и значениями констант. Препроцессор немного глючный, писать строки с комментариями нужно всегда перед строкой с константой, но в любом случае, не на одной строке, даже после точки с запятой. UPD: Проверил: также объявления корректно работают с комментариями, оформленными в C-style. Будьте внимательны: #define constX Y<Y..> //Комментарий - будет работать корректно, #define constX Y<Y..>;Комментарий - не будет работать корректно. Изменено 25 января, 2017 пользователем DmitryTDF Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться