RTOS - 前置學習 - ARM 教材 - arduino uart input/output string int 實驗

收錄於 : 關於Ameba的一百篇
前篇: systick



在前篇 systick 中, 有介紹 Jserv 從無到有打造 IoT 的影片和相關資料.
其中有個 ARM 的教材蠻適合初學者看看的.


   1. ISA - Instruction Set Architecture

   2. MOV

   3. load/store

   4. bit banging

   ...


看到 bit banging 時,  介紹到 同樣 C 清除 bit 程式, 在 assembly 上有兩種組合.


突然想用 Arduino 做個實驗, 看他的 assembly 是否是真的用 BIC.

之前有介紹怎麼用 Arduino IDE 來實現 Assembly

這次我們可以來做一下.




Arduino 程式 : 清空 bit4~bit11


uint32_t bit_clear_mask(uint32_t value, uint32_t mask)
{
  value &= ~mask;
  return value;
}

void setup() {
  int thisByte;
  int thisMask;

  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  thisByte = 0x11223344;
  Serial.print("original data : 0x");
  Serial.println (thisByte, HEX);

  thisMask = 0x00000FF0;
  thisByte = bit_clear_mask(thisByte, thisMask);

  Serial.print("after bit clear : 0x");
  Serial.println (thisByte, HEX);


}

執行結果:



original data : 0x11223344

after bit clear : 0x11223004


我們用之前介紹 Assembly 中的方法來看看.  
找不到 bit_clear_mask() , 因為被 最佳化了, 直接在 setup() 中. 
而且 因為值固定, 現在的 compiler 聰明到直接幫妳算好答案, 放到  memory.. 
程式執行時, 直接 load memory 裡的答案.. 




所以我們改成 用 terminal 透過 usb-serial (uart) 的方式. 把要運算的值輸入, 
這樣 compiler 就不會特別去做運算了. 

可以參考這篇 Arduino 的範例 : String to Int Example


的確是編譯成 bic 呢.

也許有人會說, 我們把 optimization 關掉看看, 這樣 function 就有啦.
來做一下實驗, 原本的 Arduino 是用 -Os
( 針對 size 來做 optimization )
我們把它改成 -O0 ( 在 platform.txt 裡修改 )

結果如下: 真的跑回用 MVN + AND 的方式..



所以 GCC 的 Optimization 做的還是蠻不錯的.



PS: GCC compiler 參數, Arduino 各平台的目錄下, 都有一個 platform.txt,
      記錄要用的 compiler 參數.

      以 Ameba 為例, 路徑在 Mac 上是

      /Users/<使用者名稱>/Library/Arduino15/packages/njiot/hardware/ameba/1.2.1/ platform.txt

      以 Arduino DUE 為例, 路徑在 Mac 上是:


     /Users/<使用者名稱>/Library/Arduino15/packages/arduino/hardware

      之前在如何撰寫 Arduino Library , 和 Arduino 加入 RTOS 時, 有稍微提起.



   

留言

熱門文章