打印

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

[复制链接]
8086|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个问题,那条语句的目的只是得到一个结构体的首地址,方便后面的赋值。一个空指针就够了

使用特权

评论回复
5
tianwen_4524| | 2013-3-9 10:09 | 只看该作者
旁观,学习

使用特权

评论回复
6
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*)也是完全没有问题的。
  个人理解,希望对您有用。

使用特权

评论回复
7
程序会不会|  楼主 | 2013-3-23 16:33 | 只看该作者
hhuguodong 发表于 2013-3-12 10:13
一、您的前两个问题其实是一个问题,PieVectTableInit和PieVectTable都是struct PIE_VECT_TABLE类型的变量 ...

谢谢你

使用特权

评论回复
8
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

粉丝