реклама на сайте
подробности

 
 
17 страниц V  « < 15 16 17  
Reply to this topicStart new topic
> Выпущена scmRTOS 4.0., Ура, товарищи! :)
_Артём_
сообщение May 8 2012, 22:23
Сообщение #241


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(AHTOXA @ May 8 2012, 23:30) *
SystemTimer тоже можно на низший. И другие малоприоритетные. Смысл в том, чтобы ContextSwitcher не прерывал какое-либо другое прерывание.

Понял, спасибо.
Получается есть всё-таки несколько вариантов: загнать все ОСевые прерывания на один уровень (как сейчас по сути в тех же АВР), использовать для ОСи два или три уровня с ContextSwitcher настроенным на низший уровень.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 11 2012, 15:54
Сообщение #242


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Глянул в репозитории в папку /trunk/Ports/AVR/IAR, увидел
Код
#if scmRTOS_USER_DEFINED_CRITSECT_ENABLE == 0

Какой в этом смысл на АВР? У него же Interrupt conrtoller не nested.
И как тогда может выглядеть TCritSect при scmRTOS_USER_DEFINED_CRITSECT_ENABLE=1?
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 13 2012, 10:11
Сообщение #243


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



«пусть и безобразно, зато единообразно»
Оно-то (пользовательские крит. секции) проходит транзитом от scmRTOS_TARGET_CFG.h к OS_Target.h и не используется в потрохах собсвтенно ОС (кроме проверки и значения по умолчанию в scmRTOS_defs.h), но всё равно проще иметь это однотипным во всех портах.

(там где-то на горизонте болтается xmega, у нее три уровня приоритетов, брать за основу этот порт тоже будет проще, когда все заготовки на месте)


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 13 2012, 12:49
Сообщение #244


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(ReAl @ May 13 2012, 13:11) *
«пусть и безобразно, зато единообразно»
Оно-то (пользовательские крит. секции) проходит транзитом от scmRTOS_TARGET_CFG.h к OS_Target.h и не используется в потрохах собсвтенно ОС (кроме проверки и значения по умолчанию в scmRTOS_defs.h), но всё равно проще иметь это однотипным во всех портах.

Для MegaAVR ещё добавить надо что-то такое в OS_Target_asm.s90:
Код
ContextSwitcher_ISR, Например так:
     save_SREG
     save_SP
#if scmRTOS_USER_DEFINED_CRITSECT_ENABLE == 1
     sei
#endif


Будет ли после такого изменения работать - вопрос. И при каких условиях, если будет.

Цитата(ReAl @ May 13 2012, 13:11) *
(там где-то на горизонте болтается xmega, у нее три уровня приоритетов, брать за основу этот порт тоже будет проще, когда все заготовки на месте)

Да у хмеги отличий не много видимо.
Прикидывал как может быть сделано на xmega:

Код
В scmRTOS_CONFIG.h задал макрос scmRTOS_OS_INTERRUPT_MAX_PRIORITY
// 0 - Ос используют все уровни
// 1 - средний и низший
// 2 - низший
#define scmRTOS_OS_INTERRUPT_MAX_PRIORITY 1


В OS_Target_asm.s90:
Код
#if (scmRTOS_OS_INTERRUPT_MAX_PRIORITY == 0)
#define scmRTOS_OS_INT_STATUS_MASK ~((PMIC_HILVLEN_bm)|(PMIC_MEDLVLEN_bm)|(PMIC_LOLVLEN_bm))

#elif (scmRTOS_OS_INTERRUPT_MAX_PRIORITY == 1)
#define scmRTOS_OS_INT_STATUS_MASK ~((PMIC_MEDLVLEN_bm)|(PMIC_LOLVLEN_bm))

#elif (scmRTOS_OS_INTERRUPT_MAX_PRIORITY == 2)
#define scmRTOS_OS_INT_STATUS_MASK ~(PMIC_LOLVLEN_bm)

#else
#error "OS interrupt level not defined."
#endif

class TCritSect
{
public:
    TCritSect () {
        StatusReg=PMIC.CTRL;
        PMIC.CTRL&=scmRTOS_OS_INT_STATUS_MASK;
    }


    ~TCritSect() {
        PMIC.CTRL=StatusReg;
    }

private:
    uint8_t StatusReg;

};

Но так наверное однобразия не выйдет.
Go to the top of the page
 
+Quote Post
Aprox
сообщение May 23 2012, 06:14
Сообщение #245


Местный
***

Группа: Участник
Сообщений: 374
Регистрация: 7-11-07
Из: Moscow
Пользователь №: 32 131



Не желаете продолжить абортированную дискуссию? Меня по-прежнему очень интересует вопрос - как практически написать на С++ так, чтобы один из методов статического класса вызывался по прерыванию, и адрес точки входа в эту ISR был бы помещен компилятором+линкером в .intvect ? Если нетрудно, то конкретный листинг для STM32 Cortex.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 23 2012, 06:41
Сообщение #246


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Aprox
Создайте отдельную тему в разделе "Программирование" и там обсуждайте сколько влезет.
Встревать в чужую тему не этично.
Проявитесь подобным образом ещё раз - получите отпуск на месяц.
Модератор.
Go to the top of the page
 
+Quote Post
brag
сообщение Jul 19 2012, 11:53
Сообщение #247


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046



Возможность запуска задач с одинаковым приоритетом имеет смысл. На пример нужно принимать данные допустим с 4х портов, делать сложную тяжелую обработку для каждого канала и выводить результат на дисплей. На пример:
Есть 4 порта uart. Над каждым больпим блоком данных по каждому порту надо выполнять FFT и выводить на дисплей результат по каждому каналу отдельно. Все каналы асинхронные по отношению друг к другу.
Задача легко решается созданием 4х процессов с одинаковым приоритетом для каждого порта, которые принимают данные,обрабатывают и передают 5-му процессу, который это дело оформляет в виде картинки.
Если будут разные приоритеты - обрабатываться будет самый приоритетный канал при большой его загрузке, а остальные будут спать и рано или поздно их очереди переполнятся.
Тут какраз карусель хорошо идет либо возможность вытеснения друг другом процессов с одинаковым приоритетом.

Сама реализация очереди на базе двусвязных списков и карусели всего на несколько инструкций сложнее реализации на bitmap (при наличии инструкции а-ля clz, конечно), тут проблем нету.
Проблема в поиске самого приоритетного процесса в очереди мютекса и др. синхр.примитив. Иначе просыпаться будет не самый приоритетный процесс, а тот, который первый в очереди. Мне пока известно 3 реализации - либо просмотр всего списка(как в TNKernel), либо очередь в виде бинарного дерева - оба варианта тормознутые, каждый в своем случаи. Либо держать массив голов списков - очень быстро, зато каждый обьект ядра будет весить минимум по 33 слова для 32х уровней приоритета.
Go to the top of the page
 
+Quote Post
dxp
сообщение Jul 19 2012, 13:13
Сообщение #248


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



По результатам прошедшей дискуссии ситуация была обдумана - по всей видимости возможно реализовать карусель между процессами в виде расширения (т.е. без модификации сорцов оси). К сожалению, текущая загрузка основной работой не позволяет плотно заняться этой темой.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
basil__
сообщение Sep 10 2012, 09:34
Сообщение #249





Группа: Новичок
Сообщений: 3
Регистрация: 10-09-12
Пользователь №: 73 473



Окажите пожалуйста любезность, Вы не могли бы привести примеры применения функций terminate() и start() , а то в мануале самый минимум миниморум) - буквально пара слов. И мне как начинающему поклоннику scm )) не очень понятно как их применять. Спасибо.
Go to the top of the page
 
+Quote Post
MBR
сообщение Sep 11 2012, 14:34
Сообщение #250


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748



Цитата(brag @ Jul 19 2012, 15:53) *
Сама реализация очереди на базе двусвязных списков и карусели всего на несколько инструкций сложнее реализации на bitmap (при наличии инструкции а-ля clz, конечно), тут проблем нету.
Проблема в поиске самого приоритетного процесса в очереди мютекса и др. синхр.примитив. Иначе просыпаться будет не самый приоритетный процесс, а тот, который первый в очереди. Мне пока известно 3 реализации - либо просмотр всего списка(как в TNKernel), либо очередь в виде бинарного дерева - оба варианта тормознутые, каждый в своем случаи. Либо держать массив голов списков - очень быстро, зато каждый обьект ядра будет весить минимум по 33 слова для 32х уровней приоритета.

На правах оффтопа к оффтопу, отпишу как я реализовал диспетчер в mkernel. У меня есть упорядоченный вектор с уникальными приоритетами. Каждый элемент вектора - это приоритет элемента и указатель на список активных процессов с этим приоритетом. Поиск - простой бинарный. Да, на вставление и удаление уникального элемента (сдвиг вектора) нужно время, но время это не столь критично. Зато нет никаких программных ограничений.

Сейчас переделываю диспетчер с вектора на красно-черные деревья. К концу октября должен управиться.

Естественно, речь о списке активных задач, а не ожидающих. Активных задач при грамотном проектировании крайне мало. К тому же, система у меня без тиков, поэтому не нужно дергать супервизора 100 раз в секунду (а в это время можно спать и экономить батарейку sm.gif ). Ну и вдобавок, отзывчивость на тайм-ауты от 1 микросекунды, а не 1 тик.

Поэтому, небольшая дополнительная нагрузка на диспетчер с большим перевесом компенсируется архитектурой ОС и гибкостью возможностей.
Go to the top of the page
 
+Quote Post
dxp
сообщение Sep 12 2012, 09:12
Сообщение #251


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (basil__ @ Sep 10 2012, 16:34) *
Окажите пожалуйста любезность, Вы не могли бы привести примеры применения функций terminate() и start() , а то в мануале самый минимум миниморум) - буквально пара слов.

А что не понятно? С чем возникли трудности? С запуском <process_name>.terminate() или с <process_name>.start()?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
basil__
сообщение Sep 13 2012, 17:30
Сообщение #252





Группа: Новичок
Сообщений: 3
Регистрация: 10-09-12
Пользователь №: 73 473



Цитата(dxp @ Sep 12 2012, 13:12) *
А что не понятно? С чем возникли трудности? С запуском <process_name>.terminate() или с <process_name>.start()?

К сожалению при попытке вставить запись типа OS::process::terminate(); в функцию процесса вылазит ошибка типа - error: cannot call member function 'void OS::process<pr, stack_size>::terminate() [with OS::TPriority pr = (OS::TPriority)0u, unsigned int stack_size = 80u]' without object , к сожалению любого рода манипуляции с видом записи ни к какому результату не приводят (уже просто дошел до банального перебора всего что может быть и чего не может -( ) сообщения об ошибке только разные crying.gif Может быть к этому какое-либо отношение имеет то что четверка под авр студией вообще собирается с варнингами типа - \scmRTOS\Common/OS_Services.h:261:18: warning: ignoring packed attribute because of unpacked non-POD field 'OS::TMutex& OS::TMutexLocker::Mutex' avr-g++ -mmcu=atmega8 -Wl,-Map=scm_event__4.map scm_event__4.o OS_Target_asm.o OS_Target_cpp.o OS_Kernel.o OS_Services.o usrlib.o -o scm_event__4.elf - имеются в виду проекты с пустыми процессами и с отключенными тиками и хуками, хотя вообще-то тестовые проекты со всеми средствами межпроцессного взаимодействия в том числе с мьютексами работали нормально. Со второй функцией, в принципе я понял что ее надо пихать в idle_process_user_hook(), результат к сожалению аналогичный.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 13 2012, 17:51
Сообщение #253


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(basil__ @ Sep 13 2012, 20:30) *
К сожалению при попытке вставить запись типа OS::process::terminate();


А так :
Код
Proc1.terminate();

не пробовали?
Так правильно кстати?
У вас scmRTOS_PROCESS_RESTART_ENABLE чему равен?
Go to the top of the page
 
+Quote Post
basil__
сообщение Sep 14 2012, 10:00
Сообщение #254





Группа: Новичок
Сообщений: 3
Регистрация: 10-09-12
Пользователь №: 73 473



Цитата(_Артём_ @ Sep 13 2012, 21:51) *
А так :
Код
Proc1.terminate();

не пробовали?
Так правильно кстати?
У вас scmRTOS_PROCESS_RESTART_ENABLE чему равен?

Ффуу огромное спасибо, так все получилось!!!! В силу начальности своих знаний в плюсах никак не решался отступить от манула ))))) вернее не понял видимо ту запись которая там приведена))), ну никак не мог допереть, что имя процесса это имя объекта , а не типа ))), стыдоба ))), огромное спасибо за Ваше терпение и доброжелательность.
Go to the top of the page
 
+Quote Post

17 страниц V  « < 15 16 17
Reply to this topicStart new topic
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 04:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01511 секунд с 7
ELECTRONIX ©2004-2016