SWO: Cetakan ARM Dengan Nama Lain

Aku akan mengaku. Meskipun debugging gaya printf memiliki reputasi yang buruk, saya kadang-kadang beralih ke sana. Tentu, printf mahal dan membawa banyak kode, tetapi jika Anda memiliki ruang dan waktu untuk menggunakannya saat debugging, Anda selalu dapat menghapusnya sebelum Anda selesai. Namun, bagaimana jika Anda tidak memiliki perangkat keluaran atau Anda menggunakannya untuk hal lain? Jika Anda menggunakan sebagian besar chip ARM modern, Anda memiliki opsi lain — saluran keluaran khusus yang digunakan untuk beberapa hal, termasuk keluaran debug. Saya memutuskan saya ingin mencobanya di Blackpill menjalankan mbed, dan menemukan itu tidak semudah yang Anda bayangkan. Tapi itu mungkin, dan ketika Anda selesai membaca, Anda akan bisa melakukannya juga.

Saya menulis ini menggunakan perangkat keras ST-LINK khusus STM32. Jika Anda menggunakan perangkat JTAG lain seperti probe BlackMagic, Anda mungkin sudah menyiapkan ini untuk Anda.

Apa yang kau dapatkan

Saya akan mulai mundur dengan hasil akhirnya, kemudian berbicara tentang perangkat lunak, sehingga Anda akan menjadi baik dan termotivasi pada saat Anda mendapatkan persyaratan perangkat keras. Peringatan spoiler: perangkat keras Anda yang ada mungkin memerlukan peretasan cepat untuk membuatnya berfungsi, meskipun Anda dapat membeli sesuatu dari rak jika Anda mau.

Berikut adalah program pengujian yang sangat sederhana:

SWO_Channel debugport; // membutuhkan #include “SWO.h” int main() { unsigned count=0; debugport.printf(“\r\nHalo Dunia dari SWO\r\n”); debugport.printf(“CPU SystemCoreClock adalah %d Hz\r\n”, SystemCoreClock); while (1) { led = !led; // flip LED jika output benar ThisThread::sleep_for(rate); // waktu tidur if (hitung % 10) debugport.putc(‘*’); else debugport.printf(“%d\r\n”,hitung); menghitung++; } }

Tidak ada yang sulit untuk dibayangkan di sini. Anda dapat menggunakan putc atau printf untuk menulis ke output debugging. Seperti yang Anda lihat pada gambar, Anda mendapatkan jendela bagus yang menunjukkan semua output. Sebenarnya ada 32 saluran keluaran, tetapi saluran 0 dicadangkan untuk keluaran debug. Dalam hal ini, saya memilih Semua karena itu satu-satunya yang keluar dari perangkat.

Apa yang kau butuhkan

ST’s STM32CubeProgrammer dapat menampilkan data SWO.

Pertama, Anda memerlukan chip ARM yang kompatibel. Tidak semua chip ARM mendukung ITM — Integrated Trace Macrocell — tetapi itulah yang Anda butuhkan. Akan ada satu pin pada perangkat bertanda SWO (dan mungkin hal lain juga). Karena saya menggunakan Blackpill dengan STM32F411CE, kami tahu itu akan berfungsi dan pin outputnya adalah PB3.

Anda juga memerlukan dongle ST-Link yang memiliki pin SWO. Sayangnya, yang murah yang terlihat seperti perangkat memori USB yang biasanya Anda dapatkan tidak memiliki pin SWO. Namun, Anda dapat dengan mudah meretasnya. ST-Link V2 “penuh” memiliki pin yang dikeluarkan, tetapi biasanya jauh lebih mahal. Namun, jika Anda berbelanja di toko Cina biasa, Anda biasanya dapat menemukannya dengan harga yang wajar. Saya membayar kurang dari $10.

Tentu saja, Anda juga memerlukan semacam alat untuk membaca hasilnya. Terminal normal tidak akan melakukannya, tetapi STM32CubeProgrammer ST dapat dengan mudah membaca data. Tentu saja ada pilihan lain juga. Banyak IDE dan debugger dapat membaca keluaran SWO. Ada juga beberapa alat sumber terbuka, tetapi paket Ubuntu terlalu tua dan paket rilis tidak berfungsi. Membangunnya dari awal memang berhasil.

Pengaturan Perangkat Lunak

Karena saya menggunakan Mbed, hal pertama yang saya lakukan adalah mencari perpustakaan. Saya tidak kecewa. Pustaka adalah pembungkus tipis di sekitar fungsi ITM di CMSIS, jadi jika Anda tidak menggunakan Mbed, lihat saja fungsi-fungsi itu dan Anda akan dapat mengetahuinya. Jika Anda lebih suka STM32Duino, periksa ini untuk sesuatu yang serupa.

Setelah saya menambahkannya ke proyek, saya harus memperbaiki satu hal kecil. Mungkin tidak masalah, tetapi ada contoh di mana array dialokasikan untuk nama file dan kemudian dihapus secara tidak benar. Perhatikan penghapusan pada kode di bawah ini:

bool SWO_Channel::claim (FILE *stream) { if ( FileBase::getName() == NULL) { error(“claim memerlukan nama untuk diberikan dalam instantiator dari instance SWO!\r\n”); } //Tambahkan ‘/’ sebelum nama: char *path = new char[strlen(FileBase::getName()) + 2]; sprintf(jalan, “/%s”, FileBase::getName()); if (freeopen(path, “w”, stream) == NULL) { // Gagal, seharusnya tidak terjadi return false; } menghapus [] jalur; // diperbaiki //Tidak ada buffering setvbuf(stream, NULL, _IONBF, 32); kembali benar; }

Setelah selesai, Anda siap berangkat. Anda hanya perlu beberapa perangkat keras.

Pengaturan Perangkat Keras

Jika Anda memiliki dongle ST “normal” seperti yang berwarna putih pada gambar di bawah ini, pengaturannya hanyalah pengaturan normal. Hubungkan daya, ground, dan dua pin debugging ke konektor belakang Blackpill dan kemudian jalankan kabel dari SWO ke pin B4 pada perangkat.

Jika Anda memiliki salah satu klon murah seperti yang ungu yang duduk di sebelah perangkat putih, Anda harus melakukan beberapa operasi untuk mengeluarkan pin tambahan.

Muat program yang melakukan beberapa keluaran SWO sederhana dan kemudian jalankan semuanya. Anda mungkin perlu memutakhirkan firmware ST-Link — perangkat lunak STM32CubeProgrammer juga dapat melakukannya.

Saat menghubungkan ke perangkat keras dengan programmer, saya menemukan bahwa dongle putih tidak terhubung dengan andal pada 4000 kHz, jadi saya harus memilih 1800 kHz. Itu mungkin hanya perangkat itu atau kabel acak saya. Anda dapat melihat info koneksi yang saya gunakan di tangkapan layar yang berdekatan. Tekan Hubungkan untuk memulai.

Saat Anda memilih item SWV, Anda harus menyetel jam 96 MHz untuk pengaturan ini. Agaknya, jika Anda menjalankan pada frekuensi yang berbeda, Anda akan tahu nilai yang tepat untuk pengaturan Anda. Ketika Anda menekan Start, Anda akan melihat output dari program.

Satu-satunya hal yang perlu diingat adalah bahwa perangkat lunak Anda akan memperebutkan dongle kecuali jika telah dibuat untuk bekerja dalam mode “bersama”. Dalam kasus saya, Mbed Studio tampaknya tidak peduli dengan pengaturan itu sehingga Anda harus memutuskan sambungan jika Anda ingin memprogram ulang chip. Tentu saja, Anda dapat menggunakan programmer untuk melakukan semuanya. Itu semua akan tergantung pada alat dan pengaturan Anda.

Tentu saja, setelah Anda melakukannya sekali, cukup mudah untuk ditiru untuk proyek-proyek masa depan. Anda hanya memiliki satu kabel ekstra dan dua file tambahan di program Anda.

Melangkah Lebih Jauh

Anda bisa melangkah lebih jauh. Pertama, ada output warna-warni. Jika string debug Anda berisi #RED#, #GRN#, atau #ORG#, karakter yang tersisa akan berwarna itu (merah, hijau, atau oranye) untuk sisa baris. Dengan asumsi, tentu saja, pemirsa memahami itu dan Anda telah mengaktifkannya. Sangat berguna untuk dapat menampilkan pesan penting dengan warna merah, misalnya.

Namun, sayang sekali ada begitu banyak saluran tambahan yang tidak kami gunakan. Misalnya, mengapa tidak ada pesan kemajuan di saluran 0 dan info debug mendetail di saluran 1? Anda bisa membuang apa yang masuk dari perangkat eksternal di saluran 5. Tentu, Anda bisa menulis awalan di telepon dan menarik data keluar seperti itu, tapi ini lebih menyenangkan.

Saya menulis ulang sedikit kelas SWO yang ada dan, berkat argumen opsional, itu masih berfungsi sama. Satu-satunya perbedaan adalah Anda dapat menambahkan nomor saluran ke konstruktor sehingga memungkinkan untuk membuat lebih dari satu aliran debug:

SWO_Channel debugport; SWO_Channel dbg2(“kedua”,1);

Ada sangat sedikit perubahan pada kode, tetapi saya akan membiarkan seluruh proyek di GitHub.

Jika Anda tidak tahu, saya senang bekerja dengan STM32 dan Mbed. Tentu, Anda bisa mendapatkan kinerja yang lebih baik dengan menghindari Mbed, tetapi hal baiknya adalah Anda bisa. Anehnya, mendorong data melalui satu port ke beberapa saluran adalah sesuatu yang telah saya lakukan sebelumnya dengan cara yang sama sekali berbeda.