电子发烧友网 > 嵌入式技术 > 编程语言及工具 > 正文

常用三种指针的设计类型详细描述

2018年01月12日 05:47 次阅读

指针作为C语言精华,对于软件设计者比较好理解,但是在xilinx vivado HLS高级语言综合的设计中,由于其综合后对应的硬件元素难以用软件的概念解释,常常令程序设计者和VHLS工具使用者头痛。本文采用浅显易懂的描述方式,结合具体的c代码例子,详细描述了常用三种指针的设计类型,以及其作为顶层函数参数时,采用不同的编码风格和HLS约束策略,满足设计者对指针作为RTL接口的需求。

1. 基本指针类型

基本指针类型指的是指针没有运算或者没有多次的存取(读写)。指针作为top函数的参数时,指针综合为wire型或者握手协议类型接口。如下例子1-1:

void pointer_basic (dio_t *d) {

staTIc dio_t acc = 0;

acc += *d;

*d = acc;

}

例子1-1 基本类型指针作为顶层函数参数

在这个例子中,只是简单的读写指针指向的变量值,并没有对指针做偏移或者指针(地址)运算,其接口综合为线型的RTL接口。

2. 指针运算类型。

指针作为top层函数参数,并且函数中有对指针运算时,我们称之为指针运算类型。指针运算常常限制指针可能综合的接口类型。如下例中,指针做了偏移运算用于累加数据,从第二个值开始读出累加,并将每次累加结果写入上一个地址中。

void pointer_arith (dio_t *d) {

staTIc int acc = 0;

int i;

for (i=0;i《4;i++) {

acc += *(d+i+1);

*(d+i) = acc;

}

}

例子1-2 指针运算类型作为顶层函数参数

下面代码例子1-3是这个指针运算类型仿真的testbench。因为函数pointer_arith内部的for循环进行数据累加,testbench通过数组d[5]分配了地址空间并对数组赋值。

int main () {

dio_t d[5], ref[5];

int i, retval=0;

FILE *fp;

// Create input data

for (i=0;i《5;i++) {

d[i] = i;

ref[i] = i;

}

// Call the funcTIon to operate on the data

pointer_arith(d);

// Save the results to a file

fp=fopen(“result.dat”,“w”);

printf(“ Din Dout\n”, i, d);

for (i=0;i《4;i++) {

fprintf(fp, “%d \n”, d[i]);

printf(“ %d %d\n”, ref[i], d[i]);

}

fclose(fp);

// Compare the results file with the golden results

retval = system(“diff --brief -w result.dat result.golden.dat”);

if (retval != 0) {

printf(“Test failed!!!\n”);

retval=1;

} else {

printf(“Test passed!\n”);

}

// Return 0 if the test

return retval;

}

例子1-3 指针运算类型作为顶层函数参数的testbench

在C编译环境下仿真上面例子1-3的代码,结果如下:

Din Dout

0 1

1 3

2 6

3 10

Test passed!

指针运算带来的问题是,通常情况下,指针偏移是不规则的,不能按顺序存取指针数据。而Wire,握手类型或者Fifo接口类型没有办法乱序存取数据。

对于wire类型接口来说,当设计本身准备好接收数据时可以读入数据,或者当数据准备好ready时,可以写出数据。对握手和Fifo类型接口,当控制信号允许操作进行时,读入或写出数据。

在上面wire,握手或者FIFO类型接口的情况下,数据从0元素开始,必须按顺序到达(写入)。在指针运算的例子1-2中,第一个数据从索引1开始读入(i从0开始,0+1=1),对应于testbench中数据d[5]的第二个元素。

当这种情况在硬件应用时,需要某种格式的数据索引,这种情况对于wire类型,或者握手类型还是Fifo类型来说,都不支持。像上例1-2指针运算的代码,只能综合成ap_bus接口,因为这种接口带有地址,当数据存取(读写)时,用于对应的数据索引指示。

还有一种方法,代码必须修改成如下例子1-4的风格,用数据array作为接口替代指针。这种方法应用了array作为top层参数时综合成RAM接口(ap_memory)的原理,memory接口可以用地址作为数据的索引并且可以乱序执行,不必顺序存取操作。

void array_arith (dio_t d[5]) {

staTIc int acc = 0;

int i;

for (i=0;i《4;i++) {

acc += d[i+1];

d[i] = acc;

}

}

例子1-4 指针运算类型作为顶层函数参数修改为array

Wire类型、握手类型或Fifo类型接口仅仅可用在数据流方式,因此不能用在与指针运算相关的地方(除非数据从索引0开始并顺序处理)。同时注意,如果想综合为FIFO接口,Fifo接口类型必须是只读或者只写,不能有读又有写操作。

3. 多次读写(存取)指针类型

多次读写指针类型一般用作描述一个数据流方式的接口。

当top层函数参数使用指针,函数体对指针进行多次存取操作时,必须仔细考虑。在同一函数中对一个指针多次的读或者写,就会有多次指针存取发生,从而引起下列问题:

1. 对任何函数指针参数的多次存取要使用volatile限定符。

技术专区

关注电子发烧友微信

有趣有料的资讯及技术干货

下载发烧友APP

打造属于您的人脉电子圈

关注发烧友课堂

锁定最新课程活动及技术直播
收藏 人收藏
分享:

评论

相关推荐

指针到底能不能修改其指向的常量字符串?

发表于 2018-03-14 17:03 167次阅读
指针到底能不能修改其指向的常量字符串?

金属管浮子流量计使用时指针抖动的原因

发表于 2018-03-12 14:35 261次阅读
金属管浮子流量计使用时指针抖动的原因

C语言及ARM中堆栈指针SP设置的理解与总结(转载)

发表于 2018-01-26 17:11 464次阅读
C语言及ARM中堆栈指针SP设置的理解与总结(转载)

结构体指针(转载)

发表于 2018-01-22 21:40 259次阅读
结构体指针(转载)

p, *p, &p

发表于 2018-01-16 21:49 439次阅读
p, *p, &p

基于C语言中指针的基本用法解析

我C语言中其它的知识都学得可以,唯独指针搞不懂。如果是这样,我可以很负责的告诉你,对于这门编程语言,...

发表于 2018-01-09 15:12 1140次阅读
基于C语言中指针的基本用法解析

分享开发人员在开始使用指针来编程前应该知道的秘密

对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存...

发表于 2018-01-05 11:41 1315次阅读
分享开发人员在开始使用指针来编程前应该知道的秘密

数组和指针的简单定义及其相互的联系与区别详解

确实在极个别的情况下,数组和指针确实可以”通用“,但是在却大多数情况下,数组和指针是两个完全不同的C...

发表于 2017-12-09 11:20 1381次阅读
数组和指针的简单定义及其相互的联系与区别详解

指数指针的相关知识

虽然数组与指针数组存储的都是数据,但还是有细微的差别。数组存储的是相同类型的字符或数值,而指针数组存...

发表于 2017-09-14 13:59 1042次阅读
指数指针的相关知识

所有C语言数组和指针的知识都在这里了!|周立功手...

当数组作为函数的参数时,C语言函数的所有参数必须在函数内部声明。但是,由于在函数内部并没有给数组分配...

发表于 2017-09-01 09:28 4391次阅读
所有C语言数组和指针的知识都在这里了!|周立功手...

问一个二维数组和指针的问题?

发表于 2017-05-09 11:28 895次阅读
问一个二维数组和指针的问题?

求教,这两个指针的定义怎么理解

发表于 2017-05-03 10:31 912次阅读
求教,这两个指针的定义怎么理解

labview如何在自定义里修改仪表控件的指针?

发表于 2017-02-23 18:50 1180次阅读
labview如何在自定义里修改仪表控件的指针?

《C Primer Plus》读书笔记——数组和指针(1)

发表于 2017-02-07 15:15 892次阅读
《C Primer Plus》读书笔记——数组和指针(1)

关与子函数形参为指针,在子函数里变成了数组的问题

发表于 2016-08-01 00:22 878次阅读
关与子函数形参为指针,在子函数里变成了数组的问题

C51指针定义和应用小结

一. 指针变量的定义指针变量定义与一般变量的定义类似,其形式如下:数据类型 [存储器类型1] * [...

发表于 2010-06-07 17:52 2092次阅读
C51指针定义和应用小结