2018/6/10

Simple CM4 assembly example

最近有接觸一些 CM4 assembly,發現有些地方一開始不知道的話,很容易造成起步的困擾。

一個簡單的 as file
然後這個小範例裡就藏了幾個要注意的點。
line 1: 必須要有這行。沒有的話 compiler 會跳出奇怪的訊息,而且看不出來要加這一行。 像我碰到的就是下面這些 ,
Error: unshifted register required
Error: Thumb does not support conditional execution
Error: instruction not allowed in IT block
line 3: Must. 告訴 assembler 要用 Thumb ISA

line 6: Must. 告訴 linker 這個 label 是個 funciton,用到這個symbol 的地方都要自動使用 thumb mode,也就是要把 bit 0 設定成 1。不然就會碰到當呼叫這個 function 時就產生 Usage fault。當然,如果這不是個 function ,只是一個變數的 lable,就不用加這個了。
https://e2e.ti.com/support/microcontrollers/stellaris_arm/f/471/t/44006?Q-bit-0-of-reset-vector-must-be-1-

line 11~14: 假設想跳到某個指定的位址時,若是使用 register 來存目標位址,就必須自己assert bit 0。原因跟上一個一樣,也是很常碰到的問題。

ARM directives list
https://sourceware.org/binutils/docs/as/ARM-Directives.html

2018/6/8

CM4 usage fault when using printf

最近碰到一個狀況,當呼叫 printf 時,如果印幾個字都沒問題,但當用%d 時,就會出現 Usage fault。

程式本身很簡單,就一行

printf("%d\n", __LINE__);

就這樣,跑進去 printf 後就會跑出 Usage fault。從出問題的地方看,是 PC 跑到奇怪的地方了,讀回來的值也很怪。

想了好久,後來覺得就算真找出流程了,也很難改,況且只會在某個 task 中出錯,其他都沒有,這也太奇怪了。想來想去,只能懷疑是不是 toolchain library 用錯了?剛好就Google 到這篇,可以嘗試一下。

https://stackoverflow.com/questions/26332119/stm32-hard-faults-when-trying-to-printf-numbers-10

檢查 toolchain 後,發現目前用的 toolchain 把 v7-M 相關的東西都拿掉了,可能是之前沒用到吧。ARM v7-M 就是 CM4 使用的架構。換了另一個有 v7-M 的 toolchain 再重新編一次,跑起來就沒問題了。

有問題的:
/arm-none-eabi-lib/lib/thumb
/lib/gcc/arm-none-eabi/4.9.3/thumb
修正後:
/arm-none-eabi-lib/armv7-m
/lib/gcc/arm-none-eabi/4.8.4/armv7-m