#define sreg (*(volatile unsigned char *)0x5f)
這樣的定義,總是感覺很奇怪,不知道為什麼,今天終於有了一點點心得
定義volatile是因為它的值可能會改變,大家都知道為什麼改變了;
如果在乙個迴圈操作中需要不停地判斷乙個記憶體資料,例如要等待sreg的i標誌位置位,因為sreg也是對映在sram空間,為了加快速度,編譯器可能會編譯出這樣的**:把sreg讀取到register中,然後不停地判斷register相應位。而不會再讀取sreg,這樣當然是不行了,因為程式或其它
事件(中斷等)會改變sreg,結果很可能是乙個死迴圈出不來了。
嵌入式系統程式設計,要求程式設計師能夠利用c語言訪問固定的記憶體位址。
所以知道要訪問的記憶體位址後,比如0x5f
第一步是要把它強制轉換為指標型別(volatile unsigned char *)0x5f
volatile(可變的)這個關鍵字說明這變數可能會被意想不到地改變,這樣編譯器就不會去假設這個變數的值了。這種「意想不到地改變」,不是由程式去改變,而是由硬體去改變——意想不到。
第二步,對指標變數解引用,就能操作指標所指向的位址的內容了
*(volatile unsigned char *)0x5f
第三步,小心地把#define巨集中的引數用括號括起來,這是乙個很好的習慣
所以#define sreg (*(volatile unsigned char *)0x5f)
類似的,如果使用乙個32位處理器,要對乙個32位的記憶體位址進行訪問,可以這樣定義#define ram_addr (*(volatile unsigned long *)0x0000555f)
然後就可以用c語言對這個記憶體位址進行讀寫操作了
讀:tmp = ram_addr;
寫:ram_addr = 0x55;
ubuntu 16 04 系統環境變數讀取的探索
最近在ubuntu系統中做乙個關於程式開機自啟動的問題 由於環境變數在不同的執行模式下讀取的流程不一樣,導致在伺服器開機重啟後執行既定程式找不到相應的環境變數錯誤 這裡做一篇部落格來 一下環境變數的讀取過程 首先,要明確幾個概念,登入型shell和非登入型shell,互動型shell interac...
探一探快應用的虛實
根據官方的說法,快應用是基於手機硬體平台的新型應用形態,標準是由主流手機廠商 小公尺 華為 中興 金立 聯想 魅族 努比亞 oppo vivo 組成的快應用聯盟聯合制定的 快應用標準的誕生將在研發介面 能力接入 開發者服務等層面建設標準平台,並且是以平台化的生態模式對個人開發者和企業開發者全品類開放...
mysql嗅探 關於資產發現 嗅探法
最近在忙於整理資產管理這個模組,說起資產管理可能是每個相關的安全產品都需要實現的功能模組,但是無論從bs7799還是iso27001抑或是其他標準來理解 資產 的定義範圍都過於寬泛,我在系統建設之初於使用者需求文件裡這樣定義 本系統所有涉及資產的定義為 帶ip的硬體裝置及其上面執行的應用程式和服務。...