2812中关于void InitPieVectTable(void)函数的一些疑问

[复制链接]
8985|7
 楼主| 程序会不会 发表于 2013-2-26 12:45 | 显示全部楼层 |阅读模式
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,还请多多指教!
 楼主| 程序会不会 发表于 2013-2-26 16:26 | 显示全部楼层
谁来说两句
fuchengpengjq 发表于 2013-2-27 08:04 | 显示全部楼层
good document
ywxiao 发表于 2013-3-9 08:58 来自手机 | 显示全部楼层
第3个问题,那条语句的目的只是得到一个结构体的首地址,方便后面的赋值。一个空指针就够了
tianwen_4524 发表于 2013-3-9 10:09 | 显示全部楼层
旁观,学习
hhuguodong 发表于 2013-3-12 10:13 | 显示全部楼层
一、您的前两个问题其实是一个问题,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*)也是完全没有问题的。
  个人理解,希望对您有用。
 楼主| 程序会不会 发表于 2013-3-23 16:33 | 显示全部楼层
hhuguodong 发表于 2013-3-12 10:13
一、您的前两个问题其实是一个问题,PieVectTableInit和PieVectTable都是struct PIE_VECT_TABLE类型的变量 ...

谢谢你
cuiweitju 发表于 2014-7-27 19:05 | 显示全部楼层
本帖最后由 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语法规则。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

443

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部