-
- volatile-указатели на данные записывались в конце функции, в том
порядке, как они писались в функции. Но данные писались независимо
в теле функции. Т.е. данные писались, указатели не двигались. А
потом на выходе подвинулись указатели, ровно так как они должны
были бы подвинуться пока писались данные. Идея в том, что gcc не
пишет volatile переменные, а пишет их значения в регистры (коих у
мипса дофига). А потом перед выходом эти регистры натурально
записывает в память. - fk0(17.05.2020 14:01)
- То есть забыли добавить volatile в объявление "uint8_t fifo[];"?
Расплата вполне заслуженная. - SciFi(17.05.2020 14:05)
- Если добавлять volatile для всей памяти -- это будет треш, угар и содомия (при просмотре дизассемблера -- крайне неоптимальный код). Так делать не нужно. Потом возникает другая проблема -- вся область памяти становится несовместимой (без постоянных reinterpret_cast'ов) с обычными указателями и всеми интерфейсами в программе. Вообще volatile не нужен. Достаточно вставлять memory barrier. В случае кольцевого буфера: после записи данных и перед измененим указателя записи, и fk0(392 знак., 17.05.2020 14:20, ссылка)
- То есть забыли добавить volatile в объявление "uint8_t fifo[];"?
Расплата вполне заслуженная. - SciFi(17.05.2020 14:05)
- volatile-указатели на данные записывались в конце функции, в том
порядке, как они писались в функции. Но данные писались независимо
в теле функции. Т.е. данные писались, указатели не двигались. А
потом на выходе подвинулись указатели, ровно так как они должны
были бы подвинуться пока писались данные. Идея в том, что gcc не
пишет volatile переменные, а пишет их значения в регистры (коих у
мипса дофига). А потом перед выходом эти регистры натурально
записывает в память. - fk0(17.05.2020 14:01)