[an error occurred while processing this directive] [an error occurred while processing this directive]
Дело не в асме-си, а в мировоззрении
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Xan 15 ноября 2001 г. 12:31
В ответ на: От Асм к Си отправлено Петруха 14 ноября 2001 г. 11:39

Начинающий программист мыслит: "программа выполняется". Программа в единственном числе.
А правильнее так: "одновременно выполняется множество процессов".

Надо почитать теоретические книжки по операционным системам. Нахвататься там разных умных слов... :-)

Два первых ключевых слова: "процесс", "флаг".
Вот что может получиться.
В вашей задаче видятся три процесса (а также два флага и данные):
1. "Клавиатура" - следит за нажатием кнопки, занимается антидребезгом, и устанавливает флаг нажатия кнопки.
2. "Измерение" - копит данные, если флаг нажатия кнопки, то переключает канал и начинает сначала, если данные накопились, то устанавливает флаг данных.
3. "Потребитель данных" - если флаг данных, то переваривает данные.

Ессно, над всем этим должна быть операционка.
Одна из простейших - SuperLoop.
Надо добавить ещё один (системный) процесс:
"Часы" - по прерываниям от железного таймера через каждые 5 мс устанавливает флаг часов.
Теперь всё инициализируем и после этого передаём управление на

SuperLoop:
если Флаг_Часов, то вызвать Клавиатуру
если Флаг_Часов, то вызвать Измерение
если Флаг_Данных, то вызвать Потребителя_Данных
сбросить Флаг_Часов
goto SuperLoop ; а вот и неприличное слово и четырёх букв :-)

Вот и вся операционка...
По-моему, совершенно очевидно, как эти пять строчек будут выглядеть хоть на асме, хоть на си, хоть на ... фортране :-)

Следует заметить, что здесь есть одно ограничение (плата за простоту) - подпрограммы соответствующие процессам должны через КОРОТКОЕ время отдавать управление командой возврата из подпрограммы. Ну вот, например:

Клавиатура:
extern bit KeyFlag;
void KeyBoard(void) {
static char KeyState;
KeyState += KeyState; // сдвиг влево
if (KeyPin) KeyState++; // кнопка замыкает пин на землю
if (KeyState == 0x80) KeyFlag = 1; // на нажатие
}

Измерение:
extern int data;
void mesurement(void); {
static int counter;
static int sum;
if (KeyFlag) { ChangeChannel(); counter = 0; sum = 0; }
StartADC
sum += ADC_Result;
counter++;
if (counter == 1024) { data = sum; counter = 0; sum = 0; }
}

Потребитель данных:
...void) {
if ( !DataFlag) return;
... потребление ...
}

Всего делов... Кстати, я там, в SuperLoop, ошибку допустил... но кто её увидит, тот и запросто исправит. Хе-хе.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru