Миландр

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

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 132 сообщения ]  На страницу « 15 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
Сообщения: 1390
Откуда: Тула
BY_man писал(а):
исправьте в файле port.c неточность
...
Лишняя ; разделяет одну линию команд на две.
Гитхаб, гитлаб, битбакет говорят хорош и т.д. ;)
Я не за гит или какие-то сайты и сервисы, я только за Ваше удобство и время.
Инфы по любым проблемам очень много. Можно гуглить прямо текст проблемы)) Советую консоль, но и интерфейсы, наверное есть хорошие, стандартный - не очень, имхо.
Спасибо.

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


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

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


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


Последний раз редактировалось 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 КБ]
44 скачивания
Вынести предупреждение
Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 132 сообщения ]  На страницу « 15 6 7 8 9

Часовой пояс: UTC+03:00


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

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


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

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB