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

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


Участник
*

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



Простое - да, но у меня между дерганьями было еще
AT91F_PIO_ForceOutput(AT91C_BASE_PIOA,0x5555<<16);
(т.е. AT91C_BASE_PIOA->PIO_ODSR=a<<16;)
Уважаемый amw привел ассемблерный код вместе с ним.
Как-то очень медленно получаетсяsad.gif Команды-то все сильно не однотактовые, как выяснилосьsad.gif



Цитата(aaarrr @ May 5 2008, 15:31) *
Ну, amw написал уж очень страшный вариант. На деле на одну запись в порт требуется 3 такта MCK, т.е. конструкция из 3-х записей + переход должна выполняться за 12 тактов процессора или 400 мксек.

А как бы заставить ИАР мой код НОРМАЛЬНО странслировать на ассемблер, чтобы получилось таки 12 тактов, о которых Вы пишите? Вроде бы полная оптимизация выставлена, и все-равно...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 5 2008, 11:39
Сообщение #17


Гуру
******

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



Цитата(Iezuit @ May 5 2008, 15:33) *
Простое - да, но у меня между дерганьями было еще
AT91F_PIO_ForceOutput(AT91C_BASE_PIOA,0x5555<<16);
(т.е. AT91C_BASE_PIOA->PIO_ODSR=a<<16;)
Уважаемый amw привел ассемблерный код вместе с ним.

0x5555<<16 при нормальной оптимизации никто в цикле загружать не будет, значение будет получено и положено в регистр до начала цикла.

Цитата(Iezuit @ May 5 2008, 15:37) *
А как бы заставить ИАР мой код НОРМАЛЬНО странслировать на ассемблер, чтобы получилось таки 12 тактов, о которых Вы пишите? Вроде бы полная оптимизация выставлена, и все-равно...

Для начала надо бы листинг получить, без него что-либо оптимизировать затруднительно.
Go to the top of the page
 
+Quote Post
Iezuit
сообщение May 5 2008, 11:46
Сообщение #18


Участник
*

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



Цитата(aaarrr @ May 5 2008, 15:39) *
Для начала надо бы листинг получить, без него что-либо оптимизировать затруднительно.

Ну я в принципе писал, но еще раз:
Функция, которую хочется сделать побыстрее

Код
void write_d(unsigned char a)
{
AT91C_BASE_PIOA->PIO_CODR = SCREEN_WR;
AT91C_BASE_PIOA->PIO_ODSR=a<<16;
AT91C_BASE_PIOA->PIO_SODR = SCREEN_WR;
}


Либо не функция, а просто строчки кода
Код
AT91C_BASE_PIOA->PIO_CODR = SCREEN_WR;
AT91C_BASE_PIOA->PIO_ODSR=data<<16;
AT91C_BASE_PIOA->PIO_SODR = SCREEN_WR;
Go to the top of the page
 
+Quote Post
amw
сообщение May 5 2008, 11:59
Сообщение #19


Знающий
****

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



Цитата(aaarrr @ May 5 2008, 14:31) *
Ну, amw написал уж очень страшный вариант. На деле на одну запись в порт требуется 3 такта MCK, т.е. конструкция из 3-х записей + переход должна выполняться за 12 тактов процессора или 400 мксек.

Ну да. Это типа наихудший вариант.
Если просто 0x5555 << 16 то это просто константа, а если типа a << 16 где a - переменная, то может быть еще что-то. Например с volatile тоже вопрос.
И если это переменная, то в голову не приходит ничего лучше:
Код
ldr r1, =a
ldr r1, [r1]

Хотя конечно оптимизатор должен поработать в этом месте. Да и в приведенном примере даже для переменной, ее значение может быть загружено до цикла. Плюс инверсию тоже можно загрузить до цикла. Но это уже вопрос к компилятору и его оптимизатору.
Точно, что делают макросы из листинка я не знаю. Это попытка догадаться.
Помнится я когда-то в лоб на ассемблере проверял когда SAM7S256 изучал.
На частоте 36 МГц получил чуть больше 2МГц на пине (или 3МГц, точно не помню).
Но что это на много меньше чем хотелось бы - так это точно.


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


Гуру
******

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



Цитата(Iezuit @ May 5 2008, 15:46) *
Ну я в принципе писал, но еще раз:
Функция, которую хочется сделать побыстрее

Код
void write_d(unsigned char a)
{
AT91C_BASE_PIOA->PIO_CODR = SCREEN_WR;
AT91C_BASE_PIOA->PIO_ODSR=a<<16;
AT91C_BASE_PIOA->PIO_SODR = SCREEN_WR;
}

Эту функцию можно откомпилировать по-разному, в зависимости от уровня оптимизации.
Можно так:
Код
    ldr    r1, =AT91C_PIOA_CODR
    mov    r2, #SCREEN_WR
    str    r2, [r1]
    ldr    r1, =AT91C_PIOA_ODSR
    mov    r2, r0 lsl #16
    str    r2, [r1]
    ldr    r1, =AT91C_PIOA_SODR
    mov    r2, #SCREEN_WR
    str    r2, [r1]
    mov    pc, lr

а можно и так:
Код
    ldr    r1, =AT91C_BASE_PIOA
    mov    r2, #SCREEN_WR
    str    r2, [r1, #PIO_CODR]
    mov    r3, r0 lsl #16
    str    r3, [r1, #PIO_ODSR]
    str    r2, [r1, #PIO_SODR]
    mov    pc, lr

Нужно уточнить, что сделал компилятор в Вашем случае.

Кроме того, если хотите получить максимальное быстродействие лучше вообще отказаться от подобного типа коротких функций - очень уж большие накладные расходы при вызовах.
По-моему, правильнее было бы держать в RAM образ экрана и перебрасывать его одной максимально оптимизированной функцией.
Go to the top of the page
 
+Quote Post
Iezuit
сообщение May 5 2008, 12:24
Сообщение #21


Участник
*

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



Большое спасибо!
Пробую...
Go to the top of the page
 
+Quote Post

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

 


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


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