最近一直在看ARM9编程,买了一块开发板,卖开发板的商家和我说,“板子不跑Linux,那就不叫嵌入式编程”。我听了之后很是纳闷,那以前学的是什么?不都白学了。
已经研究嵌入式Linux编程有一段时间了,慢慢的有点明白了嵌入式Linux编程方法和思想,但是不能窥其全貌,就在今天下午,慢慢的理解了一个知识点,写下来和大家分享。 在嵌入式Linux编程中,有个非常重要的函数叫做:ioctl(),上面一篇**已经把ioctl()中的定义命令的头文件展现给大家了,很多人会觉得很烦人,一堆宏定义,而且要这个有什么用,其实笔者一直也这样想,真是烦人,最重要的是不会用,要这个定义命令的宏来干嘛? 今天在调试一个程序的时候(都是大牛写好的,我等菜鸟只能一边看大牛的程序,一边学习),看到了这个定义,结合以前看的视频,总算明白了它的用处,让我们先看点代码: [cpp] view plain copy
- #define DTUCTRL_POWER _IOW('h', 0x01, unsigned long) /* cdma power */
关于IO之类的宏定义就不详细说明了,这里定义了一个命令,DTUCTRL_POWER,它后面那一串是什么呢?没事我们把它打印出来:
[cpp] view plain copy
- printf("DTUCTRL_POWER----%x\n",DTUCTRL_POWER);
打印结果:DTUCTRL_POWER----40046801
或许一个大家看不出是什么意思,没事,我又定义了几个命令:
[cpp] view plain copy
- #define DTUCTRL_RESET _IOW('h', 0x02, unsigned long) /* cdma reset */
- #define DTUCTRL_ONOFF _IOW('h', 0x03, unsigned long) /* cdma on/off */
- #define DTUCTRL_SYSTEM _IOW('h', 0x04, unsigned long) /* cdma system run */
- #define DTUCTRL_SYSTEM_TOGGLE _IO('h', 0x05) /* system run trigger */
并且依旧把他们都打印出来,结果如下:
DTUCTRL_RESET----40046802
DTUCTRL_ONOFF----40046803
DTUCTRL_SYSTEM----40046804
DDTUCTRL_SYSTEM_TOGGLE----6805
聪明的你或许已经看出来,那些乱的很的IO命令到底有什么用,没错,它就是帮我们定义个命令码,以前我们变成的时候,完全可以从0x01,0x02...这样往后定义命令,命令少还可以,如果多的话,就会混在一起,到时候连自己都分不清,而运用这个宏定义,就可以清晰的去定义命令,通过上一篇**可以知道,Linux将命令32位分成了几个段,每个段赋予不同的值,在通过IO之类的宏定义,生成一个不会重复,而且非常好记的命令
这就是IO这些命令的作用:产生命令码字!按照一定的规律,保证整个系统命令不乱
|