STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

Re: STM32 новичку в ARM что к чему

Сообщение Mr.Denis »

Если я правильно вас понял, то для функции задержки системный таймер не очень подходит?
Тогда может использовать базовый таймер?
coredumped писал(а):Если Вам нужны более точные временные интервалы, используйте обычные таймеры, благо их более чем достаточно. Для управления системным таймером, как уже написал dosikus, ARM предоставляет готовые функции в CMSIS. Не думаю, что Вы сможете написать лучше. Да и какой смысл изобретать колесо - возьмите готовое.
Согласен, просто пытался разобраться с системном таймером. Вы еще писали что системный таймер не очень хорошая идея, но сами предлагаете использовать системный таймер из CMSIS!!?

Запутали чуть-чуть :)
To dosikus, coredumped, друзья, а у вас на чем организована функция задержки в ваших проектах?
системный таймер, базовый таймер, может просто цикл, и т.д.

P.S. Я не прошу готовый код, я прошу наставить на путь истинный.
STM32F4 Discovery + KEIL + Windows 7
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: STM32 новичку в ARM что к чему

Сообщение ut1wpr »

Mr.Denis писал(а):To dosikus, coredumped, друзья, а у вас на чем организована функция задержки в ваших проектах?
системный таймер, базовый таймер, может просто цикл, и т.д.

P.S. Я не прошу готовый код, я прошу наставить на путь истинный.
Собственно, ваши друзья последние полторы страницы только этим и занимаются. :)
А пути истинного и нет. Задержки можно организовать на любом из вышеперечисленного. Но системный таймер чаще всего позволяет отстчитывать более короткие интервалы (смотрите в доках какие таймера чем клокируются). Ну а задержки, они ведь разные бывают... Блокирующие, не блокирующие... Можете и циклами, но это моветон. Хотя и никем не запрещается, вопрос целесообразности :)
Повторяю, истины в последней инстанции нет и не может быть. Какой из ресурсов свободен, какие интервалы вам нужны, требуемая их точность - вот основные критерии при организации этих самых задержек.
С уважением,
Виктор.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: STM32 новичку в ARM что к чему

Сообщение pokk »

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

Код: Выделить всё

GPIOB->BSRRL = GPIO_Pin_12;

При помощи осциллографа посчитал что около 7 тактов.
А при помощи DWT_CYCCNT она прыгает от 13 до 31 и больше.
А условие ?

Код: Выделить всё

if(N==1)

смотрю счётчиком тактов такое условие за 10 тактов выполняется.
я думал они по 1-2 такту должны выполнятся.
А теперь вообще от 5 до 13 прыгает :shock:

Компилятор IAR.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

Mr.Denis писал(а):Запутали чуть-чуть :)
To dosikus, coredumped, друзья, а у вас на чем организована функция задержки в ваших проектах?
системный таймер, базовый таймер, может просто цикл, и т.д.

P.S. Я не прошу готовый код, я прошу наставить на путь истинный.



Используй пока задержки типа DelayMs(x) .Только ради бога не в прерывании.
Со временем придет осознание процесса .
Если сейчас тебя загрузить по полной, ничего хорошего не получится.
Да и нет какого то однозначно "правильного" решения, все хорошо в свое время и в своих ситуациях.
В твоей ситуации и при твоем уровне , оптимальным будет именно простая задержка на SysTick или он же системный таймер .
Освой пока это .
Потом покажу как на любом таймере сие реализовать - с задержками и с поллингом флага ...


pokk А что именно трассируется - инструкции Си или асм ? 8)
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: STM32 новичку в ARM что к чему

Сообщение pokk »

pokk А что именно трассируется - инструкции Си или асм ? 8)

Инструкции Си.
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Re: STM32 новичку в ARM что к чему

Сообщение coredumped »

Все проекты мод Cortex-M можно условно разделить на 2 части - с использованием ОС (RTOS) и без использования ОС.
Для задач без ОС, обычно я поступаю так. Если требуется задержка на большой интервал времени (десятки милисекунд) и требования к точности этого интервала не предъявляются (например ждем, пока отдуплится какое-нибудь внешнее медленное железо), использую функцию, про которую Вам писал dosikus - DelayMs(). Если требуется короткая задержка, в несколько тактов процессора (сформировать короткий импульс) - несколько инструкций __nop()
Если требуется периодический запус какого-либо процесса, либо точность времени задержки важна - один из аппаратных таймеров.
В случае использования ОС, системный таймер напрямую использовать не стоит, для задержек в тредах следует использовать функции, предоставляемые операционной системой. Для коротких задержек - метод с __nop(); Если нужны точные задержки большого интервала - таймер, однако не забываем про особенности использования прерываний в ОС.
Отдельно хочу примазаться к словам dosikus - нельзя использовать задержки, генерируемые прерываниями, в обработчике прерывания - получите классический deadlock. Вообще нужно стараться как можно быстрее покинуть обработчик прерывания, чтоб другие прерывания тоже могли нормально обработаться.
Все будет только лучше, в крайнем случае - хуже.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

pokk писал(а):Инструкции С


Ну дык откройте для себя листинг ,инструкции асма, конвейер. Почитайте руководство Cortex-M3 на сию тему.
По одиночной инструкции судит- это не о чем .
Сразу скажу что ручной ногодрыг - это не для ARM , да и ненужен он.
И весьма эпично - оценивать новый(для себя) камень ногодрыгом . Обычно для новичка от AVR ... :)))
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Re: STM32 новичку в ARM что к чему

Сообщение coredumped »

+1 Хотите максимальной производительности - используйте встроенную периферию - FSMC, SPI итп.
Все будет только лучше, в крайнем случае - хуже.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: STM32 новичку в ARM что к чему

Сообщение pokk »

coredumped, Так и есть использую SPI а этой ногой CS устанавливаю и сбрасываю(встроенная нога не подходит).
Это я начал свой код оптимизировать все регистры по вытаскивал из библиотечных функций =).
смотрю а скорость программы не сильно изменилось было около 200 стало 80-150. Думаю откуда 150 тактов там же всего пару условий if да и ногой дёргаю иногда (запись в регистр). Вот начал смотреть по тактам, оказывается что каждая команда по10 тактов выполняется так и набирается до 150.
Ну дык откройте для себя листинг ,инструкции асма, конвейер. Почитайте руководство Cortex-M3 на сию тему.

Как-то я пытался отыскать в этом руководстве сколько тактов выполняется ассемблерная команда так и не нашёл. Нашёл только что там стоит конвейер и из за него точно нельзя сказать сколько она будет выполнятся .
Ну и в общем сложилось мнение что работает там всё быстро за 2-3 такта =))
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Re: STM32 новичку в ARM что к чему

Сообщение coredumped »

Где-то читал, что у Кортексов-М3 3-х стадийный конвейер, у остальных - не знаю. Операция выполняется АЛУ за один такт.
Ускорить работу программы можно оптимизацией производительности, естественно, в ущерб расходу памяти и размеру кода. Самое первое - раскручивание небольших циклов - приводит к росту кода, но увеличению скорости. По этой теме целые книги написаны.
Все будет только лучше, в крайнем случае - хуже.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

pokk писал(а): Так и есть использую SPI а этой ногой CS устанавливаю и сбрасываю(встроенная нога не подходит).


Озвучьте для начала камень и SPI периферию . Для многих девайсов совершенно необязательно дергать CS при каждой транзакции .
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: STM32 новичку в ARM что к чему

Сообщение pokk »

stm32f4discovery к нему по spi подключаю Wiznet w5100
Для многих девайсов совершенно необязательно дергать CS при каждой транзакции .

Ага в том то и дело что надо через 4 команды дёргать.
Изображение
Функция считывания была такая примерно за 1000 тактов выполняется
Спойлер

Код: Выделить всё

unsigned char CHIP_READ(unsigned int addr)
{

unsigned char temp[4];

GPIO_ResetBits(GPIOB, GPIO_Pin_12);                                //  разрешить передачу
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);    // ожидание
SPI_I2S_SendData (SPI2,0x0f);                                      // передача 0x0f

while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
temp[0]=SPI_I2S_ReceiveData(SPI2);

while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData (SPI2,((addr & 0xFF00) >> 8));
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
temp[1]=SPI_I2S_ReceiveData(SPI2);

while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData (SPI2,(addr & 0x00FF));
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
temp[2]=SPI_I2S_ReceiveData(SPI2);

while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData (SPI2,0xff);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);

temp[3]=SPI_I2S_ReceiveData(SPI2);

GPIO_SetBits(GPIOB, GPIO_Pin_12);                               //  запретить передачу
if(temp[0]==0x0&&temp[1]==0x01&&temp[2]==0x02){

return temp[3];
}

else {
  GPIO_SetBits(GPIOD, GPIO_Pin_13); //зажечь
  return 0;
}
}

Функция запись всё тоже самое только выполняется за 2000-3000 тактов
решил я это дело оптимизировать так как надо от 2кб записывать.
решил по пробовать с использование Протопотоков (protothreads) на библиотеке
http://dunkels.com/adam/pt/

получилось вот что

Спойлер

Код: Выделить всё

static PT_THREAD(Read1(struct pt *pt,unsigned char *data,unsigned char addr))
{
  unsigned char temp[4];
  PT_BEGIN(pt);

[b]dwt_timestamp[0] = DWT_CYCCNT;
    GPIOB->BSRRH = GPIO_Pin_12;
dwt_timestamp[1] = DWT_CYCCNT;[/b]
    PT_WAIT_UNTIL(pt, (SPI2->SR & SPI_I2S_FLAG_TXE));    // ожидание
dwt_timestamp[2] = DWT_CYCCNT;
    SPI2->DR = 0x0f;
dwt_timestamp[1] = DWT_CYCCNT;
    PT_WAIT_UNTIL(pt, (SPI2->SR & SPI_I2S_FLAG_RXNE));    // ожидание
    temp[0]=SPI2->DR;

    PT_WAIT_UNTIL(pt, (SPI2->SR & SPI_I2S_FLAG_TXE));    // ожидание
    SPI2->DR = ((addr & 0xFF00) >> 8);
    PT_WAIT_UNTIL(pt, (SPI2->SR & SPI_I2S_FLAG_RXNE));    // ожидание
    temp[1]=SPI2->DR;
dwt_timestamp[3] = DWT_CYCCNT;

    PT_WAIT_UNTIL(pt, (SPI2->SR & SPI_I2S_FLAG_TXE));    // ожидание
    SPI2->DR = (addr & 0x00FF);
    PT_WAIT_UNTIL(pt, (SPI2->SR & SPI_I2S_FLAG_RXNE));    // ожидание
    temp[2]=SPI2->DR;
dwt_timestamp[4] = DWT_CYCCNT;
    PT_WAIT_UNTIL(pt, (SPI2->SR & SPI_I2S_FLAG_TXE));    // ожидание
    SPI2->DR =0xFF;
    PT_WAIT_UNTIL(pt, (SPI2->SR & SPI_I2S_FLAG_RXNE));    // ожидание
    *data=SPI2->DR;
dwt_timestamp[5] = DWT_CYCCNT;
    GPIOB->BSRRL = GPIO_Pin_12;
dwt_timestamp[6] = DWT_CYCCNT;
  PT_END(pt);
}

Изображение
Ну что за фигня такая получается ?

Код: Выделить всё

    GPIOB->BSRRH = GPIO_Pin_12;

dwt_timestamp[1]-dwt_timestamp[0]=59 (ну ещё 10 можно отнять на запись DWT_CYCCNT)
49 тактов что бы ногой дрыгнуть ???
отладку производил с помощью breakpoints поставил что бы остановилось после записи в 6 массив
может из за этого как-то :dont_know:
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

pokk писал(а):решил я это дело оптимизировать


Ну тогда отправлять потоком с проверкой BUSY а не RXNE .
Дальше-больше, можно практически полностью автоматизировать сей процесс .... :)))
Подсказать ? :)))
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

Re: STM32 новичку в ARM что к чему

Сообщение Mr.Denis »

Кто про что, а я опять про задержку :))
Я задержку делаю для инициализации lcd дисплея, может ее сделать на _nop()
типа:

Код: Выделить всё

void delay_nop(uint32_t nop){
while(nop > 0){
   _nop();
    nop--;
  }
}
delay_nop(15);

Писал из головы, возможны ошибки но смысл думаю понятен.
STM32F4 Discovery + KEIL + Windows 7
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

Mr.Denis писал(а):для инициализации lcd дисплея


Какой дисплей, на сколько задержки ?
Ты лучше описывай саму проблему , чем свои реализации ...
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: STM32 новичку в ARM что к чему

Сообщение pokk »

Дальше-больше, можно практически полностью автоматизировать сей процесс .... :)))

А куда там ещё автоматизировать?
Ну тогда отправлять потоком с проверкой BUSY а не RXNE .

Это как ? Я только начал с этим делом разбираться ещё полностью не вник.
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

Re: STM32 новичку в ARM что к чему

Сообщение Mr.Denis »

LCD на контролере HD44780, ждать 40 микросекунд.
STM32F4 Discovery + KEIL + Windows 7
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

pokk писал(а):Это как ? Я только начал с этим делом разбираться ещё полностью не вн


Упс, с BUSY немного поспешил- и чтение же нужно .

Код: Выделить всё

    uint8_t write_buf[4];
    uint8_t  read_buf[4];
 
 void w5100_RW(void)
 {
   uint8_t i;
   
  for(i=0;i<4;i++)
    {
     SPI2->DR = write_buf[i];
     while (!(SPI2->SR & SPI_SR_RXNE));
      read_buf[i] = SPI2->DR;
     }
 }


При записи пишем в write_buf[0] код записи и вызываем w5100_RW(), при чтении пишем в write_buf[0] код чтения и вызываем w5100_RW().

Дальнейшая оптимизация- оправлять принимать 16битные посылки .
Далее - использовать DMA ...
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

Mr.Denis писал(а):LCD на контролере HD44780, ждать 40 микросекунд.


Ну так используй свой вариант . Или не работает?
Mr.Denis
Прорезались зубы
Сообщения: 220
Зарегистрирован: Пт авг 07, 2009 22:06:49
Откуда: Россия, Москва

Re: STM32 новичку в ARM что к чему

Сообщение Mr.Denis »

dosikus писал(а):
Mr.Denis писал(а):LCD на контролере HD44780, ждать 40 микросекунд.


Ну так используй свой вариант . Или не работает?

Вы имеете ввиду цикл с nop? Если да, то я его еще не проверял. Но запустить его думаю проблем не составит.

To ALL, подскажите как можно в keil посмотреть сколько тактов занимает функция? Где про это можно прочитать?
STM32F4 Discovery + KEIL + Windows 7
Ответить

Вернуться в «ARM»