全球旧事资料 分类
S等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。1一个参数既可以是co
st还可以是volatile吗?解释为什么。2一个指针可以是volatile吗?解释为什么。3下面的函数有什么错误:i
tsquarevolatilei
tptrretur
ptrptr下面是答案:1是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是co
st因为程序不应该试图去修改它。2是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。3这段代码的有个恶作剧。这段代码的目的是用来返指针ptr指向值的平方,但是,由于ptr指向一个volatile型参数,编译器将产生类似下面的代码:i
tsquarevolatilei
tptri
tabaptrbptr
fretur
ab由于ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:lo
gsquarevolatilei
tptri
taaptrretur
aa
位操作(Bitma
ipulatio

9嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit3,第二个清除a的bit3。在以上两个操作中,要保持其它位不变。
对这个问题有三种基本的反应1不知道如何下手。该被面者从没做过任何嵌入式系统的工作。2用bitfields。Bitfields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间是不可移植的,同时也保证了的你的代码是不可重用的。我最近不幸看到I
fi
eo
为其较复杂的通信芯片写的驱动程序,它用到了bitfields因此完全对我无用,因为我的编译器用其它的方式来实现bitfields的。从道德讲:永远不要让一个非嵌入式的家伙粘实际硬件的边。3用defi
es和bitmasks操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:defi
eBIT30x13statici
tavoidset_bit3voidaBIT3voidclear_bit3voidaBIT3一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。我希望看到几个要点:说明常数、和操作。
访问固定的内存位置(Accessi
gfixedmemorylocatio
s)
10嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一r
好听全球资料 返回顶部