«Народная отладка» многоядерных приложений ARM Cortex
преамбула:
..попала мне в руки плата с 2х ядерным Cortex-A7
амбула:
Как оказалось, нельзя просто так подключиться ко всем (2м в моем случае) ядрам Cortex-A7 при помощи JLink и IAR
И нельзя останавливать по software breakpoint ядро0 (к которому легко и просто цепляется отладчик IARa), ибо в этом случае ядро1 может налететь на измененный код (breakpoint) и, если не повезет, (что случается, как оказалось, чаще) debug-сессия зависает наглухо вместе с процессором (почему не разобрался пока).
Однако нас это не остановит! Как известно, технология Segger RTT умеет несколько каналов как upStream, так downStream.
Нас в данном случае интересуют up (от нашего процессора к компутеру). По умолчанию их даже и сконфигурировано 2!. В памяти они расположены независимо, каждый имеет свой буфер и свои указатели голова-хвост.
Эврика! Пишем простейший враппер на SEGGER_RTT_WriteString:
unsigned int RTT_WriteStringEx(unsigned char* str)
{
unsigned int rc=0,bufN=getCPUID();
if(bufN<SEGGER_RTT_MAX_NUM_UP_BUFFERS)
{
rc=SEGGER_RTT_WriteString(bufN,(const char*)str);
}
return(rc);
}
Все, что он делает, запрашивает номер ядра на котором работает ( вызовом getCPUID() ) , и отправляетстроку в соответствующий буфер. Таким образом, нам не нужно заботиться о взаимоблокировках при вызовах WriteString из разных ядер.
Со стороны компьютера поток rtt0 смотрим, как обычно, RTTViewer'ом, поток rtt1 он не умеет к сожалению, поэтому используем JlinkRTTLogger.exe (его путем нехитрых танцев с бубном можно направить в консоль)
И вот такую красоту получаем на экране:

PS. Останавливать ядро0 (к которому, как мы помним, подключен наш отладчик IARa) можно!
там где код гарантированно выполняется на ядре0, что можно обеспечить в случае режима SMP заданием affinity_mask при создании задачи rtos.
PPS Данный прием может пригодиться и для отладочной печати, например, из прерывания.
PPPS Вопрос, сколько потоков upStream умеет RTT? Мне пока хватило 2, но, видимо, скоро захочется 4 или 5.
PPPPS "Антинародная" отладка выглядит сильно круче. В кустах случайно оказался рояль, причем не меньше, чем Беккер. Я говорю про связку IAR и IAR i-Jet TRACE. Полноценная отладка обоих ядер, с раздельными старт-стоп ядер, окна регистров.. Но там нет RTT. Хотя и это нас тоже не остановит!.. Продолжение следует
