2019-03-24 09:00发布
辛昕 发表于 2016-9-3 00:17 这个事情,这么看。 首先,这个 TA0R,我不知道它是啥,曾经我以为这是个寄存器。 但是看到后面,我觉 ...
最多设置5个标签!
首先,这个 TA0R,我不知道它是啥,曾经我以为这是个寄存器。
但是看到后面,我觉得不一定。
所以,下一步,你给我乖乖找到 TA0R是啥,否则这问题没法往下说。
然后,我们来看看这个复杂的表达式。
其实我早就说过,这种复杂的表达式,得拆开来看。就不复杂了。
你可能没啥经验,那我教你怎么看。
其实答案基本就是 lcoftp说的,八九不离十。
我教你怎么看。
首先,找到这些括号里最大的,也就是最外层的格式。
我们发现一个很有意思的。
它说到底,前面那一大串 void *什么鬼的,反正就是个强转对不对?
所以不管他是啥,反正最后意思就是强转成一个 void *指针,那就别管他了,让他去死吧。
接下来,你会注意到,在最外层的括号之外,还有一个 ()
一般来说我们都知道,这种格式,必然是一个函数调用。
所以,考虑到前面的格式,我们就懂了。
其实,事情,是这样的。
它,是把 TAOR这个东西的地址给读出来,然后,把它强转成一种指针。
那接下来就好解释了。
既然我们看出这是个函数指针调用。那必然就是转换成一种 函数指针。
而这个函数指针是一个什么样的函数呢?
看那个 void *啥的就好了。
其实我也是刚刚才发现这一点。
注意看,括号里是这样写的
void (*)()
其实,这是一个很不标准的函数指针定义。
它的完整写法应该是
void (*)(void)
意思就是,这是一个 声明如下形式 的 函数指针
void xxx(void)
你看着有点迷糊是吧,那如果我写成这样你就不迷糊了
void *p(void);
这是一个函数指针,它的名字叫 p,它是一个指向 形如 void xxx(void)类型函数的指针。
上述定义,只是少了一个p,因为它只是一个函数指针类型。
最后,我们稍稍考虑一下这么写是个什么意思。
因为前面很奇怪,它赋值给 TAOR = 0x3FFF
现在我们来综合考虑一下,这个式子是什么意思。
首先,
(void (*)()) 这一部分我已经说了,它表明的是强转成 void *(void) 这种格式的函数指针。
然后其次是第二个括号
(unsigned int)&TAOR
这其实也好理解,它取出 TA0R 的地址,然后,把这个地址转化成 unsigned int类型,其实就是把地址转化成一个整形值。注意,它不是上面那个 0x3FFF
所以,我才让你去找程序中另外定义 TA0R的地方,否则,我能看懂这句话,但我也不知道这句话背后在做什么。
虽然我从注释里 ,大致能猜到,它应该是要去掉 flash中的某个地址值,不知道是为了某种特定的跳转还是 软件形式的IAP。
最后,就是所有括号之外,还有一个()括号。
这个没什么,因为既然这是一个 参数为 void的函数指针,所以这么干,无非是要调用这个指向的函数指针。
说的很乱了,我先缓一会,你们感受一下。
明天楼主贴住 TA0R是啥,我继续说~~
果然回答不一般,论坛估计没人敢和你挑语法吧
一周热门 更多>