2812中关于void InitPieVectTable(void)函数的一些疑问
void InitPieVectTable(void){
int16 i;
Uint32 *Source = (void *) &PieVectTableInit;/*PieVectTableInit是被初始化过的Struct变量,
而PieVectTable没有被初始化*/
Uint32 *Dest = (void *) &PieVectTable;
EALLOW;
for(i=0; i < 128; i++)
*Dest++ = *Source++; //这步相当于初始化PieVectTable,在0x000D00地址开始,指向各种中断的入口
EDIS;
// 使能PIE向量表
PieCtrl.PIECRTL.bit.ENPIE = 1;
}
函数中PieVectTableInit和PieVectTable都是struct PIE_VECT_TABLE类型的变量,只是PieVectTableInit中有具体的数值而PieVectTable没有!现在有以下几个疑问
1:为什么程序不直接给PieVectTable赋值,而是要通过PieVectTableInit来初始化?
2:PieVectTable在CMD文件中被指向了固定的地址,而PieVectTableInit也占用相同大小的空间,只是具体地址不知道在哪里,这样是不是有点浪费空间呢?为什么DSP要这么操作!
3:Uint32 *Dest = (void *) &PieVectTable; 这句里面将PieVectTable的首地址给了指针Dest,为什么强制转换成的指针类型是Void 型的呢??
刚接触DSP,还请多多指教!
谁来说两句 good document 第3个问题,那条语句的目的只是得到一个结构体的首地址,方便后面的赋值。一个空指针就够了 旁观,学习 一、您的前两个问题其实是一个问题,PieVectTableInit和PieVectTable都是struct PIE_VECT_TABLE类型的变量,PieVectTableInit中有具体的数值而PieVectTable没有,这是对的,但是在DSP的文件中还有一个DSP281x_SWPrioritizedPieVect.c的源文件和DSP281x_SWPrioritizedIsrLevel.h的头文件,这两个文件是为了改变DSP自带的中断优先级作用的。在DSP281x_SWPrioritizedPieVect.c中也有一个PieVectTableInit他的内容和DSP28_PieVect.c中的内容是不一样的。所以DSP在定义struct PIE_VECT_TABLE类型的时候没有直接给PieVectTable赋值,这样做其实是节省空间的。
二、您说的第三个问题“Uint32 *Dest = (void *) &PieVectTable; 这句里面将PieVectTable的首地址给了指针Dest,为什么强制转换成的指针类型是Void 型的呢??”在给结构实体进行变量赋值的时候要把PieVectTable的首地址给指针Dest,但是您注意,这里Dest是Uint32型的,这个时候是不能够直接给地址的,需要类型转换,在C语言里面指针强制转换要求两边的类型要是一样的,同时也指出了void类型是可以赋值给任何类型的,所以这里用了(void*),其实你改成(Uint32*)也是完全没有问题的。
个人理解,希望对您有用。 hhuguodong 发表于 2013-3-12 10:13 static/image/common/back.gif
一、您的前两个问题其实是一个问题,PieVectTableInit和PieVectTable都是struct PIE_VECT_TABLE类型的变量 ...
谢谢你 本帖最后由 cuiweitju 于 2014-7-27 19:06 编辑
顶6L。
另外:
DSP28xxx的源文件中以下这两句:
Uint32 *Source = (void *) &PieVectTableInit;
Uint32 *Dest = (void *) &PieVectTable;
改为:
Uint32 *Source = (Uint32 *) &PieVectTableInit;
Uint32 *Dest = (Uint32 *) &PieVectTable;
这更合乎ANSI C语法规则。
页:
[1]