Миландр

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

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




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

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
Вопросы множатся:
- для чего делается prepare SP for...j27 -8?
- для чего first time: j29=2;;[j28]=j29?
- насколько оптимальна процедуры восстановления/сохранения контекста?
- в обоих функциях(обработчиках) работа с контекстом одинаковая?! Может тогда их вынести в define portSave_context и portRestore_context?


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

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
-зачем при первом raise_soft_interrupt (g_startscheduler=1) сохраняется контекст?в risc-v стоит проверка


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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
Yujin писал(а):
Спасибо!Буду тестить!
А есть гарантия, что функция не перекинет дальше (320-256) слов?!

Если в программе будет баг и указатель стека попрет вверх, то он затрет всё.
В эту ОС можно добавить защиту от гуляния стека за выделенные пределы.
В процессоре есть такая возможность и в ОС тоже есть функция MPU.


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

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

Обычно те, кто не любит ассемблер используют ассемблерные вставки :D
Сохранить и восстановить контекст без ассемблера никак.
Можно конечно обьявить функцию с атрибутом interrupt.
Но там будет такое сохранение, что на это уйдет все процессорное время :)
Всё компилилось и запускалось в CM-LYNX LLVM компилятор , версия 1.06.04

За бит спасибо :) Исправил.

Про portBYTE_ALIGMEN нужно смотреть. Я боялся чтобы указатель стека не был случайно не
кратен квадрослову. Вроде все это соблюдается. Параметр portBYTE_ALIGMEN может быть
требует чтобы байты выравнивались на границе слова.
С процессором есть один момент. Всё это компилилось в режиме когда CHAR равен 32 бита,
т.е. в режиме CHAR32. Просто этот режим вроде как-бы без косяков.
Есть режим компиляции CHAR8 где байты как байты. Но в этом режиме нет уверенности в компиляторе
при использовании оптимизации.


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

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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
Yujin писал(а):
Вопросы множатся:
- для чего делается prepare SP for...j27 -8?
- для чего first time: j29=2;;[j28]=j29?
- насколько оптимальна процедуры восстановления/сохранения контекста?
- в обоих функциях(обработчиках) работа с контекстом одинаковая?! Может тогда их вынести в define portSave_context и portRestore_context?


1. Компилятор всегда держит резервные 8 слов на вершине для каких-то своих утех.
Вот и я предохранился :)

2. У RISC-5 эта функция начинается так
void Software_IRQHandler(void)
{
if(1 == g_startscheduler)
{
g_startscheduler = 2; //skip the save n switch context first time when scheduler is starting.
}
else
{
/*Save Context*/
{
__asm volatile("lw t0, pxCurrentTCB");
__asm volatile("sw a2, 0x0(t0)");
}

vTaskSwitchContext();
}
Вот и я реализовал всё аналогично. Первый старт не сохраняет ничего, но
при выходе запускает новую задачу.

3. Процедура написана так, что лучше и не напишешь. Можете попробовать.
Но есть момент в том, что эту процедуру можно обрезать.
Например, если вы в своих приложениях никогда не используете функции коммуникационного модуля
CLU, то нет смысла гонять туда-обратно (32+5)*2=74 регистра. Соответственно и размер кадра
уменьшите и тактов 20 сэкономите. Можно еще что-то посмотреть.

4. оформление это уже на усмотрение хозяина.
Эта начальная болванка и я просто хотел помочь вам не лезть в дебри ассемблера и процессора.
Сейчас вы можете сосредоточиться реально на реализации функций ОС.


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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
Yujin писал(а):
-зачем при первом raise_soft_interrupt (g_startscheduler=1) сохраняется контекст?в risc-v стоит проверка

Да, можно было и не сохранять, но это ничего не даст т.к. не делать это придется только один раз.
При всех других входах в эту функцию контекст придется сохранять.
Я так понимаю, что эта функция будет вызываться тогда, когда какая-то задача захочет немедленно передать управление в ОС.


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

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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
Yujin писал(а):
Заметил, что используются разные версии исходников freertos (8.2.3 , 10.2.1). !

Здесь я не в курсе. Я зашел на сайт, кликнул Загрузить и всё.
Что загрузилось, то и запустил :)


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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
В файле free_lib.asm в функции __ASM_FUN(raise_soft_interrupt):
удалите строчку
inf_loop: jump inf_loop(np);;
Я проделывал эксперимент и забыл почистить.
При первом входе в эту функцию, при активизации Kernel прерывания,
не должно быть возврата в точку cjmp(abs) (np);;

Но не знаю какое должно быть поведение при другом использовании raise_soft_interrupt.
Там еще может быть непонятно зачем
IVKernel = j0; irqlock;; // hold int
nop;; nop;; nop;; nop;; nop;; nop;; // delay for INTC
nop;; nop;; nop;; nop;; nop;; nop;;
irqelock;; // unhold
Здесь может я и перестарался. Обычно при генерации Kernel прерывания есть желание
чтобы ничего после момента генерации прерывания не выполнялось.
Но пока вектор доползет до контроллера прерывания и пока этот контроллер обработает его и сделает
запрос процессору, процессор уже может перемолоть кучу команд.
Поэтому одновременно с отсылкой вектора прерывания , делаю блокировку прерываний,
далее делаю задержку (может и с запасом) в течении которой контроллер прерываний подготовит запрос
к процессору. После этого разблокирую прерывания.
Но может все это и не нужно.
Я попробовал вариант
IVKernel = j0;;
cjmp(abs) (np);;
и это тоже работает :)


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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
Ещё один баг нашел. В ассемблерной библиотеке в функции __ASM_FUN(Software_IRQHandler):
Должно быть
// check first time or not
j0 = __ASM_FUN(g_startscheduler);;
j1 = [j0+0];;
comp(j1,1);;
if jeq, jump first_time (np);;

Следующее место
first_time: j1 = 2;;
[j0+0] = j1;;

Иначе работало всё корректно только первый раз.
Сейчас можно в конфигурации FreeRTOSConfig.h включить софт таймеры
#define configUSE_TIMERS 1
Ещё я исправил
#define configTIMER_TASK_STACK_DEPTH ( 512 )


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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
файл hal_RTC_s.asm к ОС не имеет отношения.
Это моя ассемблерная реализация HAL функций модуля RTC.
Я использовал этот модуль для реализации задержек в проекте под МАКС ОС ,
а сейчас приспособил и для этого проекта.
Также не обращайте внимание на различные варианты ассемблерных функций задержек.


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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
Попробовал скомпилить проект с оптимизацией О2.
работает.


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

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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
В ассемблерном файле есть две функции
.global __ASM_FUN(vApplicationTickHook);
__ASM_FUN(vApplicationTickHook): nop;;nop;;nop;;
cjmp(abs) (np);;

.global __ASM_FUN(vApplicationIdleHook);
__ASM_FUN(vApplicationIdleHook): idle;;
nop;;nop;;nop;;
cjmp(abs) (np);;

Сейчас почитал :) в одном примере, что эти функции вызываются ОС
каждый раз когда тик (vApplicationTickHook) и каждый раз когда ОС в IDLE (vApplicationIdleHook).
При этом в конфиге эти штуки должны быть разрешены
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 1

Так что в функции vApplicationIdleHook команда idle;; явно лишняя :).
Если эти функции нужны, то их можно перенести в Си -код.


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

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1323
Откуда: Тула
Открыть сравнение FreeRTOS с ОС МАКС
BY_man писал(а):
Попробовал скомпилить проект с оптимизацией О2.
Размер кода уменьшился до 10000 слов. Это более чем в 2 раза меньше чем у МАКС ОС.
При том что в максе практически голое ядро.
Также интересна реакция на прерывание. При задании периода тика можно уменьшать период до
предельного значения, при котором светодиоды еще моргают.
В МАКС ОС пределом было значение 400 , т.е. 800 процессорных тактов.
Если меньше период - ничего не работает.
На данном примере работать перестало когда период таймера стал меньше 100.
т.е. при 200 тактах ядра светодиоды еще моргают.
Полное сохранение-восстановление контекста требует чуть более 100 тактов.
Закрыть

из забавного: https://habr.com/ru/post/267573/
Пролистайте (поиском по "FreeRTOS") до раздела "Почему бы просто не использовать FreeRTOS?".

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


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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
Спасибо, Roman, очень полезно для расширения моего кругозора.
Получается , что я нарушил лицензионное соглашение. :D
Каюсь - сравнил неподумавши.


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

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
Каждый для себя может сделать сравнения и выбрать по своему критерию! Главное чтобы было из чего выбирать!
Я пока так и не смог запустить проект, но вопросы к BY_man пока остались :
- какой статус Вашего порта: планируете ли Вы его поддерживать(выкладывать в githab) от лица Миландр? Или это Ваша личная инициатива(это не отменяет вопрос о githab)?!
- В статье от prostoRoman и в комментарии от тех. поддержки(Миландр) указан вариант, когда в прерываниях используется свой стек! В текущей реализации, если я правильно понял единый режим стека для супервизора! Ваше видение, какой вариант технически выгоднее?
- в описании компилятора указывается, что все прерывания должны вызывать сохранение\восстановление контекста! Т.е. макросы сохранения и восстановления нужно выносить на уровень пользователя?!
- Поддерживает ли текущий порт вложенные прерывания?!
- Возвращаясь к первому вопросы: Вы сегодня уже что-то правили, можете выложить новую версию?!


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

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


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

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


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

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