|
libopencm3, Неплохая либа для кортексов... |
|
|
|
 |
Ответов
|
Apr 14 2015, 18:16
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Цитата Вообще-то для этого под оси и пишутся драйвера, они висят на прерываниях железа, более высокого уровня, чем переключатель контента у оси, и работают через стандартные потоки, как драйвер ком-порта под виндой, например... Ну или ждите в вечном цикле, если это устройство монопольно используется. это плохой ответ, не о чем... Цитата А вот на время передачи блока из 512 байт в SD-карту - уже усыпляю, Имеется ввиду, запускаем ДМА, а задачу в sleep, то есть ОС будет к ней возвращаться с каким то своим достаточно большим интервалом, так? Подытожим, у нас есть варианты: 1. усыпление процесса и возврат к нему с долгими интервалами для проверки дождались или нет (ожидание чего-то очень долгого) 2. это прерывание на окончание ожидания и в нем какой-то симафор, что позволяет ожидающую задачу усыпить до появления симафора. (если надо подождать среднюю длительность) 3. это долбим проверку интервала прямо в задаче циклом. В некоторых ОС будут переключать задачи по временным интервалам, если ожидание затянется, а в некоторых все задачи будут ждать эту. (ожидаем чего-то очень короткого) правильные варианты? Мне как-то внутренне кажется устраивать заопарк прерываний в ОС не верно. Ну то есть отправку UART сделать буфер, и прерывание символ ушел - пихать следующий символ, и так поступить со всеми интерфейсами. Боюсь что так система станет слабо предсказуемой и постоянно что-то ковыряющейся в прерываниях... Ведь их то между собой поделить будет нельзя, посылки по UART забьют передачи по другим интерфейсам, например... Не понятно как это решить в универсальной библиотеке
|
|
|
|
|
Apr 14 2015, 18:40
|

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

|
Цитата(Golikov A. @ Apr 14 2015, 21:16)  Мне как-то внутренне кажется устраивать заопарк прерываний в ОС не верно. Именно, о чем я вам и говорил. В драйверах доступа к всяческой памяти никаких вытеснений и семафоров RTOS. Кто так делает убивает RTOS и получает просто примитивную многозадачность. Нельзя надеятся, что RTOS облегчит написание низкоуровневых драйверов. Наоборот она их усложняет. Работа с быстрой периферией по прежнему пишется в стиле автоматов состояний. Задержки делаются аппаратными таймерами. Переключение состояний автоматов производится в процедурах обслуживания прерываний по цепочке от разных источников включая DMA. Сами прерывания это прерывания уровня ядра. Прерывание RTOS вызывается только когда уже готов блок данных для обработки. И вот там-то взводится объект синхронизации о готовности данных.
|
|
|
|
|
Apr 15 2015, 03:04
|
Гуру
     
Группа: Свой
Сообщений: 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 доступа к драйверу, работающему на уровне прерываний) и т.п..
|
|
|
|
|
Apr 15 2015, 04:46
|

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

|
Цитата(jcxz @ Apr 15 2015, 06:04)  Иногда (при необходимости быстрой работы со сложной периферией) получаются очень сложные автоматы состояний со множеством состояний (десятками) и сложными переходами между ними. Код становится трудночитаем, ведь программирование в стиле автоматов состояний гораздо хуже читается чем линейный код. В таких случаях я иногда применяю подход "а-ля ISR-псевдозадача": создаю отдельный контекст (стек), при завершении очередной транзакции с периферией (получении прерывания от неё, от DMA или от таймера), внутри ISR переключаюсь на этот контекст, выполняю участок кода до след. запроса к периферии (после которого следует обратное переключение контекста на исходный стек ISR с выходом из ISR). И по завершении этого запроса - опять вход в ISR-псевдозадачу. Получается простой хорошо читаемый линейный код вместо леса автомата состояний. Надо только не забывать про уровни приоритетов ISR, участвующих в этом (на NVIC). Можно просто сделать все одного уровня.
О готовности данных, или освобождении какого-то ресурса (занятого буфера или флага в API доступа к драйверу, работающему на уровне прерываний) и т.п.. В принципе не возражаю, только вот это - "хорошо читаемый" напрягает. Субъективизм же. Во первых в скоростной периферии важнее хорошая отлаживаемость Во вторых хорошо читаемый только короткий код. Расположите все ISR связанные с одним автоматом в одном месте и получите короткий код, понятно откоментируйте и отформатируйте и получите отличную читаемость.
|
|
|
|
|
Apr 15 2015, 06:55
|
Гуру
     
Группа: Свой
Сообщений: 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-машиной ещё вполне нормально реализуются простые линейные последовательности шагов алгоритма, без ветвлений и вызовов функций. Не более того.
|
|
|
|
Сообщений в этой теме
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 страниц
1 2 >
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|