Ардупилот на платах OpenPilot Revolution / RevoMini (записей: 1756)

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    а если в случае если назначен drdy вместо таймера назначать прерывание.

    благо у вас в хале уже для этого все есть

    https://github.com/night-ghost/ardupilot/blob/master/libraries/AP_HAL_REVOMINI/GPIO.cpp#L112

    типа

    _dev->register_periodic_callback(1000, FUNCTOR_BIND_MEMBER(&AP_InertialSensor_Invensense::_poll_data, bool));

    на attach_interrupt

     

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад

    Ну не хочу я до принятия в мейнстрим что-то улучшать... И так приходится и предубеждения преодолевать, и конкурирующий контроллер продавливать - а если их еще и в лужицы тыкать каждый раз то вообще шансы будут ниже нуля... 

    Вот недавно оформил issue  - так в полчаса закрыли, типО дубликат, а по обсуждению становится понятно "мы пробовали нам слабО". А ведь у меня 90% под это есть!

     

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    мы пробовали пробить в мэйнстрим свой хал f4by, но попытка была неудачной. в принципе будем пытаться еще...

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

    попробовал собрать ваши исхдники в эклипсе, мэйком. бинарник собрался.

     

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад
    [2017-01-03 12:51:03] kozin писал(а): стена бюрократии что зачем, давай так, нет переделай наоборот

    Ага, я наблюдал сие действо. Самое забавное что даже полное выполнение всех требований еще не гарантирует принятия! Я делал простейший PR - поддержка телеметрии DEVO. Около 200 строк, все претензии устранены, и - тишина... 

    ...а за это время INAV, который пилит один человек, пополнился поддержкой пары десятков контроллеров, и вообще заметно продвинулся вперед.

    Эх, но не будем о грустном - я тут нарыл прагмы GCC по управлению оптимизацией, так что будет время - попробую вычленить проблемные участки кода и таки разобраться, что же ломается при включении оптимизации.

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    решил попробовать расставить пины для f4by. c тем чтобы не плодить папки хала решил сделать пока просто дефайн пинаутов разных плат.

    но все равно видимо не обойтись одним файлом дефайнов

    вот что пока получилось https://github.com/kozinalexey/ardupilot/commit/f8327d6830d8af534eff20dd1894de85339bf970

     

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    если платформа планируется как универсальная, то возможно пригодятся мои заметки.

    несмотря на то что для сборки не  требуется натикс и фирмварь - без субмодулей не обойтись, после клонирования проекта нужно инициализиролвать субмодули, в их числе мавлинк генератор, он создает необходимые файлы для компиляции мавлинка.

     

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад

    Таам все совсем не так должно делаться.

    1.  называем свою плату как-нибудь
    2. в папке wirish/boards создаем папку с этим именем и туда копируем все из папки revomini_MP32V1F4
    3. правим в папке с именем своей платы таблицу PIN_MAP под свой камень - у него ж явно ног больше
    4. в папке /mk файл board_REVOMINI.mk копируем в  что-то свое, и в нем заменяем BOARD  ?= revomini_MP32V1F4 на свое
    5. и только после этого дефайны :)

    А пока я вижу сначала полное удаление файла  gpio.cpp а затем его создание заново - хотя его-то вообще можно не трогать, а только сделать нужные дефайны для оной usb_connected. Щасс сделаю :) UPD. Как-то не предполагал что кому-то может еще понадобиться, вот и не вычищал прямое указание ног. Сейчас сделал правильно, через дефайн и пинмап

    PS. в этой папке файлы system_stm32f4xx.c и revomini_MP32V1F4_startup.S - получены из СТМовского генератора файлов инициализации

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад
    [2017-01-04 09:23:23] kozin писал(а): без субмодулей не обойтись

    А то я не знаю :) Описание сборки "максимальной аутеничности"

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад

    Поймал точку возникновения бага с MPU - ничего не понимаю :(

    Файл GPIO.h класс REVOMINIDigitalSource метод write() 

    Если я его оборачиваю в #pragma GCC optimize ("O0") / #pragma GCC pop_options  то все работает. Код в этом случае имеет такой вид

    write(b)
    08099050:   push    {r7, lr}
    08099052:   sub     sp, #8
    08099054:   add     r7, sp, #0
    08099056:   str     r0, [r7, #4]
    08099058:   mov     r3, r1
    0809905a:   strb    r3, [r7, #3]
    0809905c:   ldr     r3, [r7, #4]
    0809905e:   ldr     r1, [r3, #4]
    08099060:   ldr     r3, [r7, #4]
    08099062:   ldrb    r2, [r3, #8]
    08099064:   ldrb    r3, [r7, #3]
    08099066:   mov     r0, r1
    08099068:   mov     r1, r2
    0809906a:   mov     r2, r3
    r0=dev r1=4 r2=0
    0809906c:   bl      0x8099008 <gpio_write_bit(gpio_dev const*, uint8_t, uint8_t)>
    08099070:   adds    r7, #8
    08099072:   mov     sp, r7
    08099074:   pop     {r7, pc}
    
     собственно   gpio_write_bit(gpio_dev const*, uint8_t, uint8_t):
    08099008:   movs    r3, #1
    0809900a:   lsls    r3, r1
    0809900c:   uxth    r3, r3
    173           if (val) {
    0809900e:   cbz     r2, 0x8099016 <gpio_write_bit(gpio_dev const*, uint8_t, uint8_t)+14>
    174       	dev->GPIOx->BSRRL = bv;
    08099010:   ldr     r2, [r0, #0]
    08099012:   strh    r3, [r2, #24]
    08099014:   bx      lr
    176       	dev->GPIOx->BSRRH = bv;
    08099016:   ldr     r2, [r0, #0]
    
    ; запись r2=0x40020000 r3=0x10
    08099018:   strh    r3, [r2, #26]
    0809901a:   bx      lr
    

    В таком виде все работает.

    Если же я комментарю прагму отмены оптимизации, то код приобретает такой вид

    0809903c:   ldr     r2, [r0, #4]
    171           uint16_t bv = BIT(pin);
    0809903e:   ldrb    r0, [r0, #8]
    08099040:   movs    r3, #1
    08099042:   lsls    r3, r0
    08099044:   uxth    r3, r3
    173           if (val) {
    08099046:   cbz     r1, 0x809904e <REVOMINI::REVOMINIDigitalSource::write(unsigned char)+18>
    174       	dev->GPIOx->BSRRL = bv;
    08099048:   ldr     r2, [r2, #0]
    0809904a:   strh    r3, [r2, #24]
    0809904c:   bx      lr
    176       	dev->GPIOx->BSRRH = bv;
    0809904e:   ldr     r2, [r2, #0]
    ; запись r2=0x40020000 r3=0x10
    08099050:   strh    r3, [r2, #26]
    08099052:   bx      lr
    
    

    В тот же самый регистр пишется то же самое значение - и НЕ РАБОТАЕТ.

    Ничего не понимаю :(

     

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    > этой папке файлы system_stm32f4xx.c и revomini_MP32V1F4_startup.S - получены из СТМовского генератора файлов инициализации

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

    Может инструкция есть какая как или у кого нибудь есть настроенная среда чтобы сгенерить эти файлы для 100 пин stm32F407VG?

     

     

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад

    Тогда проще взять готовые файлы инициализации из вашего ХАЛа и "доработать напильником", тулзы от СТМ это что-то с чем-то. Всего-то нужно вектора прерываний для камня и настройку всех внутренних генераторов и PLL

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

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

    случайно заметил что у вас пин cs шины и cs мпу установлены идентично. поскольку на шине нет ни мультиплексора ни буффера нужен ли ?

    #define MPU6000_CS_PIN        51

    #define BOARD_SPI1_NSS_PIN      D51
       #define BOARD_SPI1_CS_BR_PIN    51

     

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад
    [2017-01-04 15:04:18] kozin писал(а): разве что глянуть на шину снаружи каким либо аналайзером.

    был бы...

    Я сам ассемблер АРМа вижу третий раз, но  первым был взлом драйвера в телефоне, так что щасс полегче :)

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    если мпу единственный на шине то вроде не должно мешать, но если там еще что то то cs на мпу будет выставляться при любом обращении к шине

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад

    То-то и оно что единственный... Вышеприведенный код это тяжкое наследие, дефайны по шине не используются. Сейчас почищу.

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад

    Почистил

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    гы. размер массива на 107 строк функциональных пинов,  а в рево проц на 64 ноги. видимо табличка в какойто мере универсальна, нужно только понять есть ли приемственность

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад

    Да, с 55 до 99 дырень. Перенумеровывать лениво

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    сверяю масив пинмап со своим процом, пока все сходится недаром файл назван stm32f4xx

    нашел странным что один и тот же таймер в одной и той же конфигурации с одним и тем же каналом используется на двух пинах

      {&gpioa, &timer1,NULL,  8, 1, ADCx}, /* D22/PA8  2 */

        {&gpioe, &timer1,NULL,  9, 1, ADCx}, /* D75/PE9  */

    исодя из данных проги стмовской что праильно во вротом случае.

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

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад
    [2017-01-04 21:03:49] kozin писал(а): сверяю масив пинмап со своим процом, пока все сходится недаром файл назван stm32f4xx

    Ага, это из LeafLabs/ArduinoSTM32 одолжено.

    [2017-01-04 21:03:49] kozin писал(а): один и тот же таймер в одной и той же конфигурации с одним и тем же каналом используется на двух пинах

    Нога D75 не используется а значит и не инициализируется - то есть эта настройка не применяется. 

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    в идеале, если делать "универсальный хал" под стм32ф4 контроллеры было бы замечательно (если это возможно) если бы из одного файла дефайнов задавались не только пины выборки чипов, спиай шины и сериал портов но и выбор сенсоров и их шин. нашел некоторый фиксированный хардкод в i2c,  небольшой беспорядок с порядком юсартов при инициализации хал.

    было бы красивши чтобы юсарты по порядку инициализировать, а в хале проверять не сколько выходов используется и свободны ли пины, а задефайнены ли rx tx пины юсарта.

    собственно если прошивка не квайд и не три то логично не определять в пиндефайнах платы rx tx пины конкурирующих юсартов

     

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад
    [2017-01-05 06:56:03] kozin писал(а): если делать "универсальный хал" под стм32ф4 контроллеры

    Тут с одним бы разобраться окончательно, потом можно про остальное думать.

    [2017-01-05 06:56:03] kozin писал(а): но и выбор сенсоров и их шин

    I2c автодетектится так что можно всей кучей держать, для SPI есть в TODO и есть мысЕль как это сделать дешево.

    [2017-01-05 06:56:03] kozin писал(а): небольшой беспорядок с порядком юсартов

    Это не беспорядок а попытка соответствовать "умолчальному" назначению УСАРТов как в МП так и в доке OpenPilot

    [2017-01-05 06:56:03] kozin писал(а): если прошивка не квайд и не три

    УСАРТ инициализируется при первом использовании, поэтому никому такая конкуренция не мешает, зато позволяет не инклудить юзерские настройки в низкоуровневый код

     

    Жесткое назначение SoftI2C пинов убрал

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    пара наблюдений. еклипс показывает что fpu фпу не включается.

    inline void enableFPU(void){
    #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
        SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));    // set CP10 and CP11 Full Access
    #endif
    }

    т.к. расчетное __FPU_USED ==0 . попытался разобраться но там куча непонятных мне условий.

    немного не понял как рабтотает установка делителей кварца. вроде как просто задается целевая частота 168. но непонятно расчет идет исходя из какихто типовых значений кварца, т.е 25 мгц? или само вычислит что у меня снаружи 8 мгц?

     

     

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад
    [2017-01-05 07:51:27] kozin писал(а): немного не понял как рабтотает установка делителей кварца

    Скопировано как есть после СТМного генератора, даже не разбирался. Внешняя частота задана 8.

    [2017-01-05 07:51:27] kozin писал(а): еклипс показывает что fpu фпу не включается.

    В коде команды ФПУ используются и работают если по шагам идти.

              Vector3::operator*=(float):
    0804e1cc:   vldr    s13, [r0]
    0804e1d0:   vldr    s14, [r0, #4]
    0804e1d4:   vldr    s15, [r0, #8]
    0804e1d8:   vmul.f32        s13, s13, s0
    0804e1dc:   vmul.f32        s14, s14, s0
    0804e1e0:   vmul.f32        s0, s15, s0
    0804e1e4:   vstr    s13, [r0]
    0804e1e8:   vstr    s14, [r0, #4]
    0804e1ec:   vstr    s0, [r0, #8]
    283       }
    0804e1f0:   bx      lr
    
  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    /*
     *  add new boards steps 
     *  lets name of new board is
     *  in folder  wirish/boards make directory
     *  copy to this folder all files from revomini_MP32V1F4
     *  rename files part revomini_MP32V1F4 -change to
     *  change in .h  pin definitions. see pin number in PIN_MAP array
     *  example 'D2' = 2 = cpu pin named 'PB12'
     *  in folder /mk file board_REVOMINI.mk copy to ,
     *  inside this file change constant BOARD  ?= revomini_MP32V1F4 to  BOARD  ?=
      */

    куданить бы вставить памятку .

    а как определять таргет для своей платы или выбирать ее?

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад

    Readme в каталоге ХАЛа подойдет?

    ЗЫ. Ужал количество исключений из оптимизации до двух заголовков и одного CPP. Но до сих пор не понимаю что ему не хватает.

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    размер буфера достаточен?

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад
    [2017-01-05 12:24:26] kozin писал(а): размер буфера достаточен

    Какого буфера? Все определяется вызывающей стороной.

  • Аватар профиля kozin Алексей Козин в 7 г., 3 мес. назад

    Как это видится с дилетантской точки зрения: SPI порт вроде как сдвигает байт побитно из паралельного состояния в последовательное, теоретически реализация может быть с буффером когда пишешь в буффер массив байт а он сам по мере опустошения сдвигового регистра пишет в него из буффера. если в реализации такого буффера его размер меньше чем в него записывают в быстром оптисмизированом коде- то на выходе мусор. если он успевает освободить буффер сдвинув данные в последовательную шину то все нормально

  • Аватар профиля Night_Ghost Night_Ghost287 пунктов в 7 г., 3 мес. назад

    Все может быть, только вот в коде есть принудительная синхронизация по переданным и принятым байтам, так что независимо от скорости исполнения поток принимаетс/передается строго синхронно. Если драйвер заказал у ХАЛ прием и предоставил буфер меньшего размера то он ССЗБ, но от уровня оптимизации это никак не зависит.

    Тут самое забавное что наикапризнейшая I2С  прекрасно работает с чистА софтверным драйвером, а типО беспроблемная SPI загадки загадывает...

← Форум группы   Все форумы К последней записи
Постов на странице:

Вы автоматически вступите в эту группу, когда ответите в теме.

Добавить ответ:

-
Рейтинг@Mail.ru