init
This commit is contained in:
@@ -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>
|
||||
// 遍历输入图像的每一行,步长为2(2x2的池化窗口)
|
||||
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]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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); 这函数有BUG,用model_dataset函数
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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反转
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 位 UUID(8 个字符 + 空终止符)
|
||||
"%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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>С
|
||||
|
||||
Reference in New Issue
Block a user