ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
1077014
klen (14.02.2021 01:34, просмотров: 5429)
дошли руки. измерил 'скорость' прерываний riscv(bamblebee+eclic) в GigaDevice gd32vf1xx 

для справки проц китайциы назвали bamblebee - это ихняя реализация riscv IMAC

eclic - он видимо и в африке eclic - стандартный контроллер прерываний пришиваемый к riscv


мерял время между програмной генерацией прерывания exti и точкой входа в обработчик прерывания.

для контроля двумя способами

1. логическим анализатром DSLogic Pl на пине gpiob.pin9

2. внутренним 64 разрядным счетчиком циклов процессора, регистр mcycle

даже совпало.


измерял для частот процессора 8, 100, 184 МГц. разныцы в относительных "крыжиках" не обнаружилось. и это удивительно.

ибо я ожидал что на высокой частоте изза 'из-за проскальзования' флеша эффективная частота проца будет ниже реально... однакож не обнаружилось

все линейно такт к такту.


в циклах измерения показали 58 циклов


вопрос - 58 тактов это много или мало. как бы хотелось бы соотнести с например cortex-m3

наперед придумал как уменьшить это время... переписыванием точки входа в прерывание и переносом сохранения и восстановления контекста в самом обработчике. тогда наверно можно будет не всю портянку в стек просовывать.


код:

#include "appdefs.h"

sout_t sout ;

volatile uint32_t mcycle_req, mcycle_irq ;
uint32_t sys_clock_freq ;

int main()
{
   sys_clock_freq = rcu.ck_sys_freq() ;

   sout << "main->\n"
        << "\tsys clock freq: " << sys_clock_freq << " Hz\n";

   rcu.clock_out_source_ck_sys() ;
   afio.clock_enable();
   gpioa.pin8_mode_output_50mhz();
   gpioa.pin8_output_config_afio_push_pull();

   eclic.exti0_enable();
   sout << "\texti irq line 0 enable\n" ;
   exti.line0_interrupt_enable();
   exti.line0_falling_edge_trigger_enable();
   sout << "\texti line 0 falling edge configure\n" ;

   afio.clock_enable();
   afio.clock_reset();
   afio.exti0_source_pa0();
   sout << "\tafio pa0 configure\n" ;

   gpiob.clock_enable();
   gpiob.pin9_mode_output_50mhz();
   gpiob.pin9_output_config_push_pull();
   gpiob.pin9_set();
   sout << "\tpc13 as out configure\n" ;

   // измерение времени реакции на прерывание процессора ricsv в рализации gigadevice gd32
   // програмная генерация исключения

   // измерение длительности трассы команд "измерения длительности" :)
   gpiob.pin9_reset();
   mcycle_req = read_csr(mcycle);
   exti.line0_software_interrupt_event_activate();
   wfi(); // сон до наступления исключения

   sout << "\tirq request->irq hadnler exec time is: "
                     <<  1000000000ull * ( mcycle_irq - mcycle_req ) / sys_clock_freq
                     << " nS\n" ;
   while(1)
     {
         gpiob.pin9_reset();
         wfi(); // сон до наступления исключения
     }
   return 0 ;

}

IRQ_HANDLER(exti0)
{
  gpiob.pin9_set() ;
  mcycle_irq = read_csr(mcycle) ;

  static size_t irq_counter = 0 ;
  irq_counter++ ;

  sout << "exti0_irq_handler() request #" << irq_counter << "\n" ;
  exti.line0_pending_clear();
}

лог:


dslogic plus для крайнего измерения на 184 МГц: