一般地,在Linux或者其他操作系统中,一个模块都有一个总入口和多个具体的接口集,例如驱动、中间件等。上层应用调用总入口,并传递具体接口对应的命令号cmd和具体的接口参数,总入口负责分发调用具体的接口来实现。那么,总入口会有以下声明形式:
Drv_entry(uint8_t cmd, void*,void*,void*);
Drv_entry(void*, void*,void*, uint8_tcmd);
两者的不同,就在于cmd的位置不同,那么两者哪种声明比较好呢?如果你能立刻做出正确的选择,那么你的嵌入式软件功底是蛮不错的。如果不能,那说明你还需要好好努力。
这个问题跟ABI和编译优化有关,可以先思考,答案放文章最后。
一、ABI
API是应用编程接口,是高级语言接口。而ABI是应用二进制编程接口,在C和汇编语言混合编程中必须要非常熟练,尤其在操作系统的定制和优化里面常常需要注意和运用。纯C编程虽然可以不用在意ABI,但不熟悉会造成程序性能下降。
ABI要解决的问题包括:1.参数如何传递和返回,不同的参数类型,一个或者多个传参 2. 参数传递过程中对栈、寄存器的利用。
ABI是一种编译约定,并不是CPU对软件的强制规定。有一个寄存器例外,就是PC寄存器。编译器必须要使用CPU指定的寄存器作为PC寄存器。
二、ATPCS
ARM体系的ABI。