找工作準備02 - 嵌入式相關

1.大小端與其檢測方法

大端(存儲)模式:是指一個數據的低位字節序的內容放在高地址處,高位字節序存的內容放在低地址處。

小端(存儲)模式:是指一個數據的低位字節序內容存放在低地址處,高位字節序的內容存放在高地址處。(可以總結爲“小小小”即低位、低地址、小端)

注意這裏說的都是含有字節序的類型的變量,比如int。 而char類型的變量就不能用來檢測,因爲它就一個字節,根本不存在字節序的概念,想檢測也檢測不了。例,一個int型數據0x12345678,它的大小端存放方式分別爲:

地址 大端數據 小端數據
0x200000004 0x78 0x12
0x200000003 0x56 0x34
0x200000002 0x34 0x56
0x200000001 0x12 0x78

檢測方法

方法1. 使用指針

#include <stdio.h>
int main()
{
    int i = 1;
    char *a = (char *)&i;
    if(*a == 1)
        printf("小端\n");
    else
        printf("大端\n");
    return 0;
}

方法2. 使用聯合體

int Check_Sys()
{
    union
    {
        int i;
        char c;
    }un;
    un.i = 1;
    return un.c;//如果是小端返回1,如果是大端返回0
}

int main()
{
    if(Check_Sys())
        printf("小端\n");
    else
        printf("大端\n");
    return 0;
}

2. 對寄存器某一位操作

嵌入式系統總是要用戶對變量或寄存器進行位操作。給定一個整型變量a,寫兩段代碼,第一個設置a的bit 3,第二個清除a 的bit 3。在以上兩個操作中,要保持其它位不變。【程序員面試寶典
對這個問題有三種基本的反應
1)不知道如何下手。該被面者從沒做過任何嵌入式系統的工作。
2) 用bit fields。Bit fields是被扔到C語言死角的東西,它保證你的代碼在不同編譯器之間是不可移植的,同時也保證了的你的代碼是不可重用的。我最近不幸看到 Infineon爲其較複雜的通信芯片寫的驅動程序,它用到了bit fields因此完全對我無用,因爲我的編譯器用其它的方式來實現bit fields的。從道德講:永遠不要讓一個非嵌入式的傢伙粘實際硬件的邊。
3) 用 #defines 和 bit masks 操作。這是一個有極高可移植性的方法,是應該被用到的方法。最佳的解決方案如下:

#define BIT3 (0x1 << 3)
static int a;

void set_bit3(void) 
{
    a |= BIT3;
}
void clear_bit3(void) 
{
    a &= ~BIT3;
}

一些人喜歡爲設置和清除值而定義一個掩碼同時定義一些說明常數,這也是可以接受的。我希望看到幾個要點:說明常數、|=和&=~操作。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章