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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> STM32F0xxx USB без HAL
AHTOXA
сообщение Oct 25 2016, 10:21
Сообщение #16


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Kabdim @ Oct 25 2016, 13:10) *
Код
typedef struct {
    uint16_t value;
} __attribute__((packed)) unaligned_uint16;

((unaligned_uint16*)bla_bla).value = ...;

В вашем решении много битовых операций на ровном месте.

Да ладно вам стращатьsm.gif Современные компиляторы отлично оптимизируют конструкции вида
Код
    *(tmpbuf + 2) = totallen & 0xFF;
    *(tmpbuf + 3) = totallen >> 8;

Думаю, что код, сгенерированный компилятором в вашем варианте и в этом будет эквивалентен. Зато этот вариант понятнее, к тому же он переносим.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 25 2016, 10:26
Сообщение #17


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (johnshadow @ Oct 25 2016, 11:49) *
memcpy при оптимизациях Os\O3 меня уже пару раз подводила.
Интересно. Когда подведет еще раз - выложите сюда, вероятнее всего вы просто не умеете ее готовить.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Oct 25 2016, 11:41
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(AHTOXA @ Oct 25 2016, 13:21) *
Да ладно вам стращатьsm.gif Современные компиляторы отлично оптимизируют конструкции вида

Поинт был не в том. sm.gif Согласен что эффективность будет одинаковая. Но читать код как у ТСа мне хуже чем другие варианты. Я его просто буду раз десять перечитывать что бы точно убедится что не меняется порядок байт, в др. вариантах назначение кода сразу очевидно. Во-вторых в варианте ТСа куча чисел. В спокойной обстановке всё конечно ясно, но порой код редактирует, к примеру, коллега автора и находится он не в лучшем состоянии ума и тогда возможны любые чудеса - уже испытывал это.

Цитата(AHTOXA @ Oct 25 2016, 13:21) *
Зато этот вариант понятнее, к тому же он переносим.

Для упрощения примера я вставил сразу gcc'шный вариант, но в боевом это макросы в зависимости от платформы. Так что упакованная структура так же переносима.
Go to the top of the page
 
+Quote Post
johnshadow
сообщение Oct 25 2016, 13:03
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 25-09-08
Пользователь №: 40 477



Цитата(Сергей Борщ @ Oct 25 2016, 13:26) *
Интересно. Когда подведет еще раз - выложите сюда, вероятнее всего вы просто не умеете ее готовить.

Возможно. Мне тяжело сейчас предоставить "живой" пример - дело было два-три года назад.
Помню, что ошибка проявлялась при совместном использовании оптимизации по размеру и LinkTimeOptimization (Os и flto).
Проект был по CooCox и они только добавили опцию LTO у себя в настройках компиляции.
Обошел ее используя не библиотечную реализацию:
Код
__attribute__((used)) void * memcpy(void * d1, const void * s1, size_t n) {
    char * d;
    const char * s;
    volatile size_t n1 = n;
    s = s1;
    d = d1;
    while (n1--)
        *d++ = *s++;
    return d1;
}

"помогало" именно создание volatile'ной переменной и дальнейшая работа с ней.
в противном случае (при использовании аргументной переменной n) бесконечно висел в while - уменьшение переменной не происходило.
причем висело не в моем коде, а внутри функций freertos (тогда то ли 6, то ли 7 версии).
понимаю, что это все выглядит как рассказ про йети, но... laughing.gif

Go to the top of the page
 
+Quote Post
Kabdim
сообщение Oct 25 2016, 13:11
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Удалил, попутал со знаковым переполнением.
Go to the top of the page
 
+Quote Post

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

 


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


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