ESP32(4) ESP32-C3搭配Arduino
[我認知的Arduino]
用SDK開發像開手排車,開發者得處理所有的細節,大一點的系統甚至得要一個team來處理;簡化的方法也簡單,用廠商給的預設組態先玩,出問題再找FAE幫忙解答。走SDK開發這路,每換一家廠商都是生命攸關的大事,畢竟底層的操作方法全換了
Arduino把底層介面包裝成一致性的介面,讓LED一閃一閃亮晶晶變得無比簡單。他整體的體驗還包括一致編輯器,程式庫下載器,除錯器。邏輯是Arduino規定了工具的操作介面,由廠商或熱心開發者配合Arduino的邏輯,加入生態(用的人多!)
選擇Arduino代表放棄某些彈性,換來輕易上手的介面。很多應用,或是製作原型,真的不需要搞清楚所有細節,這些細節真的多到很靠腰啊...
[ESP32-C3 + Arduino IDE]
下載Arduino IDE,很快就在ESP32-C3跑起Blinky範例。官網最新版(2022/9/17)很乾脆的說,ESP32-C不支援Debugger。這當然是假的,專做debugger軟體,visualgdb就有給出範例
正確的翻譯是:ESP32-C當然能用JTAG debugger,只是廠商還沒把介面修改成Arduino IDE認可的樣子,所以不能用
[JTAG原理/ Debugger原理]
JTAG硬體實作和scan chain有莫大的關聯,底下有段我發佈在PTT的心得是ARM7的紀錄,現代CPU應該沒這麼做了;大家可以讀一下,JTAG本身沒什麼神秘之處
程式build完產生執行檔,除錯軟體解析執行檔,載入到記憶體開始執行。上述的visualgdb,或是Arduino內建的debugger,或是platformIO都能做到,並沒有特別之處。現在的差異只剩下:Arduino IDE裡面的debugger,還沒人接上ESP32-C3
[ESP32-C + PlatformIO + Arduino]
在PlatformIO裡要架起Arduino倒是意想不到的簡單,基本上和上一篇幾乎一樣,差異只有framework = arduino這行。底下的範例也同時產生Release/ Debug兩種組態。照著一般build flow跑,然後就能debug了
隨便寫個軟體試試看,確實是看到一閃一閃亮晶晶,也能設定斷點
[Re-Think Arduino]
Arduino IDE吸引大量開發者,提供簡單好用的開發板管理,程式庫管理,方便的除錯器,省去安裝toolchain的麻煩;PlatformIO應該也能做到一切,黑暗執行緒似乎打算轉檯了
理論上也能平常開發都在Arduino IDE,拿PlatformIO來當debugger使用
我猜兩個開發工具都會繼續活著,持續發展。想看到更多細節的開發者,有可能被吸引到PlatformIO
[Serial Print], 2022/10/02更新
在Arduio上,如果要透過內建的USB port印東西,需要在platformIO新增幾個compile option,初始化Serial port不用塞數baud rate。工程樣板也已經更新了
[JTAG原理]
現代 IC 在設計時, 會在輸出入的地方加入 flip flop
這個 Flip flop 可以用來阻擋IC輸出/外界輸入
進而做到, 隔離 IC 的功能
這裡講的 IC 不一定是整顆包起來的晶片, 也可以是 IC 內部的 module
運用加 flip flop 的方法, 可以把一整個 module 輸出入隔離開來...
----
這些 flip flop 還可以串起來, 一個串一個, 這樣做用途多多
串起來的 flip flop 叫做 shift-register
這個結構很有意思, 只要灌 clock 給這堆 flip flop
shift-register 的資料就可以被敲出來
反過來說, 我們想要的資料也可以敲進去
這個結構有個專業的名詞: scan chain
scan chain可以拿來測試 IC/module
舉例來講, 我們可以把輸入灌到某條 scan-chain
這條 scan-chain 正好是 IC 的輸入, 看到了嗎, 我們可以自行決定輸入
反過來講, scan-chain也可以把 IC 的輸出敲出來
所以剛剛打進去的輸入, 產生的輸出, 就可以用這招再敲出來 !!
----
以 ARM7 的 CPU 來講, CPU會存取的 data bus 上, 正好就有條 scan-chain 經過
如果我們想知道 register R0 的內容, 可以把下面這道指令塞到 scan chain 上...
str R0, [R10]
這個指令會把 R0 的內容寫到 R10 指向的記憶體
CPU 會去執行這道指令, 但在 debug 模式時, CPU 被隔離, 沒辦法存取到記憶體
上面這道指令只為了讓 R0 的內容出現在 scan-chain 上
看CPU 的結構, R0 可能要一兩個 cycle 以後才會出現
這時候可以再塞一些 NOP 指令給 CPU 泡茶聊天...
等資料出現在 scan chain 時, 再敲 clock 就可以讀出 register R0 內容了
這個方法真的是, 很巧妙啊 !!
類似的技巧可以組合出, 讀寫記憶體, 讀寫 CPU 暫存器
----
實際看 JTAG 的文件, 還會包涵一張 state machine 的圖
除非有打算做 ICE, 不然知道 JTAG 的根本原理是用 scan-chain 做壞事就可以了 XD
ARM7 的文件有提到, 他的 scan chain 位在 CPU 哪裡
以及嵌入的 debug unit 怎麼用 scan chain 操作
瞭解 ICE 的根本原理, 其實很有意思的 :)
--
非專業讀書心得, 有錯請更正, 感謝 :)
留言