Форум myROBOT.ru » Лаборатория » Микроконтроллеры » Как работает микроконтроллер.

Страниц (2): [1] 2 »
 

1. soob - 31 Марта, 2015 - 10:55:19 - перейти к сообщению
Всем привет.

ивиняюсь, если тема создана не в той ветке

Вопрос в голове уже давно. Поиск ответа в сети дал некую ясность, но не во всем (может просто не понимаю что искать).
Объясните пожалуйста, что зависит от частоты работы МК непосредственно при выполнении кода?
Допустим, наш МК работает на частоте 1МГц.
к примеру простой код:
CODE:

...
void main(void)
{
wile(1)
{
PORTB |= 1<<0;
PORTB &= ~(1<<0);
}
}
...

получается, что в течении 1 секунды на ножку PB0 500 000 раз подается лог 1. Если так, то значит на установку лог 1 или 0 на одну ножку требуется "1 тик" МК.

а если:
CODE:

...
void main(void)
{
wile(1)
{
PORTB=0b11111111;
PORTB=0b00000000;
}
}
...

то тут строка PORTB=0b11111111; выполняется за "1 тик" или на каждую ножку отдельно т.е. "8 тиков"?
2. Predator - 31 Марта, 2015 - 14:13:23 - перейти к сообщению
в обоих случаях по одному тику.
PORTB|= 1<<0 при нормальных условиях выльется в
buf=PORTB
PORTB=buf|1
у всех (насколько мне известно) контроллеров это дело аппаратно реализовано так, что работает за 1 тик

но тем не менее есть нюанс
PORTB= чтобытонибыло
выливается в несколько команд, а еще в несколько тактов проходит возврат к началу цикла.
это можно посмотреть, если дизассемблировать *.hex
3. soob - 03 Апреля, 2015 - 09:38:27 - перейти к сообщению
Получается, если взять бесконечный цикл и вложить увеличивающуюся переменную т.е.:
CODE:

...
while(1) { i++; }
...

то значение этой переменной набранной за 1 секунду будет меньше чем 1 000 000
в зависимости от того сколько тиков используется для возврата к началу?
Допустим возврат требует 1 тик, тогда i будет набирать всего 500 000! Я правильно понимаю?
4. Predator - 03 Апреля, 2015 - 13:06:00 - перейти к сообщению
думаю будет еще меньше, тысяч 200 - будет процесс

выгребание i из памяти - инкремент - складывание i в память-возврат - проверка условия
на ассемблере это можно немного сократить, пользуя регистры.
5. cjA - 03 Апреля, 2015 - 13:30:48 - перейти к сообщению
Predatorзапись в постоянную памятьт, и чтение из нне, зачем она ваше нужна, эй Predator
(Добавление)
Predatorна таких уровнях, Вы меня доожны, того. мяфа, Вы, Predator
(Добавление)
Predatorзапись в постоянную памятьт, и чтение из нне, зачем она ваше нужна, эй Predatorsoob
6. Predator - 03 Апреля, 2015 - 16:51:57 - перейти к сообщению
Цитата:
запись в постоянную памятьт, и чтение из нне, зачем она ваше нужна

да в общем-то не нужна, а вот компилятор выделит под переменную ячейку памяти и сгенерит код, который из этой ячейки памяти будет брать переменную, модифицировать и класть обратно. На ассемблере от этого можно откосить.
7. cjA - 07 Апреля, 2015 - 17:57:43 - перейти к сообщению
Predator, надеюсь не обратили внимание на мое состояние? Но ведь время записи будет не такты, а уже под два десятка тактов? Не умнее ли тогда в постоянную память писать, как я когда что-то не получается? (я просто учусь Подшучивать, дразнить )
8. Predator - 07 Апреля, 2015 - 18:30:20 - перейти к сообщению
тут дело не в том куда писать, а дело в том, что компилятор для подобного мероприятия задействует не регистр, а ячейку памяти и будет делать не один такт, а замутит целый процесс.
9. cjA - 07 Апреля, 2015 - 18:39:29 - перейти к сообщению
А об каком процессоре мы говорим? если об gcc для avr, то... естьже дерективы для Си компилятора внутри текста. Я ставлю нулевую оптимизацию- обычно потом выходит минимум кода. (другое дело что объем кода мне нужен только для скорости прошивки, ни одна из моих мег не забита больше чем на четверть. Закатывать глаза )
(Добавление)
я и грю что он в программную память пишет дольше чем в постоянную и еще дольше чем в озу. По модели этого как его Нильсона- в программную память ваще писать нельзя. И МК серии х86 тому пример. Никаких вирусов!
(Добавление)
Неймона!
10. soob - 09 Апреля, 2015 - 01:08:25 - перейти к сообщению
А как на счет таймера? В сети написано, что он работает на той же частоте что и МК (если не используется предделитель). Получается он работает параллельно с нашим кодо и не зависит от него?
11. cjA - 09 Апреля, 2015 - 07:01:03 - перейти к сообщению
soob, в атмель таймер (в меге их три) зависит очень от осцилятора, вплодь до того что пока ты их не включишь- их как бы и нет.
(Добавление)
soob в тини кажется таймеры работают с предделителем 8, но эт тоже, отключается вроде.
12. Predator - 09 Апреля, 2015 - 09:52:45 - перейти к сообщению
soob пишет:
Получается он работает параллельно с нашим кодо и не зависит от него?

Именно так, и вообще вся перефирия (UART, SPI I2C, USB, ADC, PWM...) работает отдельно от кода, а кодом только управляется (через регистры специального назначения). Это можно сказать даже отдельные участки кристалла.
13. VCOM - 16 Мая, 2015 - 19:18:17 - перейти к сообщению
А если почитать про Verilog или VHDL то можно и самому, между делом процессор написать! Именно написать! А можно и два сразу! А можно и не процессор! ))))
14. cjA - 04 Июня, 2015 - 04:03:11 - перейти к сообщению
VCOM а эти, как их ПСИЛ сы, как раз для вас. программируемые логические интегральные схемы. е ткрою меику, на их все аи Су и летают.
(Добавление)
у каждй правда свй ассемблер, н я бы пвзился, да не дадут Тащусь
15. Predator - 04 Июня, 2015 - 09:22:13 - перейти к сообщению
cjA не, на ПЛИС все сушки не летают (в том смысле, что там они применяются ничуть не чаще процессоров), ассемблера у ПЛИС нет совсем, а VHDL и Verilog у всех (абсолютно) одинаковые.
вот:
http://myrobot.ru/articles/plis_begin.php
это писано когда-то давно, когда darkblue искал способ замера временных интервалов....