Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2019-сен-17 23:54

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 132 ]  На страницу 1, 2, 3, 4, 5 ... 9  След.
Автор Сообщение
 Заголовок сообщения: FreeRTOS на 1967ВНхх
СообщениеДобавлено: 2019-июн-10 14:14 
Не в сети

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
Кто-нибудь уже портировал на 1967ВНхх FreeRTOS? Прошу откликнуться так же тех, кому интересна данная тема!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRTOS на 1967ВНхх
СообщениеДобавлено: 2019-июн-11 11:16 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
Я скачал с сайта исходники , посмотрел и скомпилил (один конфиг файл отсутствовал).
Взял за образец RISC-V. На первый взгляд ничего сложного. Нужно только знать где таймер, как его читать-писать,
как получить прерывания, сохранять-восстанавливать контекст. Недостает нескольких функций:
malloc, free. Добавил простые реализации. Написал простой пример с созданием двух задач.
Всё скомпилилось и пошла отладка. Уткнулся в проблему raise_soft_interrupt().
Cделал через trap, но не подошло.. Скорее всего придется через Kernel прерывание как у MAKS.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRTOS на 1967ВНхх
СообщениеДобавлено: 2019-июн-11 20:52 
Не в сети

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
Я за основу взял текущую версию FreeRTOS 10.2.1.Heap4. Компилятор выбрал LLVM,так как тех. поддержка "работает" только с ним.
Таймер(Sys) и Kernel(не зря же он для ядра VDK) завести не проблема!
А вот с сохранением-восстановлением контекста - затор! Не могу понять стек вверх идет или вниз?! Дисассемблер чудеса компилятора показывает! Из описания соглашения о вызовах не понятно, сколько функция стека(число) "резервирует".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRTOS на 1967ВНхх
СообщениеДобавлено: 2019-июн-12 07:45 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
Yujin писал(а):
Не могу понять стек вверх идет или вниз?! Дисассемблер чудеса компилятора показывает! Из описания соглашения о вызовах не понятно, сколько функция стека(число) "резервирует".
push на стек означает движение вниз, т.е. при вызове функции всегда можно
увидеть j27 = j27 - константа;; J27 это и есть указатель стека. Указатель всегда должен быть выровнен на границе квадрослова.
Компилятор использует регистр К26 также как указатель того же стека , что и J27. На входе в функцию (и при выходе)
значения в этих регистрах одинаковые. Исключение при прерывании: при входе в прерывание надежен только J27.
Два идентичных указателя когда-то задумывались для ускорения обращения к локальным переменным, а также для ускорения
сохранения-восстановления контекста. Архитектура поддерживает возможность двух чтений или записей в одном такте,
т.е. можно за один такт сохранить на стеке 8 регистров , либо загрузить со стека в регистры 8 значений.
Но пока это только возможность , доступная в ассемблере. Возможности бэкэнда(!) компилятора, мягко выражаясь, очень скромны :)
Пока,чтобы хоть что-то стоящее написать на этом процессоре , нужно максимально использовать ассемблер.
Особенно в критических по времени местах.
Как у вас с ассемблером ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRTOS на 1967ВНхх
СообщениеДобавлено: 2019-июн-12 19:29 
Не в сети

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
Описание ассемблерных команд в наличие!Если надо - будем изучать!
По поводу стека:
пример си-функции
void task(void *arg)
{
int k=0;
for(;;){
k++;
}
}
По disasm имеем:
<task>
j27=j27-4;; //<- j27 = j27 - константа;;
...
[j27+10]=J4;; //<- кто разрешил писать выше вершины стека?
...
[j27+9]=J0;; //<- кто разрешил писать выше вершины стека?
...
Эти записи (j27+N) подтверждены фактическим размещением значений регистров J0 и J4 по адресам БОЛЬШИМ значения j27!
Вот и как при входе в обработчик отследить эти [j27+10]? Мне кажется должно быть какое-то соглашения, по которому функции разрешено использовать j27+N стека!
А иначе j27 не может быть вершиной!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRTOS на 1967ВНхх
СообщениеДобавлено: 2019-июн-12 20:39 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
сегодня так увлекся этой ОС , что забыл про праздничный день :D
Но заставил таки заработать. Поморгал светодиодами :)
Завтра причешу и выложу начальный вариант.
Со стеком всё в порядке. Если вы знакомы с ARM, то там при входе в функцию
обычно команда STMDB (может сейчас и иначе называется :) ), а при выходе LDMIA.
В этом процессоре абсолютно всё аналогично.
Только команда STMDB не одна, а несколько.
Сначала DB (decrement before) - j27 = j27 - K;; т.е. указатель стека движется вниз (резервируем область размером К).
А затем уже сохранение типа [j27+n] = register;; множества регистров.
При выходе из функции делаем сначала загрузку множества регистров, а затем IA ,
т.е. increment after j27 = j27 + K. Возвращаем указатель в исходное состояние.
Классика. Ничего нового .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRTOS на 1967ВНхх
СообщениеДобавлено: 2019-июн-13 08:53 
Не в сети

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
Примите мои поздравления! С нетерпением жду ссылки на порт! Я же пока так и не сообразил, как определить максимальное значение n, чтобы операции [j27+n]= registers;; не перетерли Tcb текущей задачи.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRTOS на 1967ВНхх
СообщениеДобавлено: 2019-июн-13 10:02 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
Cпасибо :)
Что меня сразило в freeRTOS , так это обилие просто супперской документации.
После миландровского дока на MAKS OS это просто что-то невероятное.
Хоть и написано не по-русски :D


Последний раз редактировалось BY_man 2019-июн-28 14:18, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRTOS на 1967ВНхх
СообщениеДобавлено: 2019-июн-13 10:13 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
что я испортил в оригинале:
1. Из демо директория позаимствовал какой-то FreeRTOSConfig.h
смотрите настройки. Отключил софт таймеры т.к. пока с ними какой-то глюк.
2. В качестве подражания взял файлы портирования на RISC-V.
Недавно читал про этот процессор и было понятнее.
файлы port.c и portmacro.h как раз от RISC-5, но с соответствующими модификациями.
3. из множества вариантов HEAP взял самый первый heap_1.c
Там куча создается простым обьявлением массива. Я немного подправил
// static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
static uint8_t *ucHeap = (uint8_t *) 0x140000;
У меня куча всегда будет в банке памяти 0x140000
4. Процессор стартует с cpu_init.asm
Там я задаю начальные настройки и определяю где у меня будет начальный стек программы.
Потом иду в my_main.
5. Важные процедуры обработки тиков от таймера и софт прерываний смотрите в
файле free_lib.asm
6. В файле xmain.c мои две задачи - одна моргает одним светодиодом, а вторая вторым.

Чтобы запустить все это нужна плата ВН44 (ВН34).
Можно и на симуляторе или ВН28, но тогда светодиоды и задержки нужно сделать другим способом.


Последний раз редактировалось BY_man 2019-июн-13 10:23, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRTOS на 1967ВНхх
СообщениеДобавлено: 2019-июн-13 10:14 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
Если меняете в конфиге настройки, то делайте перед компиляцией CLEAN проекта.
А то у меня были какие-то глюки с компилятором и после смены конфигурации
не все файлы перекомпиливались. Компилил без включения оптимизации.


Последний раз редактировалось BY_man 2019-июн-13 10:24, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRTOS на 1967ВНхх
СообщениеДобавлено: 2019-июн-13 10:16 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
Процессор тяжелый и фрейм задачи довольно обьемный - 256 слов на всё состояние.
Поэтому при выборе размера стека нужно это учитывать.
Если будут вопросы - пишите здесь.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRTOS на 1967ВНхх
СообщениеДобавлено: 2019-июн-13 10:29 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
Порядок сохранения-восстановления регистров контекста влияет на функцию (файл port.c)

StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
{
/* Simulate the stack frame as it would be created by a context switch
interrupt. */
pxTopOfStack-=320; // frame size is 256 words
pxTopOfStack[249] = (portSTACK_TYPE)pxCode; /* Start address reti */
pxTopOfStack[0] = (portSTACK_TYPE) pvParameters; /* Register j4 */
pxTopOfStack[54] = (portSTACK_TYPE) pxTopOfStack + 256; // k26 = j27
pxTopOfStack[252] = (portSTACK_TYPE)prvTaskExitError; /* Register cjmp - return address */
return pxTopOfStack;
}
При создании задачи в этой функции создается начальный контекст задачи.
Я немного больше зарезервировал места на стеке (320 , а не 256) т.к.
если сделать 256 , то стек немного наезжает на параметры которые расположены над ним.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRTOS на 1967ВНхх
СообщениеДобавлено: 2019-июн-13 10:46 
Не в сети

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
Спасибо!Буду тестить!
А есть гарантия, что функция не перекинет дальше (320-256) слов?!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRTOS на 1967ВНхх
СообщениеДобавлено: 2019-июн-13 11:21 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1325
Откуда: Тула
BY_man писал(а):
что я испортил в оригинале:....

Вы бы там .git папочку оставили, было бы наглядно ;)

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRTOS на 1967ВНхх
СообщениеДобавлено: 2019-июн-13 11:29 
Не в сети

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
Много ассемблера! Заметил, что используются разные версии исходников freertos (8.2.3 , 10.2.1).
Вопросы/замечания:
- в какой среде проходит сборка? (Отсутствуют файлы проекта)
- не корректна маска в portDisable_interrupts (sqctl_gie - это второй бит)!
-разве portBYTE_ALIGMENT не должен быть кратен квадрослову?!


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 132 ]  На страницу 1, 2, 3, 4, 5 ... 9  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB