ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
401193
Chum_A (10.04.2013 18:11, просмотров: 5244)
Кто силён в эксклюзивном доступе к памяти в Cortex M3 гляньте на досуге, до этого ни разу не пользовал. С меня "респект и уважуха" :) Есть процедура записи структуры в кольцевой буфер и она вызывается и из main и из прерывания. Было реализовано так: __disable_irq(); // получаем указатель на структуру в "хвосте" буфера event = &queue->Events[queue->eventTail]; // пишем в структуру event->eventID = ID; event->eventParam = Param; // двигаем "хвост" if (++queue->eventTail == EVENT_TABLE_SIZE) queue->eventTail = 0; __enable_irq(); Cтрадания с эксклюзивным доступом такие: do { tail = __ldrex(&queue->eventTail); // вычитываем "хвост" в "локальный хвост" event = &queue->Events[queue->eventTail]; // получаем указатель на структуру в "хвосте" буфера if(__strex(tail, &queue->eventTail)) continue; // "хвост" возможно поменялся, указатель надо перечитывать if( tail == __ldrex(&queue->eventTail) ) // если "хвост" не поменялся, можно пробовать писать { if(__strex(eventID, &event->ID)) continue; } if( tail == __ldrex(&queue->eventTail) ) { if( __strex(Param, &event->eventParam) ) continue; } if( tail == __ldrex(&queue->eventTail) ) { if (++tail == EVENT_TABLE_SIZE) // если "хвост" не менялся, двигаем локально tail = 0; } else continue; } while(__strex(tail, &queue->eventTail)); // локальный "хвост" в "глобальный" Оно, вроде, как-то работает. Вопрос, что здесь не так или что лишнее?