Re: [問題] porting issue(32bits-->8bits)
※ 引述《galic (嘎利)》之銘言:
: ※ 引述《ando5566》之銘言:
: : 各位版友日安,
: : 最近小弟要將32bits平台的CAN protocol API, porting 至8bits平台上,
: : 遇到了一個問題, 如下:
: ...
: : 但是因為我的原意是porting, 所以我不希望影響任何其他寫法,
: ^^^^^^^
: : 嘗試過使用union的作法, 但是仍會面臨無法使EID定址在第12bit的問題。
: : 想請教版上高手, 有其他方法嗎?
: : 謝謝!
: 我不知道這篇為什麼沒有人回正解...
: 在我唸書的時候
: 記得老師曾經說過「C 的 bit-fields 不要亂用」
: 尤其是在涉及 memory format (layout) 相關操作的時候
: 像是 network package 的格式、操作 CPU registers …
: 一開始覺得沒什麼
: 但後來真的有看過用 C 開發的 http APIs 竟然用 bit-fields 來 mapping 封包
: 也看過 Arduino 的教學文件竟然是用 bit-fields 在操作 LED 燈和 GPIO
: 所以我覺得推文只要一句「bit-fields 不要亂用」
: 應該就足夠了
: 不然,
: 問 google 也會給你答案
: `c bit fields portability' 或 `bit fields portability'
: 有趣的是,差一個 C 搜出來的會是不同答案
: 不過觀點是一致的
: 總之,你需要的是透過 bit manipulation 來操作
: (有時候打包成 macro 會直接叫 bitmask, bitset 或 bitops....)
: ref: https://stackoverflow.com/a/263738
先講結論...
1. bit-field 真的滿難用的
2. 原Po的問題,以C standard來看,我是找不到可以只改declaration不改其他code完成
porting的方法....
====
以下來自於C11 standard關於bit-field的章節
Section 6.7.2.1 paragraph 5 提到,Bit-field只能用在_Bool, signed int,
unsinged int以及其他implementation defined的型態上。先撇開_Bool不談,
signed int以及unsigned int 在 section 5.2.4.2.1 中提到必須至少是16-bit。
因此原po提到bit-field width 11 編譯不過,很可能是這compiler根本不合standard
不過8-bit compiler這種事也很常見,希望他有在說明書中寫清楚就是了
再來是Section 6.7.2.1 paragraph 11提到,implementation可以自由選擇allocate任意
addressable storage unit來裝bit-field,只要足夠大就可以了,後面雖然有加一個補
充說如果還有空間,緊鄰的下一個bit-field應該被放到同一個storage unit,但最後又
補一句說,同一個unit裡假如放了多個bit-field,它們的順序,是implementation
defined
簡單來說,假如我們定了一個總長32bit的一組bit-fields,分別是5bit, 9bit, 14bit,
4bit,首先standard並不保證這四組bit-fields會緊鄰再一起塞在一個32-bit的storage
unit中,第二就算它們緊鄰在一起,也不能保證他們的順序就是5,9,14,4
bit-field在多數情況下確實是好用,只要能夠確定compiler的行為,比方說透過
各種pragma去限制,用bit-field也沒什麼不好 ,而用bit-field會讓code porting到不同
平台上的難度變高,這個也是肯定的
最後如果我是老師,面對大一資工系剛接觸C code的學生們,我應該也會選擇跟他們說
bit-field暫時不要用,先學好bit operation比較重要。第一個避免用bit-field踩到洞
,第二個bit operation是許多公司的面試必考題,根據我以前在某晶片廠面試的經驗
bit operation非常意外地可以刷掉很多名校並且成績不錯的人。我只是希望以後減少因
為bit operation被刷掉的人,真的滿可惜的。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.231.44.180 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1587287479.A.EB0.html
推
04/19 17:22,
5年前
, 1F
04/19 17:22, 1F
推
04/19 19:54,
5年前
, 2F
04/19 19:54, 2F
→
04/19 20:08,
5年前
, 3F
04/19 20:08, 3F
→
04/19 23:24,
5年前
, 4F
04/19 23:24, 4F
→
04/19 23:24,
5年前
, 5F
04/19 23:24, 5F
→
04/19 23:24,
5年前
, 6F
04/19 23:24, 6F
推
04/20 00:54,
5年前
, 7F
04/20 00:54, 7F
→
04/20 00:57,
5年前
, 8F
04/20 00:57, 8F
→
04/20 00:57,
5年前
, 9F
04/20 00:57, 9F
推
04/20 04:13,
5年前
, 10F
04/20 04:13, 10F
→
04/20 04:27,
5年前
, 11F
04/20 04:27, 11F
→
04/20 04:27,
5年前
, 12F
04/20 04:27, 12F
→
04/20 11:18,
5年前
, 13F
04/20 11:18, 13F
→
04/20 12:09,
5年前
, 14F
04/20 12:09, 14F
→
04/20 12:11,
5年前
, 15F
04/20 12:11, 15F
→
04/20 17:39,
5年前
, 16F
04/20 17:39, 16F
→
04/20 17:39,
5年前
, 17F
04/20 17:39, 17F
→
04/20 17:39,
5年前
, 18F
04/20 17:39, 18F
→
04/20 17:39,
5年前
, 19F
04/20 17:39, 19F
推
04/20 19:11,
5年前
, 20F
04/20 19:11, 20F
→
04/20 23:23,
5年前
, 21F
04/20 23:23, 21F
推
04/25 19:46,
5年前
, 22F
04/25 19:46, 22F
推
04/25 19:49,
5年前
, 23F
04/25 19:49, 23F
→
04/25 19:49,
5年前
, 24F
04/25 19:49, 24F
推
04/26 13:30,
5年前
, 25F
04/26 13:30, 25F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 4 篇):