Чтение MSP430 IO зарегистрироваться слишком быстро? - PullRequest
3 голосов
/ 01 января 2012

Я работаю в системе, где MSP430 обменивается данными с другим чипом по своей шине SPI. Я посылаю серию команд настройки через шину SPI и опрашиваю линию готовности ведомого чипа. Я использую IAR в качестве своей IDE и компилирую код без какой-либо оптимизации. Код выглядит примерно так:

for(int i = 0; i < NUM_SETUP_COMMANDS; i++)
{
    SendSetupCommand(); //puts data in SPI Tx buffer, sets Chip select low

    while(P1IN & 0x40) //wait for Chip ready line to go low
    {
        for(int x; x < 1024; x++)
        { 
            //do nothing 
        }
    }

    HandleReadyLine(); //Transmit/Receive data on SPI bus
 }

С и без пустого внутреннего цикла for этот код работает правильно. Все установочные сообщения передаются по шине SPI правильно. Без внутреннего цикла for этот блок кода занимает около 10 секунд. С внутренним циклом for этот кодовый блок занимает около 100 мс.

Кажется, что чтение P1IN как можно быстрее, без внутреннего цикла for, приводит к тому, что P1IN не обновляется так быстро. Есть ли в этом смысл? Есть ли явная причина, по которой добавление / удаление внутреннего цикла for может привести к такому резкому изменению синхронизации?

Ответы [ 2 ]

1 голос
/ 14 сентября 2012

Цикл, вероятно, оптимизирован.Один из способов убедиться, что он не оптимизирован, - это предварительно выполнить фиктивные вычисления, такие как

for(int i = 0; i < NUM_SETUP_COMMANDS; i++)
{
    SendSetupCommand(); //puts data in SPI Tx buffer, sets Chip select low

    while(P1IN & 0x40) //wait for Chip ready line to go low
    {
        volatile unsigned int i;
        for(int x; x < 1024; x++)
        { 
            j++; 
        }
    }
    HandleReadyLine(); //Transmit/Receive data on SPI bus
}

. Ключом здесь является ключевое слово "volatile", которое запрещает оптимизацию переменной j компилятором, поэтому ваш цикл не долженбыть удаленным.

1 голос
/ 01 января 2012

Это не должно иметь никакого значения.

Несколько предложений по отладке:

Я бы предложил сократить итерации внутреннего цикла до нуля, чтобы увидеть, изменит ли это время системы.Также попробуйте поменять местами внутренний цикл на nop и посмотрите, имеет ли это тот же эффект.Вы также можете взглянуть на сгенерированную сборку и посмотреть, есть ли что-нибудь очевидное между двумя компиляциями.Наконец, (если вы можете) охватить строки SPI и посмотреть, есть ли разница в поведении между ними.

...