21

Re: STM32, CubeMX, Keil, навчання.

Звітую. Виявляється все надзвичайно просто. Схоже, що автор на гітхабі має просто ще не тестовану версію. Він там схоже забув про дужки.
В такому варіанті все працює
    _PointData ? (PointData = 0x80) : (PointData = 0);        //=
    !(_Hours / 10) ? (Time[0] = 10) : (Time[0] = (_Hours / 10));    //=
------
Ось такий варіант теж працює
    _PointData ? (PointData |= 0x80) : (PointData &= (~0x80));    //=
На жаль я не майстер дебажити асемблерні коди, але я так думаю, що цей варіант буде швидший. Хоча навіщо тут швидкість.

До речі, через if, теж все гарно працює.

Отже, дякую всім, хто долучився. Приємно знати, що в колі друзів хтось завжди прийде на допомогу.

Цю недоробку обговорювали і в нашій групі, там теж розглядались різні варіанти. Хто бажає - долучайтесь до групи. https://www.facebook.com/groups/DIYElUk … 7259257158

22 Востаннє редагувалося koala (15.02.2021 21:55:15)

Re: STM32, CubeMX, Keil, навчання.

mykola_sa написав:
    _PointData ? (PointData = 0x80) : (PointData = 0);        //=
    !(_Hours / 10) ? (Time[0] = 10) : (Time[0] = (_Hours / 10));    //=

У такій формі це не відрізняється від звичайного if, але виглядає гірше.

mykola_sa написав:

На жаль я не майстер дебажити асемблерні коди, але я так думаю, що цей варіант буде швидший.

Не буде він швидшим. Просте присвоювання - це:
1. Можливо, читання з пам'яті в регістр константи (залежить від платформи, може й прямо з коду)
2. Запис з регістру в пам'ять.
Бітові операції - це:
1. Можливо, читання з пам'яті в регістр константи;
2. Читання з пам'яті змінної;
3. Бітова операції на регістрах (2 і 3 можуть бути в одну операцію, але все одно доступ до пам'яті);
4. Запис з регістру в пам'ять.
Таким чином, другий варіант - це зайві 1-2 операції і доступ до пам'яті.

23 Востаннє редагувалося ReAl (15.02.2021 22:13:37)

Re: STM32, CubeMX, Keil, навчання.

koala написав:

Таким чином, другий варіант - це зайві 1-2 операції і доступ до пам'яті.

Лише якщо десь volatile затесалося, і то треба ще подумати, як "затесати", щоб це впливало.
Інакше абсолютно однаково, компілятори давно навчилися добре працювати з семантикою.

p.s. Конкретно в обговорюваному коді конкретно у такій формі тернарні непотрібні.
Але у вже згаданій

Time[0] = _Hours / 10 ? _Hours / 10 : 10;

цілком зручно.
А gcc взагалі дозвляє

Time[0] = _Hours / 10 ?: 10;

Іі після звикання ця ідіома чудово читається, особливо в місцях типу

char *p = name ?: "unknown";

замість

if (name)
    p = name;
else
    p = "unknown";
Подякували: leofun011