реклама на сайте
подробности

 
 
> libopencm3, Неплохая либа для кортексов...
demiurg_spb
сообщение Mar 15 2013, 06:35
Сообщение #1


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



https://github.com/libopencm3/libopencm3

ИМХО хорошая альтернатива стандартной библиотеке от ST и не только.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Apr 14 2015, 18:16
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



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

это плохой ответ, не о чем...

Цитата
А вот на время передачи блока из 512 байт в SD-карту - уже усыпляю,

Имеется ввиду, запускаем ДМА, а задачу в sleep, то есть ОС будет к ней возвращаться с каким то своим достаточно большим интервалом, так?

Подытожим, у нас есть варианты:
1. усыпление процесса и возврат к нему с долгими интервалами для проверки дождались или нет (ожидание чего-то очень долгого)
2. это прерывание на окончание ожидания и в нем какой-то симафор, что позволяет ожидающую задачу усыпить до появления симафора. (если надо подождать среднюю длительность)
3. это долбим проверку интервала прямо в задаче циклом. В некоторых ОС будут переключать задачи по временным интервалам, если ожидание затянется, а в некоторых все задачи будут ждать эту. (ожидаем чего-то очень короткого)

правильные варианты?

Мне как-то внутренне кажется устраивать заопарк прерываний в ОС не верно.
Ну то есть отправку UART сделать буфер, и прерывание символ ушел - пихать следующий символ, и так поступить со всеми интерфейсами. Боюсь что так система станет слабо предсказуемой и постоянно что-то ковыряющейся в прерываниях... Ведь их то между собой поделить будет нельзя, посылки по UART забьют передачи по другим интерфейсам, например...

Не понятно как это решить в универсальной библиотеке
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Apr 14 2015, 18:40
Сообщение #3


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Golikov A. @ Apr 14 2015, 21:16) *
Мне как-то внутренне кажется устраивать заопарк прерываний в ОС не верно.


Именно, о чем я вам и говорил. В драйверах доступа к всяческой памяти никаких вытеснений и семафоров RTOS.
Кто так делает убивает RTOS и получает просто примитивную многозадачность.

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

Работа с быстрой периферией по прежнему пишется в стиле автоматов состояний.
Задержки делаются аппаратными таймерами. Переключение состояний автоматов производится в процедурах обслуживания прерываний по цепочке от разных источников включая DMA.
Сами прерывания это прерывания уровня ядра.
Прерывание RTOS вызывается только когда уже готов блок данных для обработки. И вот там-то взводится объект синхронизации о готовности данных.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 15 2015, 03:04
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Apr 15 2015, 00:40) *
Работа с быстрой периферией по прежнему пишется в стиле автоматов состояний.
Задержки делаются аппаратными таймерами. Переключение состояний автоматов производится в процедурах обслуживания прерываний по цепочке от разных источников включая DMA.

Иногда (при необходимости быстрой работы со сложной периферией) получаются очень сложные автоматы состояний со множеством состояний (десятками) и сложными переходами между ними.
Код становится трудночитаем, ведь программирование в стиле автоматов состояний гораздо хуже читается чем линейный код.
В таких случаях я иногда применяю подход "а-ля ISR-псевдозадача":
создаю отдельный контекст (стек), при завершении очередной транзакции с периферией (получении прерывания от неё, от DMA или от таймера), внутри ISR переключаюсь на этот контекст, выполняю
участок кода до след. запроса к периферии (после которого следует обратное переключение контекста на исходный стек ISR с выходом из ISR). И по завершении этого запроса - опять вход в
ISR-псевдозадачу.
Получается простой хорошо читаемый линейный код вместо леса автомата состояний.
Надо только не забывать про уровни приоритетов ISR, участвующих в этом (на NVIC). Можно просто сделать все одного уровня.

Цитата(AlexandrY @ Apr 15 2015, 00:40) *
Прерывание RTOS вызывается только когда уже готов блок данных для обработки. И вот там-то взводится объект синхронизации о готовности данных.

О готовности данных, или освобождении какого-то ресурса (занятого буфера или флага в API доступа к драйверу, работающему на уровне прерываний) и т.п..
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Apr 15 2015, 04:46
Сообщение #5


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Apr 15 2015, 06:04) *
Иногда (при необходимости быстрой работы со сложной периферией) получаются очень сложные автоматы состояний со множеством состояний (десятками) и сложными переходами между ними.
Код становится трудночитаем, ведь программирование в стиле автоматов состояний гораздо хуже читается чем линейный код.
В таких случаях я иногда применяю подход "а-ля ISR-псевдозадача":
создаю отдельный контекст (стек), при завершении очередной транзакции с периферией (получении прерывания от неё, от DMA или от таймера), внутри ISR переключаюсь на этот контекст, выполняю
участок кода до след. запроса к периферии (после которого следует обратное переключение контекста на исходный стек ISR с выходом из ISR). И по завершении этого запроса - опять вход в
ISR-псевдозадачу.
Получается простой хорошо читаемый линейный код вместо леса автомата состояний.
Надо только не забывать про уровни приоритетов ISR, участвующих в этом (на NVIC). Можно просто сделать все одного уровня.


О готовности данных, или освобождении какого-то ресурса (занятого буфера или флага в API доступа к драйверу, работающему на уровне прерываний) и т.п..


В принципе не возражаю, только вот это - "хорошо читаемый" напрягает. Субъективизм же.
Во первых в скоростной периферии важнее хорошая отлаживаемость
Во вторых хорошо читаемый только короткий код.
Расположите все ISR связанные с одним автоматом в одном месте и получите короткий код, понятно откоментируйте и отформатируйте и получите отличную читаемость.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 15 2015, 06:55
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Apr 15 2015, 10:46) *
В принципе не возражаю, только вот это - "хорошо читаемый" напрягает. Субъективизм же.
Во первых в скоростной периферии важнее хорошая отлаживаемость
Во вторых хорошо читаемый только короткий код.
Расположите все ISR связанные с одним автоматом в одном месте и получите короткий код, понятно откоментируйте и отформатируйте и получите отличную читаемость.

Вот такая работа с SPI (вполне хорошо читаемая и короткая при построении драйвера на уровне OS-задачи или как я описывал - псевдозадачей (выглядит так же как с OS)):
Код
FlashRead();
n = N_PAGES;
do FlashWrite();
while (--n);

при описывании state-машиной превращается в дикий лес, из нескольких десятков шагов с вермишельной логикой ветвлений:
(учтите что здесь ещё надо расписать шаги внутри FlashRead()/FlashWrite(), с реализацией стека вызовов (стека state-переменных))
Код
while (1) {
  switch (state) {
    case STATE_0:
      StartActionRead(...);
      state = STATE_1;
      break;
    case STATE_1:
      n = N_PAGES;
    case STATE_2:
      StartActionWrite(...);
      state = STATE_3;
      break;
    case STATE_3:
      state = STATE_ERROR;
      if (!result) continue;
      state = STATE_2;
      if (--n) continue;
     ...
    case STATE_ERROR:
     ...
  ...
  }
break;
}

Особенно если учесть, что надо реализовать цикл(циклы), что внутри FlashWrite(), FlashRead() может быть несколько транзакций по SPI-шине с несколькими входами в ISR, могут быть циклы с проверкой условий и т.п.). Вообще если нужно сделать простейшую функцию (набор часто повторяемых действий) на базе state-машины.
Если взять любой код драйвера, работающий на базе задачи ОС с использованием её объектов синхронизации (для уведомления о завершениях транзакций от ISR), и попытаться его развернуть в
state-машину, то сразу видно какой получается малочитаемый код.

State-машиной ещё вполне нормально реализуются простые линейные последовательности шагов алгоритма, без ветвлений и вызовов функций. Не более того.
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 15 2015, 07:29
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(jcxz @ Apr 15 2015, 09:55) *
при описывании state-машиной превращается в дикий лес

Для этого существует protothreads. Никакого дикого леса.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- demiurg_spb   libopencm3   Mar 15 2013, 06:35
- - zhevak   Цитата(demiurg_spb @ Mar 15 2013, 12:35) ...   Mar 15 2013, 07:04
- - esaulenka   Тут есть пользователи этой библиотеки? Первое впе...   Apr 3 2015, 08:06
|- - demiurg_spb   Цитата(esaulenka @ Apr 3 2015, 11:06) Тут...   Apr 3 2015, 13:24
- - AlexandrY   Цитата(demiurg_spb @ Mar 15 2013, 09:35) ...   Apr 3 2015, 10:38
- - klen   голосую за libcm3 Spl еще както было похоже на что...   Apr 4 2015, 07:36
|- - kan35   Цитата(klen @ Apr 4 2015, 10:36) голосую ...   Apr 12 2015, 15:50
|- - Dr.Alex   Цитата(kan35 @ Apr 12 2015, 18:50) Запуск...   Apr 12 2015, 17:17
- - _Pasha   Цитата(esaulenka @ Apr 3 2015, 11:06) Соб...   Apr 6 2015, 14:49
|- - esaulenka   Цитата(_Pasha @ Apr 6 2015, 17:49) у меня...   Apr 7 2015, 10:45
- - Golikov A.   А какая связь наличие или отсутствия while (бит) и...   Apr 13 2015, 06:45
|- - Dr.Alex   Цитата(Golikov A. @ Apr 13 2015, 09:45) А...   Apr 13 2015, 07:27
- - Golikov A.   строго говоря я не под что не пишу while(условие)....   Apr 13 2015, 09:28
|- - Dr.Alex   Цитата(Golikov A. @ Apr 13 2015, 12:28) с...   Apr 13 2015, 09:44
|- - AlexandrY   Цитата(Golikov A. @ Apr 13 2015, 12:28) с...   Apr 13 2015, 09:52
- - Golikov A.   понятно, спасибо...   Apr 13 2015, 09:56
- - SasaVitebsk   Вы знаете, но честно говоря меня напрягают оценки ...   Apr 13 2015, 10:00
|- - mantech   Цитата(SasaVitebsk @ Apr 13 2015, 13:00) ...   Apr 13 2015, 11:10
- - Golikov A.   А вот теперь я задумался, а как с учетом заточенос...   Apr 14 2015, 11:16
|- - AHTOXA   Тут всё просто. Если ждать долго, то надо на оконч...   Apr 14 2015, 14:21
||- - Dr.Alex   Цитата(AHTOXA @ Apr 14 2015, 17:21) Если ...   Apr 14 2015, 14:35
||- - AHTOXA   Цитата(Dr.Alex @ Apr 14 2015, 19:35) Кто ...   Apr 14 2015, 17:01
||- - Dr.Alex   Цитата(AHTOXA @ Apr 14 2015, 20:01) Ну за...   Apr 14 2015, 17:04
||- - AHTOXA   Цитата(Dr.Alex @ Apr 14 2015, 22:04) С та...   Apr 14 2015, 17:59
|- - mantech   Цитата(Golikov A. @ Apr 14 2015, 14:16) А...   Apr 14 2015, 14:51
||- - mantech   Цитата(AlexandrY @ Apr 14 2015, 21:40) Ра...   Apr 15 2015, 05:02
|- - AHTOXA   Цитата(Golikov A. @ Apr 14 2015, 23:16) И...   Apr 15 2015, 03:59
- - Golikov A.   "не о чем" - было о другом... конкретн...   Apr 15 2015, 05:12
|- - AlexandrY   Цитата(Golikov A. @ Apr 15 2015, 08:12) Д...   Apr 15 2015, 05:47
||- - Dr.Alex   Цитата(AlexandrY @ Apr 15 2015, 08:47) Лу...   Apr 15 2015, 07:37
||- - jcxz   Цитата(Dr.Alex @ Apr 15 2015, 13:37) Поэт...   Apr 15 2015, 09:07
||- - mantech   Цитата(jcxz @ Apr 15 2015, 12:07) Это одн...   Apr 15 2015, 17:41
||- - den_po   Цитата(mantech @ Apr 15 2015, 22:41) Вот ...   Apr 15 2015, 19:06
||- - Dr.Alex   Цитата(mantech @ Apr 15 2015, 20:41) Че-т...   Apr 15 2015, 19:08
||- - jcxz   Цитата(mantech @ Apr 15 2015, 23:41) Че-т...   Apr 16 2015, 02:16
||- - mantech   Цитата(jcxz @ Apr 16 2015, 05:16) Как тут...   Apr 16 2015, 04:59
||- - jcxz   Цитата(mantech @ Apr 16 2015, 10:59) Это ...   Apr 16 2015, 07:02
||- - SasaVitebsk   Цитата(jcxz @ Apr 16 2015, 10:02) Готовно...   Apr 16 2015, 09:23
||- - jcxz   Цитата(SasaVitebsk @ Apr 16 2015, 15:23) ...   Apr 17 2015, 02:27
||- - mantech   Цитата(jcxz @ Apr 17 2015, 05:27) Вот соб...   Apr 17 2015, 05:17
||- - jcxz   Цитата(mantech @ Apr 17 2015, 11:17) Дак ...   Apr 17 2015, 07:01
||- - mantech   Цитата(jcxz @ Apr 17 2015, 10:01) Какие п...   Apr 17 2015, 08:50
||- - jcxz   Цитата(mantech @ Apr 17 2015, 14:50) CRC ...   Apr 17 2015, 09:42
||- - mantech   Цитата(jcxz @ Apr 17 2015, 12:42) 64-битн...   Apr 17 2015, 17:17
|- - mantech   Цитата(Golikov A. @ Apr 15 2015, 08:12) В...   Apr 15 2015, 08:42
- - Golikov A.   еще матрица шин, а потом доступ проца и каналы кро...   Apr 15 2015, 07:44
- - Golikov A.   ЦитатаПрием - запускаю дма и счетчик таймаута, жду...   Apr 15 2015, 09:47
- - SasaVitebsk   Когда у человека появляется красивый инструмент, в...   Apr 15 2015, 09:59
|- - jcxz   Цитата(SasaVitebsk @ Apr 15 2015, 15:59) ...   Apr 15 2015, 10:29
|- - SasaVitebsk   Цитата(jcxz @ Apr 15 2015, 13:29) Прелест...   Apr 16 2015, 05:05
- - Golikov A.   Цитатакоторые нужно парсить "на лету", т...   Apr 16 2015, 07:26
|- - mantech   Цитата(Golikov A. @ Apr 16 2015, 10:26) Э...   Apr 16 2015, 16:42
- - Golikov A.   ЦитатаТогда объясните алгоритм приема пакета с фиф...   Apr 16 2015, 17:06
|- - mantech   Цитата(Golikov A. @ Apr 16 2015, 20:06) F...   Apr 16 2015, 18:31
|- - den_po   Цитата(mantech @ Apr 16 2015, 23:31) Хоро...   Apr 16 2015, 18:48
- - Golikov A.   ЦитатаПринимаю пакет, фифо настроен на 16 байт, а ...   Apr 17 2015, 05:11
|- - den_po   Цитата(Golikov A. @ Apr 17 2015, 10:11) А...   Apr 17 2015, 05:37
- - Golikov A.   Если фифо железное, то глубина фифо определена жес...   Apr 17 2015, 05:57
- - Golikov A.   А еще любое прерывание - это сброс всех конвейеров...   Apr 17 2015, 11:19
- - Эдди   Если кому интересно, можно глянуть на систему упра...   Apr 23 2015, 09:47
- - drozel   А позвольте некропостнуть и вступить в полемику по...   Oct 6 2015, 04:10
|- - mantech   Цитата(drozel @ Oct 6 2015, 07:10) Объясн...   Oct 6 2015, 06:27
- - Эдди   Вкратце: CUBE — признак идиота. Это как ардуйня. Т...   Oct 6 2015, 05:43
|- - drozel   Цитата(Эдди @ Oct 6 2015, 11:43) Вкратце:...   Oct 6 2015, 05:46
- - Golikov A.   Вот вам на пальцах: Ну берем SPI, настраиваем по ...   Oct 6 2015, 06:28
|- - mantech   Цитата(Golikov A. @ Oct 6 2015, 09:28) К ...   Oct 6 2015, 06:34
|- - scifi   Цитата(mantech @ Oct 6 2015, 09:34) Но ИМ...   Oct 6 2015, 07:17
|- - mantech   Цитата(scifi @ Oct 6 2015, 10:17) Конечно...   Oct 6 2015, 07:30
|- - drozel   Цитата(scifi @ Oct 6 2015, 13:17) +1. Зап...   Oct 6 2015, 08:18
|- - ViKo   Цитата(drozel @ Oct 6 2015, 11:18) Код не...   Oct 6 2015, 08:49
- - SasaVitebsk   Мне кажется пример для UART вы неудачный выбрали. ...   Oct 6 2015, 07:11
- - Golikov A.   ЦитатаДак так и получается, если делать не один пр...   Oct 6 2015, 10:58
- - _Pasha   Сабж нормальный. Но API в некоторых местах не нрав...   Oct 6 2015, 12:01
|- - drozel   Цитата(_Pasha @ Oct 6 2015, 18:01) dma - ...   Oct 7 2015, 03:28
|- - _Pasha   Цитата(drozel @ Oct 7 2015, 06:28) Ну так...   Oct 7 2015, 04:45
- - drozel   Люди, помогите с либой. Пытаюсь завести USB CDC с ...   Oct 8 2015, 09:24
|- - SasaVitebsk   Цитата(drozel @ Oct 8 2015, 12:24) Что пр...   Oct 8 2015, 10:34
- - drozel   Цитата(SasaVitebsk @ Oct 8 2015, 16:34) В...   Oct 8 2015, 16:41
- - _Pasha   usbd_device *usbd_init возвращает указатель на sta...   Oct 8 2015, 18:53
- - drozel   Да, уже нашел, спасибо. Просто непривычно: вместо ...   Oct 9 2015, 01:57
|- - esaulenka   Цитата(drozel @ Oct 9 2015, 04:57) Да, уж...   Oct 9 2015, 09:11
- - drozel   Почти мигрировал с stdlib и cube на сабж. Остался ...   Oct 12 2015, 11:10
|- - _Pasha   Цитата(drozel @ Oct 12 2015, 14:10) Почти...   Oct 12 2015, 11:40
||- - drozel   Цитата(_Pasha @ Oct 12 2015, 17:40) это с...   Oct 12 2015, 11:55
||- - _Pasha   RE: libopencm3   Oct 12 2015, 12:14
||- - drozel   Цитата(_Pasha @ Oct 12 2015, 18:14) держи...   Oct 13 2015, 03:33
||- - _Pasha   Цитата(drozel @ Oct 13 2015, 06:33) Спаси...   Oct 13 2015, 04:58
||- - drozel   Цитата(_Pasha @ Oct 13 2015, 10:58) я не ...   Oct 13 2015, 07:58
||- - Эдди   Цитата(drozel @ Oct 13 2015, 10:58) Если ...   Oct 13 2015, 08:26
||- - drozel   Цитата(Эдди @ Oct 13 2015, 14:26) Кодls l...   Oct 13 2015, 08:35
|- - esaulenka   Цитата(drozel @ Oct 12 2015, 14:10) Где ф...   Oct 12 2015, 12:43
|- - drozel   Цитата(esaulenka @ Oct 12 2015, 18:43) Я ...   Oct 12 2015, 17:14
- - Эдди   Быстрее по даташиту с регистрами разобраться, неже...   Oct 12 2015, 18:14
- - Golikov A.   ЦитатаКак сказать.. GCC я никогда не пользовался, ...   Oct 13 2015, 08:39
2 страниц V   1 2 >


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 21:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01528 секунд с 7
ELECTRONIX ©2004-2016