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

 
 
> TNKernel будет ли порт для cortex m4 ?
dimanisu
сообщение Feb 9 2013, 20:26
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 4-10-07
Пользователь №: 31 055



Здравствуйте!

У меня вопрос к разработчику ОС Юрию и всем, кто допиливал ось под себя(VslavX и т.д.), озвученный в названии темы. Будет ли такой порт? Планирую работать с STM32f4.
Планируется ли дальнейшее развитие TNKernel?

Заранее благодарен за ответы.
Go to the top of the page
 
+Quote Post
3 страниц V   1 2 3 >  
Start new topic
Ответов (1 - 40)
VslavX
сообщение Feb 10 2013, 11:27
Сообщение #2


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(dimanisu @ Feb 9 2013, 22:26) *
У меня вопрос к разработчику ОС Юрию и всем, кто допиливал ось под себя(VslavX и т.д.), озвученный в названии темы. Будет ли такой порт? Планирую работать с STM32f4.
Планируется ли дальнейшее развитие TNKernel?

Если не предполагается использование FPU, то, имхо, должен подойти существующий порт от Cortex-М3.
У меня на полке лежит нераспечатанный Discovery STM32F4 - никак руки не дойдут попробовать (работы всякой многовато). Очень надеюсь в ближайшее время таки до кита добраться и сделать порт с "честным многозадачным" использованием FPU - тут тема недалеко пробегала с интересной идейкой по переключению контекста FPU "по требованию". Мне будет несложно пропатчить основную ветку ОС самому (сделать и выложить пробный проект на упомянутый Discovery) или поделиться наработками с автором. Вопрос только - когда...
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Feb 10 2013, 11:39
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



А можно ссылку на тему, где обсуждалась идейка? sm.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 10 2013, 12:16
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Вот здесь обсуждалась.
Возможно пригодится ещё эта тема.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
dimanisu
сообщение Feb 10 2013, 12:38
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 4-10-07
Пользователь №: 31 055



Цитата(VslavX @ Feb 10 2013, 14:27) *
Если не предполагается использование FPU, то, имхо, должен подойти существующий порт от Cortex-М3.
У меня на полке лежит нераспечатанный Discovery STM32F4 - никак руки не дойдут попробовать (работы всякой многовато). Очень надеюсь в ближайшее время таки до кита добраться и сделать порт с "честным многозадачным" использованием FPU - тут тема недалеко пробегала с интересной идейкой по переключению контекста FPU "по требованию". Мне будет несложно пропатчить основную ветку ОС самому (сделать и выложить пробный проект на упомянутый Discovery) или поделиться наработками с автором. Вопрос только - когда...



Спасибо за ответ. Про Ваш Discovery STM32F4 я в курсе - читал другую темку sm.gif (занятное было состязание с scmrtos). Хотелось бы использовать по полной все возможности STM32F4. Поэтому если Вы сможете это провернуть - это было бы просто великолепно.
А по поводу дальнейшего развития этой оси вопрос остается в силе
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Feb 11 2013, 09:58
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Если бы я стал писать порт TNKernel для Cortex-M4, это было бы что-то похожее на FreeRTOS port.
Вячеслав предлагает более advanced решение, так что, IMHO, было бы лучше, если бы порт написал он..
Go to the top of the page
 
+Quote Post
VslavX
сообщение Feb 12 2013, 06:16
Сообщение #7


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(yuri_t @ Feb 11 2013, 11:58) *
Вячеслав предлагает более advanced решение, так что, IMHO, было бы лучше, если бы порт написал он..

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

Update: сегодня получилось поработать - пункт 1 почти выполнен. Теперь умею читать-писать по JTAG процессоры F405/407/415/417/427/437 (ессно, проверил 407 только). Порт для Cortex-M3 спокойно завелся на STM32F407 (пока без FPU). Более того, на старте пошла та же самая бинарная прошивка что и на STM32F207. Поднял частоту до 168МГц (со 120 для F2xx), поигрался с временем переключение контекста (940 нс @168MHz ART prefetch выключен (имитация ревизии А), и 900нс при включенном prefecth ("полноценная" ревизия Z).

Go to the top of the page
 
+Quote Post
dimanisu
сообщение Feb 16 2013, 00:44
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 4-10-07
Пользователь №: 31 055



VslavX!
Благодарю за инициативу! Надеюсь, что это не сильно будет Вас напрягать. Вы написали, что планируете прикрутить порт к оф релизу. Насколько я знаю, у Вас есть и собственные наработки для TNKernel(доделки, переделки оф релиза). Можно узнать в чем они заключаются, какие достоинства(недостатки) и, если возможно, посмотреть на исходники Вашей модификации.

С Уважением.
Go to the top of the page
 
+Quote Post
VslavX
сообщение Feb 18 2013, 12:34
Сообщение #9


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(dimanisu @ Feb 16 2013, 02:44) *
Благодарю за инициативу! Надеюсь, что это не сильно будет Вас напрягать. Вы написали, что планируете прикрутить порт к оф релизу. Насколько я знаю, у Вас есть и собственные наработки для TNKernel(доделки, переделки оф релиза). Можно узнать в чем они заключаются, какие достоинства(недостатки) и, если возможно, посмотреть на исходники Вашей модификации.

Увы, но руководство пока против чтобы открывать полные исходники модификации. В субботу спрашивал (есть желание на SourceForge выложить улучшения и разные порты - ожидается для NIOS, и, возможно, для MIPS), но снова получил прямой запрет sad.gif.
Архитектурно отличается несильно - удалена таймерная задача (жалко дважды переключать контекст на каждый системный тик) - обработка перенесена в прерывание, с периодическим разрешением прерываний (чтобы не страдал реал-тайм), принципально выброшена часть "стремных" функций типа tn_task_terminate(). Оптимизирован (по аппаратуре вычислется вложенность) счетчик вложения прерываний, нет флагов запрета переключения контекста, часть функций работы со списками CDLL сделана макросами. Есть точный и грубый профайлеры, монитор системных объектов, синхронизированная отладка по JTAG/COM. Оптимизация по мьютексам вроде уже включена в v2.6. Возможно кое-что из остального тоже - я автору тексты отсылал. Посмотрю последний официальный релиз и если какие изменения я смогу быстро и прозрачно прикрутить к официальной ветке - выложу.

P.S. Сейчас больно слезаю с IAR-а (имел глупость написать несовместимые хидеры с использованием фичи @ физический адрес). Потому как нет безглючной версии IAR для Cortex-M4 (все IAR 6.xx с какими-либо выбрыками), перехожу на CodeSourcery GCC. Заодно будут вкусняшки типа LTO и C++ 11-ый (это прикладникам).

Go to the top of the page
 
+Quote Post
yuri_t
сообщение Feb 18 2013, 14:00
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



Цитата(VslavX @ Feb 18 2013, 16:34) *
... перехожу на CodeSourcery GCC. Заодно будут вкусняшки типа LTO и C++ 11-ый (это прикладникам).


В последнее время пользуюсь GNU Tools for ARM Embedded Processors (https://launchpad.net/gcc-arm-embedded/+download)
- на моих проектах работает хорошо..
Go to the top of the page
 
+Quote Post
VslavX
сообщение Feb 18 2013, 14:09
Сообщение #11


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(yuri_t @ Feb 18 2013, 16:00) *
В последнее время пользуюсь GNU Tools for ARM Embedded Processors (https://launchpad.net/gcc-arm-embedded/+download)
- на моих проектах работает хорошо..

Спасибо, обязательно посмотрю. Любопытно будет сравнить с менторовским GCC.
Go to the top of the page
 
+Quote Post
SyncLair
сообщение Feb 18 2013, 18:06
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 209
Регистрация: 6-01-12
Пользователь №: 69 197



Цитата(yuri_t @ Feb 18 2013, 18:00) *
В последнее время пользуюсь GNU Tools for ARM Embedded Processors (https://launchpad.net/gcc-arm-embedded/+download)

Не забывайте про http://yagarto.de ) тоже ничего


--------------------
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 18 2013, 18:13
Сообщение #13


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(SyncLair @ Feb 18 2013, 20:06) *
Не забывайте про http://yagarto.de ) тоже ничего

Автор вроде бы обещал, что проект завершён. В качестве альтернативы предлагал всё тот же GNU Tools for ARM Embedded Processors.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 18 2013, 18:41
Сообщение #14


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



linaro gcc еще есть,
github gcc(linux'овые сборки) - недавно перешел именно на него
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 18 2013, 20:53
Сообщение #15


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(_Pasha @ Feb 18 2013, 20:41) *
linaro gcc еще есть

Я именно о нём и говорил. Где-то договорились этот тулчейн называть именно GNU Tools for ARM Embedded Processors, а linaro - это больше в сторону Cortex-A семейства.
Go to the top of the page
 
+Quote Post
VslavX
сообщение Feb 19 2013, 21:16
Сообщение #16


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Выполнил черновой перенос существующего кода порта для Cortex-M3 (в который буду добавлять код для M4F) под GCC.Погонял тестовый код на Discovery STM32F4xx под IAR 5.41, IAR 6.40, GCC CodeSourcery (4.7.2 менторовский релиз 63) и упомянутый в этой ветке GNU Tools for ARM Embedded Processors.

По компактности сгенерированного кода (в порядке от меньшего к боьшему размеру)
- IAR 5.x - 11632
- IAR 6.x - 13344
- GCC CS - 13344
- Toolchain - 14816

По быстродействию (переключение контекста / Dhrystone, не особо показательно, разница маленькая):
- IAR 6.x (0.920 мкс) - 246502 DS
- IAR 5.x (1.080 мкс) - 246850 DS
- GCC CS (1.040 мкс) - 250490 DS
- Toolchain (1.080 мкс) - 250936 DS

Тест Dhrystone гонял, но он тоже не показателен - примерно 250000 у всех, +/- пару процентов. При модификации кода показатели меняются (видимо смещается как-то оно во флешке и начинает играть акселератор).

Исходники компилируются обоими компиляторами GCC - CS/Toolchain, никаких уcловных веток между ними нет. Но мне пока CodeSourcery нравится больше - документация получше, код покомпактнее. И вроде бы поддерживает LTO, но ключики -flto компилятору и линкеру на результирующий файл влияния не оказали. Toolchain на -flto варнингует.

В-общем, следующий шаг - уже буду собственно плавучку прикручивать, тут CodeSourcery в бесплатной редакции Lite может подбросить фокусов - вроде там были искусственные ограничения на hard-FPU. Буду разбираться дальше.
Go to the top of the page
 
+Quote Post
Volldemar
сообщение Feb 20 2013, 08:54
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 27-04-09
Из: Украина
Пользователь №: 48 342



А вот с этим: arm-none-eabi кто нибудь, работал?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 20 2013, 09:45
Сообщение #18


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Именно про него парой постов выше упоминали аж несколько авторов.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
VslavX
сообщение Feb 20 2013, 09:47
Сообщение #19


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(Volldemar @ Feb 20 2013, 10:54) *
А вот с этим: arm-none-eabi кто нибудь, работал?

Именно Линуксовая версия интересует? Я тестировал в этом топике версию с того же launchpad.net, но под Cygwin. Вроде же разницы на генерируемом выходном файле быть не должно?
Go to the top of the page
 
+Quote Post
Volldemar
сообщение Feb 20 2013, 12:21
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 27-04-09
Из: Украина
Пользователь №: 48 342



Цитата(VslavX @ Feb 20 2013, 11:47) *
Именно Линуксовая версия интересует? Я тестировал в этом топике версию с того же launchpad.net, но под Cygwin. Вроде же разницы на генерируемом выходном файле быть не должно?

Да, именно линуховый вариант интересует, и в самом линухе.
Извиняюсь з аоффтопик, но может кто-то подскажет?
С помощью этого тулчейна можно компильнуьб рабочий бинарник для:
Код
-mcpu=arm946e-s -march=armv5te


Сообщение отредактировал Volldemar - Feb 20 2013, 12:32
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Feb 20 2013, 15:58
Сообщение #21


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(VslavX @ Feb 20 2013, 11:47) *
Именно Линуксовая версия интересует? Я тестировал в этом топике версию с того же launchpad.net, но под Cygwin. Вроде же разницы на генерируемом выходном файле быть не должно?

Разницы нет.

Цитата(Volldemar @ Feb 20 2013, 14:21) *
С помощью этого тулчейна можно компильнуьб рабочий бинарник для:
Код
-mcpu=arm946e-s -march=armv5te

Насколько мне известно, этот тулчейн заточен под Cortex-M/R семейства.
Go to the top of the page
 
+Quote Post
VslavX
сообщение Feb 20 2013, 19:53
Сообщение #22


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



По теме переключения контекста FPU по требованию (по исключению) тоже хотелось бы услышать мнение All. После обдумывания мне кажется что хранить контекст FPU в стеке уже нельзя - иначе его будет невозможно восстановить по требованию (задача выполняется уже при произвольном стеке, и тут ей понадобился FPU - а стек-то уже тю-тю). Поэтому предлагается хранить контекст в блоке задчаи - TN_TCB. Но тут минус что контекст FPU большой - от 128 байт, и не каждая задача использует FPU - не всем оно надо. Поэтому предлагается завести пул блоков, для сохранения контекста. Когда задача начинает юзать FPU ей оттуда выделяется блок (ссылка храниться в TCB) и далее она пользуется блоком. При завершении задачи - блок возвращается. Таким образом пользователь может определить пул нужного размера - по числу задач работающих с FPU. Поддержку FPU в обработчиках прерываний/исключений думаю не реализовывать - код усложняется, скорость падает.

P.S. А чем бы float/double на консоль выводить, а то мой самописный printf не поддерживает %f, %e, %a - наверное, пришло время добавить эту поддержку. Посмотрел реализации glibc - так там еще длинную арифметику надо. uglibc тоже не радужно. Может кто-то присоветует относительно более простое решение?

Update: разобрался я с FPSCR, он автоматически в стеке сохраняется. При моем методе надо будет делать руками, главное - не забыть sm.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 21 2013, 03:00
Сообщение #23


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Я бы для начала попытался проанализировать плюсы и минусы вашего метода при различных сценариях использования.
Сценарий первый: в данный момент времени две задачи (или более) работают с плавучкой. При таком сценарии, насколько я понял, после каждого переключения контекста на "плавучую" задачу будет происходить много чего: исключение, выяснение причины, сохранение контекста предыдущей задачи, поиск свободного пула для сохранения контекста новой задачи... То есть, это всё будет работать сильно медленнее, чем простой вариант а-ля FreeRtos.
Сценарий второй (выигрышный для вашего варианта): Все задачи (или все кроме одной) перестали работать с плавучкой. В этом случае ничего не происходит, всё работает как M3.
Мне кажется, что второй вариант будет встречаться значительно реже. К тому же, к FreeRtos-ному варианту можно просто добавить функцию окончания работы с плавучкой, типа tn_end_fpu(), в которой будет сбрасываться бит CONTROL.FPCA. В этом случае он не уступит вашему варианту и при втором сценарии (если конечно все задачи вызовут tn_end_fpu()).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
VslavX
сообщение Feb 21 2013, 05:53
Сообщение #24


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(AHTOXA @ Feb 21 2013, 05:00) *
Я бы для начала попытался проанализировать плюсы и минусы вашего метода при различных сценариях использования.

Основной анализ проделан в статье ARM на которую Вы уже давали ссылку. Там же оба подхода довольно подробно рассмотрены. Из дополнительных минусов второго ("переключение по требованию") я вижу невозможность (хотя, скорее громоздкость и неудобство) использования FPU в обработчиках прерываний/исключений. Зато снижается оверхед при переключении контекста и interrupt latency.

Цитата(AHTOXA @ Feb 21 2013, 05:00) *
Сценарий первый: ...
...
Сценарий второй ...

С анализом сценариев у меня туго sm.gif. На данный момент у меня такого рода задачи, что я вообще не понимаю зачем нужен FPU. Будучи студентом в университете приходилось заниматься численным моделированием плазмы. На Фортране-IV. На СМ-4. Предметом гордости было наличие блока FIS. Потом кафедра купила СМ-1420 с полноценным FPP - радости было. Но сейчас таких задач у меня нет - скрипач FPU не нужен. Поэтому мне сложно сказать какой сценарий более частый и предпочтительный, и планирую реализовать оба подхода, с выбором по флагу компиляции. Второй сценарий сделаю несколько упрощенным - для начала не буду заморачиваться с пулом, просто буду хранить контекст в TCB.

Если кто-то реально использует (или только планирует использовать) FPU в своих приложениях - то было бы интересно узнать какой типовой способ использования в разрезе RTOS - сколько задач используют FPU, есть ли использование FPU в обработчиках прерываний и прочее.

Цитата(AHTOXA @ Feb 21 2013, 05:00) *
(если конечно все задачи вызовут tn_end_fpu()).

ИМХО такая функция полезна при обоих подходах. Если пользователя заботит быстродействие то ему надо предоставить возможность такой настройки.

Update:
Вот такое "понравилось":

"GNUC C compiler (gcc)
If a program is compiled with the FPU option, gcc might make use of the floating-point registers
if register pressure is high, and running low on available registers for data processing. In some
cases, the memory copy might also utilize floating-point registers to hold data"

Соглашение ABI при наличии FPU разрешает его почти произвольное использование - даже если нет работы с данными типа float/double, регистры FPU все равно могут использоваться компилятором, хотя бы в качестве быстрого хранилища переменных. Поэтому весь код обработчиков прерываний (включая системные функции типа tn_sem_isignal()) нужно компилировать с -mfloat-abi=soft. И библиотеки тоже с такой опцией. И, соответственно, приложение - иначе несовместимость линковки (хотя, проверю линковку "soft" и "softfp", есть шанс). И кому такое надо - вообще не моги пользовать FPU? Получается что второй подход для систем с отдельной линковкой приложения. Разрешить использование FPU в обработчиках можно, но для этого надо для каждого сделать отдельную функцию-переходник в котором явно запрещается FPU - чтобы FPU-код в обработчике вызвал исключение. И такой переходник скушает почти весь выигрыш в быстродействии sad.gif

Из компиляторов пока только Keil можно заставить не использовать FPU для "неплавучих" целей. GCC и IAR таких флажков не имеют.
Go to the top of the page
 
+Quote Post
VslavX
сообщение Feb 21 2013, 20:01
Сообщение #25


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Реализовал оба метода переключения контекста.
Метод 1: использование автоматического "ленивого" сохранения контекста FPU в стеке, полностью аналогичен коду порта scmRTOS
Метод 2: метод переключения контекста по требованию. Имеется системная переменная - указатель на TCB задачи, контекст которой загружен в данный момент в регистры FPU. При переключении задачи эта переменная сравнивается с TCB загружаемой задачи. При совпадении доступ к FPU разрешается через биты регистра CPACR, иначе доступ запрещен. Когда текущая задача, не владеющая контекстом FPU пытается выполнить плавучую операцию - происходит исключение, сохраняющее регистры FPU в TCB задачи-владельца, и загружающее нужный контекст текущей задачи.
Предварительно потестировал оба метода.
Для начала картинка GCC<->IAR без поддержки FPU
Прикрепленное изображение

Мой взгляд, разницы принципиальной нет.

Теперь картинка сравнения разных методов, для компилятора GCC.
Прикрепленное изображение

FPU1 - метод 1
FPU2 - метод 2
none - ни одна из двух тестовых задач не обращается к FPU
Task1 - только первая тестовая задач обращается к FPU
Task2 - только вторая тестовая задач обращается к FPU
Task12 - первая и вторая тестовая задачи обращаются к FPU

Для метода 1 следует помнить, что FPCA бит в регистре CONTROL является sticky - то есть если задача хотя бы раз (возможно в далеком прошлом) обратилась к FPU и теперь про него вообще забыла - крайняя левая картинка уже использоваться не будет - работает одна из правых. С явным сбросом FPCA могут быть проблемы, так как компилятор может неявно использовать FPU даже в отсутствие операций с float/double.

Для метода 2 есть недостаток - не поддерживается FPU в прерываниях/исключениях. В связи с этим для гарантии код операционной системы следует компилировать с оцпией -mfloat-abi=soft. А приложение и математические библиотеки с опцией softfp. Иначе оно не будет линковаться. На ассемблер разумеется никаких ограничений.

Еще немного потестирую и буду прикручивать к официальной версии 2.6. Кстати, там видно что пооптимизировать, предложу модификации.

Update: еще покрутил ассемблерный листинг - для метода 2 времянки еще улучшились немного. На крайней правой нижней картинке теперь общее время 3.73мкс. Можно еще уменьшить за счет удаления всяких проверок (типа не пришло ли исключение из режима обработчика), но это уже может сказаться на надежности.

Update 2: у меня тут префетч из флеша в тесте выключался оказывается, почему то заметно влияло только на самую нижнуюю правую картинку - итого полное время 3,30 мкс для метода 2.

Update 3: тестирование прошло удачно, обновил картинку с цифрами. Префетч включен
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 22 2013, 02:59
Сообщение #26


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Очень интересно. Только я не понял, как читать осциллограммыsm.gif
Сначала думал, что жёлтый луч - это одна задача, синий - вторая, а промежуток между ними - переключение контекста. Но потом засомневался - что-то уж очень маленькое время переключения контекста получается.
Что касаемо того, что gcc может использовать регистры FPU по своему желанию - это, по идее, достаточно легко обнаружить при отладке (и как-то изменить программу, чтоб это убрать).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
VslavX
сообщение Feb 22 2013, 05:39
Сообщение #27


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(AHTOXA @ Feb 22 2013, 04:59) *
Очень интересно. Только я не понял, как читать осциллограммыsm.gif

Сейчас я убегаю, поэтому - по быстрому - фрагмент тестового кода:

CODE

#define TST_CONTEXT_STACK_SIZE 128

volatile BOOL tst_context_exit;
BYTE use_fpu;

void tst_context_task_func(void *param)
{
PTN_SEM sem;

//
// tst_printf("\r\nTest task started...\f");
//
sem = (PTN_SEM) param;
for(;;)
{
#ifdef _TEST_CONTEXT_PIN_2
IO_PORT_CLR(_TEST_CONTEXT_PIN_2);
#endif
tn_sem_acquire (sem, TN_WAIT_INFINITE);
#ifdef _TEST_CONTEXT_PIN_1
IO_PORT_CLR(_TEST_CONTEXT_PIN_1);
#endif
if (tst_context_exit)
{
//
// tst_printf("\r\nTest task completed...\f");
//
tn_task_exit(0, 0);
}
#if TN_SUPPORT_FPU
if (use_fpu & 2)
{
fpu_touch();
}
#endif
}
}

void io_test_context(void)
{
TN_SEM test_switch_sem;
TN_TCB test_task_clear;
PVOID test_task_stack[TST_CONTEXT_STACK_SIZE];
DWORD lock;

tst_printf("\r\nContext switch test...\f");
tst_context_exit = FALSE;

lock = hal_lock_interrupt();
{
#ifdef _TEST_CONTEXT_PIN_1
#if HAL_IO_SET_MODE
IO_SET_MODE(_TEST_CONTEXT_PIN_1);
#else
IO_PORT(_TEST_CONTEXT_PIN_1)->sFIO_DIR |= IO_MASK(_TEST_CONTEXT_PIN_1);
#endif
#endif
#ifdef _TEST_CONTEXT_PIN_2
#if HAL_IO_SET_MODE
IO_SET_MODE(_TEST_CONTEXT_PIN_2);
#else
IO_PORT(_TEST_CONTEXT_PIN_2)->sFIO_DIR |= IO_MASK(_TEST_CONTEXT_PIN_2);
#endif
#endif
}
hal_unlock_interrupt(lock);

tn_sem_create (&test_switch_sem, 1, 1);
tn_task_create(
(TN_TCB*)&test_task_clear,
tst_context_task_func,
IO_PRIMARY_PRIORITY-4,
&(test_task_stack[TST_CONTEXT_STACK_SIZE-1]),
TST_CONTEXT_STACK_SIZE,
(PVOID)&test_switch_sem,
TN_TASK_START_ON_CREATION);

for(;;)
{
tn_task_sleep(MS_TO_TICKS(1));
#ifdef _TEST_CONTEXT_PIN_1
IO_PORT_SET(_TEST_CONTEXT_PIN_1);
#endif
tn_sem_signal(&test_switch_sem);
#ifdef _TEST_CONTEXT_PIN_2
IO_PORT_SET(_TEST_CONTEXT_PIN_2);
#endif
if (tst_inkey() == 27)
{
tst_printf("\r\nStopping test task...\f");
while(test_task_clear.task_state != TSK_STATE_DORMANT)
{
tst_context_exit = TRUE;
tn_sem_signal(&test_switch_sem);
tn_task_sleep(MS_TO_TICKS(10));
}
tn_task_delete((TN_TCB*)&test_task_clear);
tn_sem_delete(&test_switch_sem);
tst_printf("\r\nTest completed...\f");
return;
}

#if TN_SUPPORT_FPU
if (use_fpu & 1)
{
fpu_touch();
}
#endif
}
}


Вечером продолжу тестирование и буду уже смотреть официальную ветку, там тоже есть что обсудить.
P.S. А префетч я отключал чтобы по-честному соревноваться с Вашими тестами scmRTOS - у Вас там ревизия проца старая sm.gif
P.P.S. Картинки уже устарели - есть круче sm.gif
Go to the top of the page
 
+Quote Post
Valentine Logino...
сообщение Feb 25 2013, 18:50
Сообщение #28


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 7-04-10
Из: Пушкино
Пользователь №: 56 462



Цитата(VslavX @ Feb 12 2013, 10:16) *
Порт для Cortex-M3 спокойно завелся на STM32F407 (пока без FPU).

Не могли ли бы вы поделиться проектом? У меня, к сожалению сделать это не получилось.
Программа постоянно прыгает по "OS timer tick" в tn_timer_task_func с периодической обработкой SysTick_Handler, но никак не переходит в функцию моей единственной задачи.
Буду благодарен любой помощи, мое первое знакомство с tn_kernel. Работаю все на той же stm32f4discovery под mdk-arm.
Go to the top of the page
 
+Quote Post
VslavX
сообщение Feb 25 2013, 20:24
Сообщение #29


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(Valentine Loginov @ Feb 25 2013, 20:50) *
Не могли ли бы вы поделиться проектом? У меня, к сожалению сделать это не получилось.

Порт "официальной" ветки и пример под stm32f4xx готовы, к сожалению, под IAR/GCC. Также внесена часть моих оптимизаций - которые вносятся без глубокого хирургического вмешательства. Осталось написать "сопроводиловку" и еще немного потестировать (там аж 8 вариантов компиляции нарисовалось) - и будет открыто.
Go to the top of the page
 
+Quote Post
yuri_t
сообщение Mar 9 2013, 21:53
Сообщение #30


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 24-08-05
Пользователь №: 7 937



TNKernel порт для Cortex-M4, написанный VslavX, выложен на сайте www.tnkernel.com.

Просьба со всеми вопросами обращаться непосредственно к автору ( VslavX )


Go to the top of the page
 
+Quote Post
kosyak©
сообщение Jan 21 2014, 17:20
Сообщение #31


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



VslavX, а почему в Вашем порте пропала необходимость в функции tn_int_exit() (заменена пустым макросом)?
Как оно теперь работает?
Go to the top of the page
 
+Quote Post
remi700
сообщение Jan 30 2014, 17:36
Сообщение #32





Группа: Новичок
Сообщений: 4
Регистрация: 22-09-13
Пользователь №: 78 436



Здравствуйте!
Из документации непонятно, можно ли при добавлении TNKernel в свой проект добавить tn_arm_disable_interrupts() и tn_arm_enable_interrupts() в уже имеющийся startup_stm32f4xx.s и вызывать tn_tick_int_processing() из обработчика SysTick_Handler() в stm32f4xx_it.c или обязательно заменить его на startup_hardware_init.s из комплекта TNKernel как в примере. Получается очень много исправлений по сравнению с тем что приходится делать например для FreeRTOS (только дописать __weak__ к обработчику SysTick), это нормально или делаю лишнее по незнанию (начал работать с ARM недавно, использовал шаблоны из CMSIS/SPL и FreeRTOS)?
Go to the top of the page
 
+Quote Post
Almaz_emb
сообщение Jul 16 2014, 05:10
Сообщение #33





Группа: Новичок
Сообщений: 4
Регистрация: 9-09-13
Пользователь №: 78 231



Доброго времени суток)
Безуспешно пытаюсь запустить TNKernel на STM32F401VC из Keil.
Порт для Cortex-M4 конфликтует с CMSIS core:
Код
.\TNKernelF4\CortexM4F/tn_port_cm4f.h(166): error:  #247: function "__get_PRIMASK" has already been defined
  __get_PRIMASK(void)
.\TNKernelF4\CortexM4F/tn_port_cm4f.h(179): error:  #247: function "__set_PRIMASK" has already been defined
  __set_PRIMASK(unsigned long mask)

А порт для Cortex-M3 (как я понял из топика вполне работоспособен на Cortex-M4 ) падает в hardfault-handler:
Код
#include <al_discovery_led.h>
#include <tn.h>


//----------- Tasks ----------------------------------------------------------

#define  TASK_0_PRIORITY 7
#define  TASK_0_STK_SIZE 128
align_attr_start unsigned int task_0_stack[TASK_0_STK_SIZE] align_attr_end;
TN_TCB  task_0;
void task_0_func(void);

//----------------------------------------------------------------------------

#define VECTACTIVE  (0x000001FF)
#define rNVIC_ICSR  (*((__IO unsigned int*)0xE000ED04))

void tn_cpu_int_enable()
{
   tn_arm_enable_interrupts();
}

//----------------------------------------------------------------------------
int tn_inside_int(void)
{
   if(rNVIC_ICSR & VECTACTIVE)
      return 1;
   return 0;
}


int main( void )
{
//    tn_arm_disable_interrupts();
    al_discovery_LED_init();
    tn_start_system();
    while(1)
    {
    }
}

void tn_app_init ()
{

   task_0.id_task = 0;
   tn_task_create(&task_0,               //-- task TCB
                 task_0_func,            //-- task function
                 TASK_0_PRIORITY,        //-- task priority
                 &(task_0_stack          //-- task stack first addr in memory
                    [TASK_0_STK_SIZE-1]),
                 TASK_0_STK_SIZE,        //-- task stack size (in int,not bytes)
                 NULL,                          //-- task function parameter
                 TN_TASK_START_ON_CREATION      //-- Creation option
                 );
}

//----------------------------------------------------------------------------
void task_0_func (void)
{
   for(;;)
   {
    al_discovery_LED_on(BLUE);
    tn_task_sleep(128);
   }
}

Поделитесь пожалуйста простейшим проектом под Keil)
Go to the top of the page
 
+Quote Post
Almaz_emb
сообщение Jul 16 2014, 21:22
Сообщение #34





Группа: Новичок
Сообщений: 4
Регистрация: 9-09-13
Пользователь №: 78 231



Продолжаю мудохаться.
Запустил порт для CortexM4 так, чтобы компилятор не ругался. Проект в прикрепленном файле.
Одна задача, которая зажигает светодиод. Падает в hardFault. Прошелся дебагером - проблемное место - функция tn_start_exe() ( достигается конец функции: строчка
Код
                b       .                               // Never reach this

Прикрепленные файлы
Прикрепленный файл  tnkernel.rar ( 657.92 килобайт ) Кол-во скачиваний: 23
 
Go to the top of the page
 
+Quote Post
VslavX
сообщение Jul 19 2014, 20:10
Сообщение #35


embarrassed systems engineer
*****

Группа: Свой
Сообщений: 1 083
Регистрация: 24-10-05
Из: Осокорки
Пользователь №: 10 038



Цитата(Almaz_emb @ Jul 17 2014, 00:22) *
Одна задача, которая зажигает светодиод. Падает в hardFault. Прошелся дебагером - проблемное место - функция tn_start_exe() ( достигается конец функции: строчка
Код
                b       .                               // Never reach this

А какой у Вас PendSV_Handler() работает? Судя по всему из файла startup_stm32f401xx.s, а должен бы из tn_port_cm4f_asm.s. Ну и для нормальной работы TN нужен системный таймер, функция tn_tick_int_processing() должна периодически вызываться из прерывания системного таймера.
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Sep 11 2014, 15:13
Сообщение #36


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Пробую запустить порт CortexM4F в своем проекте.
При TN_SUPPORT_FPU = 0 и TN_SUPPORT_FPU = 1 работает без проблем.
А при TN_SUPPORT_FPU = 2 падает в HardFault при первой же встреченной команде работы с FPU.
Компилятор IAR 7202. В чем может бть проблема?
Go to the top of the page
 
+Quote Post
prgjz
сообщение Oct 9 2014, 12:19
Сообщение #37


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 3-01-07
Из: Germany
Пользователь №: 24 071



Кто нибудь добился успеха с TN_SUPPORT_FPU?
Прграмма с TN_SUPPORT_FPU > 0 ведёт себя как ревнивая женщина (LPC4088).
Неужели нет альтернативы FreeRTOS?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 9 2014, 14:54
Сообщение #38


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(prgjz @ Oct 9 2014, 18:19) *
Неужели нет альтернативы FreeRTOS?

scmRTOS?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
prgjz
сообщение Oct 9 2014, 16:50
Сообщение #39


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 3-01-07
Из: Germany
Пользователь №: 24 071



Да, мне нравится она!
Использую в старых проектах.
Перешёл на TNKernel в частности из-за tn_net.

Go to the top of the page
 
+Quote Post
prgjz
сообщение Oct 10 2014, 16:34
Сообщение #40


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 3-01-07
Из: Germany
Пользователь №: 24 071



упс... минимальный стек больше при FPU.
Заработало но результат как и у kosyak©:
При TN_SUPPORT_FPU = 0 и TN_SUPPORT_FPU = 1 работает без проблем.
А вот при TN_SUPPORT_FPU = 2 падает в HardFault на инструкции VMOV S0,R0.
R0 = 0x320. Уже день пробился безрезультатно.
Меня собственно устраивает TN_SUPPORT_FPU = 1 sm.gif

Не подскажет ли кто как в EWARM заставть компилятор для определённой
функции не делать код для FPU (#pragma например)?
Go to the top of the page
 
+Quote Post
LightElf
сообщение Oct 30 2014, 15:34
Сообщение #41


Частый гость
**

Группа: Участник
Сообщений: 180
Регистрация: 5-04-09
Пользователь №: 47 205



QUOTE (prgjz @ Oct 10 2014, 20:34) *
Не подскажет ли кто как в EWARM заставть компилятор для определённой
функции не делать код для FPU (#pragma например)?

Попробуйте так.
Выносите функцию в отдельный файл, включаете файл в проект, в опциях указываете компилятору ключ командной строки --core=Cortex-M4
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 18:59
Рейтинг@Mail.ru


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