Обновить

«Народная отладка» многоядерных приложений 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. Хотя и это нас тоже не остановит!.. Продолжение следует

Теги:
+9
Комментарии0

Публикации