This commit is contained in:
Qiea
2024-12-19 14:06:05 +08:00
parent 1c0f3b676f
commit dcd484c1bd
58 changed files with 14859 additions and 863 deletions

View File

@@ -18,7 +18,7 @@ void print_rslt(float* rslt, u8 input_matrix_length, u32 length){
printf("\r\n");
}
// <EFBFBD><EFBFBD>ԭʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 将原始矩阵复制到填充后的矩阵中央
float* expand(const float* old_matrix, int old_matrix_length, int layer){
float* new_matrix = (float *)mymalloc(SRAMEX,sizeof(float)*layer*(old_matrix_length+2)*(old_matrix_length+2));
memset(new_matrix, 0, sizeof(float)*layer*(old_matrix_length+2)*(old_matrix_length+2));
@@ -35,34 +35,34 @@ float* expand(const float* old_matrix, int old_matrix_length, int layer){
return new_matrix;
}
//model ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//input_matrix <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD>
//input_matrix_length <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD>ı߳<EFBFBD><EFBFBD><EFBFBD>102
//c_rl <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD>ı߳<EFBFBD><EFBFBD><EFBFBD>100
//<EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><EFBFBD><EFBFBD>
//model 模型名字
//input_matrix 输入图像
//input_matrix_length 输入图像的边长:102
//c_rl 输出图像的边长:100
//返回卷积的结果
float* convolution(Model model_w, Model model_b, const float* input_matrix, int input_matrix_length){
// <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 初始化卷积层参数
int im_l = input_matrix_length;
int cr_l = input_matrix_length - 2;
float conv_temp; // <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ洢<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float conv_temp; // 临时变量,用于存储卷积计算的中间结果
//<EFBFBD><EFBFBD><EFBFBD>ںϲ<EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>32*64*50*50(<EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD>)<29>Ĵ<EFBFBD>С
//用于合并前的数组,具有32*64*50*50(第二层)的大小
float* _conv_rlst = (float *) mymalloc(SRAMEX,sizeof (float) * model_w.num_kernels * (cr_l * cr_l));
memset(_conv_rlst, 0, sizeof (float) * model_w.num_kernels * (cr_l * cr_l));
//<EFBFBD><EFBFBD>ͼ<EFBFBD>ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//子图合并后的数组
float* conv_rlst = (float *) mymalloc(SRAMEX,sizeof (float) * model_w.num_kernels * (cr_l * cr_l));
memset(conv_rlst, 0, sizeof (float) * model_w.num_kernels * (cr_l * cr_l));
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>30<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>30<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 遍历30个卷积核假设有30个通道
for(int c=0; c < model_w.channel; c++){
for(int k=0; k < model_w.num_kernels; k++){
for(int row = 0; row < cr_l; row++) {
for (int col = 0; col < cr_l; col++) {
conv_temp = 0; // ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD>ʼ<EFBFBD><EFBFBD>Ϊ0
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>3x3<EFBFBD>ľ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
conv_temp = 0; // 每个输出像素初始化为0
// 进行3x3的卷积操作
for (int x = 0; x < 3; x++) {
for (int y = 0; y < 3; y++) {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ۼӵ<EFBFBD>conv_temp
// 将输入图像的对应像素与卷积核权重相乘,并累加到conv_temp
conv_temp += input_matrix[(c*im_l*im_l) + (row*(im_l)+col) + (x*(im_l)+y)]
* model_w.array[((c+k*model_w.channel)*3*3) + (x*3+y)];
}
@@ -71,7 +71,7 @@ float* convolution(Model model_w, Model model_b, const float* input_matrix, int
}
}
}
//<EFBFBD>ϲ<EFBFBD><EFBFBD><EFBFBD>ͼ
//合并子图
for(int k=0; k < model_w.num_kernels; k++) {
for (int row = 0; row < cr_l; row++) {
for (int col = 0; col < cr_l; col++) {
@@ -84,13 +84,13 @@ float* convolution(Model model_w, Model model_b, const float* input_matrix, int
for (int row = 0; row < cr_l; row++) {
for (int col = 0; col < cr_l; col++) {
conv_temp = conv_rlst[(k * cr_l * cr_l) + (row * cr_l + col)];
// <EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD>ƫ<EFBFBD><EFBFBD>
// 加上对应卷积核的偏置
conv_temp += model_b.array[k];
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ReLU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>0<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>Ϊ0<EFBFBD><EFBFBD>
// 激活函数ReLU将小于0的值设为0
if (conv_temp > 0)
conv_rlst[(k * (cr_l * cr_l)) + (row * cr_l) + (col)] = conv_temp; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
conv_rlst[(k * (cr_l * cr_l)) + (row * cr_l) + (col)] = conv_temp; // 如果卷积结果大于0存入结果数组
else
conv_rlst[(k * (cr_l * cr_l)) + (row * cr_l) + (col)] = 0; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
conv_rlst[(k * (cr_l * cr_l)) + (row * cr_l) + (col)] = 0; // 否则存入0
}
}
}
@@ -99,38 +99,38 @@ float* convolution(Model model_w, Model model_b, const float* input_matrix, int
return conv_rlst;
}
//num_kernels <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵ĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>32
//area <EFBFBD>ػ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2*2
//input_matrix <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD>
//input_matrix_length <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD>ı߳<EFBFBD><EFBFBD><EFBFBD>100
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD>ı߳<EFBFBD><EFBFBD><EFBFBD>50
//<EFBFBD><EFBFBD><EFBFBD>سػ<EFBFBD><EFBFBD>Ľ<EFBFBD><EFBFBD><EFBFBD>
//num_kernels 卷积核的个数:32
//area 池化的面积:2*2
//input_matrix 输入图像
//input_matrix_length 输入图像的边长:100
//输出图像的边长:50
//返回池化的结果
float* pooling(Model model_w, const float* input_matrix, u8 input_matrix_length){
u8 im_l = input_matrix_length;
float pool_temp = 0; // <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ洢<EFBFBD>ػ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
float pool_temp = 0; // 临时变量,用于存储池化操作的最大值
float* pool_rslt = (float *) mymalloc(SRAMEX,sizeof (float)*model_w.num_kernels*im_l*im_l);
memset(pool_rslt, 0, sizeof (float)*model_w.num_kernels*im_l*im_l);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>30<EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD>
// 遍历30个通道与卷积核数量相同
for(u8 n=0; n<model_w.num_kernels; n++)
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿһ<EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ2<EFBFBD><EFBFBD>2x2<EFBFBD>ijػ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD>
// 遍历输入图像的每一行步长为22x2的池化窗口
for(u8 row=0; row<im_l; row=row+2)
{
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿһ<EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ2
// 遍历输入图像的每一列,步长为2
for(u8 col=0; col<im_l; col=col+2)
{
pool_temp = 0; // ÿ<EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>Ϊ0
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>2x2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
pool_temp = 0; // 每个池化区域的最大值初始化为0
// 进行2x2的最大池化操作
for(u8 x=0; x<2; x++)
{
for(u8 y=0; y<2; y++)
{
// <EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>ǰ<EFBFBD>ػ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// 更新当前池化区域的最大值
if(pool_temp <= input_matrix[row*im_l+col+x*im_l+y+n*(im_l*im_l)])
pool_temp = input_matrix[row*im_l+col+x*im_l+y+n*(im_l*im_l)];
}
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 将最大值存入池化结果数组
pool_rslt[(row/2)*(im_l/2)+col/2+n*((im_l/2)*(im_l/2))] = pool_temp;
}
}
@@ -139,29 +139,29 @@ float* pooling(Model model_w, const float* input_matrix, u8 input_matrix_length)
}
float* hidden(const float* input_matrix){
float affine1_temp; // <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ洢ȫ<EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float affine1_temp; // 临时变量,用于存储全连接层的中间结果
float *affine1_rslt = (float *) mymalloc(SRAMEX,sizeof(float)*128);
memset(affine1_rslt, 0, sizeof(float)*128);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>128<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>128<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>
// 遍历128个神经元假设隐藏层有128个神经元
for(u8 n=0; n<128; n++)
{
affine1_temp = 0; // ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>Ϊ0
affine1_temp = 0; // 每个神经元的输出初始化为0
// <EFBFBD><EFBFBD><EFBFBD>о<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չƽΪһά<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD>Ȩ<EFBFBD>ؽ<EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD>
// 进行矩阵乘法,将池化层输出展平为一维向量后,与全连接层权重进行点积
for(int i=0; i<(128*12*12); i++)
{
affine1_temp = affine1_temp + input_matrix[i] * fc1_weight.array[i+(128*12*12)*n];
}
// <EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>
// 加上对应神经元的偏置
affine1_temp = affine1_temp + fc1_bias.array[n];
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ReLU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD>0<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>Ϊ0<EFBFBD><EFBFBD>
// 激活函数ReLU将小于0的值设为0
if(affine1_temp > 0)
affine1_rslt[n] = affine1_temp; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
affine1_rslt[n] = affine1_temp; // 如果结果大于0存入结果数组
else
affine1_rslt[n] = 0; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
affine1_rslt[n] = 0; // 否则存入0
}
// print_rslt(affine1_rslt,1,128);
@@ -171,24 +171,24 @@ float* hidden(const float* input_matrix){
float* output(Model model_w, const float* input_matrix){
u8 num = model_w.num_kernels;
float affine2_temp; // <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ洢<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float affine2_temp; // 临时变量,用于存储输出层的中间结果
float *affine2_rslt = (float *) mymalloc(SRAMEX,(sizeof(float)*num));
memset(affine2_rslt, 0, sizeof(float)*num);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>10<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>10<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 遍历10个输出神经元假设有10个类别
for(int n=0; n<num; n++)
{
affine2_temp = 0; // <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>Ϊ0
affine2_temp = 0; // 当前神经元的输出初始化为0
// <EFBFBD><EFBFBD><EFBFBD>о<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD>ؽ<EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD>
// 进行矩阵乘法,将隐藏层的输出与输出层权重进行点积
for(int i=0; i<128; i++)
{
affine2_temp = affine2_temp + fc2_weight.array[i+128*n] * input_matrix[i];
}
// <EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>
// 加上对应神经元的偏置
affine2_temp = affine2_temp + fc2_weight.array[n];
affine2_rslt[n] = affine2_temp; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><EFBFBD><EFBFBD>
affine2_rslt[n] = affine2_temp; // 存储输出层的结果
}
return affine2_rslt;
@@ -306,8 +306,8 @@ u8 calculate_layer(Model model_w, float *input_array){
{
if(max_temp <= input_array[n])
{
max_temp = input_array[n]; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
predict_num = n; // <EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
max_temp = input_array[n]; // 更新最大值
predict_num = n; // 记录最大值对应的类别索引
}
}
print_rslt(input_array,input_num,input_num);
@@ -319,20 +319,20 @@ void cnn_run(){
float value[3] = {0};
calculate_statistics(data,&value[0]);
if (check_threshold(data,&value[0])){
//<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>100 * 100 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//初始化:生成100 * 100 矩阵
float* _data = generateMatrix(data,&value[0]);
char kind[50];
DEBUG_PRINTF("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ磡<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:%f ƽ<><C6BD>ֵ:%f <20><>׼<EFBFBD><D7BC>:%f\r\n",value[0],value[1],value[2]);
DEBUG_PRINTF("<EFBFBD><EFBFBD>ԭʼ<EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><EFBFBD><EFBFBD>SD<EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\n");
DEBUG_PRINTF("检测到放电!最大值:%f 平均值:%f 标准差:%f\r\n",value[0],value[1],value[2]);
DEBUG_PRINTF("将原始数据存入SD卡中\r\n");
SDRAM_TO_SD();
char* _uuid = uuid();
CSTX_4G_RegALiYunIOT(1); //<2F><><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5>ϱ<EFBFBD>
send_blocks(_data,_uuid);
// CSTX_4G_RegALiYunIOT(1); //订阅到物模型 用于数据的上报
// send_blocks(_data,_uuid);
//<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>102 * 102
DEBUG_PRINTF("<EFBFBD><EFBFBD>һ<EFBFBD>ʼ\n");
//第一层:填充102 * 102
DEBUG_PRINTF("第一层开始\n");
float* expand_matrix_1 = expand(_data, 100, 1);
float* conv_rlst_1 = convolution(conv1_weight,conv1_bias,expand_matrix_1, 102);
float* pool_rslt_1 = pooling(conv1_weight, conv_rlst_1, 100);
@@ -344,8 +344,8 @@ void cnn_run(){
myfree(SRAMEX,conv_rlst_1);
conv_rlst_1 = NULL;
//<EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>32 * 52 * 52
DEBUG_PRINTF("<EFBFBD>ڶ<EFBFBD><EFBFBD>ʼ\n");
//第二层:填充32 * 52 * 52
DEBUG_PRINTF("第二层开始\n");
float* expand_matrix_2 = expand(pool_rslt_1, 50, 32);
float* conv_rlst_2 = convolution(conv2_weight,conv2_bias,expand_matrix_2, 52);
float* pool_rslt_2 = pooling(conv2_weight, conv_rlst_2, 50);
@@ -357,8 +357,8 @@ void cnn_run(){
myfree(SRAMEX,conv_rlst_2);
conv_rlst_2 = NULL;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 64 * 27 * 27
DEBUG_PRINTF("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ\n");
//第三层:填充 64 * 27 * 27
DEBUG_PRINTF("第三层开始\n");
float* expand_matrix_3 = expand(pool_rslt_2, 25, 64);
float* conv_rlst_3 = convolution(conv3_weight,conv3_bias,expand_matrix_3, 27);
float* pool_rslt_3 = pooling(conv3_weight, conv_rlst_3, 25);
@@ -370,18 +370,18 @@ void cnn_run(){
myfree(SRAMEX,conv_rlst_3);
conv_rlst_3 = NULL;
DEBUG_PRINTF("<EFBFBD><EFBFBD><EFBFBD>IJ㿪ʼ\n");
DEBUG_PRINTF("第四层开始\n");
float* affine1_rslt = hidden(pool_rslt_3);
DEBUG_PRINTF("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ\r\n");
DEBUG_PRINTF("第五层开始\r\n");
float* affine2_rslt = output(fc2_weight, affine1_rslt);
DEBUG_PRINTF("<EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>%f\r\n",calculate_probabilities(fc2_weight, affine2_rslt));
DEBUG_PRINTF("概率:%f\r\n",calculate_probabilities(fc2_weight, affine2_rslt));
DEBUG_PRINTF("Label is:%d\r\n",calculate_layer(fc2_weight, affine2_rslt));
snprintf(kind, 50,"UUID:%s P:%f Label:%d", _uuid, calculate_probabilities(fc2_weight, affine2_rslt), calculate_layer(fc2_weight, affine2_rslt));
CSTX_4G_ALiYunIOTSenddata_string(kind,"kind_string");
// snprintf(kind, 50,"UUID:%s P:%f Label:%d", _uuid, calculate_probabilities(fc2_weight, affine2_rslt), calculate_layer(fc2_weight, affine2_rslt));
// CSTX_4G_ALiYunIOTSenddata_string(kind,"kind_string");
CSTX_4G_RegALiYunIOT(0); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD>ʱ<EFBFBD><EFBFBD> <20>ź<EFBFBD>
// CSTX_4G_RegALiYunIOT(0); //接收下发时间 信号
myfree(SRAMEX,pool_rslt_3);
pool_rslt_3 = NULL;
@@ -391,6 +391,6 @@ void cnn_run(){
affine2_rslt = NULL;
} else{
DEBUG_PRINTF("δ<EFBFBD>ŵ磡<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:%f ƽ<><C6BD>ֵ:%f <20><>׼<EFBFBD><D7BC>:%f\r\n",value[0],value[1],value[2]);
DEBUG_PRINTF("未放电!最大值:%f 平均值:%f 标准差:%f\r\n",value[0],value[1],value[2]);
}
}

View File

@@ -175,7 +175,7 @@ u8 model_write(char* model_name)
if(_model == NULL || strcmp(model_name, "data") == 0){
sprintf(_path, "dataset/_data/%s.txt", model_name);
if(f_open(file, (const TCHAR *)_path, 1)){
DEBUG_PRINTF("\r\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD>ģ<EFBFBD>ͻ<EFBFBD>Data<EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\n");
DEBUG_PRINTF("\r\n输入了一个无效的模型或Data数据集的名字\r\n");
return 199;
}else{
_model = model("data");
@@ -186,33 +186,33 @@ u8 model_write(char* model_name)
if(_model -> dname == NULL){
sprintf(_path, "dataset/%s.txt", _model -> name);
if(f_open(file, (const TCHAR *)_path, 1)){
DEBUG_PRINTF("Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>ͣ<EFBFBD>[%s]\r\n", _path);
DEBUG_PRINTF("预设里没有这个模型:[%s]\r\n", _path);
return 4;
}
}
if(_model -> array == NULL && modelmym_init(_model -> name) == NULL){
DEBUG_PRINTF("<EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD>[%s]<5D><><EFBFBD><EFBFBD><EFBFBD>SDRAM<EFBFBD><EFBFBD>\r\n", _model -> name);
DEBUG_PRINTF("无法创建模型参数[%s]的数组到SDRAM\r\n", _model -> name);
return 200;
}
if(_model -> dname)sprintf(_datapath, "_data/%s", _model -> dname);
sprintf(_path, "dataset/%s.txt", _model -> dname ? _datapath : _model -> name);
if(f_open(file, (const TCHAR *)_path, 1)){
DEBUG_PRINTF("<EFBFBD>ļ<EFBFBD>[%s]<EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\n", _model -> dname ? _model -> dname : _model -> name);
DEBUG_PRINTF("文件[%s]无法打开\r\n", _model -> dname ? _model -> dname : _model -> name);
return 199;
}
DEBUG_PRINTF("д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD>%s\r\n", _model -> name);
if(_model -> dname)DEBUG_PRINTF("д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Data<EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD><EFBFBD>ǣ<EFBFBD>%s\r\n", _model -> dname);
DEBUG_PRINTF("д<EFBFBD><EFBFBD>ģ<EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󳤶<EFBFBD>Ϊ<EFBFBD><EFBFBD>%d\r\n", _model -> maxlength);
DEBUG_PRINTF("Ŀǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>%d", _model -> realength);
printf("\r\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>ģ<EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD>'%s'<27><><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD>......\r\n",_model -> dname ? _model -> dname : _model -> name);
DEBUG_PRINTF("写入的模型参数名字是:%s\r\n", _model -> name);
if(_model -> dname)DEBUG_PRINTF("写入的Data数据集是%s\r\n", _model -> dname);
DEBUG_PRINTF("写入模型参数数组的最大长度为:%d\r\n", _model -> maxlength);
DEBUG_PRINTF("目前数组存活的元素数量为:%d", _model -> realength);
printf("\r\n正在写入模型参数'%s',请稍后......\r\n",_model -> dname ? _model -> dname : _model -> name);
while(1){
res = f_read(file, fatbuf, READLENGTH ,&br);
if(res){
DEBUG_PRINTF("<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>%d\r\n",res);
DEBUG_PRINTF("读文件出错,错误码为:%d\r\n",res);
return res;
}else{
for(int i=0; i < br; i++){
@@ -220,11 +220,11 @@ u8 model_write(char* model_name)
float _fvalue = atof(_fstr);
if(isneg)_fvalue = -_fvalue;
_model -> array[_larr++] = _fvalue;
//DEBUG_PRINTF("<EFBFBD>س<EFBFBD>[%d] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[string]: %s\r\n<EFBFBD>س<EFBFBD>[%d] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[float]: %f\r\n",i,_fstr,_fvalue);
//DEBUG_PRINTF("回车[%d] 单行数据是[string]: %s\r\n回车[%d] 单行数据是[float]: %f\r\n",i,_fstr,_fvalue);
i++;
isneg=0;
*_fstr = NULL;
_model -> realength = _larr; //_larr<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󳤶<EFBFBD>
_model -> realength = _larr; //_larr最大值为模型最大长度
if(_larr >= _model -> maxlength)break;
}
else if(fatbuf[i] == 0x2d)isneg = 1;
@@ -246,7 +246,7 @@ u8 model_write(char* model_name)
if(_larr >= _model -> maxlength)break;
}
}
DEBUG_PRINTF("\r\nģ<EFBFBD>Ͳ<EFBFBD><EFBFBD><EFBFBD>[%s]<5D><>д<EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>! ģ<>ͳ<EFBFBD><CDB3><EFBFBD>Ϊ %d\r\n",_model -> dname ? _model -> dname : _model -> name,_model -> realength);
DEBUG_PRINTF("\r\n模型参数[%s]已写入到内存中! 模型长度为 %d\r\n",_model -> dname ? _model -> dname : _model -> name,_model -> realength);
return 0;
}
return 1;
@@ -288,16 +288,16 @@ u8 model_switchdata(char* data_name){
if(data.array != NULL)modelmym_free("data");
sprintf(_path, "dataset/_data/%s.txt",data_name);
if(f_open(file,(const TCHAR*)_path,1)){
DEBUG_PRINTF("\r\nData<EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD>[%s]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\n",data_name);
DEBUG_PRINTF("\r\nData数据集[%s]不存在\r\n",data_name);
return 0;
}else{
u8 _res = model_write(data_name);
if (_res) {
DEBUG_PRINTF("Data<EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD>[%s]<5D>л<EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>\r\n",data_name);
DEBUG_PRINTF("Data数据集[%s]切换失败!!\r\n",data_name);
return 0;
}
else DEBUG_PRINTF("Data<EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD>[%s]<5D>л<EFBFBD><D0BB>ɹ<EFBFBD><C9B9><EFBFBD>\r\n",data_name);
DEBUG_PRINTF("data_name<EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>%d\r\n_path<EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>%d\r\n_pathΪ<EFBFBD><EFBFBD>%s\r\n",_len,sizeof(_path),_path);
else DEBUG_PRINTF("Data数据集[%s]切换成功!\r\n",data_name);
DEBUG_PRINTF("data_name的长度为:%d\r\n_path的长度为:%d\r\n_path为:%s\r\n",_len,sizeof(_path),_path);
return 1;
}
}
@@ -326,7 +326,7 @@ u8 model_info(char* model_name){
printf("model.array.address is: 0X%X\r\n",_model -> array);
printf("model.maxlength is: %d\r\n",_model -> maxlength);
printf("model.realength is: %d\r\n",_model -> realength);
//if(strcmp(_model -> name, "data") == 0)printf("dataset is: %s\r\n",_model -> dname); <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BUG<EFBFBD><EFBFBD><EFBFBD><EFBFBD>model_dataset<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//if(strcmp(_model -> name, "data") == 0)printf("dataset is: %s\r\n",_model -> dname); 这函数有BUGmodel_dataset函数
return 1;
}
return 0;

View File

@@ -39,9 +39,9 @@ typedef struct {
#define FC2_BIAS_ARRSIZE (4) //4<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define FC2_BIAS_ARRSIZE (4) //4个卷积核
#define FC2_WEIGHT_ARRSIZE (4*128)
#define DATA_ARRSIZE (1300000) //ԭʼ<EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD> 1300000
#define DATA_ARRSIZE (1300000) //原始数据长度 1300000

View File

@@ -30,76 +30,76 @@ void SDRAM_USED(){
u8 paddr[20];
memused=my_mem_perused(SRAMEX);
sprintf((char*)paddr,"%d.%01d%%",memused/10,memused%10);
printf("SDRAMʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>%s\r\n",paddr);
printf("SDRAM使用量为:%s\r\n",paddr);
}
void scan_files(u8 * path)
{
FRESULT res;
res = f_opendir(&dir,(const TCHAR*)path); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>Ŀ¼
res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录
if (res == FR_OK)
{
printf("\r\n");
while(1)
{
res = f_readdir(&dir, &fileinfo); //<EFBFBD><EFBFBD>ȡĿ¼<EFBFBD>µ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
if (res != FR_OK || fileinfo.fname[0] == 0) break; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><>ĩβ<C4A9><CEB2>,<2C>˳<EFBFBD>
//if (fileinfo.fname[0] == '.') continue; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD>Ŀ¼
printf("%s/", path);//<EFBFBD><EFBFBD>ӡ·<EFBFBD><EFBFBD>
printf("%s\r\n",fileinfo.fname);//<EFBFBD><EFBFBD>ӡ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
res = f_readdir(&dir, &fileinfo); //读取目录下的一个文件
if (res != FR_OK || fileinfo.fname[0] == 0) break; //错误了/到末尾了,退出
//if (fileinfo.fname[0] == '.') continue; //忽略上级目录
printf("%s/", path);//打印路径
printf("%s\r\n",fileinfo.fname);//打印文件名
}
}
}
TIM_HandleTypeDef TIM3_Handler; //<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TIM_HandleTypeDef TIM3_Handler; //定时器句柄
//ͨ<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><EFBFBD>3<EFBFBD>жϳ<EFBFBD>ʼ<EFBFBD><EFBFBD>
//arr<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>װֵ<EFBFBD><EFBFBD>
//psc<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>
//<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>,<2C><>λ:Mhz
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><EFBFBD>Ƕ<EFBFBD>ʱ<EFBFBD><EFBFBD>3!(<28><>ʱ<EFBFBD><CAB1>3<EFBFBD><33><EFBFBD><EFBFBD>APB1<42>ϣ<EFBFBD>ʱ<EFBFBD><CAB1>ΪHCLK/2)
//通用定时器3中断初始化
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器3!(定时器3挂在APB1上时钟为HCLK/2)
void TIM3_Init(u16 arr,u16 psc)
{
TIM3_Handler.Instance=TIM3; //ͨ<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><EFBFBD>3
TIM3_Handler.Init.Prescaler=psc; //<EFBFBD><EFBFBD>Ƶϵ<EFBFBD><EFBFBD>
TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //<EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TIM3_Handler.Init.Period=arr; //<EFBFBD>Զ<EFBFBD>װ<EFBFBD><EFBFBD>ֵ
TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//ʱ<EFBFBD>ӷ<EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TIM3_Handler.Instance=TIM3; //通用定时器3
TIM3_Handler.Init.Prescaler=psc; //分频系数
TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM3_Handler.Init.Period=arr; //自动装载值
TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
HAL_TIM_Base_Init(&TIM3_Handler);
HAL_TIM_Base_Start_IT(&TIM3_Handler); //ʹ<EFBFBD>ܶ<EFBFBD>ʱ<EFBFBD><EFBFBD>3<EFBFBD>Ͷ<EFBFBD>ʱ<EFBFBD><EFBFBD>3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<EFBFBD>TIM_IT_UPDATE
HAL_TIM_Base_Start_IT(&TIM3_Handler); //使能定时器3和定时器3更新中断TIM_IT_UPDATE
}
//<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ӣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>
//<EFBFBD>˺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>HAL_TIM_Base_Init()<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//定时器底册驱动,开启时钟,设置中断优先级
//此函数会被HAL_TIM_Base_Init()函数调用
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_ENABLE(); //ʹ<EFBFBD><EFBFBD>TIM3ʱ<EFBFBD><EFBFBD>
HAL_NVIC_SetPriority(TIM3_IRQn,1,3); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>3
HAL_NVIC_EnableIRQ(TIM3_IRQn); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ITM3<EFBFBD>ж<EFBFBD>
__HAL_RCC_TIM3_CLK_ENABLE(); //使能TIM3时钟
HAL_NVIC_SetPriority(TIM3_IRQn,1,3); //设置中断优先级抢占优先级1子优先级3
HAL_NVIC_EnableIRQ(TIM3_IRQn); //开启ITM3中断
}
}
//<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>3<EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM3_Handler);
}
//<EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//回调函数,定时器中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&TIM3_Handler))
{
LED_R=!LED_R; //LED1<EFBFBD><EFBFBD>ת
LED_R=!LED_R; //LED1反转
}
}

View File

@@ -5,7 +5,7 @@ char* uuid(){
static char uuid_str[9];
u32 time_stamp = HAL_GetTick();
u32 random_part = rand();
snprintf(uuid_str, 9, // 16 λ UUID<EFBFBD><EFBFBD>8 <20><><EFBFBD>ַ<EFBFBD> + <20><><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
snprintf(uuid_str, 9, // 16 UUID8 个字符 + 空终止符)
"%04lX%04lX",
(unsigned long)(time_stamp & 0xFFFF),
(unsigned long)(random_part & 0xFFFF));
@@ -15,7 +15,7 @@ char* uuid(){
void send_blocks(float* arr, char* uuid_str){
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢1000<30><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
// 按块处理 每个块的最大字符数最多存储1000个浮点数的字符串
char* block = (char*) mymalloc(SRAMEX,sizeof(char)*100*100);
memset(block, 0 ,sizeof(char)*100*100);
int block_index = 0;
@@ -26,8 +26,8 @@ void send_blocks(float* arr, char* uuid_str){
for (int j = 0; j < 100; ++j) {
int n = snprintf(block + block_index, 100 * 100 - block_index, "%.6f|", arr[i * 100 + j]);
block_index += n;
if (block_index >= 7000) {
block_index = 0; // <EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD>
if (block_index >= 5000) {
block_index = 0; // 重置块
_total_len++;
}
}
@@ -39,10 +39,10 @@ void send_blocks(float* arr, char* uuid_str){
for (int j = 0; j < 100; ++j) {
int n = snprintf(block + block_index, 100*100 - block_index, "%.6f|", arr[i*100+j]);
block_index += n;
if (block_index >= 7000) {
if (block_index >= 5000) {
char* _block = (char*) mymalloc(SRAMEX,sizeof(char)*100*100);
memset(_block, 0 ,sizeof(char)*100*100);
block_index = 0; // <EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD>
block_index = 0; // 重置块
sprintf(_block, "{\\\"uuid\\\":\\\"%s\\\",\\\"Bid\\\":\\\"%d\\\",\\\"Eid\\\":\\\"%d\\\",\\\"Block\\\":\\\"%s\\\"}\n", uuid_str, total_len++, _total_len, block);
//DEBUG_PRINTF("%s", _block);
@@ -53,7 +53,7 @@ void send_blocks(float* arr, char* uuid_str){
}
}
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 输出最后一个块
if (block_index > 0) {
char* _block = (char*) mymalloc(SRAMEX,sizeof(char)*100*100);
memset(_block, 0 ,sizeof(char)*100*100);

View File

@@ -158,59 +158,7 @@ u8 exf_getfree(u8 *drv,u32 *total,u32 *free)
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>,0XFF,ǿ<><C7BF><EFBFBD>˳<EFBFBD>
u8 exf_copy(u8(*fcpymsg)(u8*pname,u8 pct,u8 mode),u8 *psrc,u8 *pdst,u32 totsize,u32 cpdsize,u8 fwmode)
{
u8 res;
u16 br=0;
u16 bw=0;
FIL *fsrc=0;
FIL *fdst=0;
u8 *fbuf=0;
u8 curpct=0;
unsigned long long lcpdsize=cpdsize;
fsrc=(FIL*)mymalloc(SRAMEX,sizeof(FIL));//<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
fdst=(FIL*)mymalloc(SRAMEX,sizeof(FIL));
fbuf=(u8*)mymalloc(SRAMEX,8192);
if(fsrc==NULL||fdst==NULL||fbuf==NULL)res=100;//ǰ<><C7B0><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>fatfs
else
{
if(fwmode==0)fwmode=FA_CREATE_NEW;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else fwmode=FA_CREATE_ALWAYS; //<2F><><EFBFBD>Ǵ<EFBFBD><C7B4>ڵ<EFBFBD><DAB5>ļ<EFBFBD>
res=f_open(fsrc,(const TCHAR*)psrc,FA_READ|FA_OPEN_EXISTING); //<2F><><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD>ļ<EFBFBD>
if(res==0)res=f_open(fdst,(const TCHAR*)pdst,FA_WRITE|fwmode); //<2F><>һ<EFBFBD><D2BB><EFBFBD>򿪳ɹ<F2BFAAB3>,<2C>ſ<EFBFBD>ʼ<EFBFBD>򿪵ڶ<F2BFAAB5><DAB6><EFBFBD>
if(res==0)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򿪳ɹ<F2BFAAB3><C9B9><EFBFBD>
{
if(totsize==0)//<2F><><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
{
totsize=fsrc->obj.objsize;
lcpdsize=0;
curpct=0;
}else curpct=(lcpdsize*100)/totsize; //<2F>õ<EFBFBD><C3B5>°ٷֱ<D9B7>
fcpymsg(psrc,curpct,0X02); //<2F><><EFBFBD>°ٷֱ<D9B7>
while(res==0)//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
{
res=f_read(fsrc,fbuf,8192,(UINT*)&br); //Դͷ<D4B4><CDB7><EFBFBD><EFBFBD>512<31>ֽ<EFBFBD>
if(res||br==0)break;
res=f_write(fdst,fbuf,(UINT)br,(UINT*)&bw); //д<><D0B4>Ŀ<EFBFBD><C4BF><EFBFBD>ļ<EFBFBD>
lcpdsize+=bw;
if(curpct!=(lcpdsize*100)/totsize)//<2F>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>°ٷֱ<D9B7>
{
curpct=(lcpdsize*100)/totsize;
if(fcpymsg(psrc,curpct,0X02))//<2F><><EFBFBD>°ٷֱ<D9B7>
{
res=0XFF;//ǿ<><C7BF><EFBFBD>˳<EFBFBD>
break;
}
}
if(res||bw<br)break;
}
f_close(fsrc);
f_close(fdst);
}
}
myfree(SRAMEX,fsrc);//<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
myfree(SRAMEX,fdst);
myfree(SRAMEX,fbuf);
return res;
return 1;
}
//<2F>õ<EFBFBD>·<EFBFBD><C2B7><EFBFBD>µ<EFBFBD><C2B5>ļ<EFBFBD><C4BC><EFBFBD>

View File

@@ -14,9 +14,9 @@
//<2F>ڴ<EFBFBD><DAB4><EFBFBD>(32<33>ֽڶ<D6BD><DAB6><EFBFBD>) //<2F>ڲ<EFBFBD>SRAM<41>ڴ<EFBFBD><DAB4><EFBFBD>
__align(32) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0XC01F4000))); //<2F>ⲿSDRAM<41>ڴ<EFBFBD><DAB4><EFBFBD><><C7B0>2M<32><4D>LTDC<44><43><EFBFBD><EFBFBD>(1280*800*2)
__align(32) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0XC0560F80))); //<2F>ⲿSDRAM<41>ڴ<EFBFBD><DAB4><EFBFBD><><C7B0>2M<32><4D>LTDC<44><43><EFBFBD><EFBFBD>(1280*800*2)
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u32 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0XC01F4000+MEM2_MAX_SIZE))); //<2F>ⲿSRAM<41>ڴ<EFBFBD><DAB4><EFBFBD>MAP
u32 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0XC0560F80+MEM2_MAX_SIZE))); //<2F>ⲿSRAM<41>ڴ<EFBFBD><DAB4><EFBFBD>MAP
//<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const u32 memtblsize[SRAMBANK]={MEM2_ALLOC_TABLE_SIZE}; //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>С
const u32 memblksize[SRAMBANK]={MEM2_BLOCK_SIZE}; //<2F>ڴ<EFBFBD><DAB4>ֿ<EFBFBD><D6BF><EFBFBD>С