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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Скорость ног SAM7, проблема с выводом
Iezuit
сообщение May 4 2008, 12:23
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 13-12-07
Пользователь №: 33 263



Добрый день!
На AT91S64 начал программно (т.е. сам через порт, а не через стандартные функции периферии) выводить информацию на ноги частотой ~10-15 МегаГерц но, по осциллографу, выходит не более 1. Подскаже, я чего-то не понимаю или это ошибка, связанная с мои неправильными действиями?
Go to the top of the page
 
+Quote Post
bureau
сообщение May 4 2008, 12:45
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 625
Регистрация: 22-02-07
Пользователь №: 25 593



Приведите листинг своего кода, если вас не затруднит...!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 4 2008, 14:49
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Iezuit @ May 4 2008, 16:23) *
На AT91S64 начал программно (т.е. сам через порт, а не через стандартные функции периферии) выводить информацию на ноги частотой ~10-15 МегаГерц но, по осциллографу, выходит не более 1. Подскаже, я чего-то не понимаю или это ошибка, связанная с мои неправильными действиями?

Программно можно выводить с частотой не более 1/4 MCK (две записи APB на цикл, каждая запись 2 такта MCK). Так что с 10-15МГц будут проблемы, но точно должно получаться больше 1.
Go to the top of the page
 
+Quote Post
Iezuit
сообщение May 5 2008, 08:00
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 13-12-07
Пользователь №: 33 263



Ниже привожу код (IAR). Прошу прощения, что не сделал сразу.
Код
#include <inarm.h>
#include "main.h"


void AT91F_LowLevelInit(void) @ "ICODE"
{//low_level_init

    AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_0FWS;

    AT91C_BASE_PMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x40 <<8) | AT91C_CKGR_MOSCEN ));
    // Wait Main Oscillator stabilization
    while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));

    AT91C_BASE_PMC->PMC_PLLR = AT91C_CKGR_USBDIV_1 |
                    (16 << 8) |
                               (AT91C_CKGR_MUL & (405 << 16)) |   //18.432*(405+1)/250=29.933
                               (AT91C_CKGR_DIV & 250);
    // Wait for PLL stabilization
    while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK) );
    while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) );

    AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK;
    // Wait until the master clock is established
    while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) );

    AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK;
    // Wait until the master clock is established
    while( !(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY) );

    AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;
}



int main()
{

  AT91F_LowLevelInit(); //инициализируем рабочую частоту

//разрешаем периферические часы  
  AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,(1 << AT91C_ID_PIOA)/);


AT91F_PIO_CfgOutput(AT91C_BASE_PIOA,SCREEN_DB|SCREEN_D_C|SCREEN_RES|SCREEN_WR|SCREEN_RD);

  AT91F_PIO_CfgDirectDrive(AT91C_BASE_PIOA,SCREEN_DB);

while (1)
  {
   AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,SCREEN_WR);
AT91F_PIO_ForceOutput(AT91C_BASE_PIOA,0x5555<<16);
AT91F_PIO_SetOutput(AT91C_BASE_PIOA,SCREEN_WR);
    }  
  
}

Стандартная отладочная плата SAM7S64
При частоте - 30 MHz (от PLL, кварц - 18.432) в режиме Thumb, период главного цикла (по осциллографу) - 2 мкс, 0 на SCREEN_WR примерно 0.5мкс, 1 - 1мкс

в режиме ARM, период главного цикла (по осциллографу) - 2 мкс, 0 на SCREEN_WR 0.75мкс, 1 - 1.25мкс
Скложилось впечатление, что само обращение к порту происходит крайне медленно (ИАР обрезанный, ассемблер посмотреть не могуsad.gif )
Предполагал, что АРМ должен обеспечивать большую скорость - ведь даже на меге результаты лучше!
Или я что-то делаю не так?

Сообщение отредактировал Iezuit - May 5 2008, 08:11
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 5 2008, 09:04
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



А оптимизация-то включена?
Go to the top of the page
 
+Quote Post
Iezuit
сообщение May 5 2008, 09:25
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 13-12-07
Пользователь №: 33 263



Цитата(aaarrr @ May 5 2008, 13:04) *
А оптимизация-то включена?

если я правильно понимаю, что оптимизация на компиляцию в режиме Debug влияет, то от включения оптимизации ничего не меняется.
При переносе содержимого цикла в RAM, период цикла сокращается до 1мкс

Сообщение отредактировал Iezuit - May 5 2008, 09:29
Go to the top of the page
 
+Quote Post
bureau
сообщение May 5 2008, 09:36
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 625
Регистрация: 22-02-07
Пользователь №: 25 593



2 Iezuit
Неправильно понимаешь. Ты сравни с и без, и посмотри на АСМовский код что иар генерит.

Сообщение отредактировал bureau - May 5 2008, 09:37
Go to the top of the page
 
+Quote Post
Iezuit
сообщение May 5 2008, 09:44
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 13-12-07
Пользователь №: 33 263



Цитата(bureau @ May 5 2008, 13:36) *
2 Iezuit
Неправильно понимаешь. Ты сравни с и без, и посмотри на АСМовский код что иар генерит.

У меня к сожалению обрезанный по функциональности ИАР, и посмотреть асмовский код я не могу.
В прочем, разница при включении оптимизации нет только в режиме Thumb - на АРМ оптимизация помогает.
На АРМ оптимизацией получается 0.8 мкс на цикл. Все равно медленно
Go to the top of the page
 
+Quote Post
amw
сообщение May 5 2008, 09:56
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(Iezuit @ May 5 2008, 11:00) *
Код
while (1)
  {
   AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,SCREEN_WR);
AT91F_PIO_ForceOutput(AT91C_BASE_PIOA,0x5555<<16);
AT91F_PIO_SetOutput(AT91C_BASE_PIOA,SCREEN_WR);
    }  
  
}

Ну если чуть поразмыслить, то получается что-то вроде
Код
    ldr r0, =AT91C_BASE_PIOA
label:
    ldr r1, SCREEN_WR
    str r1, [r0 + КАК_ЕГО_ТАМ_PIOA_CLR]
    mov r1, #0x5555 lsl 16; Не уверен, что это можно mov
    str r1, [r0 + КАК_ЕГО_ТАМ_PIOA_SET]
    bic r1, r1, 0xFFFFFFFF; ??????
    str r1, [r0 + КАК_ЕГО_ТАМ_PIOA_CLR]
    ldr r1, SCREEN_WR
    str r1, [r0 + КАК_ЕГО_ТАМ_PIOA_SET]
    b label

Посчитайте такты.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
Iezuit
сообщение May 5 2008, 10:59
Сообщение #10


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 13-12-07
Пользователь №: 33 263



Цитата(amw @ May 5 2008, 13:56) *
Посчитайте такты.

Спасибо!
Скачал описание ассемблера с атмела и посчитал. Результат меня расстроил.
А есть ли какие-то альтернативные способы? Задача стоит так: обеспечить общение АРМ с OLED экраном по паралленому интерфейсу (8битная шина). На Меге приемлемая скорость получалось за счет использования механизма работы с внешней памятью (т.е. чтение и запись аппаратно устанавливались). А в АРМе есть какие-нибудь возможности несколько быстрее общаться с шиной?
Go to the top of the page
 
+Quote Post
KAlex
сообщение May 5 2008, 11:10
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Цитата(Iezuit @ May 5 2008, 12:44) *
У меня к сожалению обрезанный по функциональности ИАР, и посмотреть асмовский код я не могу.

Это как? А куда ж листинги деваются?
Go to the top of the page
 
+Quote Post
Iezuit
сообщение May 5 2008, 11:14
Сообщение #12


Участник
*

Группа: Новичок
Сообщений: 16
Регистрация: 13-12-07
Пользователь №: 33 263



Цитата(KAlex @ May 5 2008, 15:10) *
Это как? А куда ж листинги деваются?

Не генерируются листинги, заблокирована эта возможность, т.к. ИАР - кикстарт, версия с кучей ограничений
Go to the top of the page
 
+Quote Post
KAlex
сообщение May 5 2008, 11:20
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Здесь все давно разжевано.
Go to the top of the page
 
+Quote Post
vet
сообщение May 5 2008, 11:21
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



простое дергание ноги должно выливаться в гораздо меньший объем кода:
Код
//   for (;;) {
//     *AT91C_PIOA_CODR = 50;
//     *AT91C_PIOA_SODR = 50;
//   }

        LDR      R0,??xx_1 ;; 0xfffffffffffff430
        LDR      R1,??xx_1+0x4 ;; 0xfffffffffffff434
        MOVS     R2,#+50
??xx_2:
        STR      R2,[R1, #+0]
        STR      R2,[R0, #+0]
        B        ??xx_2


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 5 2008, 11:31
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Ну, amw написал уж очень страшный вариант. На деле на одну запись в порт требуется 3 такта MCK, т.е. конструкция из 3-х записей + переход должна выполняться за 12 тактов процессора или 400 мксек.
Go to the top of the page
 
+Quote Post

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

 


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


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