Форум myROBOT.ru » Шаг за шагом » С чего начать? » Планировщик приоритетных программных процессов на ATmega 8

Страниц (3): [1] 2 3 »
 

1. vik49 - 18 Апреля, 2013 - 18:19:12 - перейти к сообщению
Привет всем, вернее не всем, а только тем кто хочет научиться запускать
несколько процессов одновременно.
Другими словами тем кто хочет иметь многозадачную среду на ATmege.

Только что закончил тестирование приоритетного планировщика процессов
написанный на С в среде WinAVR.
Число одновременно запущенных Процессов - до 8
Самый приоритетный процесс выполняется каждые 10 мсек
Есть 100 мсек, 1сек и 1мин процессы
Самый низко приоритетный процесс это монитор удалённой консоли.
Причём процессы с более высоким приоритетом могут прерывать процессы с
более низким приоритетом.
Ну например процесс на 10 мсек уровне имеет самый высокий приоритет
и поэтому может прерывать процессы 100 мсек, 1000 мсек и т.д.
И в тоже время монитор консоли не может прервать ни одного процесса.
Расход SRAM (область стека) во время работы шести из восьми процессов
не более 240 байт.
Размер программы самого планировщика чуть меньше 2 кбайт.
Есть 2 маленьких фрагмента на инлайновом ассемблере.
Также в проекте используются 2 аппаратных прерывания.
До этого написал такой же планировщик на C для ARM Cortex M3 STM32F103
на IAR EW 6.10
А теперь вот и на ATmega8

Раскрою понятие "планировщик".
Планировщик процессов это диспетчер процессов.
Если у вас установлен планировщик то это означает например что вы можете
работать в программе монитор консоли и одновременно с этим будет запущена
программа ну которая положим управляет чем-то другим.
Причём таких разных программ может быть запущено несколько.
Число этих "одновременно работающих" программ зависит от размера стека микроконтроллера и конечно от его производительности.
Ну вот в данном случае это всего навсего ATmega8.
Если есть вопросы - пишите.
Да кстати я отдаю этот проект бесплатно.
Это FreeWare проект.

--------
The main function of the three electrod tube is amplification!!!
2. elmot - 18 Апреля, 2013 - 20:37:14 - перейти к сообщению
vik49 пишет:

До этого написал такой же планировщик на C для ARM Cortex M3 STM32F103
на IAR EW 6.10

Честно говоря, не очень понятно зачем. Я не сходя с места нашел 2 разных RTOS для таких камней, и зачем делать еще одну свою - неясно.

http://www.freertos.org/a00090.html#ST
http://www.keil.com/rl-arm/kernel.asp
3. vik49 - 19 Апреля, 2013 - 08:14:34 - перейти к сообщению
Ну во первых для восьмой атмеги я вообще не видел.
А во вторых - да я был на этих сайтах, но это просто игрушки.
Там есть пример проекта планировщика всего на 2 процесса.
То есть если хотите на большее число процессов то покупайте у них.
Вот такие дела.

--------
The main function of the three electrod tube is amplification!!!
4. elmot - 19 Апреля, 2013 - 09:01:58 - перейти к сообщению
Очень странные слова, я бы сказал. 8ю атмегу я вообще в виду не имел. Что значит игрушки? И что это за аргумент - "пример на 2 процесса". О чем это говорит? Кто сказал, что этот пример со 102 процессами будет работать хуже?
http://www.keil.com/rl-arm/rtx_specs.asp - до 250 одновременно запущенных процессов.
И что значит "покупайте"? FreeRTOS - свободный. RTX вообще говоря тоже.
(Добавление)
Вот еще одна RTOS, с поддержкой атмег(оговорюсь - про 8ю там не сказано).
http://www.chibios.org/dokuwiki/...os:architectures
5. vik49 - 19 Апреля, 2013 - 12:21:17 - перейти к сообщению
Ну давайте попробуем разобраться по пунктам.
Во первых - я разработал не FReeRTOS, а только планировщик процессов
Во вторых - на малышке ATmega8 (кстати для неё нет JTAG отладок)
И в третьих - если вы хотите скопировать, то что вы предлагаете - буду только рад этому
и напишите пожалуйста об этом на форуме. Это будет ваша победа!
Желаю вам удачи.

И ещё я бы не хотел настаивать на моём планировщике.
Я всего навсего только написал об этом.
Меня просто удивило почему никто за 8 дней из почти 80 просмотревших
даже не дал отрицательный ответ на мою тему...
Дело в том что у меня аналогичный планировщик уже работает - вот в чём разница.

Кстати на моторолке MC68HC908JL8 тоже 8 битный чип уже год как работает планировщик
процессов. Только там реализация немного другая, а идея та же самая.

И вообще на мой взгляд самое главное - идея - а потом её реализация.
Поэтому когда у меня получилось я и написал на форум - трудно было удержаться.
Спасибо вам - вы написали ответ первый.
А то я уж подумал что попал в параллельный мир...

--------
The main function of the three electrod tube is amplification!!!
6. elmot - 19 Апреля, 2013 - 13:39:14 - перейти к сообщению
Ну в общем-то в параллельный. На этом форуме не так много программистов.
7. vik49 - 19 Апреля, 2013 - 14:54:21 - перейти к сообщению
Одной строкой порадовал !
Молодец, Спасибо.

--------
The main function of the three electrod tube is amplification!!!
8. elmot - 19 Апреля, 2013 - 18:20:11 - перейти к сообщению
Кстати, определитесь с проектом - если freeware, то значит исходник у Вас, а пользоваться можно задарма. Это вряд ли относится к сабжевому проекту. Он скорее open-source. В таком случае его следует выложит в публичный репозиторий - sf.net или github.com или еще куда-то.
9. vik49 - 19 Апреля, 2013 - 19:14:24 - перейти к сообщению
Ты прав тут надо подумать...
Вроде бы хочется исходники открыть.
Ну ладно посмотрим.

--------
The main function of the three electrod tube is amplification!!!
10. vik49 - 24 Апреля, 2013 - 17:16:43 - перейти к сообщению
Проверка многозадачного проекта на микроконтроллере ATmega8 в среде WinAVR завершена. Всё работает нормально.
Всем кто хочет создать многозадачность в своём проекте теперь cмогут это сделать.
Для этого просто нужно добавить в свой проект два файла pp.c и pp.h
А также добавить в него библиотеку libplan.a
Эти два файла и библиотеку предоставлю я по вашему запросу.
Кроме этого я вам предоставлю ещё краткое описание как всё это сделать и как избежать некоторых ошибок при создании вашего многозадачного проекта.
Привожу пример файла pp.c который работает у меня в проекте.
Ещё раз напомню что это среда WinAVR.


/**********************************************
*
* Filename: pp.c (процессы пользователя)
* Author: Vlasov V.T.
* Revision: v0.01
* Date: 21.04.2013
*
***********************************************/

#include <stdio.h>
#include <avr/io.h>
#include <avr/pgmspace.h>

#include "def.h"
#include "asc.h"
#include "snd.h"
#include "plan.h"
#include "ASC_Console.h"

/*****************
*
* Процесс lv1
*
******************/
void lv1(void)
{
sound(4200,1);

if (cons==0)
{
SIM('1'Подмигивающий;
}
}

/*****************
*
* Процесс lv2
*
******************/
void lv2(void)
{
word n=200;

sound(3300,4);

while(n)
{
if (cons==0)
{
SIM('2'Подмигивающий;
}
n--;
}
}

/*****************
*
* Процесс lv3
*
******************/
void lv3(void)
{
word n=1000;

_svtd_on;

sound(2400,16);

_svtd_off;

while(n)
{
if (cons==0)
{
SIM('3'Подмигивающий;
}
n--;
}
}

/*****************
*
* Процесс lv4
*
******************/
void lv4(void)
{
word n=10000;

sound(1800,12);

while(n)
{
if (cons==0)
{
SIM('4'Подмигивающий;
}
n--;
}
}

/*****************
*
* Процесс lv5
*
******************/
void lv5(void)
{
cons=1;

_asc_Console(Input_Buffer);

cons=0;
}

/**********
*
* конец
*
***********/

Вот и всё.

-----
The main function of the three electrode tubes is amplification.
11. Петр Киселев - 24 Апреля, 2013 - 19:55:16 - перейти к сообщению
vik49, скажи, пожалуйста, какая версия WinAVR?
(Добавление)
Продолжай только здесь! Тема интересная!
Как сделать так, чтобы процессы выполнялись не один за другим, а по определенному алгоритму?
12. vik49 - 24 Апреля, 2013 - 20:55:38 - перейти к сообщению
версия 20100110
В этом проекте - приоритетный принцип.
Почитайте в том разделе там более подробно описано.

Спасибо за интерес к теме.
хорошо буду продолжать только здесь.
Это тоже можно сделать.
Тут главное движок планировщика.
А движок при этом не меняется.

-----
The main function of the three electrode tubes is amplification.
(Добавление)
Проверка многозадачного проекта на микроконтроллере ATmega8
в среде WinAVR завершена.
Всё работает нормально.
Всем кто хочет создать многозадачность в своём проекте теперь cмогут это сделать.
Для этого просто нужно добавить в свой проект два файла pp.c и pp.h
А также добавить в него библиотеку libplan.a
Движок планировщика как раз находится в этой библиотеке.
Это моё 'ноу хау'.
И вам совершенно не важно как он работает - главное у вас будет
многозадачность в вашей системе!!!
Но если кто нибудь захочет узнать как он работает - то он либо купит у меня,
либо вскроет файл библиотеки.
Как подсоединить эту библиотеку я напишу чуть позже.
Эти два файла и библиотеку я предоставлю по вашему запросу безплатно.
Кроме того я вам предоставлю ещё краткое описание как всё это сделать и как избежать некоторых ошибок при создании вашего многозадачного проекта.
Привожу пример файла pp.c который работает у меня в проекте.
Ещё раз напомню что это среда WinAVR.
Содержимое функций lv1, lv2, lv3, lv4 и lv5 можно удалить и вставить туда вызовы
ваших процессов или их тела (это ваши функции).
В данном случае имеется 5 работающих процессов.

/**********************************************
*
* Filename: pp.c (процессы пользователя)
* Author: Vlasov V.T.
* Revision: v0.01
* Date: 21.04.2013
*
***********************************************/
#include <stdio.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include "def.h"
#include "asc.h"
#include "snd.h"
#include "plan.h"
#include "ASC_Console.h"

/******************************************************
*
* Процесс lv1
*
*******************************************************
*
* Этот процесс самый быстрый и самый приоритетный
* он может прерывать всё нижестоящие процессы.
* Этот процесс запускается каждые 10 мсек
* Для корректной работы системы нужно чтобы он
* имел длительность работы не более 1-2 мсек.
* То есть не более 10-20 % времени тика.
* Длительность работы процесса можно определить
* с помощью осциллографа в вашем процессе до перехода
* в эту многозадачную среду.
* И вообще этот уровень самый критичный
* ко времени процесса. Чем меньше тем лучше...
*
******************************************************/
void lv1(void)
{
sound(4200,1); //длительность звука 4200 гц 1 мсек
if (cons==0)
{
SIM('1'; //вывод символа (единичка) 1 на терминал
}
}

/****************************************************
*
* Процесс lv2
*
*****************************************************
*
* Этот процесс может быть прерван только процессом lv1
* Этот процесс будет запускаться каждые 100 мсек
* Продолжительность работы процесса
* не более 20-30 % времени тика.
*
*****************************************************/
void lv2(void)
{
word n=200;
sound(3300,4);
while(n)
{
if (cons==0)
{
SIM('2';
}
n--;
}
}

/**************************************************
*
* Процесс lv3
*
***************************************************
*
* Этот процесс может быть прерван процессом lv1 и lv2
* Этот процесс будет запускаться каждые 1000 мсек
* Продолжительность работы процесса
* не более 30-40 % времени тика.
*
***************************************************/
void lv3(void)
{
word n=1000;
_svtd_on;
sound(2400,16);
_svtd_off;
while(n)
{
if (cons==0)
{
SIM('3';
}
n--;
}
}

/*****************************************************
*
* Процесс lv4
*
******************************************************
*
* Этот процесс может быть прерван процессом lv1, lv2 и lv3
* Этот процесс будет запускаться каждую 1 мин
* Продолжительность работы процесса
* не более 40-60 % времени тика.
*
******************************************************/
void lv4(void)
{
word n=10000;
sound(1800,12);
while(n)
{
if (cons==0)
{
SIM('4';
}
n--;
}
}

/*********************************************************
*
* Процесс lv5
*
**********************************************************
*
* Этот процесс может быть прерван процессом lv1, lv2, lv3 и lv4
* Это самый нетребовательный процесс и ему достаётся
* минимум процессорного времени так как все выше-
* стоящие уровни имеют более высокий приоритет.
* все верхние уровни легко его прерывают...
* Этот процесс не периодический и поэтому он
* может быть запущен в любое время и на
* любое продолжительное время.
* В моём проекте он запускается нажатием на клавишу 'm'
* выход из него осуществляется нажатием на клавишу 'q'
*
***********************************************************/
void lv5(void)
{
cons=1;
_asc_Console(Input_Buffer); //это монитор удалённой консоли
cons=0;
}

/**********
*
* конец
*
***********/

Вот пока и всё.
Если есть вопросы - пишите.

-----
The main function of the three electrode tubes is amplification.
13. vik49 - 25 Апреля, 2013 - 13:55:52 - перейти к сообщению
Пётр тут у тебя нашлись защитники.
Они почему то решили что я на тебя наехал...
Правда по теме - опять ничего.

Вы мне напишите более подробно по какому алгоритму вы бы хотели получить многозадачность ?
Я уверен что всё это можно реализовать.

-----
The main function of the three electrode tubes is amplification.
14. Петр Киселев - 25 Апреля, 2013 - 15:32:09 - перейти к сообщению
vik49, ты создал две одинаковые, на мой взгляд, темы. Отличаются в названии на одно слово. Сама суть не меняется. И по количеству сообщений они почти сравнялись.
Вопрос - Зачем? Я предложил сократить одну тему (мне она интересна), но не хочется мотаться по двум одинаковым темам, выискивая что-то для себя интересное.

Порядок, последовательность или приоритетность процессов, которые выполняются я уловил. На мой взгляд, было понятнее во всем разобраться, если бы ты представил блок-схему своей идеи.
15. vik49 - 25 Апреля, 2013 - 18:00:18 - перейти к сообщению
В тот раздел который называется "программирование микроконтроллеров" не ходите.
Там сидят люди которым эта тема неинтересна.

Теперь я останусь в этом разделе.
Теперь по делу.
Пётр всё предельно просто.
Движок процессов устроен так:
Если поступил запрос от процесса и нет других то он его запускает.
Если во время исполнения процесса поступил запрос на запуск более приоритетного
процесса, то движок поступает так.
Он прерывает текущий процесс, запоминает его состояние и запускает более приоритетный.
После окончания этого процесса движок переключается на восстановление состояния менее приоритетного процесса, а затем продолжит его исполнение.
Грубо говоря это система с вытеснением менее приоритетных процессов.
Вот примерно так...

Технику или механизм этих действий я не могу вам предоставить.
Просто это мой секрет.
Движок скрыт в библиотеке по имени libplan.a
Более подробное пояснение уже вскроет механизм этой техники.
Если вы хотите получить два файла pp.c и pp.h, а также эту библиотеку
то у вас всё будет работать. Можете попробовать.
Эти файлы я могу выслать.
При наличии опыта и желании вы можете проанализировать работу движка.
этого достаточно ?

-----
The main function of the three electrode tubes is amplification.