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
的確是編譯成 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 上是:
之前在如何撰寫 Arduino Library , 和 Arduino 加入 RTOS 時, 有稍微提起.
前篇: 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 就不會特別去做運算了.
這樣 compiler 就不會特別去做運算了.
可以參考這篇 Arduino 的範例 : String to Int Example
也許有人會說, 我們把 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 時, 有稍微提起.
留言
張貼留言