快乐虾
http://blog.csdn.net/lights_joy/
lights@hb165.com
本文适用于
ADSP-BF561
uclinux-2008r1.5-rc3 (smp patch)
欢迎转载,但请保留作者信息
内核中大量使用container_of这个宏,用以进行数据结构的向上转换,比如这样一段代码:
static int platform_match(struct device * dev, struct device_driver * drv)
{
struct platform_device *pdev = container_of(dev, struct platform_device, dev);
return (strncmp(pdev->name, drv->name, BUS_ID_SIZE) == 0);
}
在这里struct platform_device定义为:
struct platform_device {
const char * name;
u32 id;
struct device dev;
u32 num_resources;
struct resource * resource;
};
注意,在这个结构体里面包含了一个叫device的结构体,可以将struct platform_device称为父结构体,将struct device称为子结构体。
在上述函数中,传递进来的dev指针将指向platform_device这个父结构体中的dev成员,而contianer_of这个宏的作用则在于通过这个结构体成员的指针获得其父结构体的指针,在这里就是platform_device这一结构体的指针。
要达到这一目的很容易,只要将这个成员的指针减去此成员在整个结构体内的偏移量自然就可以了。看看container_of的定义:
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embedded in.
* @member: the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
这个宏定义的第一行构建一个叫__mptr的临时变量,实际上并不是必须的,它的作用只是强制编译器对数据类型进行检查。第二行里面的__mptr实际就是子结构体成员的指针。
偏移量的计算由offsetof宏完成:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
这种方法到处都在用,没什么新奇的。
分享到:
相关推荐
这是我在STM32上移植UCLINUX的重要的参考文件
这篇文章主要讨论了bfin-uclinux-2008r1-rc8中的console实现。 适用的CPU为ADSP-BF561。 还不是很完整,仅供参考。 .......
基于ARM7TDMI的uClinux移植,44b0x
这里提供了arm和uclinux的培训的视频教程。下载下来有12g,不过里面的视频看了以后很有价值。
: 基于嵌入式 uCLinux 内核和 MiniGUI 软件平台,设计并实现了公交车站广告机的用户界面。对相应 的开发环境进行了搭建,并给出了运行环境的执行步骤。在用户界面设计中,我们采用了双缓冲技术, 对动画和滚动字幕...
uClinux内核编程
uclinux_dist开发指导,包括基本配置,如何添加用户自己的程序
嵌入式uClinux下的CAN总线设备驱动程序设计,文章条理清晰,很详细的介绍了驱动程序的编写,以及如何加载到uClinux内核中,相信对您会有所帮助.
uClinux下的一个驱动程序例子,用来熟悉驱动程序的结构和编写方法
学习bfin-uclinux内核的一些笔记。 这是对blog文章的总结。
arm_uclinux_tools用于安装linux的编译器
如何交叉编译uclinux内核—屏幕录像:现场操作,肯定比看书时的印象来的深刻!
这是一款介绍uclinux内核编译的傻瓜教程,轻松教会你ulinx内核编译
如何交叉编译 uClinux 内核如何交叉编译 uClinux 内核如何交叉编译 uClinux 内核如何交叉编译 uClinux 内核
MiniGUI for uClinux 移植实验全部源码
uClinux上的ppp拨号驱动及测试程序
uclinux内核编译傻瓜教程.pdf,对于初及linux内核人员来说非常实用。
本文通过整理之前研发的一个项目(ARM7TDMI + uCLinux),分析内核启动过程及需要修改的文件,以供内核移植者参考。整理过程中也同时参考了众多网友的帖子,在此谢过。由于整理过程匆忙,难免错误及讲解的不够清楚之处...
这是对blog文章的一个总结,分析bfin-uclinux-2008r1.5内核的中断处理,适用于ADSP-BF561,第三版。
文章从构建一个针对S3C4510B硬件平台的嵌入式uClinux操作系统和在其上进行应用程序的开发入手,逐步讲述如何在Linux环境下编写用户应用程序的方法和步骤,并为熟悉Windows操作系统的用户介绍在这种平台之上,使用何...