"Jangan pamer, Maria Ivanovna, dan dengarkan lagu favoritmu," Valenki "
Terlepas dari tajuk berita utama, urutan presentasi akan berlawanan - pertama tentang Texas Instruments (tentu saja bukan tentang perusahaan itu sendiri, saya masih seorang insinyur, bukan
pelatih, analis bisnis, oleh karena itu, tentang produk yang diproduksi oleh perusahaan), dan hanya kemudian tentang pembagian.
Bagian pertama dari balet Marlezon.
Subjek diskusi akan menjadi keluarga SS13xx yang relatif baru (SS1310 / SS1350 / SS1352), tetapi itu hanya titik awal untuk membahas situasi di bidang pemrograman sistem embedded. MK ini dimaksudkan untuk digunakan dalam desain perangkat dengan antarmuka nirkabel dari berbagai jenis (saya tidak terlalu suka kata IoT yang ketinggalan jaman, terutama karena tidak menguras kemungkinan menggunakan keluarga ini).
MK dibangun berdasarkan inti M3 dengan cukup dapat diterima, meskipun tidak memecahkan rekor parameter untuk frekuensi dan ukuran memori program dan data, ia memiliki seperangkat antarmuka yang cukup, tetapi parameter ini tidak berarti menarik. Fiturnya adalah bahwa rangkaian mikro berisi tiga inti MK, satu inti dan dua periferal, untuk bekerja dengan perangkat eksternal dan untuk berinteraksi melalui eter. Apa alasan dari keputusan ini?
Pertama-tama, keinginan untuk memastikan konsumsi energi minimal. Faktanya adalah bahwa cara tradisional untuk mengurangi konsumsi dengan melakukan perhitungan intensif sumber daya dalam waktu yang relatif singkat dan kemudian beralih ke mode siaga dengan penurunan frekuensi jam memiliki keterbatasan alami dan inti cepat akan mengkonsumsi relatif banyak pada frekuensi yang lebih rendah, sambil tidak memberikan waktu reaksi yang diperlukan untuk peristiwa eksternal. Untuk menghilangkan kontradiksi ini, inti kedua dari pengontrol sensor diperkenalkan, yang menyediakan interaksi dengan dunia luar dalam mode daya rendah, dan ketika kebutuhan muncul untuk perhitungan intensif sumber daya, itu mengaktifkan inti utama.
Kontroler ketiga memecahkan (walaupun dengan cara yang sangat rumit) tugas yang sama untuk mengurangi konsumsi. Faktanya adalah bahwa mempertahankan protokol pertukaran radio seringkali memerlukan pemeliharaan batasan waktu yang sangat ketat dan upaya untuk mengimplementasikannya pada inti pusat (pada saat yang sama dengan menjalankan program target) akan memerlukan peningkatan frekuensi clock inti dan, dengan demikian, daya yang dikonsumsi dari sumber daya. Pemisahan fungsi memungkinkan penghapusan kontradiksi ini (solusi khas dalam gaya TRIZ).
Saya benar-benar tidak yakin bahwa pemisahan fungsi seperti itu benar-benar diperlukan dan bahwa parameter yang diperlukan tidak dapat dicapai dengan solusi arsitektur yang lebih sederhana, tetapi jika harga disimpan dalam kerangka kerja yang wajar dan kemampuan yang diperlukan direalisasikan, maka mengapa tidak. Apalagi posnya masih bukan tentang komponen perangkat keras MK, hanya untuk menutupi situasi. Kami akan mempertimbangkan proses pembuatan perangkat lunak untuk kelas MK ini.
Untuk mulai dengan - inti utama, semuanya standar di sini - baik inti M3 itu sendiri sudah terkenal dan toolchain adalah gcc, perusahaan itu sendiri merekomendasikan dua IDE - ccs dan iar. Saya banyak bekerja dengan yang terakhir, jadi saya memutuskan untuk mencoba produk seperti apa yang
jenius Teutonik jenius dari pikiran kolektif yang dihasilkan TI. Code Composer Studio adalah pengembangan perusahaan dan benar-benar gratis tanpa batasan, berdasarkan (siapa sangka) Eclipse dan memiliki semua kelebihan dan kekurangan yang melekat dalam lingkungan ini.
Satu-satunya hal yang ingin saya sampaikan kebingungan sekaligus adalah bahwa perusahaan dengan ramah menawarkan utilitas tambahan untuk bekerja dengan MK ini (untuk membuat image firmware yang dapat di-boot melalui eter dan untuk mentransfernya ke MK), tetapi semuanya ditulis, untuk alasan tertentu, bukan di Jawa, yang merupakan dasar untuk lingkungan pemrograman dan sistem runtime yang merupakan bagian dari paket instalasi, dan pada Phyton. Bukannya saya sangat tidak menyukai yang terakhir (walaupun ada satu, saya tidak menerima pengaturan struktur program dengan lekukan, tetapi pada akhirnya "warna dan warna berbeda"), tetapi tidak jelas mengapa perlu untuk menarik entitas yang jelas-jelas berlebihan. Selain itu, utilitas itu sendiri tidak ada yang rumit, mereka tidak menggunakan perpustakaan tertentu dan dipindahkan oleh penulis ke Jawa untuk waktu yang sangat terbatas tanpa kesulitan sedikit pun meningkatkan panjang program sebesar 20%, dan, yang agak aneh, tanpa perubahan kecepatan yang nyata (mengingat bahwa utama runtime dikaitkan dengan membaca file, ini tidak begitu mengejutkan - catatan
terlambat oleh Funtik F ...).
Bagian kedua dari teka-teki ini terletak pada kenyataan bahwa Eclipse sendiri populer karena kemampuan untuk dengan mudah menanamkan plugin. Mengingat fakta ini, keputusan pengembang lingkungan pemrograman untuk membuat pengguna memanggil utilitas dengan pegangan dari baris perintah sangat samar, setelah sebelumnya menonaktifkan terminal di lingkungan pengembangan dengan gagang dan meluncurkan program penerimaan data pada MK dengan gagang dan kemudian memulihkan terminal lagi dengan gagang. Mungkin bagi "programmer Hindu" solusi ini tampaknya menjadi satu-satunya yang mungkin dan benar-benar dibenarkan, tetapi sebuah perusahaan besar mampu menarik lebih banyak personel yang berkualitas, saya mungkin tidak tahu sesuatu.
Selanjutnya, pemrograman pengontrol sensor (namanya tidak terlalu berhasil, tetapi merupakan kertas kalkir langsung) dilakukan menggunakan produk Sensor Composer Studio. Segera pertanyaan lain - mengapa perlu memiliki produk terpisah, bukan karena sangat sulit untuk beralih jendela, tetapi masih ..., terutama karena kode yang dibuat akhirnya menjadi bagian dari kode untuk MK utama (tentu saja, ada di sana tidak dieksekusi, tetapi dimasukkan dalam ruang alamat umum memori program).
Dan inilah fitur lain - mereka tidak memberi tahu kami apa pun tentang inti ini (arsitekturnya), kecuali bahwa ia 16-bit, rendah konsumsi, dan eksklusif. Secara umum, tidak apa-apa, ia bekerja dan bekerja dengan baik, tetapi "sedimen tetap ada." Berikut ini adalah deskripsi perintah-perintah kernel ini, yang menurut kami dapat mengasumsikan bahwa ini adalah modifikasi dari 430, walaupun dengan fitur-fitur seperti perintah untuk mengatur siklus. Lokasi register periferal di ruang alamat umum dan lokal diberikan, dan kemudian hal-hal aneh mulai lagi - banyak register, termasuk register periferal, disertai dengan frasa "hanya digunakan oleh perpustakaan TI", dan untuk beberapa register tugas bitfield masih diberikan, dan untuk beberapa tidak. Bukan karena deskripsi register ini sangat mengganggu saya, tetapi mengapa memberikannya jika pengguna tidak berencana menggunakannya - saya pribadi tidak terlalu mengerti.
Anda juga dapat mengakses pinggiran kernel ini dari kernel utama menggunakan pustaka khusus, pada saat yang sama Anda dapat menulis kode di lingkungan pemrograman yang disebutkan, sekali lagi menggunakan beberapa plug-in. Semuanya baik-baik saja di sini, dokumentasinya memadai, pengaturannya nyaman, ada representasi grafis dari pengaturan, debugging bawaan dalam mode khusus (dalam mode umum, debugger sibuk dengan kernel utama), secara umum, itu cukup layak.
Bagian selanjutnya adalah kernel untuk bekerja dengan radio, dibangun atas dasar M0, menjalankan program dari ROM sendiri (kemungkinan besar itu adalah bagian dari memori yang tidak mudah menguap, tidak mungkin bahwa MK modern memiliki memori bertopeng), yang tidak dapat dimodifikasi (setidaknya tentang ini dalam dokumentasi bukan kata) oleh pengguna. Informasi tentang struktur internal saluran radio sangat langka, bahkan hanya dapat diekstraksi dari deskripsi perintah pengaturan mode, tetapi itu tidak diperlukan oleh pengembang "built-in" yang biasa.
Interaksi antara inti utama dan bagian radio didasarkan pada aliran pesan, yang didokumentasikan dengan cukup rinci. Dan dokumentasi ini cukup untuk memahami hal yang sederhana - Anda tidak akan (well, saya pasti tidak akan) membangun mekanisme interaksi antara kernel, dan terutama protokol komunikasi, tetapi Anda akan menggunakan perpustakaan yang dilaksanakan oleh perusahaan, karena interaksi cukup rumit bahkan dengan itu Desain harus mempertimbangkan sejumlah besar berbagai faktor, sehingga manfaat menulis paket Anda sendiri tidak mengimbangi biaya pembuatannya. Oleh karena itu, kami kembali menggunakan sublayer perpustakaan untuk mengatur interaksi inti utama dengan inti radio, dan, kemungkinan besar, kami menggunakan solusi yang sudah jadi untuk mengatur saluran komunikasi radio standar menggunakan modul yang sudah jadi, hanya menggunakan parameterisasi saluran.
Saya pikir menjadi jelas bagi pembaca bahwa menulis program lengkap untuk MK ini bukanlah tugas yang mudah, itu cukup mudah diakses oleh profesional tingkat lanjut, tetapi apa yang harus dilakukan oleh pengembang "biasa" (seperti yang ditulis Oleg Artamonov baru-baru ini, "Anda sudah menyadari bahwa Anda membuat kesalahan besar dengan pilihan itu profesi? "). Perusahaan menangani kasus ini dan, bersama dengan lingkungan pengembangan, menyediakan paket besar (serangkaian contoh) program untuk semua kesempatan, yang disebut SimpleLink. Selain itu, solusinya diberikan dalam dua versi - keduanya menggunakan sistem operasi real-time TI-RTOS (menurut saya, ini adalah cara yang lebih nyaman), dan dalam siklus super (jika Anda begitu membenci OS bawaan sehingga Anda tidak bisa makan "). Saya tenang tentang RTOS di MK, jadi saya menggunakan opsi pertama dan menyarankan Anda untuk melakukan hal yang sama, terutama jika Anda memahami konfigurasi proses pembuatan OS dan mengadaptasinya untuk kelas tugas Anda, kegunaan disimpan, dan biaya pemeliharaan kenyamanan ini berkurang secara drastis.
Sikap pribadi saya terhadap paket ini ada dua - di satu sisi, usaha luar biasa yang benar-benar secara dramatis menyederhanakan penggunaan MK (oleh karena itu, saya menggunakannya), tetapi di sisi lain - "sampah, limbah, dan sodomi", ilustrasi yang bagus untuk frasa "Jika biaya arsitektur yang baik tampaknya Ini tinggi untuk Anda, pikirkan tentang biaya arsitektur yang buruk. "(Itu sebabnya saya memarahinya.) Ini bukan hanya tentang distribusi fungsi oleh modul dan hubungan di antara mereka (meskipun ini tidak semua mulus), tetapi juga tentang distribusi modul berdasarkan file, nama file, distribusi file berdasarkan direktori dan nama serta strukturnya, dll. Yah, melanggar prinsip KISS dan DRY hampir merupakan aturan bagi pengembang paket, tetapi jika saya tidak memahami kode sumber paket (saya tidak bisa menghilangkan kebiasaan bodoh ini), dan menggunakannya "sebagaimana adanya", maka semuanya bekerja dengan baik, setidaknya saya belum menemukan masalah dalam proyek tertentu (terlepas dari perasaan estetika yang dihina dan hilangnya kepercayaan pada kemanusiaan).
Tetapi sekarang Anda dapat dengan mudah menuju postulat utama dari posting ini (lebih baik terlambat daripada tidak sama sekali). Saya selalu berpikir bahwa sangat sulit untuk menulis kerangka kerja yang menggabungkan keserbagunaan sejati dan kinerja tinggi. Contoh-contoh pengembangan yang diusulkan oleh perusahaan mewakili kerangka kerja semacam itu dengan penekanan pada keserbagunaan, alat penyesuaian aplikasi hampir sepenuhnya tidak ada, semuanya hanya pada tingkat penyesuaian dadih. Ambil satu dari banyak contoh kami, ubah potongan kecil yang terkait dengan pengukuran dan analisis (dan transmisi, tentu saja), dan Anda selesai. Tentu saja, kode yang dihasilkan akan sangat membengkak dalam kasus umum, tetapi kami akan menawarkan berbagai contoh untuk kondisi aplikasi yang berbeda, dan Anda hanya harus memilih yang paling cocok untuk tugas Anda. Dalam kasus yang ekstrem, sejumlah besar memori program dimasukkan ke dalam MK sehingga Anda tidak perlu berpikir untuk menghemat sumber daya ini. Selain itu, bagian penting dari perpustakaan yang mengeksekusi sudah tersembunyi di dalam ROM dan Anda hanya perlu memanggil mereka dengan cermat.
Bukannya saya menentang pendekatan semacam itu, dan secara kategoris menuntut penemuan sepeda, penggunaan kembali kode adalah keharusan kategoris dan jaminan produktivitas programmer tinggi, tetapi tunduk pada ketentuan berikut -
Perpustakaan rutin yang digunakan harus:
- dirancang dengan cermat
- diprogram dengan rapi
- didokumentasikan secara komprehensif
- universal
- efektif.
Dan jika dua poin terakhir hanya diinginkan (sangat diinginkan, tetapi tetap saja ...), maka tiga poin pertama diperlukan.
Bagaimana dengan persyaratan paket SimpleLink yang ditawarkan oleh perusahaan? Berikut ini adalah penilaian pada skala lima poin, diperoleh dalam urutan kenalan dangkal dengan paket.
1a) Koneksi antara modul harus dipikirkan, batas-batas kompetensi masing-masing modul harus jelas diuraikan, menghilangkan duplikasi fungsi, antarmuka bekerja - empat padat, pekerjaan secara keseluruhan telah dilakukan.
1b) Distribusi modul ke dalam file dengan struktur direktori yang dipikirkan dengan matang mungkin tiga plus, yang hanya layak untuk mengulangi teks modul program dalam file yang berbeda.
2. Paket seharusnya tidak memiliki kesalahan yang sulit dideteksi (sulit untuk mendeteksi kesalahan yang jarang terlihat). Sulit untuk memberikan perkiraan di sini, saya perhatikan satu keadaan yang tidak menyenangkan - sebagian besar fungsi dapat dipanggil baik dari memori program biasa dan dari memori permanen, dan jika sumber dari opsi pertama dapat diakses dan divalidasi, maka yang kedua jauh lebih buruk - kami tidak diberi instruksi apa pun sumbernya tidak identik dengan opsi pertama, sehingga tidak ada pertanyaan tentang verifikasi.
3. Dokumentasi untuk solid four sudah menjadi fakta bahwa penulis tidak menggunakan "kekuatan dan ekspresif" Doxygen dalam hal dokumentasi, memberikan minimal 1 poin, ada sistem tautan kontekstual, ada deskripsi prinsip kerja - saya tidak menempatkan lima teratas hanya karena dalam hal dokumentasi Aku tidak pernah mengaturnya, bahkan diriku sendiri.
4. Tidak lebih dari empat karena kurangnya konfigurasi yang dikembangkan, tapi saya sudah menyebutkan ini.
5. Sulit untuk mengatakan, saya biasanya melihat implementasi SPI - itu, di satu sisi, cukup sederhana untuk menghargai kurangnya standar menyapu, di sisi lain, cukup kompleks untuk memiliki tempat untuk menjejalkan mereka. Jadi, dalam paket ini ada prosedur yang sangat tidak efisien untuk menulis / membaca byte, tetapi jika Anda terjun ke kedalaman, Anda dapat menemukan opsi yang benar-benar digunakan menggunakan MPD, saya belum bisa mengatakan apa-apa tentang mereka.
Sebuah catatan tentang kedalaman - mereka benar-benar dalam (melalui fungsi 4-5 bersarang) dan saya tidak bisa tidak menyebutkan satu fitur dari paket - itu ditulis dalam C. Bukan saya yang lupa menambahkan dua plus setelah surat, itu benar-benar tidak ada. Bagi mereka yang ada dalam topik, banyak yang menjadi jelas, saya sarankan semua orang untuk pergi melalui pencarian yang menarik untuk menentukan serangkaian fungsi yang dilakukan pada tingkat perangkat keras saat mengimplementasikan objek yang tidak sepele. Tentu saja, ketika menggunakan kelas, tugas seperti itu menjadi sepele, tetapi ini bukan cara Jedi dari TI. Saya memahami bahwa ini adalah masalah yang perlu bagi para pengguna yang mengabaikan nilai plus, tetapi mengapa berhenti di situ, tetapi bagaimana dengan pengguna assembler yang malang, yang membuat mereka tersinggung.
Dan sebagai kesimpulan - saya ingin menekankan, "sehingga saya dapat dipahami dengan benar di atas", saya sama sekali tidak memarahi keluarga MK, atau lingkungan pengembangan, atau paket perangkat lunak, tetapi hanya ingin mereka menjadi lebih baik, lebih nyaman dan lebih menarik bagi pengguna . Saya memiliki akun saya sendiri dengan TI dan saya tidak akan pernah memaafkan mereka untuk pengambilalihan Nasional atau akuisisi Luminary lebih awal dengan pembunuhan berikutnya dari garis MK yang menarik (meskipun dalam kasus terakhir mereka menghukum diri mereka sendiri), serta apa yang mereka kembalikan kepada saya pada tahun 2014 uang untuk kristal yang dipesan (walaupun saya jelas tidak menyentuh Crimea), tetapi perasaan yang mendalam ini tidak menghalangi saya untuk bersikap objektif - mereka melakukan pekerjaan dengan baik. Konsep yang diusulkan oleh perusahaan, yang disajikan dalam epigraf, tidak terlalu dekat dengan saya, tetapi mereka mungkin benar, dan tidak ada cara lain untuk kristal kompleks. Ini adalah tren dan tidak masuk akal untuk melawannya.
Dan fakta bahwa ini adalah tren menegaskan situasi dengan kristal manajemen daya Vicor baru. Kristal itu sendiri baik (kebalikannya akan mengejutkan untuk perusahaan yang memiliki reputasi baik), parameternya sangat bagus, dan saya sebutkan hanya sehubungan dengan bagian tentang pemilihan komponen eksternal, khususnya induktansi. Dalam dokumentasi, bagian ini hanya satu paragraf, yang menunjukkan model induktansi spesifik dari produsen tertentu dan secara eksplisit menyatakan bahwa opsi lain tidak dipertimbangkan, lihat epigraf. Sepenuhnya memahami alasan pengembang kristal (frekuensi switching tinggi, arus signifikan, desain induktansi untuk kondisi seperti itu bukanlah tugas yang sepele), namun, saya harus mencatat bahwa untuk saat ini pendekatan untuk merancang ini tidak biasa bagi saya, βtetapi kuncinya di sini adalahβ untuk saat ini β. Mungkin Anda harus menjual kedua komponen ini dalam satu bundel, maka tidak akan ada pertanyaan.
Bagian kedua dari balet Marlezon.
Nah, sekarang tentang divisi, penggunaan yang ditemukan di salah satu perpustakaan TI, tetapi tidak berlaku langsung ke perusahaan ini, tetapi merupakan fitur dari kompiler gcc. Jadi, kita merumuskan masalah dari bidang aritmatika alamat - kita perlu menghitung perbedaan dalam indeks (yaitu indeks, bukan byte) antara dua elemen array (atau hanya data lokasi yang berurutan dari jenis yang sama) yang ditentukan oleh pointer ke mereka.
Sebagai aturan, salah satu elemen adalah elemen pertama dari array, tetapi ini tidak penting.Tugas itu sendiri sederhana dan dalam C, solusinya jelas dan terlihat seperti
.
Iblis bersembunyi dalam implementasi - tim divisi belum menjadi standar diimplementasikan dalam arsitektur MK umum, sehingga tidak cepat. Jika pembagi adalah variabel, maka tidak ada solusi yang baik dari kata sama sekali, tetapi untuk nilai konstan ada opsi berdasarkan perkalian. Berkat properti multiplikasi yang luar biasa
(Selain aditif, terima kasih, kapten) implementasi perkalian perangkat keras jauh lebih umum dalam implementasi dan cukup cepat (topik pengganda perangkat keras itu sendiri memang menarik, tapi bukan itu masalahnya sekarang). Sayangnya, tidak ada properti serupa untuk divisi, itulah sebabnya ini adalah tamu langka dalam hal implementasi perangkat keras.Jadi, alih-alih membagi (dengan konstan, ini penting) kami ingin menerapkan perkalian, perhatikan tangan Anda
di mana N adalah konstanta tambahan. Muncul pertanyaan logis - sampah macam apa, karena sekarang kami memiliki dua operasi pembagian, bukan satu, dan bahkan penggandaan, yang karenanya kami menang. Jawabannya dipilih dengan benar N, jika itu adalah kekuatan dua, tetapi pembagian berubah menjadi pergeseran angka ke kanan, yang jauh lebih murah, dan jika eksponen adalah kelipatan 8, maka pembagian berubah menjadi penomoran ulang nomor byte, yang tidak memerlukan biaya sama sekali. Karena faktor N / c konstan, kami menghitungnya terlebih dahulu dan semuanya tampak baik-baik saja, jika bukan karena satu detail - keakuratan representasi faktor ini.Pertimbangkan kasus khusus untuk membagi dengan 10, yang terjadi ketika mengkonversi angka dari biner ke desimal, kemudian, dengan mengambil H = 256, kami menghitung konstanta untuk perkalian 256/10 = 25.6 dan kesalahan pembulatan terjadi pada bilangan bulat 25 (-2,3%) atau 26 (+1,6) %). Kemudian, misalnya, 100 * 26 = 2600 = 256 * 10 + 40 dan bagian tertinggi dari hasilnya adalah 10, yang sesuai dengan yang diharapkan 100/10 = 10. Kita dapat menghitung pada nilai dividen mana hasil menyimpang dari yang benar dengan lebih dari satu, tetapi untuk ini kita harus menyelesaikan persamaan bentuk
(di mana kurung berarti bagian integer dengan pembulatan ke bawah), dan ini bukan prosedur yang sangat jelas, lebih mudah untuk melakukan simulasi numerik dan memastikan hasilnya benar untuk n tertentu. Anda dapat memasukkan aditif koreksi dan mengkompensasi hilangnya akurasi dengan rumus
dan secara signifikan memperluas rentang nilai dividen yang diizinkan (hingga 256, yaitu, pada integer 8-bit unsigned, kami tidak pernah melakukan kesalahan), tetapi kami tidak dapat menghilangkan kelemahan mendasar dari metode ini - adanya kesalahan, di samping itu, kami hanya mendapatkan perhitungan tertentu dari sisanya (jika itu diperlukan, tetapi ini bukan kasus kami) adalah mungkin untuk melakukan hanya operasi terpisah, yang mempengaruhi kecepatan kerja. Secara umum, metode ini cukup berhasil, tetapi cakupannya agak terbatas.Oleh karena itu, saya sedikit terkejut ketika dalam kode yang dikompilasi (seperti biasa, terima kasih kepada godbolt untuk kesempatan ini), saya melihat dalam perkalian alamat aritmatika dengan konstanta (cukup besar) daripada membagi dengan konstanta (sangat kecil). Pertanyaan lain adalah bahwa konstanta sama sekali tidak mirip dengan yang dihitung untuk metode di atas. Dan akhirnya, hasilnya bukan bagian senior dari pekerjaan, tetapi bagian termuda dari itu. Secara umum, metode yang sedikit aneh, beberapa sampah, tetapi perhitungan menunjukkan bahwa itu berhasil. Musyawarah singkat mengungkapkan rahasia dan metodenya ternyata benar-benar benar, tetapi ... (tentu saja, pembaca mengharapkan "tetapi ...", karena tidak mungkin untuk mengganti pembagian dengan perkalian dalam kasus umum) ia memiliki keterbatasan.Pertimbangkan angka ajaib 143 dan periksa sifat-sifatnya yang lucu 77 * 143 = 11011, bagian bungsunya 011 = 1 = 77/7. Sangat mudah untuk melihat bahwa 784 * 143 = 112112, bagian termuda adalah 112 = 784/7 dan seterusnya untuk semua angka tidak melebihi 999 * 7 = 6993. Ini dia, batasan alami dari metode ini, tetapi dengan mengambil angka ajaib lain 7143, kita akan memperluas rentang kemungkinan menjadi 9999 * 7 = 69993. Tidak sulit untuk menemukan angka ajaib lain yang memiliki sifat magis yang serupa.Cara mendapatkan angka-angka ini - kami ingin menemukan angka, dengan mengalikan dengan mana dividen dapat memperoleh hasil yang berisi hasil pembagian di bagian termuda, dalam hal ini dengan 7. Kedengarannya muskil, tetapi sangat sederhana, untuk input nomor 7 yang kita inginkan dapatkan xxx001, misalkan xxx = 001 dan ini adalah sihir jalanan sederhana 1001/7 = 143. Jelas, 143 * 7 = 1001, maka untuk angka apa pun = n * 7, (n * 7) * 143 = n * (7 * 143) = n * 1001 benar, dan bagian bawah dari hasilnya adalah n, begitu seterusnya.Sekarang kita melihat kelemahan mendasar dari metode ini - ini hanya berfungsi untuk angka yang merupakan kelipatan dari pembagi dan memberikan hasil penggandaan yang sama sekali tidak dapat diprediksi (dalam arti tidak ada hubungannya dengan pembagian) dalam semua kasus lainnya. Tetapi untuk aplikasi khusus ini, ketika kita mengurangi alamat elemen array, hasilnya akan benar-benar kelipatan dari ukuran elemen array dan kita memiliki hak untuk menggunakan metode ini. Jika kita mengambil angka yang salah, maka hasil dari pembagian itu seharusnya tidak menarik bagi kita juga, βsebuah mesin adalah sebuah gilingan, jika kamu melempar batu ke sana, maka tepung tidak akan bekerja.βMenemukan angka ajaib untuk pembagi selain 7, serta bukti keberadaan mereka, kami serahkan kepada pembaca yang ingin tahu. Juga menarik untuk membuat grafik faktor-faktor tergantung pada pembagi dan melihat penurunan dan puncaknya, mungkin kehadiran mereka entah bagaimana berkorelasi dengan teori bilangan. Misalnya, untuk komposit 21 = 3 * 7, angka ini = 381 (tentu saja, jumlah minimum, sisanya tidak menarik bagi kami) jelas kurang dari produk 667 * 143 = 95381 dan bahkan tidak banyak, seperti yang saya pikir naif, meskipun 381 = 381.Fakta menarik lainnya adalah bahwa angka ajaib akan berbeda dalam sistem angka yang berbeda. Misalnya, dalam sistem desimal, tidak ada konstanta untuk membaginya dengan 5, karena tidak ada angka dalam bentuk x ... 1 yang dapat memiliki lima sebagai pembagi dan metode kami tidak berfungsi. Tetapi, pada saat yang sama, dalam sistem biner (heksadesimal), masalah ini diselesaikan, karena 1024 + 1 = 1025 = 0x401 adalah 5 yang dibagi dengan hasil 205 = 0xCD dan algoritma kami bekerja lagi, misalnya 130 * 205 = 0x82 * 0xCD = 0xFAFA => FA = 26 = 130/5. Selain itu, dapat dibuktikan (baik, saya pikir begitu) bahwa sekarang masalah menemukan faktor diselesaikan untuk setiap pembagi ganjil, dan bahkan ada yang berubah menjadi aneh dengan jumlah shift yang terbatas (saya pasti bisa membuktikan ini). Sejauh representasi biner itu mudah dan bermanfaat, kami sangat beruntung karenanya.PS.
Pembaca reguler saya (saya menyanjung diri sendiri dengan harapan bahwa ada seperti itu) dalam kebingungan - pos telah berakhir, dan di mana "Yaroslavna's cry". Jangan khawatir, sayangku, ini dia.Dalam papan debug untuk CC1350 dan CC1352, satu kristal dari saklar antena digunakan (digunakan berbeda, tetapi tidak masalah), yaitu XMSSJE3G0PA (jangan mencoba membaca ini dalam transkripsi Rusia, saya yakin bahwa muRata tidak memikirkan hal yang sama). Jadi, sakelar dengan karakteristik sederhana - pita frekuensi hingga 2,7 GHz, atenuasi transmisi - 0,28 dB, atenuasi isolasi - 33 dB, switching power - 20 dB. Tetapi semua ini dikompensasi oleh dua parameter - dimensi 1,5 * 1,5mm dan biaya - $ 0,9, meskipun teknologi yang diterapkan "Silicon On Insulator" dan "gallium arsenide".BAGAIMANA mereka melakukannya - saya terutama berbicara tentang harga, dan kedua - mengapa kita tidak melakukannya - pertanyaannya adalah retoris