Chum_A (10.04.2013 18:11, просмотров: 5248)
Кто силён в эксклюзивном доступе к памяти в 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)); // локальный "хвост" в "глобальный"
Оно, вроде, как-то работает. Вопрос, что здесь не так или что лишнее?