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

FreeRTOS C674x порт

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

Закончил портирование FreeRTOS под ядро С674x. Точнее под DSP ядро OMAP-L138.

Появилась первая, точнее ноль.первая бета версия.

Задачи переключает, прерывания обрабатывает, т.е. ведёт себя вроде как надо.

 

Сейчас активно тестирую этот порт. Всех желающих прошу подключиться и сообщать об ошибках тут.

 

Выложил порт в форуме контрибуций на сайте FreeRTOS, прикрепляю сюда.

Обращение к SM, как к гуру C6000 ассемблера:

прошу Вас посмотреть .asm исходники на предмет правильного распараллеливания операций.

 

P.S. Это мой второй(после ХэллоуВорлд) проект для C674x, так что прошу сильно не пинать.

 

P.P.S. Взялся за этот порт, чтобы по-глубже вникнуть в архитектуру C6x и CCS.

 

P.P.P.S. Долой монополию ДСПБИОСа !

C674x_freertos_port.zip

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


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

Обращение к SM, как к гуру C6000 ассемблера:

прошу Вас посмотреть .asm исходники на предмет правильного распараллеливания операций.[/i]

А.. это... Компилятор-транслятор сразу скажет, если неправильно! Он больше гуру в этом, чем я :)

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


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

А.. это... Компилятор-транслятор сразу скажет, если неправильно! Он больше гуру в этом, чем я :)

Компилятор на мои исходники не ругается вообще.

Я пока не силён в работе конвейера С6000, поэтому есть вопросы без ответов:

1) Как проанализировать код на наличие stall-ов ?

2) Есть ли какие-то особые требования на выравнивание кода с параллельными инструкциями?

3) Когда я в коде пишу инструкцию "B регистр" и следующей строкой "NOP 5", компилятор мне иногда заменяет эти инструкции на "BNOP регистр,5", а иногда оставляет как написано. С чем может быть связано такое поведение?

4) Есть ли подводные камни(между инструкциями возникнет NMI/вмешается эмулятор и т.д.) в следующем коде (из реализации Interrupt Service Fetch Packet):

MVD        B0,B0
MVKL      addr,B0
MVKH      addr,B0
B        B0
NOP        5

Задумка была сделать реализацию ISFP, не использующую стек для сохранения/восстановления B0. В пошаговом и непрерывном выполнении этого кода проблем не выявил.

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


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

Закончил портирование FreeRTOS под ядро С674x. Точнее под DSP ядро OMAP-L138.

А зачем ОС на DSP-ядре если рядом ARM, которое вроде как и предназначено для таких дел?

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


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

Кстати вот еще конкурент (правильнее сказать альтернатива дспбиосу) потенциальный - http://www.linux-c6x.org/wiki/index.php/Releases

на сколько я понимаю, TI довели свой компилятор до уровня GCC по расширениям.

 

Компилятор на мои исходники не ругается вообще.

Я пока не силён в работе конвейера С6000, поэтому есть вопросы без ответов:

1) Как проанализировать код на наличие stall-ов ?

2) Есть ли какие-то особые требования на выравнивание кода с параллельными инструкциями?

3) Когда я в коде пишу инструкцию "B регистр" и следующей строкой "NOP 5", компилятор мне иногда заменяет эти инструкции на "BNOP регистр,5", а иногда оставляет как написано. С чем может быть связано такое поведение?

4) Есть ли подводные камни(между инструкциями возникнет NMI/вмешается эмулятор и т.д.) в следующем коде (из реализации Interrupt Service Fetch Packet):

MVD        B0,B0
MVKL      addr,B0
MVKH      addr,B0
B        B0
NOP        5

Задумка была сделать реализацию ISFP, не использующую стек для сохранения/восстановления B0. В пошаговом и непрерывном выполнении этого кода проблем не выявил.

 

 

1. А нету сталлов в С6000 (про 64/64+ не знаю, я с ними не работал, говорю только про 62хх/67хх). Если, например, невовремя после LDR сделать операцию с регистром, куда LDR, или возникнет прерывание, то просто-напросто операция посчитает не то, а LDR загрузит через несколько тактов. Поэтому, собственно, весь программно-конвейеризированный код обязательно исполняется с запрещенными прерываниями, и для этого в компилере есть "interrupt threshold", чтобы он мог реалтаймовость выдерживать. И еще в С6000 есть некоторые команды, после которых нельзя занимать юнит несколько тактов, например часть плавучки, об этом тоже не надо забывать. Эмулятор, в отличие от прерывания, не флушит конвейер, поэтому проблем не вызывает никогда.

2. нет. ну точнее на 32-битное слово, возможно в 64 что-то иначе. а если и есть, транслятор разберется.

3. не знаю. по идее всегда BNOP если 64хх надо. Или, как вариант, компилятор может быть припараллеливает B к предыдущей команде, если видит, что это безопасно.

4. Прерывание в этом куске (если возникнет между MVD и одним из MVK*) вам все испортит, точнее MVK испортит :), так что сохраняйте CSR, запрещайте прерывания, и впараллель с B их разрешайте.

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


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

Добрый день.

Посмотрите документ Hand-Tuning Loops and Control Code on the TMS320C6000.

Спасибо большое, за ссылку. Очень полезный документ для меня сейчас и на будущее.

 

А зачем ОС на DSP-ядре если рядом ARM, которое вроде как и предназначено для таких дел?

1) Чтоб многопоточное приложение делать со всякими объектами синхронизации, очередями.

2) Чтоб изучить новую для меня архитектуру во всех нюансах, а не тупо кодить на Си, а потом удивляться, почему на ДСП цифровые фильтры на Си работают медленнее чем на ARM.

3) В моём проекте не хочу идти путём "поставить линух на ARM", хочу на ARM ядре тоже запустить FreeRTOS + lwIP. И чтоб всё это влезло в Shared RAM и место ещё осталось.

 

....

Спасибо за ответы. Пока курю документацию, возразить ничего не могу.

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


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

Спасибо за ответы.

 

Кстати, сказали бы уж, ради чего экономия одного слова в стеке... Рекурсивная процедура что ли и стека мало?

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


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

Кстати, сказали бы уж, ради чего экономия одного слова в стеке... Рекурсивная процедура что ли и стека мало?

Понравилась инструкция MVD. С ней код сурово выглядит.

А вообще ни кто не мешает мне тут стек использовать.

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


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

3) В моём проекте не хочу идти путём "поставить линух на ARM", хочу на ARM ядре тоже запустить FreeRTOS + lwIP. И чтоб всё это влезло в Shared RAM и место ещё осталось.

Я в данный момент тоже делаю проект на L137 и тоже не собираюсь идти этим путём ;)

Но собираюсь ограничиться максимум ОС на ARM (скорей всего - uCOS от Micrium - очень маленькое ядро - неск. килобайт всего, но есть всё что надо) или вообще без ОС (пока так).

DSP будет заниматься только обработкой, из объектов синхронизации только прерывания DSP<->ARM (ещё не изучал этот вопрос). Никакой ОС на DSP не планирую, чтобы не тратить впустую его ресурсы.

К сожалению по ТЗ ограничиться только внутренней ОЗУ не получится - необходимо собирать с McASP большой объём данных, обрабатывать, хранить и отдавать затем по медленному каналу.

 

Насчёт "цифровых фильтров на DSP": Вы не смотрели на техасскую DSPLIB для этого ядра? Насколько она эффективна? По идее должна быть эффективнее, чем реализация фильтров на си.

Хотя (вспоминая DSPLIB на C55) полного использования процессора ждать от неё не приходится.

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


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

DSP будет заниматься только обработкой, из объектов синхронизации только прерывания DSP<->ARM (ещё не изучал этот вопрос). Никакой ОС на DSP не планирую, чтобы не тратить впустую его ресурсы.

У меня тоже планируется L137. Образцы уже получили. Сейчас плату проектируем.

А пока тренируюсь на L138 (hawkboard).

А насчет "отъедания" производительности операционной системой: этот порт FreeRTOS тратит на переключение задач 816 нс (на частоте 300 МГц). Т.е. немного.

Насчёт "цифровых фильтров на DSP": Вы не смотрели на техасскую DSPLIB для этого ядра? Насколько она эффективна? По идее должна быть эффективнее, чем реализация фильтров на си.

Хотя (вспоминая DSPLIB на C55) полного использования процессора ждать от неё не приходится.

Планирую использование этой библиотеки.

А насчет "цифровых фильтров на Си" - это я писал про то, что стоит досконально изучить архитектуру C674x, чтобы выжать максимум производительности, а не бросаться в кодирование и получить черт знает что.

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


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

можно узнать в каком состоянии порт сейчас?

Выявил и устранил несколько ошибок.

Исправленны порт пока не публиковал.

Пока работу приостановил, но скоро возобновлю.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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