|
|
  |
12 ATmega48 от одного тактового генератора (внешнего)., Можно ли провести 8 Мгц по всей плате? |
|
|
|
Nov 21 2008, 11:34
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(_Pasha @ Nov 21 2008, 14:15)  Зачем переключать контексты если можно все данные свести к массивам, а дерево алгоритма потока - к switch(state[task_num]) ? Но в таком случае невозможно будет СРОЧНО перейти от обработки одной задачи к другой (по прерыванию или опросу флага). Придётся заканчивать обработку текущей задачи, всё сохранять в массивы, и уже затем переходить к следующей. Или я что-то не понимаю?
|
|
|
|
|
Nov 21 2008, 11:54
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(galjoen @ Nov 21 2008, 15:34)  Придётся заканчивать обработку текущей задачи, всё сохранять в массивы, и уже затем переходить к следующей. Или я что-то не понимаю? Простейшая организация задачи: Код uint8_t task(uint8_t tasknum) { /* подразумевает, что Вы обращаетесь с данными, описанными в виде static массивов в любой момент можете нас.ать на плохое отношение к goto и при желании выйти из задачи написать goto exit_task */ exit_task: return 0; // возвращаемое значение может показывать какой-нить статус задачи } Т.е контекст не переключается вовсе. И текущая задача может прерваться в заранее известных местах, не прерывая атомарных операций.Но это в простом случае. Сложнее - никто не мешает "навернуть" эту конструкцию без использования оси. В общем -кооперативная многозадачность.
|
|
|
|
|
Nov 21 2008, 12:27
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(_Pasha @ Nov 21 2008, 14:54)  И текущая задача может прерваться в заранее известных местах, не прерывая атомарных операций. Да, именно это я имел ввиду, но расстояние между такими местами (в тактах) может оказаться недопустимо большим. Или, к примеру, чтобы его уменьшить придётся идти на усложнение кода - скажем не просто на выход идти, а на "специальный выход именно из этого места". А ещё я обычно запоминаю точку (её адрес) в которой данная задача была прервана. Но код, при такой манере программирования, сложно изменять становится. Хотя, если посмотреть, то у меня во всех проектах именно так и сделано (по подобной схеме и без оси).
|
|
|
|
|
Nov 21 2008, 13:04
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(_Pasha @ Nov 21 2008, 15:46)  К сожалению, кооперативные многозадачки на асме выглядят намного прямее, короче и читабельнее. А почему к сожалению? Цитата(_Pasha @ Nov 21 2008, 15:46)  Такшта, может на ARM asm ? Да, другой дороги видимо нет.
|
|
|
|
|
Nov 21 2008, 13:20
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(galjoen @ Nov 19 2008, 17:15)  ...нужно около 100мм печатного проводника с частотой 8 Мгц по плате провести Посчитаем: 10 см дают задержку импульса где-то на 30 нс, для вашего 125 нс такта это где-то 25%. Если вам так важна полная фазировка, надо принимать соотв. меры. Можно, например, уменьшить размер проводника 8 МГц, разместив генератор в середину платы, а по четырём сторонам вокруг него расположить по 3 МК. Ну или сделать отдельные линии для каждого МК и выровнять все пути от генератора до всех МК, чтобы задержки были одинаковыми. В начале и конце каждой линии поставить по инвертору. Цитата(galjoen @ Nov 19 2008, 18:41)  А для синхронизации там специальный сигнал будет. Он там есть уже, только в этом случае его через D-триггер пропустить придётся для синхронизации с тактовой частотой Не понимаю вашей идеи, зачем нужен триггер? Все 12 МК можно засинхронизировать по одному проводу безо всяких триггеров с точностью до перехода 0-1.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Nov 21 2008, 13:48
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(=GM= @ Nov 21 2008, 16:20)  Посчитаем: 10 см дают задержку импульса где-то на 30 нс, для вашего 125 нс такта это где-то 25%. Если вам так важна полная фазировка, надо принимать соотв. меры. Можно, например, уменьшить размер проводника 8 МГц, разместив генератор в середину платы, а по четырём сторонам вокруг него расположить по 3 МК. Ну или сделать отдельные линии для каждого МК и выровнять все пути от генератора до всех МК, чтобы задержки были одинаковыми. В начале и конце каждой линии поставить по инвертору. Петли, как на материнских платах, я разведу. Спасибо за совет. Но инверторы зачем? Да ещё по два. Цитата(=GM= @ Nov 21 2008, 16:20)  Не понимаю вашей идеи, зачем нужен триггер? Все 12 МК можно засинхронизировать по одному проводу безо всяких триггеров с точностью до перехода 0-1. Да они и будут синхронизироваться по одному проводу с точностью до такта (за два фронта синхросигнала). По первому фронту с точностью в 2 такта, и по второму уточнятся до такта. А триггер для того, чтобы сигнал синхронизации засинхронизировать с тактовым сигналом (изначально они не синхронны). Если так не делать, то фронт синхросигнала может попасть на границу тактов, и из-за небольшой разницы в фазах по процессорам, которая всётаки будет, один процессор может воспринять его в одном такте, а другой в другом.
|
|
|
|
|
Nov 21 2008, 15:55
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(galjoen @ Nov 21 2008, 13:48)  Но инверторы зачем? Да ещё по два Можно и без них, зависит от ваших требований к рассогласованию по фазе, скажем, 10 нс и 0.1 нс немного разные вещи. Инверторы развяжут и согласуют, согласитесь, одну линию легче проконтролировать, чем пучёк из 12. Ну поставьте 12 инверторов в начале, если будет всё нормально, кинете перемычку. Цитата(galjoen @ Nov 21 2008, 13:48)  Да они и будут синхронизироваться по одному проводу с точностью до такта (за два фронта синхросигнала). По первому фронту с точностью в 2 такта, и по второму уточнятся до такта. А триггер для того, чтобы сигнал синхронизации засинхронизировать с тактовым сигналом (изначально они не синхронны). Если так не делать, то фронт синхросигнала может попасть на границу тактов, и из-за небольшой разницы в фазах по процессорам, которая всё-таки будет, один процессор может воспринять его в одном такте, а другой в другом Всё равно не понимаю. Если будет разница в фазах, то триггер вам не поможет. Вообще похоже, мы о разных вещах говорим. Когда я говорю засинхронизировать микроконтроллеры, я подразумеваю, что одинаковая программа будет выполняться на всех МК такт в такт.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Nov 21 2008, 16:20
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(=GM= @ Nov 21 2008, 18:55)  Всё равно не понимаю. Если будет разница в фазах, то триггер вам не поможет.
Вообще похоже, мы о разных вещах говорим. Когда я говорю засинхронизировать микроконтроллеры, я подразумеваю, что одинаковая программа будет выполняться на всех МК такт в такт. Да, именно так. Во всех процессорах программа в один и тот-же такт должна начинаться и заканчиваться. Момент этого самого начала определяется по специальному сигналу синхронизации. Но этот сигнал внешний, и с тактовым генератором не связан. Поэтому его фронт может по периоду тактовой частоты гулять. Это может привести к рассинхронизации процессоров на 1 такт. А D-триггер обеспечит одновременность фронтов у тактового сигнала процессоров, и сигнала синхронизации этих процессоров. На вход данных D-триггера подаём внешний синхросигнал, на вход C - тактовый сигнал, и с выхода получаем, засинхронизированный по тактовому сигналу, внешний синхросигнал.
|
|
|
|
|
Nov 21 2008, 20:31
|

За битами по регистрам гоняюсь
  
Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446

|
Цитата(galjoen @ Nov 21 2008, 20:20)  ...Да, именно так. Во всех процессорах программа в один и тот-же такт должна начинаться и заканчиваться. ... Начинаться в один такт она сможет, а вот заканчиваться - большой вопрос. Данные поступают разные, в какой-то AVR команда, к примеру BREQ, выполнится при 0, а в другой AVR нет. Число тактов получится разное, процесс рассинхронизируется. Или у вас строго линейный алгоритм (как в первых DSP)?
--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
|
|
|
|
|
Nov 21 2008, 23:00
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
2=GM= Начать выполнение программы одновременно не так просто. Даже если 2 процессора только тем и занимаются, что фронт внешнего сигнала ловят, то тут как ни крути точность в 2 такта получится. Т.к. никоим образом програмно считывать и анализировать состояние порта чаще чем 1 раз за 2 такта не получится. Но за 2 раза вполне можно с точностью в такт уложится. Тут мог-бы вход захвата таймера помочь, но я пока на железке не проверял, а описаниям не доверяю, как-то туманно в них всё написано. Цитата(Nanobyte @ Nov 21 2008, 23:31)  Или у вас строго линейный алгоритм (как в первых DSP)? Нет. Я таймер запущу.
|
|
|
|
|
Nov 21 2008, 23:23
|

Гуру
     
Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987

|
Цитата(galjoen @ Nov 19 2008, 20:15)  Есть одна задача, требующая достаточно больших вычислений, но легко параллелящаяся на 12 потоков. Если можно установить 12 штук ATmega48 (или 88), работающих от одного внешнего тактового генератора, то задача очень красиво решается (питание процессоров 3В тактовая частота 8Мгц)... Жесть! Прошу прощенья за ремарку. Присоединюсь к предложению поставить более мощный контроллер. Выиграете во всех без исключения смыслах. Я бы, правда, порекомендовал DSP. По теме (хотя здесь это и не совсем к месту). На выход генератора обязательно нужно ставить буфер. Проще всего взять 6-гейтовый буферный инвертор типа 74AC04. Расположить рядом с генератором. К каждому выходу буфера подключить два тактовых входа. Провода желательно тянуть от буфера отдельно для каждого из входов. Собственно, согласование при такой длине проводников не играет особой роли. Однако, на каждую трассу следует поставить последовательный резистор 50-100 Ом для уменьшения добротности резонирующей цепи, обусловленной индуктивностью дорожки и ёмкостью входа приёмника. Резисторы располагать в непосредственной близости от выводов буфера. Усё.
--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|