Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Сколько тактов выполнится код
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
tvilsa
Всем привет.
Использую задержку ввиде

CODE

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



Несмог понять в руководстве пользователя сколько тактов займет выполнение цикла.
Помогите люди добрые.
Заранее спасибо.
MrYuran
Выкладывайте листинг, т.к. он зависит от уровня оптимизации
Тогда можно сказать конкретно.
rezident
Если используете IAR, то запустите его симулятор и посмотрите счетчик циклов. А вообще для таких случаев следует приводить ассемблерный листинг, а не Си-шный.
zhevak
Вот так код будет прозрачнее, а результат работы -- тот же.
Код
void delay_ms(unsigned int a)
{
  while (0 != --a)
   ;
}
SSerge
У IAR есть встроенные функции, они определены в intrinsics.h
в том числе и
__intrinsic void __delay_cycles(unsigned long __cycles);
присутствует в версиях по крайней мере начиная с 3.42, возможно и чуть раньше.

Если же писать самому, то это как раз тот случай когда есть смысл использовать ассемблер, тогда можно быть уверенным в результате независимо от оптимизации компилятора.
AHTOXA
Цитата(zhevak @ Mar 21 2009, 19:25) *
Вот так код будет прозрачнее, а результат работы -- тот же.


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

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


Вот это то что надо.
Спасибо всем.
Allregia
Цитата
Если используете 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
SSerge
У Вас генератор XT2 не успел запуститься, поэтому не произошло переключение MCLC на него.
Процессор по-прежнему тактируется от DCO.
Нужно дождаться запуска генератора (бит OFIFG), только потом переключаться.
rezident
Цитата(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
Allregia
Цитата(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 отладчиком.
rezident
Цитата(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 соответственно тоже в режиме симулятора снят.
Allregia
Цитата(rezident @ May 21 2009, 00:10) *
С дуба рухнули? 07.gif Пардон за эмоции. NOP это один цикл/такт!


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


Не горячитесь smile.gif Этот момент я тоже понял. Вчера специально переключался из эмулятора в симулятор, но не нашел де циклы считаются - потому и спросил.
SSerge
Кстати, желание обязательно переключиться на тактирование от кварца - это тоже типичное для начинающих работу с MSP. Далеко не всегда это необходимо. Если для UART-а или таймеров нужен точный клок - в Вашем распоряжении SMCLK или ACLK, а проц может и от DCO тактироваться.
Я и сам в первый раз тоже потратил на это пару дней, пока не сообразил что это лишнее и только мешает уходить в спячку и потом просыпаться.
Allregia
Цитата(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
rezident
Цитата(Allregia @ May 21 2009, 13:51) *
Дежурный - тут надо только чтобы часы шли и проверялось нажатие кнопки "Вкл".
Т.е. минимальное потребление, работа от часового кварца.
Кнопку повесьте на любой пин порта P1 или P2, у которых имеется возможность получить прерывание по изменению уровня на входе. Хотя раз у вас часы будут имитироваться, то в этом же "часовом" прерывании опросить состояние пина много времени не займет. В таком случае кнопка на любом пине может быть.
Цитата(Allregia @ May 21 2009, 13:51) *
Я полагаю, кварц 32кгц на XT1 , 8мгц - на XT2 и переключаться между ними:
дежурный режим - MCLK=XT1, SMCLK=OFF, ACLK=XT1 (от него Timer B на прерывание часов).
рабочий режим - MCLK=XT2, SMCLK=XT2 (от него UART и Timer A, по которому АЦП), ACLK=XT1 (от него Timer B на прерывание часов).
Неразумное решение. sad.gif Зачем переключаться между кварцевыми генераторами? Разработчики MSP430 не зря ведь три внутренних CLK придумали. LFXT у вас будет работать всегда, потому как часы. От LFXT будет генерироваться ACLK. Кстати, часы лучше на WDT повесить, а TimerB использовать для более полезных дел. XT2 нужно включать только тогда, когда он требуется для генерации SMCLK и работы UART. MCLK у вас всегда должен тактироваться от DCO, настроенного на высокую частоту. В таком случае гарантирован быстрый старт (единицы мкс) при переключении в рабочий режим и более надежная работа кристалла вообще (генератор-то внутренний!). К тому же уже неоднократно проверено, что "проснуться", быстро выполнить требуемые операции и снова "уснуть", менее энергозатратно, чем работать на низкой частоте тактирования, но выполнять операции более длительное время. Исключение могут составлять редкие случаи, в которых необходимо работу ядра синхронизировать с какими-то внешними событиями по опросу (без использования прерываний).
Allregia
Цитата(rezident @ May 21 2009, 18:49) *
Кнопку повесьте на любой пин порта P1 или P2, у которых имеется возможность получить прерывание по изменению уровня на входе. Хотя раз у вас часы будут имитироваться, то в этом же "часовом" прерывании опросить состояние пина много времени не займет. В таком случае кнопка на любом пине может быть.


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

Цитата
Неразумное решение. sad.gif Зачем переключаться между кварцевыми генераторами? Разработчики MSP430 не зря ведь три внутренних CLK придумали. LFXT у вас будет работать всегда, потому как часы. От LFXT будет генерироваться ACLK. Кстати, часы лучше на WDT повесить, а TimerB использовать для более полезных дел.



Но тогда в системе не будет вообще вотчдога!

Заодно вопрос по нему, тут я немного не понял логику тексасовцев.
Вотчдог это "охранное устройство", его назначение - выводить процессор (сбросом, прерыванием) их тупика в программе или аппаратного соя (например от помех - в AVR и Моторолах наблюдал не раз).
Задача программы - его вовремя сбрасывать, и при этом этот сброс надо размещать так чтобы сна него попадало только закономерным образом, например не стоит рахмещать в перрывании, поскольку основная программа може зациклиться где-то, при работающем прерывании.
При этом, в идеале у программы больше не должно быть доступа к управлению им. Например у Микрочипа WDT включается при прожигании, во фьюзах, и из программы его выключить нельзя. И считаю что это правильно.
Тексасовцы же сделали "доступ с паролем", но что это за "пароль", если он просто константа, и одной командой пуляется в регистр и пароль и код выключения/включения.

Цитата
XT2 нужно включать только тогда, когда он требуется для генерации SMCLK и работы UART. MCLK у вас всегда должен тактироваться от DCO, настроенного на высокую частоту.


Поправьте меня, если не прав - с DCO макс. частота MCLK около 4мгц, а с ХТ2 я могу запустить на 8мгц?

Дело в том, что мне это критично - АЦП надо читать и передавать довольно часто, а попутно обслуживать часы, кнопки и ЖКИ, поэтому чем быстрее - тем лучше, потому я и озадачивался вчера временем выполнения операций.

Цитата
В таком случае гарантирован быстрый старт (единицы мкс) при переключении в рабочий режим и более надежная работа кристалла вообще (генератор-то внутренний!). К тому же уже неоднократно проверено, что "проснуться", быстро выполнить требуемые операции и снова "уснуть", менее энергозатратно, чем работать на низкой частоте тактирования, но выполнять операции более длительное время.


Это я все понимаю, но все устройство в рабочем режиме жрет от аккумуятора пол ампера, и экономить ток MSP в это время излишне.
А когда устройство выключено, работают только проц, от часового кварца.
Быстрый старт при переключении в рабочий режим не нужен, это происходит по нажатию кнопки, так что, реакция человека-оператора не единицы мкс.
Для других случаев, Вы безусловно правы.
rezident
Цитата(Allregia @ May 22 2009, 00:56) *
Но тогда в системе не будет вообще вотчдога!
Ну и что в этом криминального? laughing.gif
Цитата(Allregia @ May 22 2009, 00:56) *
не стоит рахмещать в перрывании, поскольку основная программа може зациклиться где-то, при работающем прерывании.
По моим наблюдениям должно что-то совсем "страшное" для устройства произойти, чтобы MSP430 зациклился. Он может зависнуть от статики и/или защелкивания пинов, или Flash стереться (если супервизора питания нет), это да, изредка встречается. Но вот чтобы зациклилась корректно написанная программа ... я такого не припомню. Скорее MSP430 просто перезапустится по POR условию и программа начнет работу с вектора сброса. Тут особенности архитектуры играют роль. У MSP430 фон-Немановская архитектура с общим адресным пространством, а программа обычно исполняется из Flash. И при каком-либо сбое на 99,9% программа попадет на что-либо, формирующее POR-условие. А POR просто сбрасывает MSP430. POR может формироваться, например, при несанкционированной попытке записи во Flash. Допустим испортилось значение указателя, а новое его значение будет на Flash указывать и программа перезапустится при попытке записи по этому указателю "не туда". Или, например, если испортился PC в результате сбоя и программа начала "шарахаться" по адресному пространству, опять же очень велика вероятность, что попадется команда записи во флашь или в один из регистров требующих пароля. Тот же WDT, например. И опять не зацикливание будет, а перезапуск. Правда следует отметить, что я никогда не писал программы, выполняющие куски кода из ОЗУ MSP430. Может поэтому с зацикливаниями программы и не встречался.
Цитата(Allregia @ May 22 2009, 00:56) *
При этом, в идеале у программы больше не должно быть доступа к управлению им. Например у Микрочипа WDT включается при прожигании, во фьюзах, и из программы его выключить нельзя. И считаю что это правильно.
Тексасовцы же сделали "доступ с паролем", но что это за "пароль", если он просто константа, и одной командой пуляется в регистр и пароль и код выключения/включения.
Исходя из моего опыта,
а) правильная трассировка платы,
б) защита входных сигналов, выходящих за ее пределы и
в) наличие хорошего супервизора питания
гораздо эффективнее в плане устойчивости, чем использование WDT в MSP430. Поэтому я обычно без зазрения совести использую WDT как таймер системных "тиков" biggrin.gif Тем более, что прерывание от WDT, используемого в режиме интервального таймера, имеет весьма высокий приоритет среди всей периферии (выше него только NMI, TimerB и ComparatorA).
Цитата(Allregia @ May 22 2009, 00:56) *
Поправьте меня, если не прав - с DCO макс. частота MCLK около 4мгц, а с ХТ2 я могу запустить на 8мгц?
Не прав. Поправляю. DCO можно легко до сотни МГц раскочегарить. Я как-то раз случайно у MSP430F1132 на 50МГц его запустил rolleyes.gif
DCO это генератор RC-типа. Причем R у него может быть внешним (подключается ко входу Rosc). Но даже не используя внешний резистор, а только лишь перебирая значения внутренних R (биты RSELx в регистре BCSCTL1) в зависимости от типа MSP430 можно получить частоту DCO до 6МГц в случае MSP430x1xxx, до 25Мгц в случае MSP430x2xx, до 50МГц у MSP430x4xx и до 95МГц у MSP430x5xx (значения примерные, точнее см. в datasheet конкретного кристалла). При всем при этом значение частоты DCO можно откалибровать по часовому кварцу, подключенному к LFXT1. Да и стабильность DCO у современных серий MSP430 довольно высокая (единицы процента во всем рабочем температурном диапазоне).
Allregia
Цитата(rezident @ May 22 2009, 01:24) *
Ну и что в этом криминального? laughing.gif
По моим наблюдениям должно что-то совсем "страшное" для устройства произойти, чтобы MSP430 зациклился. Он может зависнуть от статики и/или защелкивания пинов, или Flash стереться (если супервизора питания нет), это да, изредка встречается. Но вот чтобы зациклилась корректно написанная программа ... я такого не припомню.


А в природе бывают полностью корректные программы? smile.gif
В любой программе, есть кк минимукм один баг smile.gifsmile.gifsmile.gif

Цитата
Скорее MSP430 просто перезапустится по POR условию и программа начнет работу с вектора сброса. Тут особенности архитектуры играют роль. У MSP430 фон-Немановская архитектура с общим адресным пространством, а программа обычно исполняется из Flash. И при каком-либо сбое на 99,9% программа попадет на что-либо, формирующее POR-условие.


Попадет. Вопрос - "когда" ? Если проц. управляет чем-то реалтаймово, и в результате какого-то сбоя "улетел" и потом "вернулся", по пока он летал - в управляемом обьекте может успеть что-то сломаться или сгореть (например - если проц управляет источником питания).

Цитата
DCO это генератор RC-типа. Причем R у него может быть внешним (подключается ко входу Rosc). Но даже не используя внешний резистор, а только лишь перебирая значения внутренних R (биты RSELx в регистре BCSCTL1) в зависимости от типа MSP430 можно получить частоту DCO до 6МГц в случае MSP430x1xxx,


Об этом я и говорил - с DCO только 6 а с кварцем - 8.
Хотя с резистором, можно дойти и до 8.
Цитата
до 25Мгц в случае MSP430x2xx, до 50МГц у MSP430x4xx и до 95МГц у MSP430x5xx (значения примерные, точнее см. в datasheet конкретного кристалла). При всем при этом значение частоты DCO можно откалибровать по часовому кварцу, подключенному к LFXT1. Да и стабильность DCO у современных серий MSP430 довольно высокая (единицы процента во всем рабочем температурном диапазоне).


Тогда во многих применеиях кварц не нужен - для UARTа < 5% хватает.
rezident
Цитата(Allregia @ May 24 2009, 22:03) *
Попадет. Вопрос - "когда" ? Если проц. управляет чем-то реалтаймово, и в результате какого-то сбоя "улетел" и потом "вернулся", по пока он летал - в управляемом обьекте может успеть что-то сломаться или сгореть (например - если проц управляет источником питания).
Вы сейчас о применении МК "вообще" рассуждаете или о конкретном применении какого-либо MSP430? rolleyes.gif
Цитата(Allregia @ May 24 2009, 22:03) *
Об этом я и говорил - с DCO только 6 а с кварцем - 8.
Хотя с резистором, можно дойти и до 8.
Вы в этой теме нигде конкретно не указали, с каким именно кристаллом вы работаете? Поэтому, чтобы не заниматься телепатией, я и дал описание возможностей всех серий MSP430.
Цитата(Allregia @ May 24 2009, 22:03) *
Тогда во многих применеиях кварц не нужен - для UARTа < 5% хватает.
Чтобы UART работал всегда, везде и со любыми другими UART нужно стремиться baudrate не хуже ±0,5% устанавливать. ±5% годится только для настольно-наколенного применения. laughing.gif
Allregia
Цитата(rezident @ May 25 2009, 01:23) *
Вы сейчас о применении МК "вообще" рассуждаете или о конкретном применении какого-либо MSP430? rolleyes.gif


Вообще smile.gif
Цитата
Вы в этой теме нигде конкретно не указали, с каким именно кристаллом вы работаете? Поэтому, чтобы не заниматься телепатией, я и дал описание возможностей всех серий MSP430.


Помоему указывал - 1611. Но пока его плата не готова, развлекаюсь с другой платой, на коорой стоит 148.

Цитата
Чтобы UART работал всегда, везде и со любыми другими UART нужно стремиться baudrate не хуже ±0,5% устанавливать. ±5% годится только для настольно-наколенного применения. laughing.gif


Нет, это не так. УАРТу нужно чтобы с стоповому биту разбег был не более половины (лучше трети) длительности бита, отсюда и появляется граница в 5-6 % разницы в скорости приемника и передатчика. Поскольку они в хушем случае могут быть противоположны по знаку, то для каждого берется половина - 2.5-3%. (и конечно, это выполняется во всем диапазоне температур и других условий).
0.5% - для УАРТа совешенно избыточно.

P.S. Доли %% стабильности при работе с внутреннего RC-генератора выполняются далеко не во всех контроллерах. Например у Микрочипа до определенных серий - изменение частоты по температуре от -20 до +100 доходило до +-15%, что для УАРТа неприемлимо. Более новые - в 2% укладывались и прекрасно работали с УАРТом без кварца.
rezident
Цитата(Allregia @ May 25 2009, 10:43) *
Нет, это не так. УАРТу нужно чтобы с стоповому биту разбег был не более половины (лучше трети) длительности бита, отсюда и появляется граница в 5-6 % разницы в скорости приемника и передатчика.
5% это при условии 8-ми битного символа без бита четности и считывании значения строго в центре битового интервала. Но вовсе не все UART считывают значение именно в центре битового интервала.
Цитата(Allregia @ May 25 2009, 10:43) *
Поскольку они в хушем случае могут быть противоположны по знаку, то для каждого берется половина - 2.5-3%. (и конечно, это выполняется во всем диапазоне температур и других условий).
Вы почему-то исключаете из рассмотрения длину (крутизну) фронтов сигнала и искажения их в тракте передачи.
Цитата(Allregia @ May 25 2009, 10:43) *
0.5% - для УАРТа совешенно избыточно.
Когда стыкуется два своих изделия - да, избыточно. Когда же заранее не известно с каким именно оборудованием будет стыковаться, то 0,5% дают уверенность, что проблем по вине вашего устройства не будет.
Allregia
Цитата(rezident @ May 25 2009, 13:26) *
5% это при условии 8-ми битного символа без бита четности и считывании значения строго в центре битового интервала. Но вовсе не все UART считывают значение именно в центре битового интервала.


Конечно, другие считывают несколько раз с мажроитированием. Им еще проще будет smile.gif
Цитата
Вы почему-то исключаете из рассмотрения длину (крутизну) фронтов сигнала и искажения их в тракте передачи.


Длительность импульсов при этом не искажается, до определенного предела, конечно.

Цитата
Когда стыкуется два своих изделия - да, избыточно. Когда же заранее не известно с каким именно оборудованием будет стыковаться, то 0,5% дают уверенность, что проблем по вине вашего устройства не будет.


С любым стандартным.
rezident
Делайте так, как вам будет угодно. Хоть 5%, хоть 10%. Я сразу понял, что пояснять для вас бесполезно, но почему-то вот не сдержался sad.gif
Allregia
Непонятно, почему сделан такой вывод...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.