ВходНаше всё Теги codebook PARTS Поиск Опросы Закон Воскресенье
9 августа
/909565
rual (11.03.2019 19:52, просмотров: 2782)
PIC32MX + XC32 + MCC I2C: не понятно, почему компиллер оптимизирует и проскакивает функцию static bool i2c_transaction_complite(void), код внутри. Состояние переменной меняется в прерывании на I2C2_MESSAGE_COMPLETE. При постановке в очередь сообщения status = I2C2_MESSAGE_PENDING, отладчик это показывает, соответственно i2c_transaction_complite() = false, что должно зацикливать ожидание до status != I2C2_MESSAGE_PENDING, но хрен там!!! Пролетает, при этом BP не ставиться, т.е. while (!i2c_transaction_complite()); компиллер проигнорил... static I2C2_MESSAGE_STATUS status = I2C2_MESSAGE_COMPLETE; static I2C2_TRANSACTION_REQUEST_BLOCK trBlock[2]; static uint8_t buff[2]; static bool i2c_transaction_complite(void) { if (status != I2C2_MESSAGE_PENDING) return true; else false; } I2C2_MESSAGE_STATUS readRegisterRegion(uint8_t *outputPointer , uint8_t offset, uint8_t length) { uint32_t timeout; buff[0] = offset; I2C2_MasterWriteTRBBuild(&trBlock[0], buff, 1, 0x77); I2C2_MasterReadTRBBuild(&trBlock[1], outputPointer, length, 0x77);//settings.I2CAddress /*while (I2C2_MasterQueueIsEmpty() == false) { if (timeout++ > 100000) return status; } */ while (!i2c_transaction_complite()) { // if (timeout++ > 100000) break; } I2C2_MasterTRBInsert(2, trBlock, &status); while (!i2c_transaction_complite()) { // if (timeout++ > 100000) break; } return status; }
Ответить
Ответы