
Сообщение от
Alex_Jet
Сообщение от Alex
RTFM - "Керниган и Ричи"
Ага - скажите еще и все прочитать... Лучше это найти:
Цитата:
Есть книга некоего Шпака, С для микроконтроллеров, для начинающего
Нет, лучше для начала - Кернигана-Ричи. Это классический учебник по языку Си.
Когда будут в голове основные понятия - уже можно переходить к частным диалектам.
Хотя, насколько я понимаю - у тебя проблема не столько с языком Си, сколько с самими технологиями программирования. Это более важно, поскольку на чем писать программу - на ассемблере, на Си, на Паскале, на PL/M или АДА - в основном определяется наличием конкретных компиляторов для данного процессора, и их качеством.
А вот что читать именно по технологиям - тут сразу не подскажу. Рекомендовать Кнута - там всё хорошо и правильно, даны азы алгоритмов, но всё оно там весьма далеко от технологий, применяемых в embedded устройствах (коими являются практически все устройства на МК).

Сообщение от
Alex_Jet
Сообщение от Alex
но это довольно длинно и у меня сейчас нет времени рассказывать что это такое
В общем как всегда. Сказал ам и нет...
Ну согласись все же, что форум не учебник. И если ты не знаешь как работают стандартные операторы IF/WHILE или " ? : " - обьяснять все на пальцах несколько утомительно.
Но если ты хочешь вкратце, то технологию стейт-машины я тебе могу показать на простом примере, но боюсь что вопросов это вызовет еще больше.
Я написал только касающее сути стейт-машины, и только один из вариантов, без слипа.
Код:
enum States {stOff, stStart, stSteady, stChange1, stChange2};
enum Comands{cmdNone,cmdON, cmdOFF, cmdCommand1, cmdCommand2};
volatile persistent byte cState;
volatile persistent byte cCmd;
void ColdInit(){
// тут делаем начальную инициализацию всех переменных и регистров
cState=stStart;
}
void HotInit(){
// тут можно сделать какие-нибудь действия, без переинициализации
}
void main (){
if (ColdStart) ColdInit() else HotInit();
while(1){ // main execution loop
CLRWDT();
Input(); // тут устанавливаем cCmd в соотв с вводом
switch (cState){
case stOff: // ждем включения
if (cCmd == cmdON) cState=stStart;
cCmd=CmdNone;
break;
case stStart:
// делаем что-то вначале
if (доделали) cState=stSteady;
break;
case stSteady:
// тут крутимcя основное время во время работы,
// ожидая например ввода с кнопок или команды с ДУ
if (cCmd != cmdNone)
switch(cCmd){
case cmd OFF: ProcOff(); cState=stOff; break;
case cmdCommand1: cState=stChange1; break;
case cmdCommand2: cState=stChange2; break;
}
break;
case stChange1: // тут меняем что-то, потом возвращаемся
cCtate=stSteady;
break;
case stChange2: // тут меняем что-то, потом возвращаемся
cCtate=stSteady;
break;
default: cCtate = stSteady; break;
}
}
}
P.S. Есть еще технология "синхронного исполнения", где вся программа находится в обработчике таймерного прерывания, а в основном цикле (в main) делаются вспомогательные действия.
Социальные закладки