C_and_CPP 板


LINE

※ 引述《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://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1587287479.A.EB0.html
1F:推 LiloHuang: 任何東西存在都有它的意義,這篇文章的見解比較客觀 04/19 17:22
2F:推 qscgy4: 能不能舉個bit operation的題目來看看? 04/19 19:54
3F:→ LiloHuang: https://leetcode.com/tag/bit-manipulation/ 04/19 20:08
4F:→ nevak: 其實應該就大家能想到最簡單的,set/clr某個bit,台清交成 04/19 23:24
5F:→ nevak: 資工系全部都掛掉過,我也是到那時知道,很多就算資工系畢 04/19 23:24
6F:→ nevak: 業的人,也沒寫過 | 或者是& 04/19 23:24
7F:推 Schottky: 推 04/20 00:54
8F:→ Schottky: 成大資工也掛掉過?我好像聽成大的同學們說過 jserv 相 04/20 00:57
9F:→ Schottky: 當重視特訓大家的 bit operation 熟練度 04/20 00:57
10F:推 LPH66: 特訓是一回事, 能懂是另一回事... 04/20 04:13
11F:→ LPH66: 我在的某群組裡有個現在正在修他的課的學生 04/20 04:27
12F:→ LPH66: 從他每周貼作業的感覺來看好像也不是很好地掌握這些東西.. 04/20 04:27
13F:→ hsnuyi: 去刷個LC 或是寫個verilog就會懂bit op了 04/20 11:18
14F:→ MasterChang: 因為難懂,所以逃避,可以理解。 04/20 12:09
15F:→ MasterChang: 試過XC8可以編過,可能原PO是lite版的關係。 04/20 12:11
16F:→ Lipraxde: 我查了 XC8 C Compiler User's Guide for PIC,原 Po 04/20 17:39
17F:→ Lipraxde: 所看到的錯誤訊息應該是 Appendix B 中的 (741) bitfie 04/20 17:39
18F:→ Lipraxde: ld too large ... ,裡面有說明 bitfield 的位元數不能 04/20 17:39
19F:→ Lipraxde: 超過 8,跟是不是 Lite 版應該沒有關係? 04/20 17:39
20F:推 ucrxzero: 請問網路遮罩也算是一種應用嗎 04/20 19:11
21F:→ protoss: 是啊~資工沒修過網路也是蠻神奇的... 04/20 23:23
22F:推 ando5566: 我是原po我是用1.45 pro版 04/25 19:46
23F:推 ando5566: 用pragma pack(1)也沒編譯成功,已經硬改code把專案 04/25 19:49
24F:→ ando5566: 完成了,一個pic18 的mcp2517 spi to CANFD的driver api 04/25 19:49
25F:推 ando5566: #pragma pack 1 有效 04/26 13:30







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP