[DSP编程]

关于FPGA寄存器读写问题!

[复制链接]
2894|12
手机看帖
扫描二维码
随时随地手机跟帖
PanDaerr|  楼主 | 2017-2-19 15:09 | 显示全部楼层 |阅读模式
最近遇到一个问题
对于下面这段代码

#define addr_fpga_version                        (addr_base + (0x4031))

int16u Read16uData(int16u *pAddr)
{
        int16u sTemp = *pAddr;
        return sTemp;
}
pgaVersion = Read16uData((int16u *)addr_fpga_version);


为什么当
#define addr_base                                ((int16u*)0x60000000)
时,FPGA中收到的地址是正确的
而当
#define addr_base                                (0x60000000)
时,FPGA中收到的地址就不对呢???
不太明白这两种定义的方式有什么区别,按理说后边的函数都强制将数值转换成指针了呀??

相关帖子

mcu5i51| | 2017-2-19 17:27 | 显示全部楼层
好像这个代码不像FPGA的;
两个都是指针,没错;不过一个是指向16位无符号数据,一个是指向未知类型数据的(和编译器有关)

使用特权

评论回复
mcu5i51| | 2017-2-19 17:31 | 显示全部楼层
修正:是指向未知长度数据的
加上大小端编译工具,指向的位置可能不同

使用特权

评论回复
PanDaerr|  楼主 | 2017-2-19 22:01 | 显示全部楼层
mcu5i51 发表于 2017-2-19 17:27
好像这个代码不像FPGA的;
两个都是指针,没错;不过一个是指向16位无符号数据,一个是指向未知类型数据的(和编 ...

这段代码是DSP的,通过EMIFA访问FPGA

使用特权

评论回复
xuplastic| | 2017-2-19 23:02 | 显示全部楼层
你确定你学过C语言?

这个函数只是把pAddr所指向的内存中的数据读出来返回而已,而且根本不需要声明sTemp,直接return *pAddr;完事,不过这个函数有啥用?

使用特权

评论回复
xuplastic| | 2017-2-19 23:04 | 显示全部楼层
((int16u*)0x60000000)中的0x60000000表示一个保存着int16u类型数据内存地址,他的地址是60000000

使用特权

评论回复
PanDaerr|  楼主 | 2017-2-19 23:13 | 显示全部楼层
xuplastic 发表于 2017-2-19 23:04
((int16u*)0x60000000)中的0x60000000表示一个保存着int16u类型数据内存地址,他的地址是60000000 ...

不写int16u*的话,按照函数中的写法,应该也可以读到60000000地址的数据吧?

使用特权

评论回复
shuifengjackcoo| | 2017-2-20 08:31 | 显示全部楼层
很好

使用特权

评论回复
mcu5i51| | 2017-2-20 10:22 | 显示全部楼层
PanDaerr 发表于 2017-2-19 23:13
不写int16u*的话,按照函数中的写法,应该也可以读到60000000地址的数据吧? ...

没有指定数据类型可以读到数据,你不是也说可以读到吗;
没有指定类型就是默认类型,在C中默认数据是int型,int数据长度没有明确的定义,在多数的32位机是32位数据;
如果指针为1000,这个地址的数据为(1000):12,34,56,(1003)78;你用这里的16位;就就有两种情况:
大端: 5678
小端: 3412

使用特权

评论回复
xuplastic| | 2017-2-20 12:38 | 显示全部楼层
PanDaerr 发表于 2017-2-19 23:13
不写int16u*的话,按照函数中的写法,应该也可以读到60000000地址的数据吧? ...

((int16u*)0x60000000)+0x4031的计算结果和0x60000000+0x4031的计算结果是不一样的! 捕获.PNG

因为int16u类型数据占用两个字节,所以int16u*的指针在你写“+1”的时候实际是“+2”了!!!

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
PanDaerr + 1 很给力!
PanDaerr|  楼主 | 2017-2-20 22:51 | 显示全部楼层
mcu5i51 发表于 2017-2-20 10:22
没有指定数据类型可以读到数据,你不是也说可以读到吗;
没有指定类型就是默认类型,在C中默认数据是int型,i ...

谢谢你啦!10楼的答案更符合我想问的问题!不过你的也很棒!

使用特权

评论回复
PanDaerr|  楼主 | 2017-2-20 22:52 | 显示全部楼层
xuplastic 发表于 2017-2-20 12:38
((int16u*)0x60000000)+0x4031的计算结果和0x60000000+0x4031的计算结果是不一样的!

因为int16u类型数 ...

谢谢谢谢!!!应该就是这个原因!我明天去公司确认下!

使用特权

评论回复
特拉苏| | 2017-2-23 01:24 | 显示全部楼层
同解,破题。我也是刚开始了解  fpga   Dsp 处理问题

使用特权

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

本版积分规则

3

主题

9

帖子

1

粉丝