Вопрос по picamera

Тема в разделе "Raspberry Pi", создана пользователем Shestipaliy, 29 июн 2019.

  1. Igor68

    Igor68 Гуру

    Да и никто не спорит. Правда можно и на Сях делать оптимально. К примеру может и сам размер не так важен но важно время выполнения как пример такая конструкция:
    Код (C++):
    if (p == 1)
      work(1);
    else if (p == 2)
      work(2);
    else if (p == 3)
      work(3);
    else
      work(4);
    В любом случае медленнее чем
    Код (C++):
    switch(p)
    {
      case 1:
        work(1);
        break;
      case 2:
       work(2);
       break;
      case 3:
       work(3);
       break;
    default:
      work(4);
      break;
    }
     
    Именно на столько, что для if(p==1) значения как p, так и 1(2 и 3) надо извлекать каждый раз. В то время как во 2-м случае p извлекается 1 раз и только 1,2,3 извлекаются каждый раз. А это лишнее обращение к памяти. А то, что каксается библиотек, то каждый волен применять их на своё усмотрение. И если хочется избавиться от "узких" мест то можно закрутить и свой код вплоть до ассемблера.
     
  2. Igor68

    Igor68 Гуру

    Кстати Вы сами можете посмотреть код после компиляции, взглянув на листинг ассемблера. Зачастую компиляторы, кроме библиотечных функций, которые загружаются выдают файл листинга в форме:
    C->Аsm->Bin. Так к примеру поступает Keil uVision.
     
  3. parovoZZ

    parovoZZ Гуру

    Я всегда так делаю, когда отлаживаюсь.
     
  4. ИгорьК

    ИгорьК Давно здесь Команда форума

    :) главное трезво оценивать три вещи:
    - свои (царские) способности;
    - наличие времени;
    - желания доказывать что твой велосипед круче.
     
  5. Igor68

    Igor68 Гуру

    Вот про крутизну не знаю. А вот это (прерывание Fiq для ARM7):
    Код (C++):
    void FIQ_Handler (void) __irq
    {
        PWMA        = *pw_addr;
        #if(_debug > 0)
        sim_pw = *pw_addr;
        #endif
        if(flag1 & _adc_start)
        {
            #if(!(_sim_disable_adc_u > 0))
            *dat_addr = (((ADCDAT >> 16) & 0x0FFF) + *dat_addr) >> 1;
            //*dat_addr = ((ADCDAT >> 16) & 0x0FFF);
            #endif
            #if(_debug > 0)
            sim_setadc = adc_u_set[sim_cnt_adc_u_set];
            sim_cnt_adc_u_set++;
            #endif
            dat_addr++;
            if(!(dat_addr < max_dat_addr))
            {
                dat_addr = dat_addr_null;
                #if(_debug > 0)
                sim_cnt_adc_u_set = 0;
                #endif
            }
        }
        pw_addr++;
        if(!(pw_addr < max_pw_addr))
        {
            pw_addr = &pw[0];//pw_addr_nul;
            if(flag1 & _adc_start)
                flag1 &= (~(_adc_start | _adc_on));
            else if(flag1 & _adc_on)
                flag1 |= _adc_start;
        }
        T1CLRI = 0x01;
    }
    Надо что бы как можно быстрее... и уже посматриваю в сторону ASM. Хотя можно наверное и опртимизировать. Смысл в том что бы задание для PWM и чтение ADC было как можно быстрее. Ведь есть ещё прерывания типа Irq для других трёх таймеров, обращение к EEPROM внутренней и монитору питания.
    Да и циклу main надо когда-то работать. И при генерации синусоиды более 1500 Гц с контролем формы сигнала на клавиатуру, дисплей и выполнение условий совсем не остаётся времени.
     
    ИгорьК нравится это.
  6. Shestipaliy

    Shestipaliy Нерд

    Ну это конечно замечательно, только вот picamera стабильная и удобная библиотека (только медленная), я если даже умудрюсь такое сделать своими руками то на это уйдет тонна времени. Засада.
     
  7. Igor68

    Igor68 Гуру

    Дело не в том, что она picamera совсем. А в том, что программа на питоне редко с точки зрения чатоты кадров работает с полученными данными. И только. Тут надо что-то в реальном времени. Кстати OpenCV нормально работает с камерой. Там и готовый пример есть.