Exceptions in C with Longjmp and Setjmp 這篇文章已經把標題解釋完了, 要理解該篇文章, 需要瞭解 setjmp/longjmp 的使用方式。
那 ... 我要寫些什麼呢?
文章的 macro 可能會讓你不好理解 (我也是), 所以我列出了展開 macro 的程式碼, ex.c L25 ~ 59 的 f1 就是這樣的展現。很正常的 c 程式碼, 一點也不令人害怕, 但是一看 f2, 就會覺得神奇, 而 f1, f2 是一樣的東西, 只不過 f2 用 macro 包裝起來。
另外那個 FINALLY 的版本很神奇的把 while(1) 放到 case 0 裡頭, 真是厲害。
使用類似 exception 的錯誤處理有什麼好處呢? 你是不是覺得每次都要去檢查 malloc 的傳回值很麻煩, 希望有錯的時候丟出 exception 就好了, L13 的 mymalloc 就是在模擬這樣的行為, 這樣就不用每次都去檢查 malloc 是不是傳回 NULL 了。
z.c L12 的 while(1) 真是神奇的用法, 我都不知道要怎麼排版了。
獲得此技能後, 我稍微改寫了
bare metal programming for stm32f4 - discovery: using c++ std::vector 的 class my_allocator, 讓它在要不到記憶體時, 丟出 exception, 其實就只是發動 longjmp 而已, 真的沒什麼了不起。
順道題一下 g++5, g++4 的小差異, 還有 float 是 hard/soft 對編譯程式碼的影響。
g++ 5 產生的 text 部份很大, 我猜測是 g++ 搭配的 c++ library 其 vector 程式碼變大了, 這已經影響到我能用的空間了。
原本是
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 128K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
}
改成
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 1280K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 1280K
}
才能產生出 elf 執行檔。
stm32 的 flash 和 ram 很小, 塞不下了。
descent@debian64:myvec$ size myvec.elf.gcc51.fp_hard myvec.elf.gcc51.fp_soft myvec.elf.gcc48
text data bss dec hex filename
475426 1501 91889 568816 8adf0 myvec.elf.gcc51.fp_hard (64 bit arm gcc 51)
474820 1501 91889 568210 8ab92 myvec.elf.gcc51.fp_soft (32 bit arm gcc 51)
114281 2300 89961 206542 326ce myvec.elf.gcc48
不過這只是測試用的, 我從來就沒想過要把 vector 用到自己的 os 上, 有需要我會自己寫一個 vector, 又不難, 網路上就有得抄。
一開始用的 g++ 51 是 hard fp, 結果 -mfloat-abi=soft 編譯有問題, 改成 -mfloat-abi=hard 才能編過。後來重新建立一個 g++ 51 是 soft fp 的版本, -mfloat-abi=soft 就可以編過了。
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。