Перейти к содержанию
    

Цитата

Пришёл к выводу: так как время нахождения в прерывании не превышает периода следования данных, то нет необходимости проверять в этом же цикле оставшиеся данные в FIFO.

1) если во время прерывания долетит символ - на него потратится отдельный вызов прерывания и шедулеры. а проверка на наличие символа - копеешная.

2) если вам долетит последний символ посылки, и дальше ваш абонент ждет ответа. Так вот Вы можете и не получить этот последний символ пока не проверите порт. Это в случае если прерывание потеряется, а это много от чего может зависеть в операционке и железе. проверка в коде делает поведение более предсказуемым чтоли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 минут назад, AlexRayne сказал:

Это в случае если прерывание потеряется, а это много от чего может зависеть в операционке и железе.

Такого в принципе не должно быть. Если такое происходит - сначала нужно это вылечить, прежде чем дальше что-то делать. Дополнительная проверка этому не поможет - тут не потеряется, так значит потеряется в случае если символ придёт сразу после проверки. Лечить нужно причину, прежде чем костыли городить.

Циклическая проверка (для без-FIFO-шных UART) - дело десятое, может быть может не быть. А если высока цена за вызов ISR (из-за особенностей ОС/ядра), то лучше тогда для работы с UART использовать DMA.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 hours ago, jcxz said:

У меня своя RTOS, самописная.

Помниться вы ucos использовали. Надоела? или вы её кардинально переписали?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, haker_fox сказал:

Помниться вы ucos использовали. Надоела? или вы её кардинально переписали?

Да, надоела. :biggrin: 

uCOS - универсальная ОС, под разные ядра. И как любое универсальное решение - неоптимальна для каждого конкретного ядра. И очень даже неоптимальна для ARM.

Я написал свою, гораздо более лёгкую и быструю (на переключениях задач). Впрочем и ранее я использовал uCOS сильно оптимизированную под себя под Cortex-M.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, jcxz said:

И очень даже неоптимальна для ARM

Гм, что же вам такое нужно от оси?:biggrin: Скорость переключения? Малый объём TCB? Детерминированность ("реалтаймовость")? Уже просто интересно)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 минут назад, haker_fox сказал:

Гм, что же вам такое нужно от оси?:biggrin: Скорость переключения? Малый объём TCB? Детерминированность ("реалтаймовость")? Уже просто интересно)

Всё подряд. Никогда не помешает. Зачем делать что-то кое-как если можно сделать лучше?

Сравните хотя-бы как выглядит выбор текущей приоритетной задачи (ре-шедулинг) в uCOS-II:

Спойлер

   \   00000000   0xB510             PUSH     {R4,LR}
   \   00000002   0xF3EF 0x8410      MRS      R4,PRIMASK
   \   00000006   0xB672             CPSID    I
   \   00000008   0x....             LDR.N    R0,??DataTable8
   \   0000000A   0x7881             LDRB     R1,[R0, #+2]
   \   0000000C   0x2900             CMP      R1,#+0
   \   0000000E   0xBF04             ITT      EQ
   \   00000010   0x78C1             LDRBEQ   R1,[R0, #+3]
   \   00000012   0x2900             CMPEQ    R1,#+0
   \   00000014   0xD117             BNE.N    ??OS_Sched_0
   \   00000016   0x7C02             LDRB     R2,[R0, #+16]
   \   00000018   0x.... 0x....      ADR.W    R1,OSUnMapTbl
   \   0000001C   0x5C8A             LDRB     R2,[R1, R2]
   \   0000001E   0x00D3             LSLS     R3,R2,#+3
   \   00000020   0x4402             ADD      R2,R0,R2
   \   00000022   0x7B12             LDRB     R2,[R2, #+12]
   \   00000024   0x5C89             LDRB     R1,[R1, R2]
   \   00000026   0x7802             LDRB     R2,[R0, #+0]
   \   00000028   0x1859             ADDS     R1,R3,R1
   \   0000002A   0x7041             STRB     R1,[R0, #+1]
   \   0000002C   0x7841             LDRB     R1,[R0, #+1]
   \   0000002E   0xEB00 0x0181      ADD      R1,R0,R1, LSL #+2
   \   00000032   0x6A09             LDR      R1,[R1, #+32]
   \   00000034   0x6081             STR      R1,[R0, #+8]
   \   00000036   0x7841             LDRB     R1,[R0, #+1]
   \   00000038   0x4291             CMP      R1,R2
   \   0000003A   0xD004             BEQ.N    ??OS_Sched_0
   \   0000003C   0x6941             LDR      R1,[R0, #+20]
   \   0000003E   0x1C49             ADDS     R1,R1,#+1
   \   00000040   0x6141             STR      R1,[R0, #+20]
   \   00000042   0x.... 0x....      BL       OSCtxSw
   \                     ??OS_Sched_0:
   \                     ?Subroutine0:
   \   00000000   0xF384 0x8810      MSR      PRIMASK,R4
   \   00000004   0xBD10             POP      {R4,PC}          ;; return

                       OSCtxSw:                                   
00000000 2848          OSIntCtxSw:   LDR      R0, =NVIC_INT_CTRL
00000002 4FF08051                    MOV      R1, #1 << 28
00000006 0160                        STR      R1, [R0]
00000008 7047                        BX       LR

 

И как у меня:

Спойлер

00000000   0xF3EF 0x8010      MRS      R0,PRIMASK                 
00000004   0xB672             CPSID    I                          
00000006   0x.... 0x....      LDR.W    R1,??DataTable15           
0000000A   0x788A             LDRB     R2,[R1, #+2]               
0000000C   0xB962             CBNZ.N   R2,??OsSched_0             
0000000E   0x684A             LDR      R2,[R1, #+4]               
00000010   0xFAB2 0xF282      CLZ      R2,R2                      
00000014   0x704A             STRB     R2,[R1, #+1]               
00000016   0x7809             LDRB     R1,[R1, #+0]               
00000018   0x428A             CMP      R2,R1                      
0000001A   0xD005             BEQ.N    ??OsSched_0                
0000001C   0xF04F 0x22E0      MOV      R2,#-536813568             
00000020   0xF04F 0x5180      MOV      R1,#+268435456             
00000024   0xF8C2 0x1D04      STR      R1,[R2, #+3332]            
                  ??OsSched_0:
00000028   0xF380 0x8810      MSR      PRIMASK,R0                 
0000002C   0x4770             BX       LR

 

(Скомпилено на полной оптимизации с одинаковыми опциями).

А ведь выполняют одну и ту же функцию!

 

С "реалтаймовостью" в uCOS ещё хуже. Чего стоит одно только требование в каждом ISR, из которого нужно просто послать сигнал какой-то задаче ОС, вызывать пару функций IsrEnter()/IsrExit()!

У меня они не требуются. Вызывать соответствующие функции ОС можно просто так из ISR.

 

PS: uCOS-II рассчитана на работу на 8-битках. И ядро её больше оптимизировано под них. Для ARM оно неоптимально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, jcxz said:

Сравните хотя-бы как выглядит выбор текущей приоритетной задачи (ре-шедулинг) в uCOS-II:

Немного вам завидую (по-доброму:angel:), вы так классно знаете ассемблер для армов!!! У вас значительно меньше команд в планировщике.

1 hour ago, jcxz said:

пару функций IsrEnter()/IsrExit()!

У FreeRTOS, например, этого не нужно, но у них для прерываний API заканчиваются на FromISR().

2 hours ago, jcxz said:

Вызывать соответствующие функции ОС можно просто так из ISR.

Похоже, ваши функции анализируют внутри себя, выполняются ли они в прерывании. В арме же есть флажок, сигнализирующий об этом. Я прав?

2 hours ago, jcxz said:

Для ARM оно неоптимально.

А вот ценник они (микриум) выставили не стесняясь этого обстоятельства)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, haker_fox сказал:

Немного вам завидую (по-доброму:angel:), вы так классно знаете ассемблер для армов!!! У вас значительно меньше команд в планировщике.

Ассемблер тут не при чём. И та и другая функция написаны на си. Я привёл их листинги, для того чтобы была ясно видна плата за универсальность.

Как я говорил выше - uCOS постарались сделать максимально портируемой на разные ядра. А в данной функции нужно выбирать самый младший установленный бит в биткарте (самую приоритетную готовую к выполнению задачу). На ARM это реализуется одной командой CLZ. Но её аналога нет на многих архитектурах. Поэтому в uCOS обошлись без неё, но более громоздко.

Это плата за универсальность ОС.

6 часов назад, haker_fox сказал:

У FreeRTOS, например, этого не нужно, но у них для прерываний API заканчиваются на FromISR().

Видимо в этой функции делаются те же операции, что и в uCOS-вской IsrExit(). 

6 часов назад, haker_fox сказал:

Похоже, ваши функции анализируют внутри себя, выполняются ли они в прерывании. В арме же есть флажок, сигнализирующий об этом. Я прав?

Нет. У меня структура данных и работа с ними так построена, что их можно вызывать хоть из задачи хоть из ISR - без разницы.

6 часов назад, haker_fox сказал:

А вот ценник они (микриум) выставили не стесняясь этого обстоятельства)))

Одна из целей написания своей ОС у меня была - чтобы в одном нашем коммерческом проекте убрать uCOS - как единственный чужой платный код. Иначе пришлось бы платить за использование. Теперь в этом проекте нет ни строчки чужого платного кода.  :wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 9/28/2019 at 2:11 AM, jcxz said:

На ARM это реализуется одной командой CLZ. Но её аналога нет на многих архитектурах.

Ну т.е. ассемблерные вставки всё-таки есть?! Иначе как же компилятору объяснить, какую команду использовать?

On 9/28/2019 at 2:11 AM, jcxz said:

Теперь в этом проекте нет ни строчки чужого платного кода

Т.е. вы также написали и свои средства межпроцессного взаимодействия (очереди, мьютексы и т.п.)? Серьёзная работа!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

39 минут назад, haker_fox сказал:

Ну т.е. ассемблерные вставки всё-таки есть?! Иначе как же компилятору объяснить, какую команду использовать?

Для этого они не нужны. У IAR есть intrinsic-и. Прочитайте что это такое.

Цитата

Т.е. вы также написали и свои средства межпроцессного взаимодействия (очереди, мьютексы и т.п.)? Серьёзная работа!

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

Всей работы там было на 3 дня примерно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, jcxz said:

Прочитайте что это такое.

Ок. Прочту.

16 minutes ago, jcxz said:

Реализовал только семафоры и event-ы. Всё.

Понятно)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...