Например TDA7294

Форум РадиоКот • Просмотр темы - Влияние библиотеки STDPeriph на скорость
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Ср апр 17, 2024 02:04:14

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


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



Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Влияние библиотеки STDPeriph на скорость
СообщениеДобавлено: Ср фев 22, 2017 18:33:11 
Открыл глаза

Зарегистрирован: Вс авг 02, 2015 18:02:38
Сообщений: 68
Рейтинг сообщения: 0
Просветите меня пожалуйста. Я может пока ещё многого не понимаю, но подскажите.

Вот этот кусок кода выполняется за 82 мкс
Код:
int i;
GPIO_InitTypeDef KEY;
RCC_APB2PeriphClockCmd(KEYB_PORT_KEY_CMD, ENABLE);
for(i = 0; i < ROWS; i++){
KEY.GPIO_Mode = GPIO_Mode_Out_OD;
KEY.GPIO_Speed = GPIO_Speed_10MHz;
KEY.GPIO_Pin = row_pin[i];
GPIO_Init(row_port[i], &KEY);
GPIO_SetBits(row_port[i], row_pin[i]);
}


А вот тоже самое, только на CMSIS

Код:
GPIOB->CRL |= (GPIO_CRL_MODE5_0 | GPIO_CRL_CNF5_0); // Pin 5 Output mode, Speed 10mHz, Open Drain
GPIOB->CRL |= (GPIO_CRL_MODE6_0 | GPIO_CRL_CNF6_0); // Pin 6 Output mode, Speed 10mHz, Open Drain
GPIOB->CRL |= (GPIO_CRL_MODE7_0 | GPIO_CRL_CNF7_0); // Pin 7 Output mode, Speed 10mHz, Open Drain
GPIOB->CRH |= (GPIO_CRH_MODE8_0 | GPIO_CRH_CNF8_0); // Pin 8 Output mode, Speed 10mHz, Open Drain
GPIOB->BSRR = (GPIO_BSRR_BS5 | GPIO_BSRR_BS6 | GPIO_BSRR_BS7 | GPIO_BSRR_BS8);

Это выполняется за 5 мкс.

Вопрос. Зачем писать на std periph, если оно заметно тормозит дело. Я понимаю что счёт на микросекунды это ерунда, но хочется понять идеальные условия. Время замерял, включив отладку в Keil и шагая по коду построчно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Влияние библиотеки STDPeriph на скорость
СообщениеДобавлено: Ср фев 22, 2017 19:42:40 
Друг Кота
Аватар пользователя

Карма: 1
Рейтинг сообщений: 157
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 3328
Рейтинг сообщения: 0
supercelt писал(а):
Вот этот кусок кода выполняется за 82 мкс
Уровень оптимизации?

supercelt писал(а):
А вот тоже самое, только на CMSIS
Где цикл, где массив? Где в коде включается тактирование портов и прочая инициализация?
Почему не обеспечены равные условия? :facepalm:

supercelt писал(а):
Зачем писать на std periph, если оно заметно тормозит дело.
Не используйте SPL или вас кто-то заставляет? :)))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Влияние библиотеки STDPeriph на скорость
СообщениеДобавлено: Ср фев 22, 2017 23:04:09 
Открыл глаза

Зарегистрирован: Вс авг 02, 2015 18:02:38
Сообщений: 68
Рейтинг сообщения: 0
оптимизация - level0

в том то и дело что как я сделаю циклом, если надо заранее знать CRL или CRH. то есть как я сделаю подстановку то в эту строку?

не использовать это значит это значит писать всё в ручную типа во так: GPIOB->BSRR = 0x0043 ?


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Влияние библиотеки STDPeriph на скорость
СообщениеДобавлено: Чт фев 23, 2017 10:23:17 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 0
Мы так и не поняли в чём проблема открыть и посмотреть реализацию скажем GPIO_Init чтобы убедится что она будет выполняться явно дольше
GPIOB->CRL |= (GPIO_CRL_MODE5_0 | GPIO_CRL_CNF5_0);
Хотя бы потому что в ней много всякого понаписано.
Плюс к этому работа со стеком, массивы, циклы.

За удобство надо платить ресурсами.


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

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

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Влияние библиотеки STDPeriph на скорость
СообщениеДобавлено: Чт фев 23, 2017 13:30:11 
Открыл глаза

Зарегистрирован: Вс авг 02, 2015 18:02:38
Сообщений: 68
Рейтинг сообщения: 0
Тогда я задам вопрос, который напрашивается сам собой):
Как тогда в цикле сделать инициализацию пинов 5,6,7,8 в таком стиле GPIOB->CRL |= (GPIO_CRL_MODE5_0 | GPIO_CRL_CNF5_0); И что самое забавное, учесть, что пины могут быть на разных портах))


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Влияние библиотеки STDPeriph на скорость
СообщениеДобавлено: Чт фев 23, 2017 17:38:23 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 0
Получить универсальную запись в явном виде нельзя.
Но это можно сделать через работу с указателями на регистры портов, чем собственно и занимаются функции внутри stdperiph gpio.
Если посмотреть на карту памяти чипов и карту регистров, то можно увидеть что:
1. Блоки портов находятся по фиксированным для данного устройства адресам.
2. Блоки имеют одинаковое смещение друг относительно друга.
3. Биты в конфигурационных регистрах идентичны и имеют одинаковые смещения.
Благодаря этому можно построить достаточно простой алгоритм конфигурации, который можно перебирать в цикле.
Например обращение к конфигурационным регистрам портов по номерам:

portNumber=0;
*(GPIOA_BASE + (GPIOB_BASE-GPIOA_BASE)*portNumber + 0)= something1; // CRL
*(GPIOA_BASE + (GPIOB_BASE-GPIOA_BASE)*portNumber + 4)= something2; // CRH

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Влияние библиотеки STDPeriph на скорость
СообщениеДобавлено: Чт фев 23, 2017 21:31:00 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
supercelt писал(а):
Как тогда в цикле сделать инициализацию пинов...самое забавное, учесть, что пины могут быть на разных портах

вот примерчик отсюда:
http://en.radzio.dxp.pl/stm32f429idisco ... oller.html
Спойлер
Код:
static const GPIO_TypeDef * const GPIOInitTable[] = {
  GPIOC, GPIOB, GPIOA, GPIOA, GPIOB, GPIOG,
  GPIOA, GPIOG, GPIOB, GPIOB, GPIOC, GPIOD,
  GPIOD, GPIOG, GPIOG, GPIOA, GPIOB, GPIOB,
  GPIOA, GPIOC, GPIOF, GPIOG,
  0};

static uint8_t const PINInitTable[] = {
  10, 0, 11, 12, 1, 6,
  6, 10, 10, 11, 7, 3,
  6, 11, 12, 3, 8, 9,
  4, 6, 10, 7,
  0};

static uint8_t const AFInitTable[] = {
  14, 9, 14, 14, 9, 14,
  14, 9, 14, 14, 14, 14,
  14, 14, 9, 14, 14, 14,
  14, 14, 14, 14,
  0};

Код:
  uint8_t i = 0;
  /* GPIO pin configuration */
  while(GPIOInitTable[i] != 0){
    gpio_conf(GPIOInitTable[i], PINInitTable[i], MODE_AF, TYPE_PUSHPULL, SPEED_100MHz, PULLUP_NONE,     AFInitTable[i]);
    i++;
  }


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Влияние библиотеки STDPeriph на скорость
СообщениеДобавлено: Чт фев 23, 2017 23:28:20 
Открыл глаза

Зарегистрирован: Вс авг 02, 2015 18:02:38
Сообщений: 68
Рейтинг сообщения: 0
Я сделал с помощью макроса

Код:
#define GPIO_INI_PIN(PORT, PIN, MODE) (PIN > 7) ? \
      (PORT->CRH = (PORT->CRH & (~((uint32_t)0x0F << (((PIN) & 0x07) << 2)))) | (((uint32_t)(MODE) & 0x0F) << (((PIN) & 0x07) << 2))) : \
      (PORT->CRL = (PORT->CRL & (~((uint32_t)0x0F << (((PIN) & 0x07) << 2)))) | (((uint32_t)(MODE) & 0x0F) << (((PIN) & 0x07) << 2)))   


но сам вызов я не стал зацикливать, а расписал 4 строками, потому что если в цикле, выполняется за 25 мкс, а если просто расписать 4 строками, то 5 мкс))


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

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


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

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


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

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


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