Миландр

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

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




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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
Yujin писал(а):
С char8 разобрались. А почему для char32 надо #define tskSTACK_FILL_BYTE ( 0xa5a5a5a5U )?! В чем тут особенность компилятора?Может есть какой определяемый макрос?
У исходного кода этой ОС такой вид как будто бы он написан по всем стандартам Си для любой машины.
На самом деле ничего подобного. Возьмем этот случай с 0хA5. ОС вызывает функцию memset и забивает все байты памяти
значением 0хА5. Но memset смотрит чему в процессоре сейчас равны байты (а они равны 32 битам) и пишет в эти "байты"
заданную константу. А потом ОС проверяет выход за пределы стека сравнивая уже не байтовые , а словные значения с 0хA5A5A5A5.
т.е. в коде предполагается что байты будут 8-разрядными. Тут ОС и пролетает :)
Если где-нибудь в коде еще есть такой случай , то проблема обеспечена.
Также в ОС нужно проверить места где есть преобразования указателей в числа и манипуляции с числами, а затем опять присваивание чисел указателям.
Это потенциально опасные места для нашего компилятора при любом режиме CHAR.


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

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

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

Можно предусмотреть подмену вектора прерывания тика.
Если планировщик в uxSchedulerSuspended, то в этом случае можно подменить вектор прерывания и
при тике будет вызываться упрощенная процедуру обработки. Сэкономим (м.б.) электроэнергию.
Как только планировщик выходит из этого состояния, возвращаем нормальный вектор прерывания.
Но это возможно потребует некоторую модификацию исходников RTOS.


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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
Попробовал пример работы с задачами , одна из которых (задача R) после выполнения передает управление
в планировщик
printf("task _R\n");
taskYIELD();
Получается, что планировщик запускает следующую задачу В, но когда приходит тик,
то он берет очередную задачу С.
Итого, если taskYIELD(); попадает незадолго до тика, то следующей задаче практически
нет времени на выполнение.
Помню, что такую ситуацию обсуждали на хабре с МАКС ОС.
Пришли к мнению, что куда лучше "награждать" следующую задачу бонусом от предыдущей.
Как в этой ОС? Может я какую-нибудь опцию забыл? :)


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

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
BY_man писал(а):
Yujin писал(а):
Зачем в char8 (portBYTE_ALIGNMENT_MASK<<30)?!

Вам нужно немного почитать про представление указателей в этом процессоре на различные типы данных.
У этого процессора "не традиционная ориентация" в плане указателей :)
Каждый представляет что такое указатель на char в обычной 32-разрядной машине.
Допустим это число 0х8003.
Тогда указатель на int на эту же ячейку будет 0х8003>>2=0x2000.
А вот указатель на void это циклический сдвиг вправо на два разряда указателя на байт,
т.е. 0хС0002000. Отсюда и маска которая проверяет не только два младших бита , но и два старших.


Компилятор ругается - говорит за 32 разряда выходите! (0xf<<30 = 0x3C0000000)


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

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
BY_man писал(а):
Yujin писал(а):
С char8 разобрались. А почему для char32 надо #define tskSTACK_FILL_BYTE ( 0xa5a5a5a5U )?! В чем тут особенность компилятора?Может есть какой определяемый макрос?
У исходного кода этой ОС такой вид как будто бы он написан по всем стандартам Си для любой машины.
На самом деле ничего подобного. Возьмем этот случай с 0хA5. ОС вызывает функцию memset и забивает все байты памяти
значением 0хА5. Но memset смотрит чему в процессоре сейчас равны байты (а они равны 32 битам) и пишет в эти "байты"
заданную константу. А потом ОС проверяет выход за пределы стека сравнивая уже не байтовые , а словные значения с 0хA5A5A5A5.
т.е. в коде предполагается что байты будут 8-разрядными. Тут ОС и пролетает :)
Если где-нибудь в коде еще есть такой случай , то проблема обеспечена.
Также в ОС нужно проверить места где есть преобразования указателей в числа и манипуляции с числами, а затем опять присваивание чисел указателям.
Это потенциально опасные места для нашего компилятора при любом режиме CHAR.

В таком случае тема с защитой стеков через MPU, становится все актуальнее!


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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
исправьте в файле port.c неточность
void raise_soft_interrupt()
{
uint32_t tl,th;
tl = (uint32_t) Software_IRQHandler;
asm volatile("IVKernel = x%0;; irqlock;;"::"x"(tl)); // restart pipe
Должно быть
void raise_soft_interrupt()
{
uint32_t tl,th;
tl = (uint32_t) Software_IRQHandler;
asm volatile("IVKernel = x%0; irqlock;;"::"x"(tl)); // restart pipe

Лишняя ; разделяет одну линию команд на две.


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

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1310
Откуда: Тула
BY_man писал(а):
исправьте в файле port.c неточность
...
Лишняя ; разделяет одну линию команд на две.

Гитхаб, гитлаб, битбакет говорят хорош и т.д. ;)
Я не за гит или какие-то сайты и сервисы, я только за Ваше удобство и время.
Инфы по любым проблемам очень много. Можно гуглить прямо текст проблемы)) Советую консоль, но и интерфейсы, наверное есть хорошие, стандартный - не очень, имхо.
Спасибо.

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


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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
предпоследняя версия ОС :)


Вложения:
free_RTOS_v5.2.zip [17.8 КБ]
Скачиваний: 7


Последний раз редактировалось BY_man 2019-июл-01 11:54, всего редактировалось 1 раз.
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: FreeRTOS на 1967ВНхх
СообщениеДобавлено: 2019-июн-26 17:18 
Не в сети

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
BY_man писал(а):
предпоследняя версия ОС :)

И даже комментариев "что нового" не будет?!


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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
Из новинок обновленной версии:
1. сохранение контекста тика разбито на два этапа. Сначала сохраняется только та часть
регистров , которая используется компилятором . Далее вызов инкремента тика.
Если нужно переключение контекста - сохранение контекста продолжается.
Если не нужно - быстрый выход на прежнюю задачу.
2. Вместо константы , задающей источники АPI прерываний, используется переменная.
3. Изменены макросы разрешения и запрещения прерываний. Сейчас они запрещают и разрешают не
все прерывания, а только API прерывания. Прерывания, не использующие API OS, всегда разрешены.


Последний раз редактировалось BY_man 2019-июл-01 11:59, всего редактировалось 3 раз(а).

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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
Yujin писал(а):
BY_man писал(а):
предпоследняя версия ОС :)

И даже комментариев "что нового" не будет?!


1. новый файл def_1967.h
#define __CHAR_BIT__ 32
здесь задаете режим представления байт
//#define SIM 1
Если используете симулятор , то убрать коммент
//#define SINGLE_STACK
если хотите одиночный стек , то убрать коммент
2. в этой версии используется "фишка" с регистром IMASK. Поскольку чтение этого регистра из контроллера прерываний
это всегда потеря 10 тактов (а чтение 2-х регистров это уже 20 тактов впустую), то используется следующий прием.
Копия регистра IMASK сидит в переменной cur_imask. Доступ к этой переменной уже можно сделать за 1 такт.
Поэтому изменение IMASK выглядит как изменение cur_imask с отсылкой (записью) нового значения в IMASK.
Запись в IMASK 64-разрядного значения потребует только 2-х тактов.
Изменение IMASK должно быть всегда в безопасном для прерываний месте кода.
3. При работы с прерыванием Kernel используется подмена вектора обработки прерывания.
При первом вызове - вектор 1, при регулярном - вектор 2, при вызове из ISR - вектор 3.
Это упрощает базовый код обработки и делает его более быстрым.
4. перед вызовом kernel блокируются все API прерывания.


Последний раз редактировалось BY_man 2019-июл-01 12:05, всего редактировалось 2 раз(а).

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

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


Вложения:
free_contrext.pdf [487.85 КБ]
Скачиваний: 9
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 132 ]  На страницу Пред.  1 ... 5, 6, 7, 8, 9

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


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

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


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

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