Отговори на тема  [ 23 мнения ]  Отиди на страница 1, 2  Следваща
АРМ - библиотеки за закъснения? 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение АРМ - библиотеки за закъснения?
Става въпрос за кратки закъснения - до около 1 мс, но да кажем с резолюция под 1мкс.

Нещо от сорта на - 10,100,1000,10000 тактови цикъла. Говорим за закъснения които си ангажират процесора, без таймери, многозадачност и прочие. Просто да му кажеш - изчакай 100 цикъла.

Знам че някой ще каже да ги напиша сам на асемблер, ама още ми е малко мътен асемблера за това говедо. Аз съм разглезен в това отношение от пиковете, къде нещата с тактовите цикли бяха доста по ясни.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пон Мар 06, 2006 1:02 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Добре, нямаш ли свободно таймерче? :roll:


Пон Мар 06, 2006 1:43 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Ами нали се сещаш. Управляваш например екрана. И трябва да закъснееш два от сигналите на 1us. Е сега за една проста входно изходна операция да пускам таймери? Е че само инициализацията и обработката на таймера ще отнеме повече време.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пон Мар 06, 2006 2:03 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
няма да се раминеш без асемблер.
най-малкото нещо е NOP в цикъл. дали ще инлайн или макрос си преценяваш ти
по-трудното е да го направиш универсално, т.е. да работи на всякакви честоти на CPU-то.
ще трябва да се калибрираш в началото. нещо от рода:
пускаш таймера на 1мс и броиш колко nop-а се изпъляват за този период


Пон Мар 06, 2006 2:12 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Е извинявай, ама ако викаш ф-я, докато инициализираш преди да влезеш в цикъла за изчакване, пак ще мине повече от 1 uS. Зависи от тактовата честота де, ама пак.


Пон Мар 06, 2006 2:14 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
ДедоБоре написа:
няма да се раминеш без асемблер.
най-малкото нещо е NOP в цикъл. дали ще инлайн или макрос си преценяваш ти
по-трудното е да го направиш универсално, т.е. да работи на всякакви честоти на CPU-то.
ще трябва да се калибрираш в началото. нещо от рода:
пускаш таймера на 1мс и броиш колко nop-а се изпъляват за този период


Няма нужда от NOP. Просто инкрементиране с последващо сравняване. Калибриращият коефициент е достатъчно да бъде инициализиран еднократно при ресета.


Пон Мар 06, 2006 2:16 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Ами обикновенно практиката е такава. Правят се различни функции например за 10,100*n, 1000*n тактови цикъла.

10 цикъла се прави макрос с нопове, 100 се прави като макрос на асемблер с някъв луп n-пъти, от там на горе обикновенно са по висши функции. Идеята е да не се специфицира време, а просто брой цикли n пъти. После като си знаеш тактовата честота - сам си определяш коя да включиш. Не е много универсално, но е достатъчно просто.

Само дето някой трябва да чете асемблер за АРМ.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пон Мар 06, 2006 2:18 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Яну 10, 2006 2:40 pm
Мнения: 2258
Мнение 
закъсненията при арм най-добре прави през таймер да ти е мирна главата
иначе ще си зависим от PLL-и, кеш, код и прочее


Пон Мар 06, 2006 2:25 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Странна практика. Един loop от сорта на:

Код:
@1: dec  R1
       jnz @1


е напълно достатъчен за всичко. Ако горното се изпълнява за n такта, то калибриращия коефициент се смята просто като mhz/точност/n.


Пон Мар 06, 2006 2:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Заек - как да направя следното с таймер -

1.Някакъв пин се вдига.
2. Пауза около 500нс.
3. Друг пин се вдига.

Прощавай ама това да го правиш с таймер си е чист мазохизъм.

Сега естествено че ако ми трябва нещо около милисекунда, ще навия таймер.

Аз по принцип във почти всеки проект си имам прекъсване тиктакащо на милисекунда, даже си го пействам като стандартен код, все нещо се налага да се мери в милисекунди.

Ама тук става въпрос за стандартен запис в стандартен LCD дисплей (текстов) - Пуснеш му данните и трябва да изклокаш енейбъла, ама да има поне 500нс пулс, че дисплея бавно хваща. Сега за всяка подобна глупост да навивам таймери и да ги дебна за такива времена е гадно.

Да не говорим че специално при АРМ-а (LPC2138), таймерите също са зависими от PLL, VPB divider и пр.

Реконструктор - и аз това точно имах предвид (прости лупове), ама писането на асемблер за АРМ не ми е силна страна. Не мога да го направя с inline асемблера, понеже незнам дали няма да прецакам някой регистър дето го ползва компилатора. Трябва да си направя отделен асемблерски фаил, който да линквам към проекта. А това не ми е ясно как става - трябва да го чета. Също и самия асемблер - тия ядра имат една камара инструкции и видове адресации, всяка със собствено мнение по отношение на брой цикли.

Не може някой да не е правил нещо подобно. Направо съм учуден че ИАР-а няма подобни библиотеки или поне аз не ги откривам.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пон Мар 06, 2006 3:54 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Ное 01, 2005 10:23 am
Мнения: 704
Местоположение: Limerick, Ireland
Мнение 
аз го правя така:
Код:
#define DELAY_NOPS      5
/* The number of NOPs, taken for 1 iteration of the delay() loop. (compiler   */
/* dependent)   */

/* -------------------------------------------------------------------------- */
/* Time delay defines                                                         */
/* -------------------------------------------------------------------------- */

#define DELAY_1ms   (PLL_CLK_ARM / (DELAY_NOPS*1000)) //17550

void delay (int t)
{
    register uint32 i;

    for (i = 0 ; i < t ; i++) {
        NOP();
    }

}



може да си дефинираш и закъснения по-малки от 1мс...

_________________
"640 К са достатъчни на всеки за всичко."
Бил Гейтс


Пон Мар 06, 2006 4:12 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
nickich написа:
аз го правя така:
Код:
#define DELAY_NOPS      5
/* The number of NOPs, taken for 1 iteration of the delay() loop. (compiler   */
/* dependent)   */

/* -------------------------------------------------------------------------- */
/* Time delay defines                                                         */
/* -------------------------------------------------------------------------- */

#define DELAY_1ms   (PLL_CLK_ARM / (DELAY_NOPS*1000)) //17550

void delay (int t)
{
    register uint32 i;

    for (i = 0 ; i < t ; i++) {
        NOP();
    }

}



може да си дефинираш и закъснения по-малки от 1мс...


Пробвах и така, става, ама за големи закъснения около 1ms.
А на мен ми трябва около и под 1us.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пон Мар 06, 2006 4:41 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Ное 01, 2005 10:23 am
Мнения: 704
Местоположение: Limerick, Ireland
Мнение 
ами в моя случай DELAY_1ms се получава 17550, т.е. за 1 us => около 17 и за 500 нс => около 8-9..., и inline. Трябва да стане... :roll:

_________________
"640 К са достатъчни на всеки за всичко."
Бил Гейтс


Пон Мар 06, 2006 4:49 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Ное 01, 2005 10:23 am
Мнения: 704
Местоположение: Limerick, Ireland
Мнение 
... за горния пример съм си дефинирал:

Код:

#define DELAY_1us   ((DELAY_1ms +500)/1000)


_________________
"640 К са достатъчни на всеки за всичко."
Бил Гейтс


Пон Мар 06, 2006 4:51 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
мда нещо подобно правя и аз. Засега е решение. Малко неугледно, ама... толкоз

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пон Мар 06, 2006 6:39 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 23 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни