Jump to content

    

Arlleex

Свой
  • Content Count

    1038
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Arlleex

Контакты

  • Сайт
    http://
  • ICQ
    0

Recent Profile Visitors

2912 profile views
  1. Ваша правда, баг на ровном месте... Действительно поспешная корректировка. Верну назад. Благодарю за бдительность
  2. Тоже однажды хотел сравнить результаты вычислений 32 выражений и выдать предупреждение времени компиляции на чистом Си, но, взглянув на этого монстра, урезал осетра. А нужно это было для следующего. Есть массив регистров с битами включения определенных параметров (любой из 32 бит можно установить в 1) u32 REG[10]; Теперь идея заключалась в оптимизации количества доступов к этим регистрам: если нужно включить несколько параметров одновременно, то проще записать этот регистр с нужными битами сразу, а не по отдельности. Индекс нужного регистра и положение бита в нем определяются макросами #define REGIND(x) ((x)/32) // индекс регистра в массиве #define BITPOS(x) ((x)%32) // позиция бита в регистре Вот и хотелось разом определять, входят ли указываемые номера параметров (номера бит [0 - 320]), например, [10, 17 и 28] или [13, 45, 46] в один физический регистр, и, если входят, сформировать одну инструкцию записи нужных бит в нужный регистр. Не в run-time, а на этапе компиляции. В итоге, сделать это возможно, сравнивать нужно рассчитанные индексы регистров для каждого параметра. А, поскольку параметров может быть от 1 до 32 через запятую, нужно иметь 32 макроса, в каждом из которых проверяется от 1 до 32 входных параметров на равенство рассчитанных индексов в массиве регистров. Делать не стал (пока что).
  3. А что опять стало с редактируемыми постами? Можно вернуть для Своих право изменения своего поста в течение хотя бы 30 минут без вот этого вот внизу? Очень глаза мозолит, особенно если сообщение короткое и редактировалось ради запятой или исправления синтаксической ошибки... ИМХО, вполне достаточно оставить только вот это в шапке поста
  4. Я, в общем-то, сразу так и сделал, к тому же избавился от лишней переменной i static s32 HexToInt1(u32 Symb) { if((Symb = Symb - '0') > 9) { Symb = (Symb & ~0x20) - 7; if(Symb > 15) return -1; } return Symb; }
  5. artemkad, посмотрите мой ответ Сергею пару сообщениями выше. Повторюсь, этот код не сделает подобие a |= 5 << Mpos | 6 << Npos.
  6. Не понимаю, как Вы это делаете Шо то я сидел сидел, да не придумал, потому в лоб и накатал... Спасибо, оно работает!
  7. Неа, подаю символ 'F' на вход, получаю 5 =) Моя функция в исходном виде выше была предназначена для преобразования ASCII HEX-тетрады в двоичный вид. Причем, на вход подаются только символы '0'-'9', 'a'-'f' или 'A'-'F'. Однако, сейчас в голову стукнуло, что я пишу парсер протокола, в котором, на самом деле, все может быть... В итоге написал так static u32 HexToInt1(u32 Symb, u32 *IntBuf) { if(Symb >= '0' && Symb <= '9') {*IntBuf = Symb - '0'; return 0;} if((Symb >= 'a' && Symb <= 'f') || (Symb >= 'A' && Symb <= 'F')) {*IntBuf = (Symb & 0x7) + 9; return 0;} return 1; } В случае, если встретится запрещенный символ - функция вернет 1, иначе - 0, при этом записав адекватное преобразование в *IntBuf.
  8. Ну да. Но, все-таки, Symb будет рассматриваться как int, так?
  9. Приветствую! Допустим, есть функция static u32 HexToInt1(u8 Symb) { if(Symb <= '9') return Symb - '0'; else return (Symb & 0x7) + 9; } Есть правила, по которым сохраняются или неявно преобразуются типы представления переменных. 1. В условии if(Symb <= '9') тип выражения будет int, потому что '9' имеет этот тип, а все возможные значения u8 "влазят" в диапазон представления положительных значений int. 2. В операторе return Symb - '0' тип выражения будет int. Однако функция возвращает u32. Будет ли здесь иметь место какое-либо неявное преобразование? 3. Какой тип будут иметь выражения (Symb & 0x7) + 9 и return (Symb & 0x7) + 9?
  10. Конечно можно, насколько помню, такая инициализация называется инициализацией составным литералом (составные литералы были введены в C99). Правда, перед инициализатором нужно привести тип typedef struct { u32 a : 10; u32 b : 15; u32 : 7; }sREG; ... sREG a; a = (sREG){.a = 5UL, b = 3UL}; Однако все равно такой способ не подойдет, поскольку он пишет не просто структуру, а периферийный регистр, в котором есть и другие биты, состояние которых мне неведомо и трогать которые не нужно. Там же и резервные биты, о которых производитель может кричать "что бы там ни лежало, не трогайте и не меняйте их значение". В общем итоге, как я понял, одним выражением сделать чтение-модификацию-запись синтаксисом работы с битами структур не получится.
  11. В случае работы с битовыми полями структуры - да. В случае работы с предопределенными битовыми масками - не обязательно. Да и ассемблерный выхлоп я смотрю на минимальной и максимальной оптимизации. Я пишу под ARM Cortex-M3. Под атомарностью в целом можно понимать несколько несвязанных между собой операций: 1. Атомарная работа с одним или несколькими регистрами (LDR/LDRD/STR/STRD). 2. Атомарная работа с переменными в разделяемой среде, например, в многопоточной вытесняющей ОС (команды LDREX/STREX и средства синхронизации самой ОС). 3. Атомарная работа с битовыми группами с точки зрения языка Си. Вот последний вариант как раз я и подразумевал - я хотел одной строкой Си-кода инициализировать несколько битовых полей структуры. Язык этого не позволяет, поэтому я так и продолжил работать с за-#define-нными битовыми масками.
  12. AVRDRAGON помогите разобратся.

    А что в нем такого особенного? STM8S208, например. Вот щас посмотрел в Терраэлектронике - 173 рубля. А ATMega32M1 там и вообще уже только под заказ. В Чип и Дип 450 рублей. STM8S208 в 2.5 раза дешевле оказалась, по периферии примерно все то же самое. Разумеется, МК нужно выбирать под задачу, но не таких же уже "мамонтов" ставить... Впрочем, дело разработчика.
  13. AVRDRAGON помогите разобратся.

    Лучше переходить на что-то более современное; из дешевого, не уступающего параметрам AVR, а в чем-то даже прогрессивного, например, могу предложить STM8. А если нужно что-то покруче, при этом не сильно кусачее по цене, можно присмотреться к линейке XMC1000 от Infineon. ИМХО, рано или поздно империя AVR-микроконтроллеров падет, и не будет ни то что средств отладки, а самих МК.
  14. Я уже как-то притерся ко всем этим макросам и пользую их на ура. Но тут уж кому как удобно