Например TDA7294

Форум РадиоКот • Просмотр темы - Как можно посчитать кол-во тактов выполнения программы???
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс июл 27, 2025 07:03:53

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 7 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Как можно посчитать кол-во тактов выполнения программы???
СообщениеДобавлено: Пт ноя 25, 2011 12:28:06 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Сб апр 03, 2010 10:12:41
Сообщений: 561
Откуда: Хабаровск
Рейтинг сообщения: 0
Нужно подсчитать сколько уйдёт времени на выполнение программы, МК ARM7TDMI, CLK =20МГц.
Может быть есть программы специальные, а то по тактам это извращение, т.к. код написанный на Си был дизасемблирован Ниже коды:
Код:
// main.c  главная функция программной части
#include <SecondLab.h> // подключаем файл, созданный командой Generate
// глобальные переменные
volatile unsigned int *result = ( unsigned int * ) Result ;
// Глобальные функции
void IRQ_Handler (void)
{
    // обработчик прерываний
}
// функция задержки
void wait(unsigned int cnt)
 {
 volatile unsigned int i;
   for (i = 0; i < cnt; i++)
    {
   volatile int ii;
   for(ii=0; ii < 1; ii++)
   {
#ifdef __ARM__
       __asm
       {
                        mov     r0, r0
      mov     r0, r0
      mov     r0, r0
      mov     r0, r0
       }
#else      
       asm("       mov     r0, r0");
       asm("       mov     r0, r0");
       asm("       mov     r0, r0");
       asm("       mov     r0, r0");
#endif      
       }
  }
    }
// главная функция программы
void C_Entry ()
{
    int index = 0;
    while (1)
    { // вечный цикл
             *result = index;
             index ++ ;
             wait(500000); // делам задержку
    }
}

Этот код делает задержку. Было проверено на осциллографе - задержка вышла около 1,2с.
Ниже этот же код только ассемблер:
Код:
00000000:  b        #0x64
00000004:  b        #4
00000008:  b        #8
0000000c:  b        #0xc
00000010:  b        #0x10
00000014:  mov      r0,r0
00000018:  ldr      pc,#0x50 ; = #0x54
0000001c:  b        #0x1c
00000020:  ldmvcdb  r0!,{r0,r1,r6,r8-r11,sp,lr}^
00000024:  stmvsda  r7!,{r1,r4-r6,r8,r11,sp,lr}^
00000028:  msrmi    cpsr_flg,#0x74
0000002c:  eorccs   r2,r2,r9,lsr #32
00000030:  eorcs    r3,r12,r0,lsr r0
00000034:  msrvc    spsr_all,#0x40000005
00000038:  strvsbt  r6,[lr],#-0x563
0000003c:  rsbvc    r4,pc,#0x80000000
00000040:  andeq    r2,r0,r0,ror lr
00000044:  andeq    r0,r0,r0
00000048:  andeq    r0,r0,r0
0000004c:  andeq    r0,r0,r0
00000050:  andeq    r0,r0,r4,asr r0
00000054:  stmdb    sp!,{r0-r12,lr}
00000058:  bl       #0xe0
0000005c:  ldmia    sp!,{r0-r12,lr}
00000060:  subs     pc,lr,#4
00000064:  mov      r0,#0xd2
00000068:  msr      cpsr_all,r0
0000006c:  ldr      sp,#0xc4 ; = #0xd1032000
00000070:  mov      r0,#0xd3
00000074:  msr      cpsr_all,r0
00000078:  ldr      sp,#0xc8 ; = #0xd1031f00
0000007c:  ldr      r0,#0xcc ; = #0x1c0
00000080:  ldr      r1,#0xd0 ; = #0xd1030800
00000084:  ldr      r3,#0xd4 ; = #0xd1030814
00000088:  cmp      r0,r1
0000008c:  beq      #0xa0
00000090:  cmp      r1,r3
00000094:  ldrcc    r2,[r0],#4
00000098:  strcc    r2,[r1],#4
0000009c:  bcc      #0x90
000000a0:  ldr      r1,#0xd8 ; = #0xd1030814
000000a4:  mov      r2,#0
000000a8:  cmp      r3,r1
000000ac:  strcc    r2,[r3],#4
000000b0:  bcc      #0xa8
000000b4:  mov      r0,#0x50
000000b8:  msr      cpsr_all,r0
000000bc:  ldr      sp,#0xdc ; = #0xd1031e00
000000c0:  b        #0x168
000000c4:  mrsle    r2,cpsr
000000c8:  mrsle    r1,cpsr
000000cc:  andeq    r0,r0,r0,asr #3
000000d0:  mrsle    r0,cpsr
000000d4:  mrsle    r0,cpsr
000000d8:  mrsle    r0,cpsr
000000dc:  mrsle    r1,cpsr
000000e0:  mov      r12,sp
000000e4:  stmdb    sp!,{r11,r12,lr,pc}
000000e8:  sub      r11,r12,#4
000000ec:  ldmdb    r11,{r11,sp,pc}
000000f0:  mov      r12,sp
000000f4:  stmdb    sp!,{r11,r12,lr,pc}
000000f8:  sub      r11,r12,#4
000000fc:  sub      sp,sp,#0xc
00000100:  str      r0,[r11,#-0x10]
00000104:  mov      r3,#0
00000108:  str      r3,[r11,#-0x14]
0000010c:  ldr      r2,[r11,#-0x14]
00000110:  ldr      r3,[r11,#-0x10]
00000114:  cmp      r2,r3
00000118:  bcc      #0x120
0000011c:  b        #0x164
00000120:  mov      r3,#0
00000124:  str      r3,[r11,#-0x18]
00000128:  ldr      r3,[r11,#-0x18]
0000012c:  cmp      r3,#0
00000130:  ble      #0x144
00000134:  ldr      r3,[r11,#-0x14]
00000138:  add      r3,r3,#1
0000013c:  str      r3,[r11,#-0x14]
00000140:  b        #0x10c
00000144:  mov      r0,r0
00000148:  mov      r0,r0
0000014c:  mov      r0,r0
00000150:  mov      r0,r0
00000154:  ldr      r3,[r11,#-0x18]
00000158:  add      r3,r3,#1
0000015c:  str      r3,[r11,#-0x18]
00000160:  b        #0x128
00000164:  ldmdb    r11,{r11,sp,pc}
00000168:  mov      r12,sp
0000016c:  stmdb    sp!,{r11,r12,lr,pc}
00000170:  sub      r11,r12,#4
00000174:  sub      sp,sp,#4
00000178:  mov      r3,#0
0000017c:  str      r3,[r11,#-0x10]
00000180:  ldr      r3,#0x1b8 ; = #0xd1030800
00000184:  ldr      r1,[r3,#0]
00000188:  ldr      r3,[r11,#-0x10]
0000018c:  and      r2,r3,#0xf
00000190:  ldr      r3,#0x1bc ; = #0xd1030804
00000194:  ldrb     r3,[r3,r2]
00000198:  str      r3,[r1,#0]
0000019c:  ldr      r3,[r11,#-0x10]
000001a0:  add      r3,r3,#1
000001a4:  str      r3,[r11,#-0x10]
000001a8:  mov      r0,#0x7a000
000001ac:  add      r0,r0,#0x120
000001b0:  bl       #0xf0
000001b4:  b        #0x180
000001b8:  mrsle    r0,cpsr
000001bc:  mrsle    r0,cpsr
000001c0:  strnesh  pc,[pc],-r12
000001c4:  adclt    pc,r4,r0,asr #19
000001c8:  stm??ia  r2,{r0,r3,r4,r7,r9,r12,pc}
000001cc:  orrhi    r9,r8,#0x80
000001d0:  cdphi    p1,0x8,c10,c6,c6,#6

Хотя бы где здесь 500000 тактов ???


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как можно посчитать кол-во тактов выполнения программы??
СообщениеДобавлено: Пт ноя 25, 2011 12:47:29 
Друг Кота
Аватар пользователя

Карма: 26
Рейтинг сообщений: 108
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Сообщений: 7439
Откуда: г. Москва
Рейтинг сообщения: 0
чего ты мучаешься, внутренним счетчиком тактов посчитай.
не помню, есть ли он в арм7тдми. в любом случае, никто не мешает напрячь один из таймеров считать с тактовки ядра.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как можно посчитать кол-во тактов выполнения программы??
СообщениеДобавлено: Пт ноя 25, 2011 15:23:44 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Сб апр 03, 2010 10:12:41
Сообщений: 561
Откуда: Хабаровск
Рейтинг сообщения: 0
А как я узнаю его состояние? Работаю в САПР FAST CHIP


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как можно посчитать кол-во тактов выполнения программы??
СообщениеДобавлено: Пт ноя 25, 2011 20:14:29 
Вымогатель припоя

Карма: 22
Рейтинг сообщений: 114
Зарегистрирован: Пн июн 14, 2010 13:07:29
Сообщений: 630
Откуда: Жуковский
Рейтинг сообщения: 0
наверно здесь:
Цитата:
000001a8: mov r0,#0x7a000
000001ac: add r0,r0,#0x120
500000 = 0x7A120


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как можно посчитать кол-во тактов выполнения программы??
СообщениеДобавлено: Сб ноя 26, 2011 13:03:21 
Вымогатель припоя
Аватар пользователя

Зарегистрирован: Сб апр 03, 2010 10:12:41
Сообщений: 561
Откуда: Хабаровск
Рейтинг сообщения: 0
a_skr писал(а):
наверно здесь:
Цитата:
000001a8: mov r0,#0x7a000
000001ac: add r0,r0,#0x120

500000 = 0x7A120

Спасибо большое.
Только кое что не ясно:
1. поместили в рег. r0 число в шестнадцатиричке 0007A000
2. прибавили к 0007А00 число 0000120 в шестнадцатиричке.
Не понятна запись : add r0,r0,#0x120 . Зачем два раза R0 ???? :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как можно посчитать кол-во тактов выполнения программы??
СообщениеДобавлено: Сб ноя 26, 2011 14:20:39 
Сверлит текстолит когтями
Аватар пользователя

Карма: 4
Рейтинг сообщений: 30
Зарегистрирован: Ср янв 05, 2011 16:25:15
Сообщений: 1163
Рейтинг сообщения: 0
Цитата:
Не понятна запись : add r0,r0,#0x120 . Зачем два раза R0
.. это особенность ARM и причем весьма удобная (трёхадресная адресация) .... смысл - R0=R0+0x120
ЗЫ. вместо второго r0 может быть и другой регистр, например add r0,r1,r4 - r0=r1+r4


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: Как можно посчитать кол-во тактов выполнения программы??
СообщениеДобавлено: Сб ноя 26, 2011 14:22:19 
Вымогатель припоя

Карма: 4
Рейтинг сообщений: 41
Зарегистрирован: Пт янв 30, 2009 14:50:35
Сообщений: 635
Откуда: Солнечногорск
Рейтинг сообщения: 0
У родной АРМовской системы команд (как и Тумбы-2, но не просто Тумбы) все арифметико-логические команды имеют вид:

приёмник := источник1 операция источник2

Запись типа add r0,r0,#0x120 указывает, что приёмником и источником1 является один и тот же регистр R0, а источником2 -- константа 0x120.

ADD. Опередили :)

А подсчитывать число тактов -- дело неблагодарное. Дело в том, что в АРМах не всё так просто, даже если кэш-памяти нет. Может иметься, например, "ускоритель флэш-памяти" (таковые присутствуют как минимум у NXP и STM), эффективность которого зависит от ширины команд и последовательности их выполнения. В результате подсчитать такты можно совершенно точно, но сделать это намного сложней, чем для какой-нибудь АТмеги.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Форум закрыт Эта тема закрыта, Вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


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

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y