23.#pragma使用分析

本文详细介绍了#pragma指令在C/C++编程中的应用,包括其基本概念、常见用途如保证头文件只被编译一次,以及与#ifndef的区别。探讨了不同编译器对#pragma指令的解释差异,提供了提高编译效率的策略。

#pragma简介

#pragma用于指示编译器完成一些特定的动作

#pragma所定义的很多指示字是编译器特有的

#pragma在不同的编译器间是不可移植的

预处理器将忽略它不认识的#pragma指令

不同的编译器可能以不同的方式解释同一条#pragma指令

一般用法:

#pragma parameter

注:不同的parameter参数语法和意义各不相同

message用于条件编译中可提示代码的版本信息

#if defined(ANDROID40)

#pragma message("Compile Android SDK 4.0...")

#define VERSION "Android 4.0"

#endif

#pragma once

#pragma once 用于保证头文件只被编译一次

#pragma once 是编译器相关的,不一定被支持

 

#pragma once 与 #ifndef 的区别

#pragma once 效率更高, 单不一定被支持

如何保持编译效率高,又都被支持了

可以使用如下方法实现

#ifndef G_LOBLE_

#def G_LOBLE_

#pragma once

// 代码片段

#endif

 

#include "ap_int.h" #include "ap_axi_sdata.h" #include "hls_stream.h" #include "hls_math.h" using namespace hls; #define IN_WIDTH 640 #define IN_HEIGHT 480 #define OUT_WIDTH 1920 #define OUT_HEIGHT 1080 typedef ap_axiu<24, 1, 1, 1> AxiPixel; typedef hls::stream<AxiPixel> AxiStream; // 双线性插值函数 void bilinear_interpolate( ap_uint<24> line0[IN_WIDTH], ap_uint<24> line1[IN_WIDTH], float ix, float iy, ap_uint<24>& out_pixel ) { #pragma HLS INLINE off #pragma HLS PIPELINE II=1 // 边界保护处理 int x0 = static_cast<int>(ix); int x1 = (ix < IN_WIDTH-1) ? x0+1 : x0; int y0 = static_cast<int>(iy); int y1 = (iy < IN_HEIGHT-1) ? y0+1 : y0; // 权重计算优化 float dx = ix - x0; float dy = iy - y0; float w00 = (1.0f - dx) * (1.0f - dy); float w10 = dx * (1.0f - dy); float w01 = (1.0f - dx) * dy; float w11 = dx * dy; // 读取像素数据 ap_uint<8> r00 = line0[x0].range(23, 16); ap_uint<8> g00 = line0[x0].range(15, 8); ap_uint<8> b00 = line0[x0].range(7, 0); ap_uint<8> r10 = line0[x1].range(23, 16); ap_uint<8> g10 = line0[x1].range(15, 8); ap_uint<8> b10 = line0[x1].range(7, 0); ap_uint<8> r01 = line1[x0].range(23, 16); ap_uint<8> g01 = line1[x0].range(15, 8); ap_uint<8> b01 = line1[x0].range(7, 0); ap_uint<8> r11 = line1[x1].range(23, 16); ap_uint<8> g11 = line1[x1].range(15, 8); ap_uint<8> b11 = line1[x1].range(7, 0); // 使用定点数进行插值计算 ap_ufixed<16, 8> r_res = w00*r00 + w10*r10 + w01*r01 + w11*r11; ap_ufixed<16, 8> g_res = w00*g00 + w10*g10 + w01*g01 + w11*g11; ap_ufixed<16, 8> b_res = w00*b00 + w10*b10 + w01*b01 + w11*b11; out_pixel.range(23, 16) = r_res.range(7, 0); out_pixel.range(15, 8) = g_res.range(7, 0); out_pixel.range(7, 0) = b_res.range(7, 0); } // 图像缩放函数 void image_scale( AxiStream& s_axis_in, AxiStream& m_axis_out, float scale_factor, bool short_press, bool long_press ) { #pragma HLS INTERFACE axis port=s_axis_in #pragma HLS INTERFACE axis port=m_axis_out #pragma HLS INTERFACE s_axilite port=scale_factor bundle=CTRL #pragma HLS INTERFACE s_axilite port=short_press bundle=CTRL #pragma HLS INTERFACE s_axilite port=long_press bundle=CTRL #pragma HLS INTERFACE ap_ctrl_none port=return // 缩放系数数组 float scale_factors[10] = {1.0f, 1.1f, 1.2f, 1.3f, 1.4f, 1.5f, 1.6f, 1.7f, 1.8f, 1.9f}; #pragma HLS RESOURCE variable=scale_factors core=RAM_1P_BRAM // 选择当前缩放系数 if (short_press) { // 短按步进±10% scale_factor += 0.1f; } else if (long_press) { // 长按连续调节 scale_factor += 0.01f; } // 限制缩放系数范围 if (scale_factor < 1.0f) scale_factor = 1.0f; if (scale_factor > 1.9f) scale_factor = 1.9f; // 双缓冲行存储 ap_uint<24> line0[IN_WIDTH]; ap_uint<24> line1[IN_WIDTH]; #pragma HLS ARRAY_PARTITION variable=line0 cyclic factor=8 dim=1 #pragma HLS ARRAY_PARTITION variable=line1 cyclic factor=8 dim=1 #pragma HLS RESOURCE variable=line0 core=RAM_1P_BRAM #pragma HLS RESOURCE variable=line1 core=RAM_1P_BRAM // 计算步进 float step_x = (float)IN_WIDTH / (OUT_WIDTH * scale_factor); float step_y = (float)IN_HEIGHT / (OUT_HEIGHT * scale_factor); // 读取第一行 int base_idx = 0; for (int x = 0; x < IN_WIDTH; x++) { #pragma HLS PIPELINE II=1 AxiPixel pix; s_axis_in.read(pix); line0[x] = pix.data; } // 读取第二行或复制第一行 if (IN_HEIGHT > 1) { for (int x = 0; x < IN_WIDTH; x++) { #pragma HLS PIPELINE II=1 AxiPixel pix; s_axis_in.read(pix); line1[x] = pix.data; } } else { for (int x = 0; x < IN_WIDTH; x++) { #pragma HLS UNROLL line1[x] = line0[x]; } } // 逐行处理输出 for (int y_out = 0; y_out < OUT_HEIGHT; y_out++) { #pragma HLS PIPELINE off float iy = y_out * step_y; int y_idx; // Y轴边界保护 if (iy >= IN_HEIGHT - 1) { iy = IN_HEIGHT - 1.0001f; y_idx = IN_HEIGHT - 2; } else { y_idx = static_cast<int>(iy); } // 动态切换行缓冲 while (base_idx < y_idx) { for (int x = 0; x < IN_WIDTH; x++) { #pragma HLS PIPELINE II=1 line0[x] = line1[x]; } base_idx++; if (base_idx + 1 < IN_HEIGHT) { for (int x = 0; x < IN_WIDTH; x++) { #pragma HLS PIPELINE II=1 AxiPixel pix; s_axis_in.read(pix); line1[x] = pix.data; } } } // 逐像素输出 for (int x_out = 0; x_out < OUT_WIDTH; x_out++) { #pragma HLS PIPELINE II=1 float ix = x_out * step_x; ap_uint<24> pixel_data; bilinear_interpolate(line0, line1, ix, iy, pixel_data); AxiPixel pixel_out; pixel_out.data = pixel_data; pixel_out.strb = 0x3; pixel_out.keep = 0x3; pixel_out.last = (x_out == OUT_WIDTH - 1) ? 1 : 0; m_axis_out.write(pixel_out); } } } 所以这个代码是对的吗?
最新发布
08-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值