Миландр

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

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




Начать новую тему  Ответить на тему  [ 132 сообщения ]  На страницу « 13 4 5 6 79 »
Автор Сообщение
 Заголовок сообщения: Re: FreeRTOS на 1967ВНхх
СообщениеДобавлено: 2019-июн-17 17:45 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Организация: Миландр
Откуда: Миландр
Yujin писал(а):
Автор, очень много ассемблера и магических цифр!
Может "j27 = 0x4fff0;; // setup SP value" задать с помощью секции в среде с указанием размера?
Напрасно отрезаете пути отступления - может пока поддерживать условной компиляцией оба варианта(один или два стека)?
На самом деле ассемблера очень мало. Только один файл free_lib.asm и самая крутая в нем функция это сохранение контекста :)
Файл cpu_init может отсутствовать и тогда компилятор с линковщиком сами определят где стек. Это для ленивых.
Для продвинутых юзеров можно предложить в cpu_init запись
j27 = ldf_jstack_base- 8;;
вершина стека ldf_jstack_base определяется в LDF файле.
Ну а для чайников просто j27 = 0x4fff0;; :)


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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Организация: Миландр
Откуда: Миландр
Yujin писал(а):
Считаю использование MPU полезной фичей! Я так понимаю, что сейчас минимальный стек и так равен 1000U слов и приведение его к 1024 роли не с играет. Предлагаю BY_man начать с защиты стека задач(tcb), как с обязательной программы, а дальше уже по обстоятельствам(по примеру) можно и расширить.
Почитал немного про MPU в документации. Там немного не то. MPU предполагает использование USER режима и ограничения доступа.
В этом процессоре USER режим очень ограничен. Простые действия , типа установки флага, невозможны в USER режиме.
Придется писать драйвер и вызывать ОС чтобы установила флаг :)
Пока можно защитить область кода от модификации, сделать области данных запрещенными для исполнения кода.
Это очень просто.
Сложнее сделать защиту стека задачи. В ОС можно программно контролировать выход за границы стека задачи.
Начало и конец стека помечается спец символами , они проверяются. Если выход за пределы - символ типа портится.
Выход за пределы стека можно контролировать в MPU, задав две области недоступные по записи - выше и ниже стека.
Но нужно ли это - непонятно. К тому же придется переписать malloc. Размеры стека делать кратными 1К.
Сейчас размер стека определяется как 256+8 + сколько нужно задаче.


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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Организация: Миландр
Откуда: Миландр
Yujin писал(а):
1.Маска двойная (H и L) можно присмотреть в Hal!
2.Прерывания запрещены пока стоит sqstat [20], он сбрасывается при reti или j0=retib - может этим обыграть?
Пункт 1. не понял.
2. У запрета прерываний много слоев :) sqstat [21] самый крутой. Это когда софт исключение.
Далее sqstat [20] это когда мы в обработчике. Только после этого играет роль бит GIE в SQCTL.
Далее бит в IMASK.
Бит sqstat [20] сбрасывается при RTI, при RDS и при j0=retib.
Всё это может разрешать прерывание. raise_soft_interrupt(); означает смену задачи и по идее
перед её вызовом лучше в IMASKL убрать разрешение тика. Оставив все другие прерывания.
Но посмотрим далее как все будет работать.


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

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
Организация: частное лицо
BY_man писал(а):
Yujin писал(а):
Автор, очень много ассемблера и магических цифр!
Может "j27 = 0x4fff0;; // setup SP value" задать с помощью секции в среде с указанием размера?
Напрасно отрезаете пути отступления - может пока поддерживать условной компиляцией оба варианта(один или два стека)?
На самом деле ассемблера очень мало. Только один файл free_lib.asm и самая крутая в нем функция это сохранение контекста :)
Файл cpu_init может отсутствовать и тогда компилятор с линковщиком сами определят где стек. Это для ленивых.
Для продвинутых юзеров можно предложить в cpu_init запись
j27 = ldf_jstack_base- 8;;
вершина стека ldf_jstack_base определяется в LDF файле.
Ну а для чайников просто j27 = 0x4fff0;; :)
Мы все же не студенческую лабораторную делаем!


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

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
Организация: частное лицо
BY_man писал(а):
Yujin писал(а):
1.Маска двойная (H и L) можно присмотреть в Hal!
2.Прерывания запрещены пока стоит sqstat [20], он сбрасывается при reti или j0=retib - может этим обыграть?
Пункт 1. не понял.
Я считал, что данная функция должна "работать" со всей маской аппаратных прерываний, а она 64-разрядная! Или я не понял для чего тогда используется vPortSetInterruptMask?


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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Организация: Миландр
Откуда: Миландр
Yujin писал(а):
Я считал, что данная функция должна "работать" со всей маской аппаратных прерываний, а она 64-разрядная! Или я не понял для чего тогда используется vPortSetInterruptMask?
Вы считаете абсолютно верно. Просто вопрос был немного о другом.
Ваше замечание по поводу 64 поставило меня в тупик.
Тут засада в том, что в этой freeRTOS написано typedef unsigned long UBaseType_t;
Итого, базовый тип 32-разрядный. Нужно править исходники ОС чтобы влезть с этими 64-разрядными масками прерываний :)
Буду смотреть как выкрутиться из этой ситуации.


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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Организация: Миландр
Откуда: Миландр
Yujin писал(а):
Мы все же не студенческую лабораторную делаем!
Если делать не лабораторную, то выкладывать нужно только 3 файла
portmacro.h
port.c
free_lib.asm
Всё остальное в выложенном архиве абсолютно ненужно :)


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

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
Организация: частное лицо
BY_man писал(а):
Yujin писал(а):
Мы все же не студенческую лабораторную делаем!
Если делать не лабораторную, то выкладывать нужно только 3 файла
portmacro.h
port.c
free_lib.asm
Всё остальное в выложенном архиве абсолютно ненужно :)
Собственно имено 2 файла (.h и .c) я у Вас и позаимствовал.Остальное -архив FreeRtos + штатный проект для cm-lynx с встроенным startup.asm.


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

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
Организация: частное лицо
BY_man писал(а):
Yujin писал(а):
Я считал, что данная функция должна "работать" со всей маской аппаратных прерываний, а она 64-разрядная! Или я не понял для чего тогда используется vPortSetInterruptMask?
Вы считаете абсолютно верно. Просто вопрос был немного о другом.
Ваше замечание по поводу 64 поставило меня в тупик.
Тут засада в том, что в этой freeRTOS написано typedef unsigned long UBaseType_t;
Итого, базовый тип 32-разрядный. Нужно править исходники ОС чтобы влезть с этими 64-разрядными масками прерываний :)
Буду смотреть как выкрутиться из этой ситуации.
Надо отталкиваться от того, а каком качестве она используется! За макросом можно запретить прерывание и сохранить 64_t по адресу, адрес-> usSavedInterruptStatus, в clear делать обратное


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

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
Организация: частное лицо
BY_man писал(а):
Спасибо, еще один мой косяк обнаружился :)
ячейки: 43(213),44(212),47(209) и 48(208) здесь я дал маху - обнулил , забыв, что еще не сохранил.
Портятся THR1:0. Сегодня подправлю и выложу новую версию. Добавлю раздельные стеки.
Не могли бы Вы выложить фрагмент исправлений процедуры сохранения контекста для первого варианта (один стек)?


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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Организация: Миландр
Откуда: Миландр
Yujin писал(а):
BY_man писал(а):
Yujin писал(а):
Мы все же не студенческую лабораторную делаем!
Если делать не лабораторную, то выкладывать нужно только 3 файла
portmacro.h
port.c
free_lib.asm
Всё остальное в выложенном архиве абсолютно ненужно :)
Собственно имено 2 файла (.h и .c) я у Вас и позаимствовал.Остальное -архив FreeRtos + штатный проект для cm-lynx с встроенным startup.asm.
т.е. Вам даже ассемблерный файл оказался не нужен. Круто .


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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Организация: Миландр
Откуда: Миландр
Yujin писал(а):
BY_man писал(а):
Спасибо, еще один мой косяк обнаружился :)
ячейки: 43(213),44(212),47(209) и 48(208) здесь я дал маху - обнулил , забыв, что еще не сохранил.
Портятся THR1:0. Сегодня подправлю и выложу новую версию. Добавлю раздельные стеки.
Не могли бы Вы выложить фрагмент исправлений процедуры сохранения контекста для первого варианта (один стек)?
нет.


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

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Организация: Миландр
Откуда: Миландр
Yujin писал(а):
BY_man писал(а):
Yujin писал(а):
Я считал, что данная функция должна "работать" со всей маской аппаратных прерываний, а она 64-разрядная! Или я не понял для чего тогда используется vPortSetInterruptMask?
Вы считаете абсолютно верно. Просто вопрос был немного о другом.
Ваше замечание по поводу 64 поставило меня в тупик.
Тут засада в том, что в этой freeRTOS написано typedef unsigned long UBaseType_t;
Итого, базовый тип 32-разрядный. Нужно править исходники ОС чтобы влезть с этими 64-разрядными масками прерываний :)
Буду смотреть как выкрутиться из этой ситуации.
Надо отталкиваться от того, а каком качестве она используется! За макросом можно запретить прерывание и сохранить 64_t по адресу, адрес-> usSavedInterruptStatus, в clear делать обратное
Да. Нужно изучать первопричину, а не следствие :)
Эти две функции используются при реализации критических секций в случае вызова API функций ОС из ISR.
При входе берется маска прерываний , а новая маска что-то блокирует.
При выходе восстанавливается старая маска.
Если в ISR не разрешать вложенные прерывания, то эти две функции ничего не значат.
Если разрешать, то нужно как-то этим хозяйством управлять.


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

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
Организация: частное лицо
В общем сколько я не мучился, мне так и не удалось победить двойной стек(1967вн044):
Если прерывание случается перед операцией ветвления(comp (j1,1)U;; <прерывание >if JEQ, JUMP <>)в задаче, то после восстановления контекста проверка не проходит! Причем с одним стеком таких проблем нет! Видимо при переключении стеков каким-то образом портятся признаки!


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

Зарегистрирован: 2019-июн-07 14:33
Сообщения: 50
Организация: частное лицо
Yujin писал(а):
В общем сколько я не мучился, мне так и не удалось победить двойной стек(1967вн044):
Если прерывание случается перед операцией ветвления(comp (j1,1)U;; <прерывание >if JEQ, JUMP <>)в задаче, то после восстановления контекста проверка не проходит! Причем с одним стеком таких проблем нет! Видимо при переключении стеков каким-то образом портятся признаки!
Кажется разобрался-была пропущена опция (nf) перед сдвигом указателя стека (j27)


Вынести предупреждение
Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 132 сообщения ]  На страницу « 13 4 5 6 79 »

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


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

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


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

Перейти: 

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