簡體   English   中英

嵌入式C:var = 0xFF是什么; 做?

[英]Embedded C: what does var = 0xFF; do?

我是第一次使用嵌入式C語言。 雖然我的C是生銹的,但我可以閱讀代碼,但我並沒有真正理解為什么某些行是這樣的。 例如,我想知道變量是true還是false並將其發送回另一個應用程序。 原始實現者不是將變量設置為1或0,而是選擇0xFF。

他試圖將它設置為地址空間嗎? 或者為什么將布爾變量設置為255?

0xFF設置char中的所有位。

最初的實施者可能會認為,標准的01還不夠好,並決定,如果所有的位假的 ,那么所有的位真實的

這是有效的,因為在C中任何0以外的值都是真的。 雖然這將設置char中的所有字節,但它也適用於任何其他變量類型,因為在變量中設置的任何一個位都使其成立。

如果你迫切需要內存,你可能想要在一個字節中存儲8個布爾值(或者在一個字節中存儲32個,或者其他)

這可以通過使用標志掩碼輕松完成:

  // FLAGMASK = ..1<<n for n in 0..7...
  FLAGMASK = 0x10;    // e.g. n=4

  flags &= ~FLAGMASK; // clear bit
  flags |= FLAGMASK;  // set bit
  flags ^= FLAGMASK;  // flip bit
  flags = (flags & ~FLAGMASK) | (booleanFunction() & FLAGMASK); // clear, then maybe set

這僅在booleanFunction()返回0(所有位清零)或-1(所有位設置)時有效。

這些年輕人,他們知道什么?

在一種原始的嵌入式語言中 - PL / M(-51是,如8051,-85,-86,-286,-386) - 邏輯運算符之間沒有區別(!,&&,||在C中)和按位(〜,&,|,^)。 相反,PL / M有NOT,AND,OR和XOR處理這兩個類別。 我們最好有兩個類別嗎? 我不確定。 但我錯過了C中的邏輯^^運算符(xor)。 不過,我想我可以在C中構建程序,而不必涉及邏輯類別。

在PL / M中,False定義為0.布爾值通常用字節變量表示。 True定義為NOT False,它將為您提供0ffh(C的0xff為PL / M-ese)。

為了查看狀態標志進位的轉換是如何在一個字節中存儲的(布爾值不能作為類型)變量,PL / M可以在存儲之前使用匯編指令“sbb al,al”。 如果設置了進位,則al將包含0ff,如果不是,則包含0h。 如果需要相反的值,PL / M將在sbb之前插入“cmc”或在之后附加“not al”(實際上是xor - one或其他)。

因此,TRUE的0xff是PL / M的直接兼容端口。 必要? 可能不是,除非你不確定你的技能(在C中)並且玩它超級安全。

就像我一樣。

PL / M-80(用於8080,8085和Z80)不支持整數或浮點數,我懷疑PL / M-51也是如此。 PL / M-86(用於8086,8088,80188和80186)增加了整數,單精度浮點,段:偏移指針和標准內存模型小,中,緊湊和大。 對於那些如此傾向的人來說,有一些特殊的指令來創建自己動手的混合記憶模型。 微軟巨大的內存模型相當於英特爾的大型內存。 MS還提供小型,小型,緊湊型,中型和大型型號。

0xFF是〜0的十六進制表示(即11111111)

例如,在VB和Access中,-1用作True。

通常在嵌入式系統中,有一個程序員編寫所有代碼,他/她的特性遍及整個源代碼。 許多嵌入式程序員都是硬件工程師,他們必須盡可能地運行系統。 沒有要求也沒有“便攜性”的概念。 嵌入式系統中的另一個考慮因素是編譯器特定於CPU HW。 請參閱此CPU的ISA並檢查“boolean”的所有用法。

正如其他人所說,它將所有位設置為1.由於這是嵌入式C,您可能會將其存儲到寄存器中,其中每個位對於某些內容都很重要,因此您希望將它們全部設置為1.我知道我做了在匯編語言寫作時類似。

了解這個問題真正重要的是“var”的類型。 你說“boolean”,但它是C ++ / C99的bool,還是它(很可能是一個嵌入式C應用程序),一種完全不同的類型被用作布爾值?

同時將1添加到0xff會將其設置為0(假設為無符號字符),並且檢查可能已經處於循環中並且具有遞增的中斷。

這是一個可能的原因: 0xff0的二進制補碼。 可能在您的嵌入式架構中,將0xff存儲到變量中比存儲(例如1 )更有效,這可能需要額外的指令或存儲在內存中的常量。

或者,檢查架構中寄存器“真值”的最有效方法是使用“檢查位設置”指令。 使用0xff作為TRUE值,檢查哪個位無關緊要......它們都已設置。

當然,上面只是猜測,不知道你正在使用什么樣的嵌入式處理器。 8位,16位,32位? PIC,AVR,ARM,x86 ???

(正如其他人所指出的,出於C中布爾表達式的目的,除0以外的任何整數值都被視為TRUE。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM