C语言结构体数组的初始化方式(内核或者uboot中经常用到)

在学习S5P6818芯片的串口时钟初始化部分,结合代码,总结一下结构体初始化的 几种方式。

struct nxp_clk_periph {
	const char	*dev_name;
	int			 dev_id;
	char  		 periph_id;
	void	    *base_addr;
	/* clock config */
	char   		 level;
	unsigned int clk_mask0;
	unsigned int clk_mask1;
	short 		 clk_src0;
	short 		 clk_div0;
	char  		 clk_inv0;
	short 		 clk_src1;
	short 		 clk_div1;
	char  		 clk_inv1;
	long		 clk_ext1;
	long		 clk_ext2;
	spinlock_t	 lock;
};

下面是结构体初始化代码:

static struct nxp_clk_periph clk_periphs [] = {
	CLK_PERI_1S(DEV_NAME_TIMER		,  0, CLK_ID_TIMER_0	, PHY_BASEADDR_CLKGEN14, (_PLL_0_2_)),
       ......
}

其中CLK_PERI_1S的宏展开为:

#define CLK_PERI_1S(name, devid, id, base, mk) [id] = {	\
	.dev_name = name, .dev_id = devid,.periph_id = id, .level = 1, 	\
	.base_addr = (void*)base, .clk_mask0 = mk, }

把CLK_PERI_1S宏展开,代入原来的代码:

static struct nxp_clk_periph clk_periphs [] = {
[CLK_ID_TIMER_0] = {	\
	.dev_name = DEV_NAME_TIMER, .dev_id = 0,.periph_id = CLK_ID_TIMER_0, .level = 1, 	\
	.base_addr = (void*)PHY_BASEADDR_CLKGEN14, .clk_mask0 = _PLL_0_2_, },
       ......
}

上述初始化方式为选择数组中的某一个元素进行初始化:

struct nxp_clk_periph clk_periphs [ ] = 
{ 
    [3] = { }, 
    [4] = { }, 
}

常见的是直接用大括号按顺序来进行初始化:

struct nxp_clk_periph clk_periphs [ ] = 
{ 
    { }, 
    { }, 
    { },
}

还有的方式就是这样的:

struct nxp_clk_periph clk_periphs [ ] = 
{ 
   [1].dev_id = 10, 
   [2].dev_name = "nxp-uart0", 
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值