Использование Atmel studio 7 с микроконтроллером STK600 и 32UC3C
Я дергаю себя за волосы. Я отправляю строки переменного размера по UART каждые 5 секунд. Строка состоит из одной буквы в качестве кода операции, затем следуют два символа, которые сообщают длину следующей строки данных (без нуля никогда не бывает нуля в конце любой из этих строк). В большинстве случаев строка будет иметь размер 3 символа, потому что в ней нет данных ("p00").
После расследования я узнал, что то, что должно было быть "p00", было на самом деле "0p0" или "00p" или (только при первой попытке после перезапуска микро "p00"). Я посмотрел это в представлении памяти отладчика. Затем я запустил hTerm и подтвердил, что данные на самом деле «p00». Итак, через некоторое время hTerm показал мне "p00p00p00p00p00p00p00...", в то время как память моего кольцевого буфера uart читает "p000p000p0p000p0p000p0p0..."
edit: На самом деле «0p0» и «00p» чередуются.
Скорость передачи 9600 бод. Раньше я отправлял только отдельные письма. Так что все шло хорошо.
Это код прерывания приемника: я пробовал разные варианты кода, которые все делали одно и то же по-разному. Но все они показали точно такое же поведение.
lastWebCMDWritePtr относится к типу uint8_t*, как и lastWebCMDRingstartPtr. lastWebCMDRingRXLen относится к типу uint8_t.
__attribute__((__interrupt__))
void UartISR_forWebserver()
{
*(lastWebCMDWritePtr++) = (uint8_t)((&AVR32_USART0)->rhr & 0x1ff);
lastWebCMDRingRXLen++;
if(lastWebCMDWritePtr - lastWebCMDRingstartPtr > lastWebCMDRingBufferSIZE)
{
lastWebCMDWritePtr = lastWebCMDRingstartPtr;
}
// Variation 2:
// advanceFifo((uint8_t)((&AVR32_USART0)->rhr & 0x1ff));
// Variation 3:
// if(usart_read_char(&AVR32_USART0, getReadPointer()) == USART_RX_ERROR)
// {
// usart_reset_status(&AVR32_USART0);
// }
//
};
Я приветствую любые ваши идеи и советы.
С уважением Сомео
P.S. Я поставил тег студии Atmel на случай, если это как-то связано с множеством ошибок отладчика AS.
'\n'
и т. д. Получатель не знает, где начинается одна строка и другая строка заканчивается. - person chux - Reinstate Monica   schedule 23.03.2017if(lastWebCMDWritePtr - lastWebCMDRingstartPtr >= lastWebCMDRingBufferSIZE)
. - person chux - Reinstate Monica   schedule 23.03.2017lastWebCMDWritePtr
этоuint8_t
, но, например, для pl011 это должен быть 32-битный указатель. Кроме того, этот адрес может быть помечен какvolatile
, потому что его семантика не является памятью (чтение (запись (v)) != v). Вы проверили сгенерированный код? - person Aif   schedule 23.03.2017<
и>
. - person chux - Reinstate Monica   schedule 23.03.2017usart_read_char
для чтения символа из буфера UART вместо прямого доступа кrhr
? Если произошла ошибка связи, содержимоеrhr
может быть недействительным. - person putu   schedule 23.03.2017volatile
? - person Attie   schedule 23.03.2017