реклама на сайте
подробности

 
 
> STM32F10x USART 7Bit word_len, Отсутствует 7-ми битный режим...
demiurg_spb
сообщение Mar 19 2013, 05:44
Сообщение #1


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Стал портировать модбас ASCII на железку с STM32F10x и облом...
Не реализована поддержка 7-ми битного режима в этой серии кристаллов (есть только 8,9 бит и 7 бит в режиме LIN).

Есть у кого-нибудь идеи как сие можно побороть?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Mar 19 2013, 06:02
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Так а другого варианта не просматривается ... ))
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Mar 19 2013, 06:35
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Хорошо. К вопросу о быстрых способах вычисления количества единиц (нулей) в байте...
Поглядел на cortex-m3 instruction set и не смог найти ничего подходящего по данной теме (ну кроме CLZ и Bitfield Instructions)...
Есть хорошо известный табличный метод:
Код
uint_fast8_t bits_in_byte(uint_fast8_t byte)
{
        static const uint_fast8_t matrix[] =
        {
                0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3,
                4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4,
                4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2,
                3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5,
                4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4,
                5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3,
                3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2,
                3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6,
                4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
                3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6,
                4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
        };

        return matrix[byte];
}

Есть-ли ещё более оптимальные и быстрые варианты?
Вспомнил про вариант для AVR (видимо его стоит творчески переработать под ARM):
Код
#define parity_even_bit(val)                \
(__extension__({                    \
    unsigned char __t;                \
    __asm__ (                    \
        "mov __tmp_reg__,%0" "\n\t"        \
        "swap %0" "\n\t"            \
        "eor %0,__tmp_reg__" "\n\t"        \
        "mov __tmp_reg__,%0" "\n\t"        \
        "lsr %0" "\n\t"                \
        "lsr %0" "\n\t"                \
        "eor %0,__tmp_reg__"             \
        : "=r" (__t)                \
        : "0" ((unsigned char)(val))        \
        : "r0"                    \
    );                        \
    (((__t + 1) >> 1) & 1);                \
}))


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 12:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.0141 секунд с 7
ELECTRONIX ©2004-2016