打印

在ZLG版块没有人关注,到这里再发.

[复制链接]
2442|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laserpic|  楼主 | 2012-2-8 15:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
table.h 文件中有:
/* tables.h
* Linker table helper macros.
* NetWatch system management mode administration console
*
* Copyright 2009, Google Inc.
* All rights reserved.
*...........
*/
typedef void (*thunk_t)(void);
typedef struct {
    thunk_t f;
    const char * name;
} initializer_t;

#define TABLE(typ, name) \
    const volatile typ name##_table[0] __attribute__((section(".table." #name ))); \
const volatile typ name##_table_end[0] __attribute__((section(".table." #name ".END")));

#define TABLE_LENGTH(name)    (name##_table_end - name##_table)

在main.c  中调用( aa,bb均己定义的函数名 )
TABLE(initializer_t, aa);
TABLE(initializer_t, bb);

for (i = 0; i < TABLE_LENGTH(aa); i++) {
        outputf("- %s()", aa_table[i].name);
        aa_table[i].f();
}
for (i = 0; i < TABLE_LENGTH(bb); i++) {
        outputf("- %s()", bb_table[i].name);
        bb_table[i].f();
}
这是从一个开源软件(基于GCC编译的)上看到的. 搞不明白,name##_table[0]中的name能像字符串那样用参数直接替代?
问题好二:在链接文件里section字段下面有(lds):
_table_start = .;
    *(SORT(.table.*));
    _table_end = .;
*(SORT(.table.*));这名的意思是将table下的东西排序吗? 原理是什么?
有朋友接触过这些吗.
沙发
laserpic|  楼主 | 2012-2-8 16:19 | 只看该作者
是否 发的版块不对.

使用特权

评论回复
板凳
dfsa| | 2012-2-8 16:36 | 只看该作者
好像不太对

使用特权

评论回复
地板
sinadz| | 2012-2-8 16:45 | 只看该作者
没看太明白

使用特权

评论回复
5
laserpic|  楼主 | 2012-2-11 00:52 | 只看该作者
作用应该是把函数指针在section.table下面排序, 初始化时顺序调用,而无需了解具体要调用多少个函数.

使用特权

评论回复
6
香水城| | 2012-2-12 12:41 | 只看该作者
对于第1个问题:从学习方法上讲,如果你碰到一个已经存在的东西,但是不知道原理的时候,请不要首先怀疑它的正确性,而应该以欣赏的角度看待这种方法,“哦,原来还可以这样做”,你可以在自己的项目中直接使用这种方法,如果想搞清楚原理,可以找一些相关的资料看。

对于第2个问题:你需要在整个项目中搜索一下,在哪里定义了SORT,什么意义;或搜索一下有没有对SORT的说明注释。

使用特权

评论回复
7
john_lee| | 2012-2-12 13:46 | 只看该作者
1、##是C预处理连接符,用于连接两个符号,#是把符号字符串化,例:
TABLE(int, dev)
宏展开后得到:
const volatile int dev_table[0] __attribute__((section(".table." "dev" )));
const volatile int dev_table_end[0] __attribute__((section(".table." "dev" ".END")));

2、SORT是把匹配的符号按升序排列,方法就是字符串比较。

使用特权

评论回复
8
ehu| | 2012-2-12 16:35 | 只看该作者
同意7楼

使用特权

评论回复
9
ehu| | 2012-2-12 16:39 | 只看该作者
C语言深度解剖中有如下描述:

3.7, #运算符
#也是预处理?是的,你可以这么认为。那怎么用它呢? 别急,先看下面例子:
#define SQR(x) printf("The square of x is %d.\n", ((x)*(x)));
如果这样使用宏:
SQR(8);
则输出为:
The square of x is 64.
注意到没有,引号中的字符 x 被当作普通文本来处理,而不是被当作一个可以被替换的语言
符号。
假如你确实希望在字符串中包含宏参数,那我们就可以使用“#”,它可以把语言符号转
化为字符串。上面的例子改一改:
#define SQR(x) printf("The square of "#x" is %d.\n", ((x)*(x)));
再使用:
SQR(8);
则输出的是:
The square of 8 is 64.
很简单吧?相信你现在已经明白#号的使用方法了。
3.8,##预算符
和#运算符一样,##运算符可以用于宏函数的替换部分。这个运算符把两个语言符号组合成单个语言符号。看例子:
#define XNAME(n) x ## n
如果这样使用宏:
XNAME(8)
则会被展开成这样:
x8
看明白了没?##就是个粘合剂,将前后两部分粘合起来。

使用特权

评论回复
10
sinadz| | 2012-2-12 17:27 | 只看该作者
学习方法的确是很重要

使用特权

评论回复
11
laserpic|  楼主 | 2012-2-24 22:58 | 只看该作者
多谢七楼,九楼.
一半感谢香主.
如此看来,基础问题来的. 因为这种类型的问题网上搜不到.
本贴结贴早,没能给有心之士给分.

使用特权

评论回复
12
王紫豪| | 2012-2-24 23:02 | 只看该作者
对于第1个问题:从学习方法上讲,如果你碰到一个已经存在的东西,但是不知道原理的时候,请不要首先怀疑它的正确性,而应该以欣赏的角度看待这种方法,“哦,原来还可以这样做”,你可以在自己的项目中直接使用这种 ...
香水城 发表于 2012-2-12 12:41

第一点说得很好,我遇到过很多新手,遇到板子调不出来,就怀疑芯片有问题;遇到程序写不好,有的还怀疑编译器有问题。。。。

新手入门,一定学会绕着别人转;不能以自己为中心,让别人绕着你转。

使用特权

评论回复
13
哲哲55| | 2012-2-28 09:27 | 只看该作者
6# 香水城
香版主果然很给力,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

187

帖子

0

粉丝