[問題] 列舉型別enum

作者: zzss2003 (brotherD)   2017-08-30 18:05:50
hi,各位好。小弟在看header file的時候看到以下定義:
* enum CAN_TX_MSG_FLAGS
*
* This enumeration values define flags related to transmission of a
* CAN message. There could be more than one this flag
* ANDed together to form multiple flags.
enum CAN_TX_MSG_FLAGS
{
CAN_TX_PRIORITY_BITS= 0b00000011,
CAN_TX_PRIORITY_0 = 0b11111100, // XXXXXX00
CAN_TX_PRIORITY_1 = 0b11111101, // XXXXXX01
CAN_TX_PRIORITY_2 = 0b11111110, // XXXXXX10
CAN_TX_PRIORITY_3 = 0b11111111, // XXXXXX11
CAN_TX_FRAME_BIT = 0b00001000,
CAN_TX_STD_FRAME = 0b11111111, // XXXXX1XX
CAN_TX_XTD_FRAME = 0b11110111, // XXXXX0XX
CAN_TX_RTR_BIT = 0b01000000,
CAN_TX_NO_RTR_FRAME = 0b11111111, // X1XXXXXX
CAN_TX_RTR_FRAME = 0b10111111 // X0XXXXXX
};
不太能意會這一小段程式碼與註解的關係。
This enumeration values define flags related to transmission of a CAN message.
There could be more than one this flag ANDed together to form mutiple flags.
請問這兩句話是什麼意思?
據我所知flag不就是一個bit?如果bit預設是0,由於觸發了某個動作,經由硬體觸發此bit
使它變成1。所以programmer可以利用此flag去判讀動作觸發了沒。
但enum裡面的識別字的值不是我們自己定義的嗎?定義完後就是定值了吧?還可以當flag使
用嗎?
以CAN_TX_PRIORITY_0為例子。為什麼要把值定義成0b11111100,不能定義成0b00000000呢
?註解後面用X表示不就是代表可以為0或者1嗎?
接著,列舉裡面的識別字跟其他識別字作and。是指什麼意思呢?
舉個例,CAN_TX_PRIORITY_BITS跟CAN_TX_PRIORITY_0做and後,會變成0b00000000,這代
表甚麼意思呢?
謝謝各位指點。
作者: TWkobe (中華柯比)   2017-08-30 18:28:00
定義成0b11111100只是因為剛好CAN_TX_PRIORITY_BITS只要兩個bit 他只是剛好其中一個組合....
作者: F04E (Fujitsu)   2017-08-30 18:28:00
這應該是CAN Bus吧... 0b是binary,所以flag是8bitpriority只用的bit0和bit1
作者: TWkobe (中華柯比)   2017-08-30 18:30:00
你對他作and不就是代表你讓TX得priority設為0?
作者: MOONRAKER (㊣牛鶴鰻毛人)   2017-08-30 18:32:00
你把 CAN_TX_PRIORITY_2 CAN_TX_XTD_FRAME and起來不就有意思了 那些BITS和PRIORITY_BITS是mask 取出值用的
作者: TWkobe (中華柯比)   2017-08-30 18:34:00
MOONRAKER大說得精準, 請依照他的說法為準XD
作者: chuegou (chuegou)   2017-08-30 18:47:00
就是mask
作者: steve1012 (steve)   2017-08-30 22:46:00
不就是flag 跟mask嗎...定值跟不能當flag的關聯是?
作者: longlongint (華哥爾)   2017-08-31 01:05:00
不同系列的值可以 and 起來做組合然後名稱帶 BIT 是拿來做檢查 on/off 用的 mask填 1 做 and 的時候才不會影響別人
作者: james732 (好人超)   2017-08-31 13:24:00
其實我不太懂這裡為什麼要用enum用#define或const應該也都可以
作者: enonrick (EnonRick)   2017-08-31 14:45:00
#define,const可以,但SoC上效率/空間至上bit wise比 if 更有效率,以該例只需要用到1byte就可以定三種flags,才是最有效率的作法更正,是4bytes
作者: F04E (Fujitsu)   2017-08-31 15:14:00
呃... 這個例子是1byte
作者: Lipraxde (Lipraxde)   2017-08-31 16:36:00
用enum好處是可以讓compiler幫忙做型別檢查,不過好像要看compiler的樣子
作者: james732 (好人超)   2017-08-31 20:03:00
型別檢查的話用const int也可以做到一樣的效果吧?我想enum的好處是閱讀的人能一眼看出這些是同一件事(?)
作者: stucode   2017-08-31 20:48:00
這是普通的flag及mask用法 但它稍微反過來做他的flag是0不是1 沒有set的位元必須是1所以CAN_TX_PRIORITY_0前面才都是1不是0並且用AND來combine flags 而不是一般的OR我想就是那句話要表達的意思
作者: enonrick (EnonRick)   2017-08-31 21:27:00

Links booklink

Contact Us: admin [ a t ] ucptt.com