|
|
  |
Выпущена scmRTOS 4.0., Ура, товарищи! :) |
|
|
|
May 11 2012, 15:54
|
Гуру
     
Группа: Свой
Сообщений: 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?
|
|
|
|
|
May 13 2012, 12:49
|
Гуру
     
Группа: Свой
Сообщений: 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;
}; Но так наверное однобразия не выйдет.
|
|
|
|
|
Jul 19 2012, 11:53
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 2-12-06
Из: Kyiv, Ukraine
Пользователь №: 23 046

|
Возможность запуска задач с одинаковым приоритетом имеет смысл. На пример нужно принимать данные допустим с 4х портов, делать сложную тяжелую обработку для каждого канала и выводить результат на дисплей. На пример: Есть 4 порта uart. Над каждым больпим блоком данных по каждому порту надо выполнять FFT и выводить на дисплей результат по каждому каналу отдельно. Все каналы асинхронные по отношению друг к другу. Задача легко решается созданием 4х процессов с одинаковым приоритетом для каждого порта, которые принимают данные,обрабатывают и передают 5-му процессу, который это дело оформляет в виде картинки. Если будут разные приоритеты - обрабатываться будет самый приоритетный канал при большой его загрузке, а остальные будут спать и рано или поздно их очереди переполнятся. Тут какраз карусель хорошо идет либо возможность вытеснения друг другом процессов с одинаковым приоритетом.
Сама реализация очереди на базе двусвязных списков и карусели всего на несколько инструкций сложнее реализации на bitmap (при наличии инструкции а-ля clz, конечно), тут проблем нету. Проблема в поиске самого приоритетного процесса в очереди мютекса и др. синхр.примитив. Иначе просыпаться будет не самый приоритетный процесс, а тот, который первый в очереди. Мне пока известно 3 реализации - либо просмотр всего списка(как в TNKernel), либо очередь в виде бинарного дерева - оба варианта тормознутые, каждый в своем случаи. Либо держать массив голов списков - очень быстро, зато каждый обьект ядра будет весить минимум по 33 слова для 32х уровней приоритета.
|
|
|
|
|
Sep 10 2012, 09:34
|
Группа: Новичок
Сообщений: 3
Регистрация: 10-09-12
Пользователь №: 73 473

|
Окажите пожалуйста любезность, Вы не могли бы привести примеры применения функций terminate() и start() , а то в мануале самый минимум миниморум) - буквально пара слов. И мне как начинающему поклоннику scm )) не очень понятно как их применять. Спасибо.
|
|
|
|
|
Sep 11 2012, 14:34
|
Частый гость
 
Группа: Участник
Сообщений: 107
Регистрация: 26-09-10
Пользователь №: 59 748

|
Цитата(brag @ Jul 19 2012, 15:53)  Сама реализация очереди на базе двусвязных списков и карусели всего на несколько инструкций сложнее реализации на bitmap (при наличии инструкции а-ля clz, конечно), тут проблем нету. Проблема в поиске самого приоритетного процесса в очереди мютекса и др. синхр.примитив. Иначе просыпаться будет не самый приоритетный процесс, а тот, который первый в очереди. Мне пока известно 3 реализации - либо просмотр всего списка(как в TNKernel), либо очередь в виде бинарного дерева - оба варианта тормознутые, каждый в своем случаи. Либо держать массив голов списков - очень быстро, зато каждый обьект ядра будет весить минимум по 33 слова для 32х уровней приоритета. На правах оффтопа к оффтопу, отпишу как я реализовал диспетчер в mkernel. У меня есть упорядоченный вектор с уникальными приоритетами. Каждый элемент вектора - это приоритет элемента и указатель на список активных процессов с этим приоритетом. Поиск - простой бинарный. Да, на вставление и удаление уникального элемента (сдвиг вектора) нужно время, но время это не столь критично. Зато нет никаких программных ограничений. Сейчас переделываю диспетчер с вектора на красно-черные деревья. К концу октября должен управиться. Естественно, речь о списке активных задач, а не ожидающих. Активных задач при грамотном проектировании крайне мало. К тому же, система у меня без тиков, поэтому не нужно дергать супервизора 100 раз в секунду (а в это время можно спать и экономить батарейку  ). Ну и вдобавок, отзывчивость на тайм-ауты от 1 микросекунды, а не 1 тик. Поэтому, небольшая дополнительная нагрузка на диспетчер с большим перевесом компенсируется архитектурой ОС и гибкостью возможностей.
|
|
|
|
|
Sep 13 2012, 17:30
|
Группа: Новичок
Сообщений: 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 , к сожалению любого рода манипуляции с видом записи ни к какому результату не приводят (уже просто дошел до банального перебора всего что может быть и чего не может -( ) сообщения об ошибке только разные  Может быть к этому какое-либо отношение имеет то что четверка под авр студией вообще собирается с варнингами типа - \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(), результат к сожалению аналогичный.
|
|
|
|
|
Sep 13 2012, 17:51
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(basil__ @ Sep 13 2012, 20:30)  К сожалению при попытке вставить запись типа OS::process::terminate(); А так : Код Proc1.terminate(); не пробовали? Так правильно кстати? У вас scmRTOS_PROCESS_RESTART_ENABLE чему равен?
|
|
|
|
|
Sep 14 2012, 10:00
|
Группа: Новичок
Сообщений: 3
Регистрация: 10-09-12
Пользователь №: 73 473

|
Цитата(_Артём_ @ Sep 13 2012, 21:51)  А так : Код Proc1.terminate(); не пробовали? Так правильно кстати? У вас scmRTOS_PROCESS_RESTART_ENABLE чему равен? Ффуу огромное спасибо, так все получилось!!!! В силу начальности своих знаний в плюсах никак не решался отступить от манула ))))) вернее не понял видимо ту запись которая там приведена))), ну никак не мог допереть, что имя процесса это имя объекта , а не типа ))), стыдоба ))), огромное спасибо за Ваше терпение и доброжелательность.
|
|
|
|
|
  |
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0
|
|
|