Большое количество падежных операторов ломает I2C? - PullRequest
0 голосов
/ 03 февраля 2019

Я использую 8-битный PIC (PIC16F18326), и одна из основных целей - обработка множества различных сообщений I2C.PIC настроен как ведомый I2C и должен отвечать различными данными примерно на 100 различных команд.Когда полное сообщение получено через прерывание I2C, устанавливается флаг.Флаг считывается из основного цикла, и вызывается функция для обработки данных с помощью оператора switch ... case и построения ответа на сообщение.Все работает нормально, когда декодируется только около 50 различных сообщений, но PIC даже не может распознать мастера, когда я увеличиваю количество операторов case выше 50. Кто-нибудь испытывал подобные проблемы с 8-разрядными PIC?Существует ли максимальное количество регистров, разрешенных до того, как PIC делает странные вещи?Компилятор и компоновщик не сообщают о каких-либо ошибках или предупреждениях.Пожалуйста, дайте мне знать, если у вас есть какие-либо идеи / предложения.

Спасибо, Джек

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Спасибо за ответ.После многих сообщений с поддержкой Microchip, кажется, что есть проблема с компилятором XC8 версии 2.00.Эта версия компилятора является первым выпуском для стандарта C99, и, очевидно, это породило некоторые серьезные проблемы.Я обновил XC8 до версии 2.05 (выпущенной в январе 2019 года) и не видел подобных проблем.

Еще раз спасибо.Jack

0 голосов
/ 11 февраля 2019

Альтернативой кодированию огромного оператора case является список функций

/* Declarations */
void fun1() {}
void fun2() {}
void fun3() {}

typedef void (*funtype)();

funtype funs[] = { &fun1, &fun2, &fun3, &fun2 };
...

/* Instead of
switch (x)
{
case 0: fun1(); break;
case 1: case 3: fun2(); break;
case 2: fun3(); break;
}
*/

funs[x];
0 голосов
/ 04 февраля 2019

Похоже, что он ломается, когда ваш оператор switch превышает границу банка?Если это так, то это будет ошибка в компиляторе.Вы можете легко проверить это, посмотрев на сгенерированный asm, я верю ...

...