AlexRayne 7 27 сентября, 2019 Опубликовано 27 сентября, 2019 · Жалоба Цитата Пришёл к выводу: так как время нахождения в прерывании не превышает периода следования данных, то нет необходимости проверять в этом же цикле оставшиеся данные в FIFO. 1) если во время прерывания долетит символ - на него потратится отдельный вызов прерывания и шедулеры. а проверка на наличие символа - копеешная. 2) если вам долетит последний символ посылки, и дальше ваш абонент ждет ответа. Так вот Вы можете и не получить этот последний символ пока не проверите порт. Это в случае если прерывание потеряется, а это много от чего может зависеть в операционке и железе. проверка в коде делает поведение более предсказуемым чтоли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 172 27 сентября, 2019 Опубликовано 27 сентября, 2019 · Жалоба 17 минут назад, AlexRayne сказал: Это в случае если прерывание потеряется, а это много от чего может зависеть в операционке и железе. Такого в принципе не должно быть. Если такое происходит - сначала нужно это вылечить, прежде чем дальше что-то делать. Дополнительная проверка этому не поможет - тут не потеряется, так значит потеряется в случае если символ придёт сразу после проверки. Лечить нужно причину, прежде чем костыли городить. Циклическая проверка (для без-FIFO-шных UART) - дело десятое, может быть может не быть. А если высока цена за вызов ISR (из-за особенностей ОС/ядра), то лучше тогда для работы с UART использовать DMA. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 59 27 сентября, 2019 Опубликовано 27 сентября, 2019 · Жалоба 22 hours ago, jcxz said: У меня своя RTOS, самописная. Помниться вы ucos использовали. Надоела? или вы её кардинально переписали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 172 27 сентября, 2019 Опубликовано 27 сентября, 2019 · Жалоба 3 минуты назад, haker_fox сказал: Помниться вы ucos использовали. Надоела? или вы её кардинально переписали? Да, надоела. uCOS - универсальная ОС, под разные ядра. И как любое универсальное решение - неоптимальна для каждого конкретного ядра. И очень даже неоптимальна для ARM. Я написал свою, гораздо более лёгкую и быструю (на переключениях задач). Впрочем и ранее я использовал uCOS сильно оптимизированную под себя под Cortex-M. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 59 27 сентября, 2019 Опубликовано 27 сентября, 2019 · Жалоба 7 minutes ago, jcxz said: И очень даже неоптимальна для ARM Гм, что же вам такое нужно от оси? Скорость переключения? Малый объём TCB? Детерминированность ("реалтаймовость")? Уже просто интересно) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 172 27 сентября, 2019 Опубликовано 27 сентября, 2019 · Жалоба 18 минут назад, haker_fox сказал: Гм, что же вам такое нужно от оси? Скорость переключения? Малый объём 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 оно неоптимально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 59 27 сентября, 2019 Опубликовано 27 сентября, 2019 · Жалоба 1 hour ago, jcxz said: Сравните хотя-бы как выглядит выбор текущей приоритетной задачи (ре-шедулинг) в uCOS-II: Немного вам завидую (по-доброму), вы так классно знаете ассемблер для армов!!! У вас значительно меньше команд в планировщике. 1 hour ago, jcxz said: пару функций IsrEnter()/IsrExit()! У FreeRTOS, например, этого не нужно, но у них для прерываний API заканчиваются на FromISR(). 2 hours ago, jcxz said: Вызывать соответствующие функции ОС можно просто так из ISR. Похоже, ваши функции анализируют внутри себя, выполняются ли они в прерывании. В арме же есть флажок, сигнализирующий об этом. Я прав? 2 hours ago, jcxz said: Для ARM оно неоптимально. А вот ценник они (микриум) выставили не стесняясь этого обстоятельства))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 172 27 сентября, 2019 Опубликовано 27 сентября, 2019 · Жалоба 6 часов назад, haker_fox сказал: Немного вам завидую (по-доброму), вы так классно знаете ассемблер для армов!!! У вас значительно меньше команд в планировщике. Ассемблер тут не при чём. И та и другая функция написаны на си. Я привёл их листинги, для того чтобы была ясно видна плата за универсальность. Как я говорил выше - uCOS постарались сделать максимально портируемой на разные ядра. А в данной функции нужно выбирать самый младший установленный бит в биткарте (самую приоритетную готовую к выполнению задачу). На ARM это реализуется одной командой CLZ. Но её аналога нет на многих архитектурах. Поэтому в uCOS обошлись без неё, но более громоздко. Это плата за универсальность ОС. 6 часов назад, haker_fox сказал: У FreeRTOS, например, этого не нужно, но у них для прерываний API заканчиваются на FromISR(). Видимо в этой функции делаются те же операции, что и в uCOS-вской IsrExit(). 6 часов назад, haker_fox сказал: Похоже, ваши функции анализируют внутри себя, выполняются ли они в прерывании. В арме же есть флажок, сигнализирующий об этом. Я прав? Нет. У меня структура данных и работа с ними так построена, что их можно вызывать хоть из задачи хоть из ISR - без разницы. 6 часов назад, haker_fox сказал: А вот ценник они (микриум) выставили не стесняясь этого обстоятельства))) Одна из целей написания своей ОС у меня была - чтобы в одном нашем коммерческом проекте убрать uCOS - как единственный чужой платный код. Иначе пришлось бы платить за использование. Теперь в этом проекте нет ни строчки чужого платного кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 59 30 сентября, 2019 Опубликовано 30 сентября, 2019 · Жалоба On 9/28/2019 at 2:11 AM, jcxz said: На ARM это реализуется одной командой CLZ. Но её аналога нет на многих архитектурах. Ну т.е. ассемблерные вставки всё-таки есть?! Иначе как же компилятору объяснить, какую команду использовать? On 9/28/2019 at 2:11 AM, jcxz said: Теперь в этом проекте нет ни строчки чужого платного кода Т.е. вы также написали и свои средства межпроцессного взаимодействия (очереди, мьютексы и т.п.)? Серьёзная работа! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 172 30 сентября, 2019 Опубликовано 30 сентября, 2019 · Жалоба 39 минут назад, haker_fox сказал: Ну т.е. ассемблерные вставки всё-таки есть?! Иначе как же компилятору объяснить, какую команду использовать? Для этого они не нужны. У IAR есть intrinsic-и. Прочитайте что это такое. Цитата Т.е. вы также написали и свои средства межпроцессного взаимодействия (очереди, мьютексы и т.п.)? Серьёзная работа! Нет ни очередей, ни мьютексов. Я не ставил целью разработку сферического коня в вакууме. Реализовал только то, что реально мне нужно и что реально использую в своих проектах. Реализовал только семафоры и event-ы. Всё. Всей работы там было на 3 дня примерно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 59 30 сентября, 2019 Опубликовано 30 сентября, 2019 · Жалоба 16 minutes ago, jcxz said: Прочитайте что это такое. Ок. Прочту. 16 minutes ago, jcxz said: Реализовал только семафоры и event-ы. Всё. Понятно) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться