mbed 的这种开发方式还是很新颖的,只用了几分钟的时间我就已经把第一个程序运行起来了。而作为用户,不用了解 ARM 芯片的任何知识,也不用了解编译器的相关概念,甚至在自己电脑上都不用安装任何新软件。所有的开发都可以通过浏览器完成,所有硬件的细节都被抽象成了用户 API,非常适合刚刚接触嵌入式的人士使用。
个人认为 mbed 比较适合高中生或者业余非专业人员使用,而对于专业嵌入式开发者可能会觉得它隐藏了太多的细节,更像一个玩具而不是一个开发工具。或者换句话说,专业人士如果使用 mbed,有一天碰见了一个高中生,那个高中生说:“我用的也是这个”,这或多或少会让专业人士少了些神秘感,甚至感觉有点“丢份”。就像一个 Linux Hack,要么只用 terminal,要么就使用一个平铺的窗口管理器,总之必须满屏幕是字符才会让他觉得有真正黑客的自尊。
I see nothing wrong here. C integer promotion rules require the P4 value to be upcast to an int and then have its bits inverted. And after that the resulting int is shifted down. Didn't you get a warning about the ~ operator having strange effects on operands smaller than int?
To get what you probably expected, you should either cast the ~P4 value back to unsigned char or assign it to an intermediate unsigned char variable and shift that down in a second operation.
可惜当时我仍然没有立刻领会了这段话的含义,又经过了几次实验才最终搞清楚。在进行 ~P4 » 4 这个运算的时候,由于第一个取反之后还要进行其它的运算,所以必须在运算前提高 P4 的精度,对于前面的实例,P4 的值将在运算前变成 int 类型,在 C51 的环境中就是 0x000F,然后取反再右移就得到了 0xFFFF(包含符号位扩展),重新赋值给 P4 才使得它最终成为 0xFF。而这种行为是符合 C 语言的标准的,也就是说 Keil C 的行为不符合标准。
没过几天,我正好翻看 Linden 的 Expert C Programming,结果也看到了对 integer promotion 的分析,看来我的 C 语言知识还需要再补充一些。BTW,Linden 的这本书真的是非常的精彩,信息量很大,而且讲述也很有趣,非常推荐大家阅读。