roboforum.ru

Технический форум по робототехнике.


dccharacter - Излить посильно

Блоги посетителей.
Правила форума
В данном разделе каждый может иметь не более одной темы. Тема должна начинаться с логина (ника) робофорума.

Re: dccharacter - Излить посильно

Сообщение dccharacter » 12 фев 2013, 11:36

Ну и чего?
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: dccharacter - Излить посильно

Сообщение Dmitry__ » 12 фев 2013, 17:36

Ну чего тебе сказать? Я получил разрыв шаблона :shock:
Так много говорилось про перемалывание NOPов, а ты... :cry:

Научись пользоваться симулятором в IAR, прокрути в нем основные функции, посмотри кто жрет ресусрсы.

AHRS_GetValues(val) сьедает 3909246 тактов = 55846,3 мкс

Причем:
Код: Выделить всёРазвернуть
  processGyroData(GyroBuffer, GyroTempBuffer);   =303521 t

  processAccelData(AccBuffer, AccTempBuffer);   =1802600 t

  processMagnetoData(MagBuffer, MagTempBuffer);   =1802490 t


Если ты хочешь получить 50 герц, то у тебя есть: 1000000 (1сек) /50 герц * 70мгц = 1400000 тактов.
А твои processGyroData + processAccelData + processMagnetoData сьедают почти 4000000 тактов.
А сам расчет AHRS занимает 630 тактов :D
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: dccharacter - Излить посильно

Сообщение dccharacter » 12 фев 2013, 18:07

гггггггг

Добавлено спустя 12 минут 14 секунд:
Кстати, это функции из примеров, из которых просто вырезано получение данных для того, чтобы данные с датчиков читались одновременно, а потом уже остальная лабуда шла.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: dccharacter - Излить посильно

Сообщение Dmitry__ » 12 фев 2013, 18:14

На самом деле я могу ошибаться с тактами, т.к. проверял на симуляторе, а не в железе. Работа с i2c скорее всего проходит по time out, а это самое долгое ожидание. В общем, надо написать тестовые примочки, которые тебе реально покажут такты выполнения функций. Типа, обнулил таймер, выполнил функцию, прочитал таймер и выдал на терминал.
Но в любом случае, AHRS_GetValues не должен читать датчики залезая в реальные железяки. Он должен забирать данные из памяти. А готовить данные из датчиков должна другая программа (в прерывании, прозрачно основной проге). И вылизана по тактам она должна быть по макс. Даже нельзя ждать флаг готовности шин, проверил флаг, если все плохо - свалил до след. тика времени.

Добавлено спустя 2 минуты 8 секунд:
dccharacter писал(а):Кстати, это функции из примеров, из которых просто вырезано получение данных

Да у стм полный быдлокодинг. Ни одну их функцию не включай в свой проект, пока полностью ее не оттестишь/поймешь.
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: dccharacter - Излить посильно

Сообщение dccharacter » 12 фев 2013, 20:54

Ну ты не разобрался
Вот где у меня читаются данные с железа
Код: Выделить всёРазвернуть
void EXTI1_IRQHandler(void) {
  /* Clear the EXTI line pending bit */
  EXTI_ClearITPendingBit(EXTI_Line1);
  STM_EVAL_LEDToggle(LED3);
  STM_EVAL_LEDOn(LED4);
  readAllSensors(GyroTempBuffer, AccTempBuffer, MagTempBuffer); // <--- чтение из железа занимает 1мс, скорости отпущены, если увеличить вдвое i2c, то ьудет свистеть
  STM_EVAL_LEDOff(LED4);
  GyroDRDFlag = 1;
}


Добавлено спустя 7 минут 41 секунду:
AHRS_GetValues - 500 мкс в железе

Добавлено спустя 22 минуты 9 секунд:
хм, а я в симуляторе не могу попасть на эти функции. Прога висит на всяких инициациях гиры и проч. Как ты до них дошел-то?
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: dccharacter - Излить посильно

Сообщение Dmitry__ » 12 фев 2013, 21:14

Вот трейсю: updateQuaternions(QuaternionsBuffer);
Код: Выделить всёРазвернуть
32694
      updateQuaternions(QuaternionsBuffer);
32753
AHRS_GetValues(val);
32760
processGyroData(GyroBuffer, GyroTempBuffer);
32786
L3GD20_Read(&tmpreg, L3GD20_CTRL_REG4_ADDR, 1);
32817
  L3GD20_SendByte(ReadAddr);
32829 !!! L3GD20Timeout=4096
  /* Loop while DR register in not empty */
  L3GD20Timeout = L3GD20_FLAG_TIMEOUT;
  while (SPI_I2S_GetFlagStatus(L3GD20_SPI, SPI_I2S_FLAG_TXE) == RESET)
  {
    if((L3GD20Timeout--) == 0) return L3GD20_TIMEOUT_UserCallback();
  }
***********************************************************
/**
  * @brief  Checks whether the specified SPI flag is set or not.
  * @param  SPIx: To select the SPIx/I2Sx peripheral, where x can be: 1, 2 or 3
  *         in SPI mode or 2 or 3 in I2S mode or I2Sxext for I2S full duplex mode. 
  * @param  SPI_I2S_FLAG: specifies the SPI flag to check.
  *   This parameter can be one of the following values:
  *     @arg SPI_I2S_FLAG_TXE: Transmit buffer empty flag.
  *     @arg SPI_I2S_FLAG_RXNE: Receive buffer not empty flag.
  *     @arg SPI_I2S_FLAG_BSY: Busy flag.
  *     @arg SPI_I2S_FLAG_OVR: Overrun flag.
  *     @arg SPI_I2S_FLAG_MODF: Mode Fault flag.
  *     @arg SPI_I2S_FLAG_CRCERR: CRC Error flag.
  *     @arg SPI_I2S_FLAG_FRE: TI frame format error flag.
  *     @arg I2S_FLAG_UDR: Underrun Error flag.
  *     @arg I2S_FLAG_CHSIDE: Channel Side flag.   
  * @retval The new state of SPI_I2S_FLAG (SET or RESET).
  */
FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG)
{
  FlagStatus bitstatus = RESET;
  /* Check the parameters */
  assert_param(IS_SPI_ALL_PERIPH_EXT(SPIx));
  assert_param(IS_SPI_I2S_GET_FLAG(SPI_I2S_FLAG));

  /* Check the status of the specified SPI flag */
  if ((SPIx->SR & SPI_I2S_FLAG) != (uint16_t)RESET)
  {
    /* SPI_I2S_FLAG is set */
    bitstatus = SET;
  }
  else
  {
    /* SPI_I2S_FLAG is reset */
    bitstatus = RESET;
  }
  /* Return the SPI_I2S_FLAG status */
  return  bitstatus;
}

Уже попали в ожидание шины spi и таймаут в 4096 повторов.
т.е. явно обращение к железке

Код: Выделить всёРазвернуть
//L3GD20Timeout=4096
  /* Loop while DR register in not empty */
  L3GD20Timeout = L3GD20_FLAG_TIMEOUT;
  while (SPI_I2S_GetFlagStatus(L3GD20_SPI, SPI_I2S_FLAG_TXE) == RESET)
  {
    if((L3GD20Timeout--) == 0) return L3GD20_TIMEOUT_UserCallback();
  }



Добавлено спустя 13 минут 13 секунд:
dccharacter писал(а):хм, а я в симуляторе не могу попасть на эти функции. Прога висит на всяких инициациях гиры и проч. Как ты до них дошел-то?

А ты останови симуляцию. (или вообще запрети запуск симуляции при отладке)
потом правая кнопка мыши на нужной функции: SetNextStatement
Саму функцию пометь точкой останова, и за этой функцией поставь точку останова.
Запомни значение CYCLECOUNTER (если этого окна нет, то: view/register)
A дальше по F11 / shiftF11 / F5 изучай мегакод стм :)
Если твой стек не переполнится и ты сможешь вернуться из дебрей в начальную функцию, то CYCLECOUNTER тебе покажет сколько времени ты был в жопппппе у стм
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: dccharacter - Излить посильно

Сообщение dccharacter » 12 фев 2013, 21:28

а, я понял
это притащено из СТМ-овских функций
там в каждом цикле идет чтение регистра и по нему выставляется чувствительность
это тупость конечно, руки просто не дошли до этого
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: dccharacter - Излить посильно

Сообщение dccharacter » 13 фев 2013, 01:48

офигеть
за два дня так и не удалось повернуть кубик теми кватернионами, что приходят от платы в питоне
в процессинге все крутиться
про разные реализации atan2 уже в курсе
жесть
Я всегда думал, что нет ничего элементарнее, чем описание вращения
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: dccharacter - Излить посильно

Сообщение dccharacter » 14 фев 2013, 22:43

бизон, пора тебе апсейлиться http://ibigdan.livejournal.com/12474654.html
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: dccharacter - Излить посильно

Сообщение dccharacter » 16 фев 2013, 16:09

Пацаны! КВАТЕРНИОНЫ!
http://www.gamedev.ru/code/articles/?id=4215

Добавлено спустя 3 часа 53 минуты 16 секунд:
Хи х ихи
Вращение на 90 град вокруг оси Y: rmY = Quaternion((sqrt(2.0)/2.0, 0, sqrt(2.0)/2.0, 0)) <-тупо, чтобы ось Х смотрела в монитор
Вращение на 90 град вокруг оси Z: rmZ = Quaternion((sqrt(2.0)/2.0, 0, 0, sqrt(2.0)/2.0)) <-тупо, чтобы вращение было в нужном направлении
Сумма вращений (оператор * перегружен!!!!): rmC = rmZ*rmY
Читаем кватернион с платы: q
Если надо задать "домашнюю позицию", берем кватернион, обратный текущему, т.о. вращения нивелируют друг друга: hq = q.conjugate(); q = hq*q
Суммируем все вращения: res = rmC*q
Дальше берем тупо любой вектор: axis = Quaternion((0, 1, 0, 0))
И тупо по формуле вращаем ег онашим вращением: axis = (res*axis)*res.conjugate()
profit!!!!!

Присказка "я вас *** вертел" приобретает новый смысл :-)))
Никаких конвертаций в матрицы и уж тем более страшные-ужасные углы эйлера.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: dccharacter - Излить посильно

Сообщение dccharacter » 17 фев 2013, 18:29

Скриптик для визуализации

Добавлено спустя 2 часа 5 минут 35 секунд:
опять скучно...

можно, конечно, сделать нормальную печать и перевести i2c и SPI на ДМА, но.... зачем? Нынешний вариант не мешает абсолютно AHRS алгоритмам. Писать свои алгоритмы - мозгов нет. Использовать чужие - использовал уже. Куда это все приткнуть - хз.

грустно. скучно. пацаны, кто-нить кроме 3д-принтеров и радиоуправляемых машинок что-нить делает?
Вложения
myVisualisation.py
(6.87 КиБ) Скачиваний: 240
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: dccharacter - Излить посильно

Сообщение elmot » 17 фев 2013, 18:36

Я делает. Лежит недопиленный балансер. Так что довольно внимательно смотрю на твои изголятельства.
А, да, в F3 есть набортный операционник. Можно его заморщить:)
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: dccharacter - Излить посильно

Сообщение dccharacter » 17 фев 2013, 19:26

elmot писал(а):Я делает. Лежит недопиленный балансер. Так что довольно внимательно смотрю на твои изголятельства.
А, да, в F3 есть набортный операционник. Можно его заморщить:)

Ну балансир - да. Думал об этом...
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: dccharacter - Излить посильно

Сообщение dccharacter » 21 фев 2013, 21:04

NXP в свои ARM F1 микроконтроллеры зашивают драйвера для периферии в ROM. Вроде на маркетинговых материалах неплохо выглядит. Но в спецификации API..... Мамачки
Но вообще там вроде у них что-то интересное есть. Типа проброс периферии вообще на любую ногу и т.д.
Не пробовал никто?
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: dccharacter - Излить посильно

Сообщение Duhas » 21 фев 2013, 21:16

dccharacter писал(а):Типа проброс периферии вообще на любую ногу и т.д.

это для совсем бездарных трассировщиков ПП ? )
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Пред.След.

Вернуться в Блоги

Кто сейчас на конференции

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