在一个.c文件里面进行子函数调用
step1:函数声明
step2:mian函数
step3:子函数
/********************************
数组元素之和
法一: 子函数调用
**********************************/
#include
#define M 10 // 数组元素个数
int num[M]={1,2,3,4,5,6,7,8,9,10};
/********************************
函数声明
**********************************/
int sum(int * start, int * end);
/********************************
main函数
**********************************/
int main(void)
{
long answer;
answer=sum(num,num+M);
printf("The total number is %ld.\n",answer);
return 0;
}
/********************************
子函数
**********************************/
int sum(int * i, int * end)
{
int total=0;
while(i<end)
{
total+=*i;// 把数组元素的值加起来
i++; // 让指针指向下一个元素
}
return total;
}
调用外部的C文件
/********************************
数组元素之和
不需要.h文件,直接调用外部函数的方法
**********************************/
#include
#include "D:\mwq\LAB\z7\ARM\VC\extern_get_c_file_v2\sum.c"//调用外部函数 路径+外部函数名
#define M 10 // 数组元素个数
int num[M]={1,2,3,4,5,6,7,8,9,10};
/********************************
main函数
**********************************/
int main(void)
{
long answer;
answer=sum(num,num+M);//调用求和函数
printf("The total number is %d.\n",answer);
return 0;
}
#include
/********************************
函数功能:求和
输入参数:素组的首尾地址
输出参数:素组所有元素之和
**********************************/
int sum(int * i, int * end)
{
int total=0;
while(i<end)
{
total+=*i;// 把数组元素的值加起来
i++; // 让指针指向下一个元素
}
return total;
}
注:这种方法的实现平台为SDK,但思想一样。
一个main.c 。
子函数源文件用sum.c 表示;子函数头文件用 sum.h表示。
有几个子函数就有几个sum.c 和 sum.h
#include
#include "platform.h"
#include "xil_printf.h"
#include "sleep.h"
#include "sum.h"
#define M 10
int answer;
int main()
{
init_platform();
print("Hello World\n\r");
print("you are my book\n\r");
answer=sum(M);//调用求和函数
printf("The total number is %d.\n",answer);
cleanup_platform();
return 0;
}
#include
#include"sum.h"
/********************************
函数功能:求和
输入参数:素组的首尾地址
输出参数:素组所有元素之和
**********************************/
int sum(int N)
{
int i;
int total=0;
for(i=0;i<=N;i++)
{
total=total+i;// 把数组元素的值加起来
}
return total;
}
#ifndef SUM_H
#define SUM_H
int sum(int N);// 子函数
#endif
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include "Multiple_Beam_send_func.h" // 多波束发射的头文件
/*
工作模式说明
% mode = 0:相控阵接收模式
% mode = 1:空域抗干扰模式(LMS)
% mode = 2:空时抗干扰模式(LMS)
% mode = 3:空域抗干扰模式(DMI)
% mode = 4:空时抗干扰模式(DMI)
% mode = 5:相控阵发射模式
*/
// 输入参数
#define mode 5 // 工作模式
#define T 1 // 信源数(波束个数)
#define S 4 // 阵元数
#define B 320 // 信号总带宽,单位是MHz
#define fs 250 // 采样率,单位是MHz
#define f_clk 250 // 系统钟,单位是MHz
#define flag 0 // 乘法器是否复用 如果乘法器复用,则flag = 1;如果乘法器不复用,则flag = 0。
#define N 89 // 多相滤波器(低通滤波器)的阶数
#define W 16 // 信号位宽 16bit / 32bit,需为16的倍数。
#define IQ_slect 0 // IQ_slect = 1:全部用复信号处理; IQ_slect = 0:尽量用实信号处理。
#define s_p 1 // 阵元权值串行计算,则s_p = 1;如果阵元权值并行计算,则s_p = 0。
#define H 50 // 希尔伯特滤波器的阶数
#define J 1 // 空时滤波阶数
int main()
{
double DSP_est=0, DDS_est=0;
source_struct ZiYuan;
ZiYuan = Multiple_Beam_send_func(S, s_p, flag);
DSP_est = ZiYuan.sum_DSP;// 得到第1个返回值
DDS_est = ZiYuan.sum_DDS; // 得到第2个返回值
printf("DSP_est is %.0f \n\r", DSP_est);
printf("DDS_est is %.0f \n\r", DDS_est);
system("pause");
return 0;
}
#include
#include"Multiple_Beam_send_func.h"
/********************************
函数功能:多波束发射的资源估计
**********************************/
source_struct Multiple_Beam_send_func(int S, int s_p, int flag)
{
//变量声明
source_struct ZiYuan;
double Comp_mul_1 = 0;
double Real_mul_1 = 0;
double DDS_1 = 0;
double Comp_mul_2 = 0;
double Real_mul_2 = 0;
double DDS_2 = 0;
double Comp_mul_3 = 0;
double Real_mul_3 = 0;
double DDS_3 = 0;
double Comp_mul_4 = 0;
double Real_mul_4 = 0;
double DDS_4 = 0;
double sum_Comp_mul = 0;
double sum_Real_mul = 0;
double sum_DSP_Esti = 0;
double sum_DDS_Esti = 0;
// step 1:参考阵元信号生成模块
Comp_mul_1 = 0; // 复数乘法器个数
Real_mul_1 = 0; // 实数乘法器个数
DDS_1 = 1; // DDS个数
// step 2:权值计算模块
if (s_p == 0) // 阵元权值串行计算,则s_p = 1;如果阵元权值并行计算,则s_p = 0。
{
Comp_mul_2 = 0; // 复数乘法器个数
Real_mul_2 = 3 * S; // 实数乘法器个数
DDS_2 = 3 * S; // DDS个数
}
else
{
Comp_mul_2 = 0; // 复数乘法器个数
Real_mul_2 = 3; // 实数乘法器个数
DDS_2 = 3; // DDS个数
}
// step 3:加权求和模块
if (flag == 0) // 如果乘法器复用,则flag = 1;如果乘法器不复用,则flag = 0。
{
Comp_mul_3 = 0;
Real_mul_3 = 2 * S;
DDS_3 = 0;
}
else
{
Comp_mul_3 = 0;
Real_mul_3 = S;
DDS_3 = 0;
}
// step 4:总资源计算
sum_Comp_mul = Comp_mul_1 + Comp_mul_2 + Comp_mul_3; // 复数乘法器个数
sum_Real_mul = Real_mul_1 + Real_mul_2 + Real_mul_3; // 实数乘法器个数
sum_DSP_Esti = sum_Comp_mul * 3 + sum_Real_mul * 1; // DSP资源消耗
sum_DDS_Esti = DDS_1 + DDS_2 + DDS_3; // DDS个数
// test-- - 具体实例的计算公式(2.5)
//R_Mul_DSP_M = 3 + 2 * S; % 多波束接收的乘法器资源
//fprintf('example_DSP=%g\n', R_Mul_DSP_M);
//fprintf('\n');
ZiYuan.sum_DSP = sum_DSP_Esti;
ZiYuan.sum_DDS = sum_DDS_Esti;
return ZiYuan;
}
#pragma once
#ifndef _MUlTIPLE_BEAM_SEND_FUNC_H
#define _MUlTIPLE_BEAM_SEND_FUNC_H
// 定义一个结构体,用来返回子函数的多个参数
typedef struct//结构体
{
double sum_DSP;
double sum_DDS;
}source_struct;// 声明了一个结构体 angle_struct
// 函数调用
source_struct Multiple_Beam_send_func(int S, int s_p, int flag);
#endif