[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Начинающий программист мыслит: "программа выполняется". Программа в единственном числе.
А правильнее так: "одновременно выполняется множество процессов".
Надо почитать теоретические книжки по операционным системам. Нахвататься там разных умных слов... :-)
Два первых ключевых слова: "процесс", "флаг".
Вот что может получиться.
В вашей задаче видятся три процесса (а также два флага и данные):
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