Обеспечение записи в память перед выполнением более позднего кода - PullRequest
0 голосов
/ 02 сентября 2018

Я пишу код, который запускает DMA. Как только DMA завершит свою работу, он вызовет ISR_Routine. Проблема в том, что я хочу убедиться, что refreshComplete установлен на 0 до запуска DMA. Если DMA запускается первым до того, как refreshComplete будет установлено на 0, то возможно, что ISR_Routine будет вызван первым, в результате чего refreshComplete будет 0 даже после успешного выполнения DMA. Это означает, что функция ready() всегда будет возвращать 0, блокируя дальнейшее использование DMA.

Код, который я сейчас написал, состоит в том, что переменная refreshComplete равна volatile, и я занят, пока переменная чтения не будет 0, прежде чем DMA будет работать следующим образом:

volatile uint8 refreshComplete = 0u;

void trigger(void)
{
    /* Write 0 and then busy wait */
    refreshComplete = 0;
    while (refreshComplete != 0);

    /* Code to start the DMA */
    ...
}

/* ISR called once the DMA has completed its operation */
void ISR_Routine(void)
{
    refreshComplete = 1u;
}

/* Function to check the status of the DMA */
uint8 ready(void)
{
    return refreshComplete;
}

Есть ли способ, которым я всегда могу гарантировать, что код для установки refreshComplete всегда выполняется перед кодом для настройки и запуска DMA?

1 Ответ

0 голосов
/ 03 сентября 2018

Это точка, где вы должны посмотреть информацию об архитектуре процессора и набор инструкций.

Вы найдете DMB, DSB и ISB, возможно, также несколько других в зависимости от того, насколько продвинут ваш процессор. Они относятся к обеспечению порядка передачи данных и инструкций, относящихся к другим инструкциям (следовательно, DMB, ISB является обычной последовательностью). Конечно, если вы используете их в «С», вам также следует позаботиться о гарантиях упорядочения языка.

...