初始C语言中的opaque类型:
http://blog.youkuaiyun.com/xgbing/article/details/2775426
GCC中运用枚举定义数组的实例:
http://blog.youkuaiyun.com/xgbing/article/details/6564979
#include <stdio.h>
#include <stdlib.h>
#define u32 unsigned int
enum uaddr {
MTD_UADDR_NOT_SUPPORTED = 0, /* data width not supported */
MTD_UADDR_0x0555_0x02AA,
MTD_UADDR_0x0555_0x0AAA,
MTD_UADDR_0x5555_0x2AAA,
MTD_UADDR_0x0AAA_0x0555,
MTD_UADDR_DONT_CARE, /* Requires an arbitrary address */
MTD_UADDR_UNNECESSARY, /* Does not require any address */
};
struct unlock_addr {
u32 addr1;
u32 addr2;
};
/*
* I don't like the fact that the first entry in unlock_addrs[]
* exists, but is for MTD_UADDR_NOT_SUPPORTED - and, therefore,
* should not be used. The problem is that structures with
* initializers have extra fields initialized to 0. It is _very_
* desireable to have the unlock address entries for unsupported
* data widths automatically initialized - that means that
* MTD_UADDR_NOT_SUPPORTED must be 0 and the first entry here
* must go unused.
*/
static const struct unlock_addr unlock_addrs[] = {
[MTD_UADDR_NOT_SUPPORTED] = {
.addr1 = 0xffff,
.addr2 = 0xffff
},
[MTD_UADDR_0x0555_0x02AA] = {
.addr1 = 0x0555,
.addr2 = 0x02aa
},
[MTD_UADDR_0x0555_0x0AAA] = {
.addr1 = 0x0555,
.addr2 = 0x0aaa
},
[MTD_UADDR_0x5555_0x2AAA] = {
.addr1 = 0x5555,
.addr2 = 0x2aaa
},
[MTD_UADDR_0x0AAA_0x0555] = {
.addr1 = 0x0AAA,
.addr2 = 0x0555
},
[MTD_UADDR_DONT_CARE] = {
.addr1 = 0x0000, /* Doesn't matter which address */
.addr2 = 0x0000 /* is used - must be last entry */
},
[MTD_UADDR_UNNECESSARY] = {
.addr1 = 0x0000,
.addr2 = 0x0000
}
};
int main(void)
{
printf("unlock_addrs[MTD_UADDR_0x0AAA_0x0555].addr2=0x%x\n", unlock_addrs[MTD_UADDR_0x0AAA_0x0555].addr2);
}
输出结果:

其实有些利用GCC的特性,对编译器有兴趣可以深入研究!!
本文介绍了如何在GCC中使用枚举类型定义数组,并通过具体的示例代码展示了这一过程。通过对不同枚举值对应的地址进行初始化,实现了特定的解锁地址配置。
1684

被折叠的 条评论
为什么被折叠?



