Важная информация

User Tag List

Страница 7 из 53 ПерваяПервая ... 34567891011 ... ПоследняяПоследняя
Показано с 61 по 70 из 530

Тема: Планирую сделать FDD эмулятор на Atmega8

  1. #61
    Master
    Регистрация
    20.01.2016
    Адрес
    п. Власиха, Московская обл.
    Сообщений
    593
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    33
    Поблагодарили
    20 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от newart Посмотреть сообщение
    А в ардуино IDE разве нельзя делать ассемблерные вставки?
    Можно, но толку от них, если неизвестно, что в каком регистре и их нужно сохранять перед использованием



    Цитата Сообщение от Trol73 Посмотреть сообщение
    Что именно пытались генерить и насколько сильно не успевает AVR?
    Пушей "видимо много", или на самом деле много (легко понять по листингу)?
    GCC с ассемблерными вставками как вариант не рассматриваете?
    Библиотека работы с SDHC и FAT32 на ассемблере или Algoritm Builder-е уже существует или планируете писать и отлаживать сами?
    Вот такая LPM конструкция работает нормально
    ISR(USART_UDRE_vect)
    {
    tmp2 = MFM_tab[1];
    UDR0=(byte)(tmp2 >> 8);
    UDR0=(byte)tmp2;
    }
    а вот такая уже нет
    ISR(USART_UDRE_vect)
    {
    tmp2 = MFM_tab[track0[i++]];
    UDR0=(byte)(tmp2 >> 8);
    UDR0=(byte)tmp2;
    }
    GCC со вставками опять же упрется в сохранение регистров.
    Для AB думаю не составит большой сложности FatFs переделать, там кода не много.

    В принципе, если на компе TRD перегнать в MFM, и потом эти данные выдавать, то ардуины должно хватить (теоретически)
    Последний раз редактировалось EvgenRU; 24.03.2016 в 00:33.

  2. #61
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #62
    Master Аватар для s_kosorev
    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    а вот такая уже нет
    ISR(USART_UDRE_vect)
    {
    tmp2 = MFM_tab[track0[i++]];
    UDR0=(byte)(tmp2 >> 8);
    UDR0=(byte)tmp2;
    }

    это на ассемблере делать нужно
    причем что бы шустрее работало, MFM_tab выравнять в памяти по 256байт граице, в ISR можно сказать каждый такт на счету
    причем что бы быстрее было, 2 таблицы, сначала 256 старших байт, потом младших

  4. #63
    Activist Аватар для Trol73
    Регистрация
    07.05.2015
    Адрес
    г. Ульяновск
    Сообщений
    350
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    50
    Спасибо Благодарностей получено 
    42
    Поблагодарили
    25 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от EvgenRU Посмотреть сообщение
    GCC со вставками опять же упрется в сохранение регистров.
    Для AB думаю не составит большой сложности FatFs переделать, там кода не много.
    Идея писать все на ассемблере - это преждевременная оптимизация, классическая ошибка проектирования. GCC умеет оптимизировать код, тем более, такой тривиальный. Перенос на ассемблер может дать не более ~10% ускорения, что в данном случае не имеет никакого значения.

    Для начала надо оптимизировать код на Си. А для этого надо смотреть его ассемблерный листинг.

    Сейчас бросаются в глада две вещи:
    1. MFM_tab[track0[i++]] - зачем тут два массива? нельзя сразу поместить подготовленные данные в массив track_data[] ?
    2. ну и да, алгоритм надо преобразовать так, чтобы индексы были однобайтными - это сокращает код в разы.

    Цитата Сообщение от EvgenRU Посмотреть сообщение
    В принципе, если на компе TRD перегнать в MFM, и потом эти данные выдавать, то ардуины должно хватить (теоретически)
    Перегонять TRD во что угодно можно и на самом девайсе - есть SD-карта, и ничто не мешает на нее сохранять временные данные в любом удобном формате

  5. #64
    Master Аватар для s_kosorev
    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Trol73 Посмотреть сообщение
    track_data[]
    тогда на буфер сектора надо будет 512 байт а не 256

    - - - Добавлено - - -

    как вариант можно нечто такое расмотреть

    Код:
    alignas(256) static const uint8_t mfmtab_h[256] = { .... };
    alignas(256) static const uint8_t mfmtab_l[256] = { ... };
    	
    alignas(256) static uint8_t  sect_data[2][256];
    register uint8_t rdbuff asm("r3"); // тут держим старшую половину адреса текущего буфера
    register uint8_t rdpos  asm("r4"); // тут позиция в буфере
    
    ISR(USART_UDRE_vect, ISR_NAKED)
    {
    	asm ("push r31");
    	asm ("push r30");
    	asm ("push r29");
    	// формируем указатель в буфере сектора
    	asm ("mov  r31, r3");
    	asm ("mov  r30, r4");
    	// читаем данные из буфера сектора
    	asm ("ld   r29, Z");
    	asm ("inc  r3");
    	// формируем указатель на mfmtab_h
    	asm ("ldi  r31, hi8(mfmtab_h)");
    	asm ("mov  r30, r29");
    	// чтение mfm_h
    	asm ("lpm   r29, Z");
    	asm ("sts  0xc9, r29");
    	// формируем указатель на mfmtab_l
    	asm ("inc  r31");
    	// чтение mfm_l
    	asm ("lpm   r29, Z");
    	asm ("sts  0xc9, r29");
    	
    	asm ("pop  r29");
    	asm ("pop  r30");
    	asm ("pop  r31");
    	asm ("reti");
    	
    	/* аналог на Си
    	uint8_t* pos = (uint8_t*)((rdbuff << 8) | rdpos);
    	UDR0 = mfmtab_h[*pos];
    	UDR0 = mfmtab_l[*pos];
    	rdpos++;
    	*/
    }
    тело ISR где то 19 тактов, GCC раз 5 больше выхлоп дает
    Последний раз редактировалось s_kosorev; 24.03.2016 в 12:08.

  6. #65
    Guru Аватар для tnt23
    Регистрация
    28.03.2006
    Адрес
    Санкт-Петербург
    Сообщений
    2,634
    Спасибо Благодарностей отдано 
    401
    Спасибо Благодарностей получено 
    78
    Поблагодарили
    63 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Trol73 Посмотреть сообщение
    Идея писать все на ассемблере - это преждевременная оптимизация, классическая ошибка проектирования. GCC умеет оптимизировать код, тем более, такой тривиальный. Перенос на ассемблер может дать не более ~10% ускорения, что в данном случае не имеет никакого значения.
    Ерунда. В данном случае писать на ассемблере можно и нужно, особенно если прикинуть длительность bit cell (500нс) и время выполнения однотактовой AVR инструкции на 16МГц (62.5нс).

    Топикстартеру - я это все уже проходил на ATmega256@16MHz. Помогал только выпрямленный tight loop c очень плотным кодированием по тактам, а также высушенные и обрезанные по самое немогу обработчики прерываний. Да, и еще у меня была привешана внешняя DRAM c программной же регенерацией.

    Мой вам совет (с) маркер из "Шерлока Холмса" - выкинуть AVR и взять любой STM32.

    - - - Добавлено - - -

    Например, самый простой из семейства STM32F0 на Терраэлектронике - 84р (восемьдесят четыре рубля, Карл!). Тактовая 48МГц, фигова куча периферии - а кстати, для формирования MFM потока можно использовать SPI, - и вообще.

  7. #66
    Veteran Аватар для dosikus
    Регистрация
    29.03.2005
    Адрес
    Ярославль
    Сообщений
    1,102
    Спасибо Благодарностей отдано 
    14
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от tnt23 Посмотреть сообщение
    Тактовая 48МГц,
    Причем гонятся до 64МГц, но это уже из области извращений...
    А STM32F0x2 умеют набортный DFU бут ...
    ZXM-Phoenix 1024+PROF ROM+SMUC+VGA
    Profi 1024+CF+CPM+VGA
    ATARI 800XL+SIO2PC+SIO2SD
    RK86@Maximite

  8. #67
    Master Аватар для s_kosorev
    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от tnt23 Посмотреть сообщение
    В данном случае писать на ассемблере можно и нужно, особенно если прикинуть длительность bit cell (500нс) и время выполнения однотактовой AVR инструкции на 16МГц (62.5нс).
    итого при 120 инструкций на байт MFM, ISR в 20-30 тактов, оставляет уйму времени для подкачки данных с SDCARD, 20-25% времени ядра на ISR это ниочем, зачем тут ARM с кучей не нужной для задачи перефирии?

    Кстати в ARM почти весь профит от частоты съест вход в ISR, возможно даже будет не хватать
    Последний раз редактировалось s_kosorev; 24.03.2016 в 12:18.

  9. #68
    Activist Аватар для Trol73
    Регистрация
    07.05.2015
    Адрес
    г. Ульяновск
    Сообщений
    350
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    50
    Спасибо Благодарностей получено 
    42
    Поблагодарили
    25 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от s_kosorev Посмотреть сообщение
    тогда на буфер сектора надо будет 512 байт а не 256
    А разве 256 байт - это критично для m328? Массивы mfmtab так вообще 512 байт занимают..

    Цитата Сообщение от tnt23 Посмотреть сообщение
    Ерунда. В данном случае писать на ассемблере можно и нужно, особенно если прикинуть длительность bit cell (500нс) и время выполнения однотактовой AVR инструкции на 16МГц (62.5нс).
    На ассемблере есть смысл писать критичные к скорости выполнения куски кода в конечном приложении. Это позволить немного ускорить код. Сейчас же речь о прототипе, который только формирует сигнал и ничего при этом не делает, с картой не работает. Эти 10% выигрыша быстродействия тут не должны играть решающую роль. Когда добавится работа с картой требования к процессорному времени, затрачиваемому на формирования сигнала могут возрасти.

    Проходил нечто подобное когда делал поддержку воспроизведения WAV 44100 Гц в своём магнитофоне. Сначала все тормозило и скорости не хватало. Переписывания кода обработчика прерывания на Си, разбиение массивов длиной 512 байт на два массива по 256 байт дало ощутимый прирост в скорости выполнения. Небольшие оптимизации библиотеки поддержки SD-карты и FAT-а (разворачивания циклов, inline-зация нескольких функций и отключение лишних проверок) ещё немного ускорило прошивку.
    Потом переписал обработчик прерывания на ассемблер. Да, он стал работать чуть быстрее, но основной вклад внесла именно оптимизация Си-кода и отказ от 16-битных индексов массивов.

    PS. использование 48МГц МК для эмуляции флопа для компьютеров, частота которых измеряется единицами МГц - как-то неприлично, имхо

  10. #69
    Master Аватар для s_kosorev
    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Trol73 Посмотреть сообщение
    так вообще 512 байт занимают..
    ну так таблицы в флеше, а 2 буфера в оперативке по 512 это уже 50% памяти в расход ушло

  11. #70
    Activist Аватар для Trol73
    Регистрация
    07.05.2015
    Адрес
    г. Ульяновск
    Сообщений
    350
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    50
    Спасибо Благодарностей получено 
    42
    Поблагодарили
    25 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от s_kosorev Посмотреть сообщение
    ну так таблицы в флеше, а 2 буфера в оперативке по 512 это уже 50% памяти в расход ушло
    Ну не совсем 50% в расход, а + 256 байт, т.е., +25% за сильное упрощение процедуры обработчика. Тут вопрос, на что еще нужна память во время выдачи трека. И, если её хватает, то это вообще не проблема.

Страница 7 из 53 ПерваяПервая ... 34567891011 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 24
    Последнее: 08.12.2012, 19:00
  2. Тестер транзисторов на ATmega8
    от ILoveSpeccy в разделе Творчество
    Ответов: 10
    Последнее: 19.05.2011, 15:03
  3. Ответов: 0
    Последнее: 31.01.2007, 18:18

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •