реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Сколько тактов выполнится код
tvilsa
сообщение Mar 20 2009, 08:48
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 27-01-09
Пользователь №: 43 990



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

CODE

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



Несмог понять в руководстве пользователя сколько тактов займет выполнение цикла.
Помогите люди добрые.
Заранее спасибо.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Mar 20 2009, 09:10
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 20 2009, 21:39
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Если используете IAR, то запустите его симулятор и посмотрите счетчик циклов. А вообще для таких случаев следует приводить ассемблерный листинг, а не Си-шный.
Go to the top of the page
 
+Quote Post
zhevak
сообщение Mar 21 2009, 14:25
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Вот так код будет прозрачнее, а результат работы -- тот же.
Код
void delay_ms(unsigned int a)
{
  while (0 != --a)
   ;
}


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
SSerge
сообщение Mar 21 2009, 16:24
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



У IAR есть встроенные функции, они определены в intrinsics.h
в том числе и
__intrinsic void __delay_cycles(unsigned long __cycles);
присутствует в версиях по крайней мере начиная с 3.42, возможно и чуть раньше.

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


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 23 2009, 03:52
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(zhevak @ Mar 21 2009, 19:25) *
Вот так код будет прозрачнее, а результат работы -- тот же.


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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
tvilsa
сообщение Mar 23 2009, 04:15
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 27-01-09
Пользователь №: 43 990



Цитата(SSerge @ Mar 21 2009, 20:24) *
У IAR есть встроенные функции, они определены в intrinsics.h
в том числе и
__intrinsic void __delay_cycles(unsigned long __cycles);
присутствует в версиях по крайней мере начиная с 3.42, возможно и чуть раньше.

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


Вот это то что надо.
Спасибо всем.
Go to the top of the page
 
+Quote Post
Allregia
сообщение May 20 2009, 15:47
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



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


Подскажите, плиз, где оно там?
Только начал (причем сегодня smile.gif) работать с 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
Go to the top of the page
 
+Quote Post
SSerge
сообщение May 20 2009, 16:17
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



У Вас генератор XT2 не успел запуститься, поэтому не произошло переключение MCLC на него.
Процессор по-прежнему тактируется от DCO.
Нужно дождаться запуска генератора (бит OFIFG), только потом переключаться.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
rezident
сообщение May 20 2009, 19:15
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Allregia @ May 20 2009, 21:47) *
Подскажите, плиз, где оно там?
См. скриншот.
Цитата(Allregia @ May 20 2009, 21:47) *
Кварц 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
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Allregia
сообщение May 20 2009, 20:08
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(rezident @ May 20 2009, 22:15) *
См. скриншот.


Спасибо. Я уже нашел в принципе, что 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 отладчиком.
Go to the top of the page
 
+Quote Post
rezident
сообщение May 20 2009, 21:10
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Allregia @ May 21 2009, 02:08) *
Я уже нашел в принципе, что NOP это 5 циклов.
С дуба рухнули? 07.gif Пардон за эмоции. NOP это один цикл/такт!
Цитата(Allregia @ May 21 2009, 02:08) *
Ошибка в том, что я не жду в цикле сброса OFIFG перед тем как идти дальше ?
Да. Пока OFIFG не сбросится (генерация кварца не будет устойчивой) MCLK на тактирование от XT2 (XT1) не переключится, несмотря на любое принудительное изменение состояния битов SELMx в регистре BCSCTL2. По умолчанию (после сброса или подаче питания) MCLK от внутреннего DCO работает. А DCO на частоте около 900кГц запускается.
Цитата(Allregia @ May 21 2009, 02:08) *
Но судя по всему, работает оно у меня нормально.
Угу, работает. Только не от 8МГц кварца. Если бы MCLK тактировался от 8МГц, то вы бы наблюдали импульсы 0,75мкс (6 тактов) и 1мкс (8 тактов). А так вы записью в BCSCTL1 битов RSELx увеличили частоту DCO до (примерно) 3.1МГц и работаете на DCO. См. фрагмент из даташита в аттаче.
Цитата(Allregia @ May 21 2009, 02:08) *
Если это на что-то влияет - питание подано все время, работаю с JTAG отладчиком.
Вообще-то, если внимательно читать мой ответ в сообщении #3, который вы процитировали в своем вопросе, то я там писал про симулятор, а не про эмулятор (JTAG отладчик). И скриншот в сообщении #10 соответственно тоже в режиме симулятора снят.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Allregia
сообщение May 21 2009, 04:33
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(rezident @ May 21 2009, 00:10) *
С дуба рухнули? 07.gif Пардон за эмоции. NOP это один цикл/такт!


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


Не горячитесь smile.gif Этот момент я тоже понял. Вчера специально переключался из эмулятора в симулятор, но не нашел де циклы считаются - потому и спросил.
Go to the top of the page
 
+Quote Post
SSerge
сообщение May 21 2009, 04:42
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



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


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Allregia
сообщение May 21 2009, 07:51
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(SSerge @ May 21 2009, 07:42) *
Кстати, желание обязательно переключиться на тактирование от кварца - это тоже типичное для начинающих работу с 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 на прерывание часов).

А прав ли я ? smile.gif
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01502 секунд с 7
ELECTRONIX ©2004-2016