Перейти к содержанию
    

Сколько тактов выполнится код

Всем привет.

Использую задержку ввиде

 

delay_ms(unsigned int a)
{
volatile unsigned int b;
  b=a;                          
  do b--;
  while (b != 0);
}

 

 

Несмог понять в руководстве пользователя сколько тактов займет выполнение цикла.

Помогите люди добрые.

Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выкладывайте листинг, т.к. он зависит от уровня оптимизации

Тогда можно сказать конкретно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если используете IAR, то запустите его симулятор и посмотрите счетчик циклов. А вообще для таких случаев следует приводить ассемблерный листинг, а не Си-шный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот так код будет прозрачнее, а результат работы -- тот же.

void delay_ms(unsigned int a)
{
  while (0 != --a)
   ;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У IAR есть встроенные функции, они определены в intrinsics.h

в том числе и

__intrinsic void __delay_cycles(unsigned long __cycles);

присутствует в версиях по крайней мере начиная с 3.42, возможно и чуть раньше.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот так код будет прозрачнее, а результат работы -- тот же.

 

Ой не факт. Обратите внимание на volatile b в исходном примере.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У IAR есть встроенные функции, они определены в intrinsics.h

в том числе и

__intrinsic void __delay_cycles(unsigned long __cycles);

присутствует в версиях по крайней мере начиная с 3.42, возможно и чуть раньше.

 

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

 

Вот это то что надо.

Спасибо всем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если используете IAR, то запустите его симулятор и посмотрите счетчик циклов. А вооб

 

Подскажите, плиз, где оно там?

Только начал (причем сегодня :)) работать с IAR и вообще 430-м (до того было много других). Ничал как обычно - "помигать светодиодом", т.е. "подергать ножкой.

 

Вот такой код:

        
  while(1){
          _NOP();
          LEDS_OFF;
          _NOP();
          LEDS_ON;

 

в асме выглядит так:

 
          _NOP();
0040AC   0343          nop     
          LEDS_OFF;
0040AE   F2D01F003100  bis.b   #0x1F,&P5OUT
          _NOP();
0040B4   0343          nop     
          LEDS_ON;
0040B6   F2F0E0003100  and.b   #0xE0,&P5OUT
0040BC   F73F          jmp     0x40AC

 

Смотрю осциллографом на ножке - 1.88/2.48 мкс.,

Это что получается, проц, работающий на 8мгц столько времени это выполняет?!

 

Кварц 8мгц подлючен к XT2, настройки такие:

        // Clock init
    BCSCTL1 = 7;                          // Turn on XTL2
    BCSCTL2 = 0x88;                   // SMCLK = XTL2
      __bic_SR_register(SCG1);                // Turn on SMCLK

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У Вас генератор XT2 не успел запуститься, поэтому не произошло переключение MCLC на него.

Процессор по-прежнему тактируется от DCO.

Нужно дождаться запуска генератора (бит OFIFG), только потом переключаться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, плиз, где оно там?
См. скриншот.

Кварц 8мгц подлючен к XT2, настройки такие:
У вас типовая ошибка для начинающих работать с MSP430. Читайте внимательно в User's Guide раздел Basic Clock Module Operation подраздел Sourcing MCLK from a Crystal. Вот тут даже по-русски. http://www.gaw.ru/html.cgi/txt/doc/micros/msp430/arh/4_2.htm

post-3882-1242846977_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

См. скриншот.

 

Спасибо. Я уже нашел в принципе, что NOP это 5 циклов.

 

У вас типовая ошибка для начинающих работать с MSP430. Читайте внимательно в User's Guide раздел Basic Clock Module Operation подраздел Sourcing MCLK from a Crystal. Вот тут даже по-русски. http://www.gaw.ru/html.cgi/txt/doc/micros/msp430/arh/4_2.htm

 

Ошибка в том, что я не жду в цикле сброса OFIFG перед тем как идти дальше ?

Но судя по всему, работает оно у меня нормально.

Если это на что-то влияет - питание подано все время, работаю с JTAG отладчиком.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я уже нашел в принципе, что NOP это 5 циклов.
С дуба рухнули? :07: Пардон за эмоции. NOP это один цикл/такт!

Ошибка в том, что я не жду в цикле сброса OFIFG перед тем как идти дальше ?
Да. Пока OFIFG не сбросится (генерация кварца не будет устойчивой) MCLK на тактирование от XT2 (XT1) не переключится, несмотря на любое принудительное изменение состояния битов SELMx в регистре BCSCTL2. По умолчанию (после сброса или подаче питания) MCLK от внутреннего DCO работает. А DCO на частоте около 900кГц запускается.

Но судя по всему, работает оно у меня нормально.
Угу, работает. Только не от 8МГц кварца. Если бы MCLK тактировался от 8МГц, то вы бы наблюдали импульсы 0,75мкс (6 тактов) и 1мкс (8 тактов). А так вы записью в BCSCTL1 битов RSELx увеличили частоту DCO до (примерно) 3.1МГц и работаете на DCO. См. фрагмент из даташита в аттаче.

Если это на что-то влияет - питание подано все время, работаю с JTAG отладчиком.
Вообще-то, если внимательно читать мой ответ в сообщении #3, который вы процитировали в своем вопросе, то я там писал про симулятор, а не про эмулятор (JTAG отладчик). И скриншот в сообщении #10 соответственно тоже в режиме симулятора снят.

post-3882-1242853786_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С дуба рухнули? :07: Пардон за эмоции. NOP это один цикл/такт!

 

Да понял я, понял. Сейчас проверю.

Вообще-то, если внимательно читать мой ответ в сообщении #3, который вы процитировали в своем вопросе, то я там писал про симулятор, а не про эмулятор (JTAG отладчик). И скриншот в сообщении #10 соответственно тоже в режиме симулятора снят.

 

Не горячитесь :) Этот момент я тоже понял. Вчера специально переключался из эмулятора в симулятор, но не нашел де циклы считаются - потому и спросил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, желание обязательно переключиться на тактирование от кварца - это тоже типичное для начинающих работу с MSP. Далеко не всегда это необходимо. Если для UART-а или таймеров нужен точный клок - в Вашем распоряжении SMCLK или ACLK, а проц может и от DCO тактироваться.

Я и сам в первый раз тоже потратил на это пару дней, пока не сообразил что это лишнее и только мешает уходить в спячку и потом просыпаться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, желание обязательно переключиться на тактирование от кварца - это тоже типичное для начинающих работу с MSP. Далеко не всегда это необходимо. Если для UART-а или таймеров нужен точный клок - в Вашем распоряжении SMCLK или ACLK, а проц может и от DCO тактироваться.

 

Хорошо, тогда посоветуйте как быть (я начинающий с 430).

Проц работает в 2-х режимах - в рабочем и в дежурном.

Дежурный - тут надо только чтобы часы шли и проверялось нажатие кнопки "Вкл".

Т.е. минимальное потребление, работа от часового кварца.

 

Рабочий - тут нужна максимальная скорость процессора, точное тактирование АЦП и УАРТА.

 

Я полагаю, кварц 32кгц на XT1 , 8мгц - на XT2 и переключаться между ними:

дежурный режим - MCLK=XT1, SMCLK=OFF, ACLK=XT1 (от него Timer B на прерывание часов).

рабочий режим - MCLK=XT2, SMCLK=XT2 (от него UART и Timer A, по которому АЦП), ACLK=XT1 (от него Timer B на прерывание часов).

 

А прав ли я ? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...