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

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Переключатель задач


Переключатель задач

Сообщений 1 страница 3 из 3

1

Это демонстрационный проект простейшего переключателя задач.

Ссылка на хранилище (svn): https://mysvn.ru/avr/bascom/manager/

Скачать исходники к себе можно при помощи плагина к Проводнику TortoiseSVN, выполнив операцию экспорта из репозитория svn.

Описание:

МК: ATmega16
Количество задач: 2.
Квант времени: постоянный, равен dt ~= ( 255 * Timer0_Presacaler * 1000 ) / crystal (Гц), [мсек].
Код переключения задач написан на ассемблере и является ISR TIM0_OVF (подпрограммой обработки прерывания по переполнению Таймера 0). Пока собран только каркас проекта, он компилируется, но ещё не работает. Нужно правильно инициализировать контексты для каждой задачи, чтобы код на бейсике выполнялся правильно.

Отредактировано uni (2013-11-06 23:34:37)

+1

2

Проект обновлён. Переключатель задач с периодом в 2 мсек прерывает одну задачу и переходит на вторую. Можно посмотреть на это в Proteus, файл проекта приложен.
У каждой задачи свой набор стеков: hw (128 байт), sw (128 байт), frames (120 байт). Контекст каждой задачи включает все 32 регистра общего назначения, которые сохраняются в HWSTACK при переключении, т.е. на самом деле можно использовать только 128 - 35 = 93 байта в этом стеке (32 РОН, адрес PC - 2 байта и статус регистр - 1 байт).

Следующий этап - тестирование корректности работы стеков у каждой из задач. Т.е. в главном цикле каждой задачи нужно добавить код, работающий с переменными в ОЗУ, код, вызывающий подпрограммы параметрами и локальными переменными. Если при переключении задач не нарушится ход течения кода в каждой и переменные будут содержать адекватные значения, то можно приступать к следующим этапам.

В проекте добавлена специальная переменная:
Dim Array(5) As Byte At &H60

Эта область памяти зарезервирована. Первый байт - это номер текущей выполняемой задачи (счётчик задач), следующие два - указатель стека первой задачи, следующие - указатель стека второй задачи. На время прерывания задачи нужно хранить адрес стека, где хранятся данные для её восстановления. Вот по этим адресам они и находятся.

0

3

Проект обновлён.

Добавлены модули работы с ANSI-терминалом и командной строкой. Задачи теперь представлены в виде процедур Task0 и Task1. Каждая задача независимо имеет внутреннюю переменную I, которая инкрементируется в замкнутом цикле. Период обновления счётчика у каждой задачи свой: 0,5 и 1 сек. Текущее значение счётчика выводится на терминал в каждой задаче. Поскольку они работают параллельно и независимо, то вывод каждой из задач перемежается с выводом другой. Значение первого счётчика выводится в два раза чаще, т.к. задержка вдвое меньше.

Это самый примитивный переключатель задач, который можно реализовать. Есть определённые ограничения, плюсы и минусы, связанные с таким подходом вообще и данной реализацией в частности. Bascom ничего не знает о наличии переключателя задач, поэтому инициализировать задачи нужно со знанием внутренней кухни компилятора.

http://img.radiokot.ru/files/4453/thumbnail/bf4ifb5hl.png

+1


Вы здесь » Программирование ATMEL в BASCOM. » Исходники » Переключатель задач