Vitis HLS 学习笔记--移除内存分配malloc

embedded/2024/9/25 16:17:58/

目录

1. 简介

2. 示例解析

2.1 源码解释

2.2 malloc 分析

2.3 替代方案分析

3. 总结


1. 简介

Vitis HLS 也不支持动态创建或删除 C/C++ 对象(用于综合)。

本文探究如何在C/C++代码中避免使用显式的malloc函数来分配内存。在硬件设计和FPGA开发中,避免动态内存分配是一个常见的实践。

通过一个例子,了解 malloc 被用于动态分配内存,但是在 USE_MALLOC 未定义的情况下,代码使用了栈上的局部变量来代替。

2. 示例解析

2.1 源码解释

#include <stdlib.h>long long example(int din[32], int width) {#ifdef USE_MALLOClong long *out_accum = malloc(sizeof(long long));int *array_local = malloc(64 * sizeof(int));
#elselong long _out_accum;long long *out_accum = &_out_accum;int _array_local[64];int *array_local = &_array_local[0];
#endifint i, j;LOOP_SHIFT:for (i = 0; i < 31; i++) {if (i < width)*(array_local + i) = din[i];else*(array_local + i) = din[i] >> 2;}*out_accum = 0;LOOP_ACCUM:for (j = 0; j < 31; j++) {*out_accum += *(array_local + j);}return *out_accum;
}

函数 example 接受一个整数数组 din 和一个选择宽度 width 作为参数。它通过两个循环处理数组:第一个循环 LOOP_SHIFT 根据 width 值对数组元素进行移位操作,第二个循环 LOOP_ACCUM 累加处理后的数组元素到 out_accum。最终,函数返回累加的结果。

2.2 malloc 分析

首先了解 malloc 的用途:

long long *out_accum = malloc(sizeof(long long));

这句代码声明了一个指向long long类型的指针out_accum,并使用malloc函数为它分配了足够存储一个long long类型数据的内存空间。sizeof(long long)是计算long long类型数据大小的操作,确保分配的内存正好可以存放一个long long类型的值。

int *array_local = malloc(64 * sizeof(int));

这句代码声明了一个指向int类型的指针array_local,并使用malloc函数为它分配了足够存储64个int类型数据的内存空间。64 * sizeof(int)是计算64个int类型数据总大小的操作,确保分配的内存可以存放一个包含64个整数的数组。

2.3 替代方案分析

本质上是使用栈内存(stack memory)来替代malloc函数动态分配的堆内存(heap memory)。

  • long long _out_accum; 这行代码在栈上声明了一个long long类型的变量_out_accum。这意味着不需要动态分配内存,因为_out_accum的大小在编译时就已经确定了。
  • long long *out_accum = &_out_accum; 这行代码创建了一个指向_out_accum的指针out_accum。这样,我们就可以像使用动态分配的内存那样使用_out_accum,但实际上它是在栈上分配的,这使得内存的分配和释放更加高效。
  • int _array_local[64]; 这行代码在栈上声明了一个包含64个整数的数组_array_local。与malloc不同,这里不需要在程序运行时分配内存,因为数组的大小在编译时就已经确定了。
  • int *array_local = &_array_local[0]; 这行代码创建了一个指向数组第一个元素的指针array_local。这允许我们通过指针来访问和操作数组,就像它是通过malloc动态分配的一样。

3. 总结

Vitis HLS不支持动态创建或删除C/C++对象,因此开发者必须寻找替代方案。本文通过一个例子展示了如何在不定义USE_MALLOC的情况下,使用栈内存代替堆内存进行内存分配。示例中的函数example通过两个循环处理输入数组,使用栈上的局部变量而非malloc分配的内存,从而在编译时确定内存大小,这对硬件合成至关重要。


http://www.ppmy.cn/embedded/47341.html

相关文章

【物联网实战项目】STM32C8T6+esp8266/mqtt+dht11+onenet+uniapp

一、实物图 前端uniapp效果图&#xff08;实现与onenet同步更新数据&#xff09; 首先要确定接线图和接线顺序&#xff1a; 1、stm32c8t6开发板连接stlinkv2下载线 ST-LINK V2STM323.3V3.3VSWDIOSWIOSWCLKSWCLKGNDGND 2、ch340串口连接底座&#xff08;注意RXD和TXD的连接方式…

微信小程序 画布canvas

属性说明 属性类型默认值必填说明最低版本typestring否指定 canvas 类型&#xff0c;支持 2d (2.9.0) 和 webgl (2.7.0)2.7.0canvas-idstring否canvas 组件的唯一标识符&#xff0c;若指定了 type 则无需再指定该属性1.0.0disable-scrollbooleanfalse否当在 canvas 中移动时且…

使用本地大语言模型和Langchain手搓免费的AI搜索问答助手

1 概述 大语言模型虽然已经有了很多的背景知识&#xff0c;但针对模型训练之后新产生的内容&#xff0c;或者领域内的知识进行提问&#xff0c;大模型本身通常无法准确给出回应&#xff0c;一个常用的解决方法是&#xff0c;借助检索增强生成&#xff08;RAG&#xff09;&…

【春秋云镜】Faculty Evaluation System未授权任意文件上传漏洞(CVE-2023-33440)

因为该靶场没有Write up,索性自己搞一下&#xff0c;方便别人&#xff0c;快乐自己&#xff01; 漏洞概述&#xff1a; Sourcecodester Faculty Evaluation System v1.0 is vulnerable to arbitrary code execution via /eval/ajax.php?actionsave_user. 漏洞复现&#xff…

与设备无关的I/O软件

目录 什么是设备无关的 I/O 软件&#xff1f; 设备无关的 I/O 软件的特征 设备无关的 I/O 软件的实现方法 设备无关的 I/O 软件的优势 设备无关 I/O 软件的好处 1. 一致的用户体验 2. 跨平台兼容性 3. 可访问性 4. 灵活性和可扩展性 5. 成本效率 6. 简化开发 示例分…

Discuz! X3.4发帖时间修改插件批量操作版

下载地址&#xff1a;Discuz! X3.4发帖时间修改插件批量操作版 发帖时间与回复时间说明 1、使用本插件修改发帖时间&#xff0c;则帖子中的回复楼层的时间会保持同步同间隔修改&#xff0c;所谓同步同间隔就是如果某个回复是在主题发布之后一小时回复的&#xff0c;那么修改之…

Altair® Inspire™ 加快仿真驱动设计,缩短产品上市时间

Inspire应用于产品开发生命周期的早期&#xff0c;通过协作加速了创新、结构高效的零件和装配体的创建、优化和研究。 Inspire 的用户体验屡获好评&#xff0c;用户可以在短短几个小时内掌握几何图形创建和修改操作&#xff0c;并且它还具有可靠的 Altair 求解器功能&#xff…

leetcode hot100 之 最长公共子序列

题目 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;…