ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
20 апреля
1005260 Топик полностью
fk0, легенда (17.05.2020 13:09, просмотров: 765) ответил RxTx на Я пока что в командировке, так что "решено" это условно, временно. Я к тому так написал чтобы не ломали голову из-за меня, как бы не тратили энергию. Но если есть какие-то мысли, конечно пишите. Приеду домой, буду разбираться, трассировать времянки итд. "Решено" так: сделал код прерывания как можно более коротким, просто запись в ring buffer. Об этом писал здесь: и один из UART'ов у меня уже был так построен. Этот (отладочную консоль) я перевел, остался еще один,
Кстати в любой функции оперирующей с указателями на данные доступными из нескольких потоков (тот же ring buffer) можно запросто нарваться на перестановку порядка обращения к переменным. И volatile не поможет: gcc все эти volatile аккуратненько вынесет в конец функции и там запишет в том же порядке. Я на когда такое впервые увидел, чуть не рехнулся пока баг разгадывал. Поэтому после изменения указателей или после записи данных перед продвижением указателя нужно обязательно 

вставлять ручками memory barrier. На многоядерных системах ещё нужно память между ядрами насильно синхронизировать через спец. инструкцию процессора. Барьером (для одноядерных) в принципе является вызов любой функции и это наверное оптимальный вариант для кроссплатформенности. Либо писать asm volatile("": : :"memory") , либо __sync_synchronize(), но это уже компиляторо-специфично.

[ZX]