精简项目
删除了不需要的文件,并整理了文件夹
This commit is contained in:
631
PORTING/CNN/cnn.c
Normal file
631
PORTING/CNN/cnn.c
Normal file
@@ -0,0 +1,631 @@
|
||||
#include "cnn.h"
|
||||
|
||||
u8 isrun;
|
||||
|
||||
void _cnn_run(){
|
||||
isrun = 1;
|
||||
}
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>*/
|
||||
/// @brief <20><>ӡͼ<D3A1><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// @param array <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
|
||||
/// @param array_num <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ܵĸ<DCB5><C4B8><EFBFBD>
|
||||
/// @param elements_per_line ÿһ<C3BF>еĸ<D0B5><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
void PrintfArray(float *array, int array_num, int elements_per_line)
|
||||
{
|
||||
for (int i = 0; i < array_num; i++)
|
||||
{
|
||||
printf("%f ", array[i]); // <20><>ӡ<EFBFBD><D3A1>ǰԪ<C7B0><D4AA>
|
||||
// ÿ<><C3BF>ӡ<EFBFBD><D3A1>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD><EFBFBD>
|
||||
if ((i + 1) % elements_per_line == 0)
|
||||
{
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ԫ<EFBFBD>ز<EFBFBD><D8B2>㣬<EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (array_num % elements_per_line != 0)
|
||||
{
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void PrintfResArray(float *array, int array_num, int elements_per_line)
|
||||
{
|
||||
for (int i = 0; i < array_num; i++)
|
||||
{
|
||||
printf("%f ", array[i]); // <20><>ӡ<EFBFBD><D3A1>ǰԪ<C7B0><D4AA>
|
||||
// ÿ<><C3BF>ӡ<EFBFBD><D3A1>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD><EFBFBD>
|
||||
if ((i + 1) % elements_per_line == 0)
|
||||
{
|
||||
printf("\t");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*<2A><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>*/
|
||||
/// @brief <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ά<EFBFBD><CEAC><EFBFBD>飬<EFBFBD><E9A3AC><EFBFBD><EFBFBD>ΪelementSize
|
||||
/// @param depth <20><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>a[depth][]
|
||||
/// @param num <20><><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>a[][num]
|
||||
/// @param elementSize <20><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void **allocate2DArray(int depth, int num, size_t elementSize)
|
||||
{
|
||||
void **array = (void **)mymalloc(SRAMEX, depth * sizeof(void *));
|
||||
for (int d = 0; d < depth; d++)
|
||||
{
|
||||
array[d] = mymalloc(SRAMEX, num * elementSize);
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
/// @brief <20>ͷ<EFBFBD>ͨ<EFBFBD><CDA8>allocate2DArray<61><79><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>
|
||||
/// @param array <20><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>
|
||||
/// @param depth <20><><EFBFBD><EFBFBD>
|
||||
void free2DArray(float **array, int depth)
|
||||
{
|
||||
for (int d = 0; d < depth; d++)
|
||||
{
|
||||
myfree(SRAMEX, array[d]);
|
||||
}
|
||||
myfree(SRAMEX, array);
|
||||
}
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><D8BA><EFBFBD>*/
|
||||
/// @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD>
|
||||
/// @param inputArray <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
|
||||
/// @param input_size <20><><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>е<EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>磺100<30><30>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>100<30><30>Ԫ<EFBFBD><D4AA>
|
||||
/// @param outputArray <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
|
||||
void Full(float *inputArray, int input_size, float *outputArray)
|
||||
{
|
||||
int i, j;
|
||||
for (i = 0; i < ((input_size + 2) * (input_size + 2)); i++)
|
||||
{
|
||||
outputArray[i] = 0;
|
||||
}
|
||||
for (i = 0; i < input_size; i++)
|
||||
{
|
||||
for (j = 0; j < input_size; j++)
|
||||
{
|
||||
outputArray[(i + 1) * (input_size + 2) + (j + 1)] = inputArray[i * input_size + j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>гػ<D0B3><D8BB><EFBFBD>ѡȡkernel_size*kernel_size<7A>ķ<EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊstep
|
||||
/// @param inputArray <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
|
||||
/// @param input_size <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ĵ<EFBFBD><C4B5>е<EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
|
||||
/// @param kernel_size <20>ػ<EFBFBD><D8BB>˵ĵ<CBB5><C4B5>е<EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
|
||||
/// @param step <20><><EFBFBD><EFBFBD>ֵ
|
||||
/// @param outputArray <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
|
||||
void Pooling(float *inputArray, int input_size,
|
||||
int kernel_size, unsigned int step,
|
||||
float *outputArray)
|
||||
{
|
||||
int output_size = (input_size - kernel_size) / step + 1;
|
||||
|
||||
for (int i = 0; i < output_size; i++)
|
||||
{
|
||||
for (int j = 0; j < output_size; j++)
|
||||
{
|
||||
float max_value = 0;
|
||||
|
||||
for (int m = 0; m < kernel_size; m++)
|
||||
{
|
||||
for (int n = 0; n < kernel_size; n++)
|
||||
{
|
||||
int input_row = i * step + m;
|
||||
int input_col = j * step + n;
|
||||
int input_idx = input_row * input_size + input_col;
|
||||
|
||||
if (inputArray[input_idx] > max_value)
|
||||
{
|
||||
max_value = inputArray[input_idx];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int output_idx = i * output_size + j;
|
||||
outputArray[output_idx] = max_value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD>ѡȡkernel_size*kernel_size<7A>ķ<EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD>ﲽ<EFBFBD><EFB2BD>Ϊ1
|
||||
/// @param inputArray <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
|
||||
/// @param input_size <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ĵ<EFBFBD><C4B5>е<EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
|
||||
/// @param kernel <20><><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD>kernel_size * kernel_size<7A>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD>˲<EFBFBD><CBB2><EFBFBD>
|
||||
/// @param kernel_size <20>ػ<EFBFBD><D8BB>˵ĵ<CBB5><C4B5>е<EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
|
||||
/// @param outputArray <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
|
||||
void Convolution(float *inputArray, int input_size,
|
||||
float *kernel, int kernel_size,
|
||||
float *outputArray)
|
||||
{
|
||||
int i, j, m, n;
|
||||
int half_k = kernel_size / 2;
|
||||
int output_size = input_size - 2 * half_k;
|
||||
|
||||
for (i = half_k; i < input_size - half_k; i++)
|
||||
{
|
||||
for (j = half_k; j < input_size - half_k; j++)
|
||||
{
|
||||
float sum = 0;
|
||||
|
||||
for (m = 0; m < kernel_size; m++)
|
||||
{
|
||||
for (n = 0; n < kernel_size; n++)
|
||||
{
|
||||
int input_row = i + m - half_k;
|
||||
int input_col = j + n - half_k;
|
||||
int input_idx = input_row * input_size + input_col;
|
||||
int kernel_idx = m * kernel_size + n;
|
||||
sum += inputArray[input_idx] * kernel[kernel_idx];
|
||||
}
|
||||
}
|
||||
int output_idx = (i - half_k) * output_size + (j - half_k);
|
||||
outputArray[output_idx] = sum;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief <20>Զ<EFBFBD>ά<EFBFBD><CEAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧλ<D3A6><CEBB><EFBFBD><EFBFBD>
|
||||
/// @param inputArray <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
|
||||
/// @param input_depth <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>a[input_depth][]
|
||||
/// @param input_size <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ĵ<EFBFBD><C4B5>е<EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
|
||||
/// @param outputArray <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
|
||||
void Combine(float **inputArray, int input_depth, int input_size, float *outputArray)
|
||||
{
|
||||
int i, j, k;
|
||||
int input_idx;
|
||||
|
||||
for (i = 0; i < input_size; i++)
|
||||
{
|
||||
|
||||
for (j = 0; j < input_size; j++)
|
||||
{
|
||||
float sum = 0;
|
||||
|
||||
input_idx = i * input_size + j;
|
||||
for (k = 0; k < input_depth; k++)
|
||||
{
|
||||
sum += inputArray[k][input_idx];
|
||||
}
|
||||
outputArray[i * input_size + j] = sum;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief չ<><D5B9><EFBFBD><EFBFBD>ά<EFBFBD><CEAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һά<D2BB><CEAC><EFBFBD><EFBFBD>
|
||||
/// @param inputArray <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
|
||||
/// @param input_depth <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3><EFBFBD>a[input_depth][]
|
||||
/// @param input_size <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ĵ<EFBFBD><C4B5>е<EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
|
||||
/// @param outputArray <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
|
||||
void Flatten2D(float **inputArray, int input_depth, int input_size, float *outputArray)
|
||||
{
|
||||
int i, j, k;
|
||||
for (k = 0; k < input_depth; k++)
|
||||
{
|
||||
for (i = 0; i < input_size; i++)
|
||||
{
|
||||
for (j = 0; j < input_size; j++)
|
||||
{
|
||||
int input_idx = i * input_size + j;
|
||||
outputArray[k * input_size * input_size + input_idx] = inputArray[k][input_idx];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>ÿһλ<D2BB><CEBB><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
|
||||
/// @param inputArray <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
|
||||
/// @param input_num <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ܵ<EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
|
||||
/// @param bias ƫ<>ú<EFBFBD>
|
||||
/// @param outputArray <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
|
||||
void AddBias(float *inputArray, int input_num, float bias, float *outputArray)
|
||||
{
|
||||
for (int i = 0; i < input_num; i++)
|
||||
{
|
||||
outputArray[i] = inputArray[i] + bias;
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief ȫ<><C8AB><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD>
|
||||
/// @param inputArray <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
|
||||
/// @param input_num <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ܵ<EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
|
||||
/// @param input_w <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD>غ<EFBFBD>
|
||||
/// @param input_b <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ú<EFBFBD>
|
||||
/// @return һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊfloat
|
||||
float ConnectedLayer(float *inputArray, int input_num,
|
||||
float *input_w, float input_b)
|
||||
{
|
||||
int i;
|
||||
float sum = 0;
|
||||
for (i = 0; i < input_num; i++)
|
||||
{
|
||||
sum += inputArray[i] * input_w[i];
|
||||
}
|
||||
sum = sum + input_b;
|
||||
return sum;
|
||||
}
|
||||
|
||||
/// @brief ReLU<4C><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD><CBBA><EFBFBD><EFBFBD>Ƕ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEA3BA>ֵ<EFBFBD><D6B5><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
|
||||
/// @param inputArray <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
|
||||
/// @param num <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ܵ<EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
|
||||
/// @param outputArray <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
|
||||
void ReLU1(float *inputArray, int num, float *outputArray)
|
||||
{
|
||||
for (int i = 0; i < num; i++) {
|
||||
outputArray[i] = (inputArray[i] > 0) ? inputArray[i] : 0;
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief ReLU<4C><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD><CBBA><EFBFBD><EFBFBD>Ƕ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEA3BA>ֵ<EFBFBD><D6B5><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
|
||||
/// @param data <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊfloat
|
||||
float ReLU2(float data)
|
||||
{
|
||||
if (data > 0) {
|
||||
return data;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD>ֵ
|
||||
|
||||
/// @brief <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ͱ<EFBFBD><EFBFBD><D7BC>
|
||||
/// @param arr <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// @param size <20><><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
|
||||
/// @param max_val <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
|
||||
/// @param mean ƽ<><C6BD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
|
||||
/// @param std_dev <20><><EFBFBD><EFBFBD><EEB1A3>
|
||||
void calculate_statistics(float arr[], int size, float *max_val, float *mean, float *std_dev)
|
||||
{
|
||||
*max_val = fabs(arr[0]);
|
||||
float sum = 0.0;
|
||||
float sum_sq = 0.0;
|
||||
|
||||
for (int i = 0; i < size; i++) {
|
||||
float abs_val = fabs(arr[i]);
|
||||
|
||||
if (abs_val > *max_val) {
|
||||
*max_val = abs_val;
|
||||
}
|
||||
sum += abs_val;
|
||||
sum_sq += abs_val * abs_val;
|
||||
}
|
||||
|
||||
*mean = sum / size;
|
||||
|
||||
float variance = (sum_sq / size) - (*mean * *mean);
|
||||
*std_dev = sqrt(variance);
|
||||
}
|
||||
//<2F>жϷŵ<CFB7>
|
||||
|
||||
/// @brief <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7>ŵ<EFBFBD>
|
||||
/// @param arr <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// @param size <20><><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
|
||||
/// @param mean ƽ<><C6BD>ֵ
|
||||
/// @param std_dev <20><><EFBFBD><D7BC>
|
||||
/// @return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
|
||||
int check_threshold(float arr[], int size, float *mean, float *std_dev)
|
||||
{
|
||||
const float threshold = 20.0;
|
||||
|
||||
for (int i = 0; i < size; i++) {
|
||||
float K = (arr[i] - *mean) / *std_dev;
|
||||
if (K > threshold) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// @brief <20><><EFBFBD><EFBFBD>100*100<30><30><EFBFBD><EFBFBD>
|
||||
/// @param get_data <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// @param Max_value <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||||
/// @param totalPoints <20>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
|
||||
/// @param CNN_data <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>飨<EFBFBD><E9A3A8>ά<EFBFBD><CEAC>
|
||||
void generateMatrix(float *get_data, float Max_value, int totalPoints, float CNN_data[100*100])
|
||||
{
|
||||
for (int i = 0; i < 100; i++) {
|
||||
for (int j = 0; j < 100; j++) {
|
||||
CNN_data[i*100+j] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
int pointsPerInterval = totalPoints / 100;
|
||||
float amplitudeStep = Max_value / 100;
|
||||
|
||||
for (int i = 0; i < totalPoints; i++) {
|
||||
float amplitudeValue = fabsf(get_data[i]);
|
||||
|
||||
if (amplitudeValue == 0.0f) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int intervalIndex = i / pointsPerInterval;
|
||||
if (intervalIndex >= 100) intervalIndex = 99;
|
||||
|
||||
int amplitudeIndex = 99 - (int)(amplitudeValue / amplitudeStep);
|
||||
if (amplitudeIndex < 0) amplitudeIndex = 0;
|
||||
|
||||
CNN_data[amplitudeIndex*100+intervalIndex]++;
|
||||
}
|
||||
}
|
||||
|
||||
/// @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// @param input_array <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// @param output_array <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// @param input_num <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
|
||||
/// @return <20><><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>+1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>a[0]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>
|
||||
int calculate_probabilities(float *input_array, float *output_array, int input_num)
|
||||
{
|
||||
float sum = 0.0;
|
||||
float temp[input_num];
|
||||
for (int i = 0; i < input_num; i++)
|
||||
{
|
||||
temp[i] = exp(input_array[i]);
|
||||
sum = sum + temp[i];
|
||||
}
|
||||
for (int j = 0; j < input_num; j++)
|
||||
{
|
||||
output_array[j] = temp[j] / sum;
|
||||
}
|
||||
int max_index = 0;
|
||||
float max_value = output_array[0];
|
||||
for (int k = 1; k < input_num; k++)
|
||||
{
|
||||
if (output_array[k] > max_value)
|
||||
{
|
||||
max_value = output_array[k];
|
||||
max_index = k;
|
||||
}
|
||||
}
|
||||
return max_index + 1;
|
||||
}
|
||||
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǻ<EFBFBD><C7BB><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD>*/
|
||||
|
||||
/*ԭʼ<D4AD><CABC><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
|
||||
*Ŀǰ<C4BF><C7B0><EFBFBD><EFBFBD>֤<EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>㣬<EFBFBD>п<EFBFBD><D0BF>ܳ<EFBFBD><DCB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*Ŀǰû<C7B0><C3BB><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>㡣
|
||||
*ԭʼ<D4AD><CABC><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><D3A1>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>㣬<EFBFBD><E3A3AC><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
|
||||
/// @brief <20><><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
|
||||
/// @param data <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һά<D2BB><CEAC><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC><EFBFBD><EFBFBD> --> data.array<61><79><EFBFBD><EFBFBD>
|
||||
/// @param size ԭʼ<D4AD><CABC><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD> --> data.maxlength<74><68><EFBFBD><EFBFBD>
|
||||
void cnn_run()
|
||||
{
|
||||
float maxvalue = 0.0; //<2F><><EFBFBD><EFBFBD>ֵ
|
||||
float meanvalue = 0.0; //ƽ<><C6BD>ֵ
|
||||
float std_devvalue = 0.0; //<2F><><EFBFBD><D7BC>
|
||||
int index = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>ɶ<EFBFBD>ģ<EFBFBD>
|
||||
float *Matrix_data = (float*)mymalloc(SRAMEX, sizeof(float) * 100 * 100); //<2F><><EFBFBD>ɵ<EFBFBD>100*100<30>ľ<EFBFBD><C4BE><EFBFBD><F3B1A3B4><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
printf("CNNģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\nData<EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD>Ϊ<EFBFBD><EFBFBD>%s\r\n",data.dname);
|
||||
DEBUG_PRINTF("data[%d]: %f\r\n",0,data.array[0]);
|
||||
DEBUG_PRINTF("data[%d]: %f\r\n",1,data.array[1]);
|
||||
DEBUG_PRINTF("data[%d]: %f\r\n",2,data.array[2]);
|
||||
DEBUG_PRINTF("data[%d]: %f\r\n",299,data.array[299]);
|
||||
DEBUG_PRINTF("data[%d]: %f\r\n",300,data.array[300]);
|
||||
DEBUG_PRINTF("data[%d]: %f\r\n",301,data.array[301]);
|
||||
DEBUG_PRINTF("data[%d]: %f\r\n",1249997,data.array[1249997]);
|
||||
DEBUG_PRINTF("data[%d]: %f\r\n",1249998,data.array[1249998]);
|
||||
DEBUG_PRINTF("data[%d]: %f\r\n",1249999,data.array[1249999]);
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
calculate_statistics(data.array, data.maxlength, &maxvalue, &meanvalue,&std_devvalue);
|
||||
|
||||
/*<2A>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<C7B7><F1B3ACB9><EFBFBD>ֵ*/
|
||||
int x = check_threshold(data.array, data.maxlength, &meanvalue, &std_devvalue);
|
||||
if (x == 1) {
|
||||
printf("Start\r\n");
|
||||
//pre <20><>ʼԤ<CABC><D4A4><EFBFBD><EFBFBD>
|
||||
/*<2A><><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD>*/
|
||||
generateMatrix(data.array, maxvalue, data.maxlength, Matrix_data);
|
||||
float *CNN_data = (float*)mymalloc(SRAMEX, sizeof(float) * 100 * 100);
|
||||
/*<2A><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>תһά<D2BB><CEAC><EFBFBD>飬<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
for (int i = 0; i < 100; i++) {
|
||||
for (int j = 0; j < 100; j++) {
|
||||
CNN_data[9999 - index++] = Matrix_data[i*100+j];
|
||||
}
|
||||
}
|
||||
DEBUG_PRINTF("<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>һ<EFBFBD>㣡\r\n");
|
||||
//1 <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>*/
|
||||
float* Full_output1 = (float*)mymalloc(SRAMEX, sizeof(float) * 102 * 102);
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
Full(CNN_data, 100, Full_output1);
|
||||
float** Convolution_result1_before = (float**)allocate2DArray(32, 100 * 100, sizeof(float));
|
||||
float** Convolution_result1_relu = (float**)allocate2DArray(32, 100 * 100, sizeof(float));
|
||||
float** Convolution_result1 = (float**)allocate2DArray(32, 100 * 100, sizeof(float));
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
for (int i = 0; i < 32; i++) {
|
||||
/*<2A><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD>û<EFBFBD>Ż<EFBFBD><C5BB><EFBFBD>*/
|
||||
float conv1_weight_new[9] = {
|
||||
conv1_weight.array[i*9+0],conv1_weight.array[i*9+1],
|
||||
conv1_weight.array[i*9+2],conv1_weight.array[i*9+3],
|
||||
conv1_weight.array[i*9+4],conv1_weight.array[i*9+5],
|
||||
conv1_weight.array[i*9+6],conv1_weight.array[i*9+7],
|
||||
conv1_weight.array[i*9+8] };
|
||||
Convolution(Full_output1, 102, conv1_weight_new, 3, Convolution_result1_before[i]);
|
||||
}
|
||||
/*<2A><><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>*/
|
||||
for (int i = 0; i < 32; i++) {
|
||||
AddBias(Convolution_result1_before[i], 100 * 100, conv1_bias.array[i], Convolution_result1_relu[i]);
|
||||
}
|
||||
/*<2A><>ReLU<4C><55><EFBFBD><EFBFBD>*/
|
||||
for (int i = 0; i < 32; i++) {
|
||||
ReLU1(Convolution_result1_relu[i], 100 * 100, Convolution_result1[i]);
|
||||
}
|
||||
/*<2A>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
float ** Pooling_result1 = (float**)allocate2DArray(32, 50 * 50, sizeof(float));
|
||||
for (int i = 0; i < 32; i++) {
|
||||
Pooling(Convolution_result1[i], 100, 2, 2, Pooling_result1[i]);
|
||||
}
|
||||
DEBUG_PRINTF("<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD>\r\n");
|
||||
//2 <20>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/*<2A>ͷ<EFBFBD><CDB7><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ*/
|
||||
myfree(SRAMEX, Full_output1);
|
||||
free2DArray(Convolution_result1_relu,32);
|
||||
free2DArray(Convolution_result1_before,32);
|
||||
free2DArray(Convolution_result1,32);
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
float** Full_output2 = (float**)allocate2DArray(32, 52 * 52, sizeof(float));
|
||||
for (int i = 0; i < 32; i++) {
|
||||
Full(Pooling_result1[i], 50, Full_output2[i]);
|
||||
}
|
||||
/*<2A><><EFBFBD>뱾<EFBFBD><EBB1BE><EFBFBD><EFBFBD>Դ*/
|
||||
float** Convolution_result_temp_2 = (float**)allocate2DArray(32, 50 * 50, sizeof(float));
|
||||
float** Convolution_result2_before = (float**)allocate2DArray(64, 50 * 50, sizeof(float));
|
||||
float** Convolution_result2_relu = (float**)allocate2DArray(64, 50 * 50, sizeof(float));
|
||||
float** Convolution_result2 = (float**)allocate2DArray(64, 50 * 50, sizeof(float));
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
for (int i = 0; i < 64; i++) {
|
||||
for (int j = 0; j < 32; j++) {
|
||||
/*<2A><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
float conv2_weight_new[9] = {
|
||||
conv2_weight.array[i*32*9+9*j+0],conv2_weight.array[i*32*9+9*j+1],
|
||||
conv2_weight.array[i*32*9+9*j+2],conv2_weight.array[i*32*9+9*j+3],
|
||||
conv2_weight.array[i*32*9+9*j+4],conv2_weight.array[i*32*9+9*j+5],
|
||||
conv2_weight.array[i*32*9+9*j+6],conv2_weight.array[i*32*9+9*j+7],
|
||||
conv2_weight.array[i*32*9+9*j+8]
|
||||
};
|
||||
Convolution(Full_output2[j], 52, conv2_weight_new, 3, Convolution_result_temp_2[j]);
|
||||
}
|
||||
/*ÿһ<C3BF><D2BB><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ϲ<EFBFBD>*/
|
||||
Combine(Convolution_result_temp_2, 32, 50, Convolution_result2_before[i]);
|
||||
}
|
||||
/*<2A><><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>*/
|
||||
for (int i = 0; i < 64; i++) {
|
||||
AddBias(Convolution_result2_before[i], 50 * 50, conv2_bias.array[i], Convolution_result2_relu[i]);
|
||||
}
|
||||
/*<2A><><EFBFBD><EFBFBD>ReLU<4C><55><EFBFBD><EFBFBD>*/
|
||||
for (int i = 0; i < 64; i++) {
|
||||
ReLU1(Convolution_result2_relu[i], 50 * 50, Convolution_result2[i]);
|
||||
}
|
||||
/*<2A>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
float** Pooling_result2 = (float**)allocate2DArray(64, 25 * 25, sizeof(float));
|
||||
for (int i = 0; i < 64; i++) {
|
||||
Pooling(Convolution_result2[i], 50, 2, 2, Pooling_result2[i]);
|
||||
}
|
||||
DEBUG_PRINTF("<EFBFBD>ڶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD>\r\n");
|
||||
//3 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/*<2A>ͷ<EFBFBD><CDB7><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ*/
|
||||
free2DArray(Full_output2,32);
|
||||
free2DArray(Pooling_result1,32);
|
||||
free2DArray(Convolution_result_temp_2,32);
|
||||
free2DArray(Convolution_result2_relu,64);
|
||||
free2DArray(Convolution_result2_before,64);
|
||||
free2DArray(Convolution_result2,64);
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
float** Full_output3 = (float**)allocate2DArray(64, 27 * 27, sizeof(float));
|
||||
for (int i = 0; i < 64; i++) {
|
||||
Full(Pooling_result2[i], 25, Full_output3[i]);
|
||||
}
|
||||
/*<2A><><EFBFBD>뱾<EFBFBD><EBB1BE><EFBFBD><EFBFBD>Դ*/
|
||||
float** Convolution_result_temp_3 = (float**)allocate2DArray(64, 25 * 25, sizeof(float));
|
||||
float** Convolution_result3_before = (float**)allocate2DArray(128, 25 * 25, sizeof(float));
|
||||
float** Convolution_result3_relu = (float**)allocate2DArray(128, 25 * 25, sizeof(float));
|
||||
float** Convolution_result3 = (float**)allocate2DArray(128, 25 * 25, sizeof(float));
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
for (int i = 0; i < 128; i++) {
|
||||
for (int j = 0; j < 64; j++) {
|
||||
float conv3_weight_new[9] = {
|
||||
conv3_weight.array[i*64*9+9*j+0],conv3_weight.array[i*64*9+9*j+1],
|
||||
conv3_weight.array[i*64*9+9*j+2],conv3_weight.array[i*64*9+9*j+3],
|
||||
conv3_weight.array[i*64*9+9*j+4],conv3_weight.array[i*64*9+9*j+5],
|
||||
conv3_weight.array[i*64*9+9*j+6],conv3_weight.array[i*64*9+9*j+7],
|
||||
conv3_weight.array[i*64*9+9*j+8]
|
||||
};
|
||||
Convolution(Full_output3[j], 27, conv3_weight_new, 3, Convolution_result_temp_3[j]);
|
||||
}
|
||||
/*<2A><>ͼ<EFBFBD><CDBC><EFBFBD>ϲ<EFBFBD>*/
|
||||
Combine(Convolution_result_temp_3, 64, 25, Convolution_result3_before[i]);
|
||||
}
|
||||
/*<2A><><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>*/
|
||||
for (int i = 0; i < 128; i++) {
|
||||
AddBias(Convolution_result3_before[i], 25 * 25, conv3_bias.array[i], Convolution_result3_relu[i]);
|
||||
}
|
||||
/*ReLU<4C><55><EFBFBD><EFBFBD>*/
|
||||
for (int i = 0; i < 128; i++) {
|
||||
ReLU1(Convolution_result3_relu[i], 25 * 25, Convolution_result3[i]);
|
||||
}
|
||||
/*<2A>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
float** Pooling_result3 = (float**)allocate2DArray(128, 12 * 12, sizeof(float));
|
||||
for (int i = 0; i < 128; i++) {
|
||||
Pooling(Convolution_result3_before[i], 25, 2, 2, Pooling_result3[i]);
|
||||
}
|
||||
/*<2A>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><D5B9><EFBFBD><EFBFBD>һά<D2BB><CEAC><EFBFBD><EFBFBD>*/
|
||||
float* xi = (float *)mymalloc(SRAMEX, sizeof(float) * 128 * 12 * 12);
|
||||
Flatten2D(Pooling_result3, 128, 12, xi);
|
||||
DEBUG_PRINTF("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD>\r\n");
|
||||
//4 <20><>һ<EFBFBD><D2BB><EFBFBD>Ӳ<EFBFBD>
|
||||
/*<2A>ͷ<EFBFBD><CDB7><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ*/
|
||||
free2DArray(Full_output3,64);
|
||||
free2DArray(Pooling_result2,64);
|
||||
free2DArray(Convolution_result_temp_3,64);
|
||||
free2DArray(Convolution_result3_relu,128);
|
||||
free2DArray(Convolution_result3_before,128);
|
||||
free2DArray(Convolution_result3,128);
|
||||
/*<2A><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
//float yi[128] = {0};
|
||||
DEBUG_PRINTF("<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>IJ㣡\r\n");
|
||||
float* yi = (float *)mymalloc(SRAMEX, 128 * sizeof(float));
|
||||
memset(yi, 0, 128 * sizeof(float));
|
||||
for (int i = 0; i < 128; i++) {
|
||||
float sum = 0;
|
||||
//float fc1_weight_new[128*12*12];
|
||||
float* fc1_weight_new = (float*)mymalloc(SRAMEX, sizeof(float) * 128 * 12 * 12);
|
||||
/*<2A><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
memcpy(fc1_weight_new,&fc1_weight.array[i*128*12*12],128*12*12 * sizeof(float));
|
||||
sum = ConnectedLayer(xi, 128 * 12 * 12, fc1_weight_new, fc1_bias.array[i]);
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ReLU<4C><55><EFBFBD><EFBFBD>*/
|
||||
yi[i] = ReLU2(sum);
|
||||
myfree(SRAMEX, fc1_weight_new);
|
||||
}
|
||||
DEBUG_PRINTF("<EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD>\r\n");
|
||||
//5 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD>
|
||||
/*<2A>ͷ<EFBFBD><CDB7><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ*/
|
||||
free2DArray(Pooling_result3,128);
|
||||
/*<2A><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
float zi[7] = {0};
|
||||
// float *zi = (float *)mymalloc(SRAMEX, 7 * sizeof(float));
|
||||
// memset(zi, 0, 7 * sizeof(float));
|
||||
for (int i = 0; i < 7; i++) {
|
||||
//float fc2_weight_new[128];
|
||||
float* fc2_weight_new = (float*)mymalloc(SRAMEX, sizeof(float) * 128);
|
||||
/*<2A><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
memcpy(fc2_weight_new,&fc2_weight.array[i*128],128 * sizeof(float));
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ReLU<4C><55><EFBFBD><EFBFBD>*/
|
||||
zi[i] = ConnectedLayer(yi, 128, fc2_weight_new, fc2_bias.array[i]);
|
||||
myfree(SRAMEX, fc2_weight_new);
|
||||
}
|
||||
DEBUG_PRINTF("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD>\r\n");
|
||||
//end <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
float result[7];
|
||||
int max_probability_idx = calculate_probabilities(zi,result,7);
|
||||
PrintfResArray(zi,7,7);
|
||||
PrintfResArray(result,7,7);
|
||||
printf("%f, Label %d\t", result[max_probability_idx - 1] * 100, max_probability_idx);
|
||||
myfree(SRAMEX, xi);
|
||||
myfree(SRAMEX, yi);
|
||||
myfree(SRAMEX, CNN_data);
|
||||
myfree(SRAMEX, Full_output1);
|
||||
myfree(SRAMEX, Matrix_data);
|
||||
}
|
||||
else printf("No\r\n");/*<2A><><EFBFBD><EFBFBD>û<EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD>ӡ<EFBFBD><D3A1>No<4E><6F>*/
|
||||
printf("maxvalue is:%f\t",maxvalue);
|
||||
printf("meanvalue is:%f\t",meanvalue);
|
||||
printf("std_devvalue is:%f\r\n",std_devvalue);
|
||||
isrun = 0;
|
||||
}
|
||||
|
||||
34
PORTING/CNN/cnn.h
Normal file
34
PORTING/CNN/cnn.h
Normal file
@@ -0,0 +1,34 @@
|
||||
#ifndef _CNN_H_
|
||||
#define _CNN_H_
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include "cnn_model.h"
|
||||
|
||||
extern u8 isrun;
|
||||
|
||||
void PrintfArray(float *array, int array_num, int elements_per_line);
|
||||
void **allocate2DArray(int depth, int num, size_t elementSize);
|
||||
void free2DArray(float **array, int depth);
|
||||
void Full(float *inputArray, int input_size, float *outputArray);
|
||||
void Pooling(float *inputArray, int input_size, int kernel_size, unsigned int step, float *outputArray);
|
||||
void Convolution(float *inputArray, int input_size, float *kernel, int kernel_size, float *outputArray);
|
||||
void Combine(float **inputArray, int input_depth, int input_size, float *outputArray);
|
||||
void Flatten2D(float **inputArray, int input_depth, int input_size, float *outputArray);
|
||||
float ConnectedLayer(float *inputArray, int input_num, float *input_w, float input_b);
|
||||
void ReLU1(float *inputArray, int num, float *outputArray);
|
||||
float ReLU2(float data);
|
||||
void AddBias(float *inputArray, int input_num, float bias, float *outputArray);
|
||||
|
||||
int calculate_probabilities(float *input_array, float *output_array, int input_num);
|
||||
void generateMatrix(float *get_data, float Max_value, int totalPoints, float CNN_data[100*100]);
|
||||
void calculate_statistics(float arr[], int size, float *max_val, float *mean, float *std_dev);
|
||||
int check_threshold(float arr[], int size, float *mean, float *std_dev);
|
||||
|
||||
void _cnn_run(void);
|
||||
void cnn_run(void);
|
||||
void PrintfResArray(float *array, int array_num, int elements_per_line);
|
||||
|
||||
#endif
|
||||
393
PORTING/CNN/cnn_model.c
Normal file
393
PORTING/CNN/cnn_model.c
Normal file
@@ -0,0 +1,393 @@
|
||||
#include "cnn_model.h"
|
||||
|
||||
|
||||
|
||||
Model conv1_bias;
|
||||
Model conv1_weight;
|
||||
Model conv2_bias;
|
||||
Model conv2_weight;
|
||||
Model conv3_bias;
|
||||
Model conv3_weight;
|
||||
Model fc1_bias;
|
||||
Model fc1_weight;
|
||||
Model fc2_bias;
|
||||
Model fc2_weight;
|
||||
Model data;
|
||||
|
||||
|
||||
|
||||
float* modelmym_init(char* model_name){
|
||||
if(conv1_bias.array == NULL && strcmp(model_name, "conv1_bias") == 0)
|
||||
return conv1_bias.array = (float*)mymalloc(SRAMEX, CONV1_BIAS_ARRSIZE * sizeof(float));
|
||||
else if(conv1_weight.array == NULL && strcmp(model_name, "conv1_weight") == 0)
|
||||
return conv1_weight.array = (float*)mymalloc(SRAMEX, CONV1_WEIGHT_ARRSIZE * sizeof(float));
|
||||
else if(conv2_bias.array == NULL && strcmp(model_name, "conv2_bias") == 0)
|
||||
return conv2_bias.array = (float*)mymalloc(SRAMEX, CONV2_BIAS_ARRSIZE * sizeof(float));
|
||||
else if(conv2_weight.array == NULL && strcmp(model_name, "conv2_weight") == 0)
|
||||
return conv2_weight.array = (float*)mymalloc(SRAMEX, CONV2_WEIGHT_ARRSIZE * sizeof(float));
|
||||
else if(conv3_bias.array == NULL && strcmp(model_name, "conv3_bias") == 0)
|
||||
return conv3_bias.array = (float*)mymalloc(SRAMEX, CONV3_BIAS_ARRSIZE * sizeof(float));
|
||||
else if(conv3_weight.array == NULL && strcmp(model_name, "conv3_weight") == 0)
|
||||
return conv3_weight.array = (float*)mymalloc(SRAMEX, CONV3_WEIGHT_ARRSIZE * sizeof(float));
|
||||
else if(fc1_bias.array == NULL && strcmp(model_name, "fc1_bias") == 0)
|
||||
return fc1_bias.array = (float*)mymalloc(SRAMEX, FC1_BIAS_ARRSIZE * sizeof(float));
|
||||
else if(fc1_weight.array == NULL && strcmp(model_name, "fc1_weight") == 0)
|
||||
return fc1_weight.array = (float*)mymalloc(SRAMEX, FC1_WEIGHT_ARRSIZE * sizeof(float));
|
||||
else if(fc2_bias.array == NULL && strcmp(model_name, "fc2_bias") == 0)
|
||||
return fc2_bias.array = (float*)mymalloc(SRAMEX, FC2_BIAS_ARRSIZE * sizeof(float));
|
||||
else if(fc2_weight.array == NULL && strcmp(model_name, "fc2_weight") == 0)
|
||||
return fc2_weight.array = (float*)mymalloc(SRAMEX, FC2_WEIGHT_ARRSIZE * sizeof(float));
|
||||
else if(data.array == NULL && strcmp(model_name, "data") == 0)
|
||||
return data.array = (float*)mymalloc(SRAMEX, DATA_ARRSIZE * sizeof(float));
|
||||
else if(strcmp(model_name, "all") == 0){
|
||||
if(conv1_bias.array == NULL)conv1_bias.array = (float*)mymalloc(SRAMEX, CONV1_BIAS_ARRSIZE * sizeof(float));
|
||||
if(conv1_weight.array == NULL)conv1_weight.array = (float*)mymalloc(SRAMEX, CONV1_WEIGHT_ARRSIZE * sizeof(float));
|
||||
if(conv2_bias.array == NULL)conv2_bias.array = (float*)mymalloc(SRAMEX, CONV2_BIAS_ARRSIZE * sizeof(float));
|
||||
if(conv2_weight.array == NULL)conv2_weight.array = (float*)mymalloc(SRAMEX, CONV2_WEIGHT_ARRSIZE * sizeof(float));
|
||||
if(conv3_bias.array == NULL)conv3_bias.array = (float*)mymalloc(SRAMEX, CONV3_BIAS_ARRSIZE * sizeof(float));
|
||||
if(conv3_weight.array == NULL)conv3_weight.array = (float*)mymalloc(SRAMEX, CONV3_WEIGHT_ARRSIZE * sizeof(float));
|
||||
if(fc1_bias.array == NULL)fc1_bias.array = (float*)mymalloc(SRAMEX, FC1_BIAS_ARRSIZE * sizeof(float));
|
||||
if(fc1_weight.array == NULL)fc1_weight.array = (float*)mymalloc(SRAMEX, FC1_WEIGHT_ARRSIZE * sizeof(float));
|
||||
if(fc2_bias.array == NULL)fc2_bias.array = (float*)mymalloc(SRAMEX, FC2_BIAS_ARRSIZE * sizeof(float));
|
||||
if(fc2_weight.array == NULL)fc2_weight.array = (float*)mymalloc(SRAMEX, FC2_WEIGHT_ARRSIZE * sizeof(float));
|
||||
if(data.array == NULL)data.array = (float*)mymalloc(SRAMEX, DATA_ARRSIZE * sizeof(float));
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
u8 modelmym_free(char* model_name){
|
||||
if(conv1_bias.array != NULL && strcmp(model_name, "conv1_bias") == 0){
|
||||
myfree(SRAMEX,conv1_bias.array);
|
||||
conv1_bias.array = NULL;
|
||||
conv1_bias.realength = NULL;
|
||||
return 1;
|
||||
}
|
||||
else if(conv1_weight.array != NULL && strcmp(model_name, "conv1_weight") == 0){
|
||||
myfree(SRAMEX,conv1_weight.array);
|
||||
conv1_weight.array = NULL;
|
||||
conv1_weight.realength = NULL;
|
||||
return 1;
|
||||
}
|
||||
else if(conv2_bias.array != NULL && strcmp(model_name, "conv2_bias") == 0){
|
||||
myfree(SRAMEX,conv2_bias.array);
|
||||
conv2_bias.array = NULL;
|
||||
conv2_bias.realength = NULL;
|
||||
return 1;
|
||||
}
|
||||
else if(conv2_weight.array != NULL && strcmp(model_name, "conv2_weight") == 0){
|
||||
myfree(SRAMEX,conv2_weight.array);
|
||||
conv2_weight.array = NULL;
|
||||
conv2_weight.realength = NULL;
|
||||
return 1;
|
||||
}
|
||||
else if(conv3_bias.array != NULL && strcmp(model_name, "conv3_bias") == 0){
|
||||
myfree(SRAMEX,conv3_bias.array);
|
||||
conv3_bias.array = NULL;
|
||||
conv3_bias.realength = NULL;
|
||||
return 1;
|
||||
}
|
||||
else if(conv3_weight.array != NULL && strcmp(model_name, "conv3_weight") == 0){
|
||||
myfree(SRAMEX,conv3_weight.array);
|
||||
conv3_weight.array = NULL;
|
||||
conv3_weight.realength = NULL;
|
||||
return 1;
|
||||
}
|
||||
else if(fc1_bias.array != NULL && strcmp(model_name, "fc1_bias") == 0){
|
||||
myfree(SRAMEX,fc1_bias.array);
|
||||
fc1_bias.array = NULL;
|
||||
fc1_bias.realength = NULL;
|
||||
return 1;
|
||||
}
|
||||
else if(fc1_weight.array != NULL && strcmp(model_name, "fc1_weight") == 0){
|
||||
myfree(SRAMEX,fc1_weight.array);
|
||||
fc1_weight.array = NULL;
|
||||
fc1_weight.realength = NULL;
|
||||
return 1;
|
||||
}
|
||||
else if(fc2_bias.array != NULL && strcmp(model_name, "fc2_bias") == 0){
|
||||
myfree(SRAMEX,fc2_bias.array);
|
||||
fc2_bias.array = NULL;
|
||||
fc2_bias.realength = NULL;
|
||||
return 1;
|
||||
}
|
||||
else if(fc2_weight.array != NULL && strcmp(model_name, "fc2_weight") == 0){
|
||||
myfree(SRAMEX,fc2_weight.array);
|
||||
fc2_weight.array = NULL;
|
||||
fc2_weight.realength = NULL;
|
||||
return 1;
|
||||
}
|
||||
else if(data.array != NULL && strcmp(model_name, "data") == 0){
|
||||
myfree(SRAMEX,data.array);
|
||||
data.array = NULL;
|
||||
data.realength = NULL;
|
||||
return 1;
|
||||
}
|
||||
else if(strcmp(model_name, "all") == 0){
|
||||
modelmym_free("conv1_bias");
|
||||
modelmym_free("conv1_weight");
|
||||
modelmym_free("conv2_bias");
|
||||
modelmym_free("conv2_weight");
|
||||
modelmym_free("conv3_bias");
|
||||
modelmym_free("conv3_weight");
|
||||
modelmym_free("fc1_bias");
|
||||
modelmym_free("fc1_weight");
|
||||
modelmym_free("fc2_bias");
|
||||
modelmym_free("fc2_weight");
|
||||
modelmym_free("data");
|
||||
return 2;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
u8 model_write(char* model_name)
|
||||
{
|
||||
if(strcmp(model_name, "all") == 0){
|
||||
model_write("conv1_bias");
|
||||
model_write("conv1_weight");
|
||||
model_write("conv2_bias");
|
||||
model_write("conv2_weight");
|
||||
model_write("conv3_bias");
|
||||
model_write("conv3_weight");
|
||||
model_write("fc1_bias");
|
||||
model_write("fc1_weight");
|
||||
model_write("fc2_bias");
|
||||
model_write("fc2_weight");
|
||||
|
||||
model_info("all");
|
||||
SDRAM_USED();
|
||||
}else{
|
||||
u8 res=0;
|
||||
u8 isneg=0;
|
||||
u8 _times=0;
|
||||
u32 _larr = 0;
|
||||
u8 _len = strlen(model_name);
|
||||
char _path[_len+1+7+30];
|
||||
char _fstr[READLENGTH+1] = {0};
|
||||
char _sstr[2];
|
||||
int progress;
|
||||
Model *_model = model(model_name);
|
||||
|
||||
if(_model == NULL || strcmp(model_name, "data") == 0){
|
||||
sprintf(_path, "0:/%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");
|
||||
return 199;
|
||||
}else{
|
||||
_model = model("data");
|
||||
_model -> dname = model_name;
|
||||
}
|
||||
}
|
||||
|
||||
if(_model -> dname == NULL){
|
||||
sprintf(_path, "0:/%s.txt", _model -> name);
|
||||
if(f_open(file, (TCHAR *)_path, 1)){
|
||||
DEBUG_PRINTF("Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>ͣ<EFBFBD>[%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<41><4D>\r\n", _model -> name);
|
||||
return 200;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
return res;
|
||||
}else{
|
||||
for(int i=0; i < br; i++){
|
||||
if(fatbuf[i] == 0x0d){
|
||||
float _fvalue = atof(_fstr);
|
||||
if(isneg)_fvalue = -_fvalue;
|
||||
_model -> array[_larr++] = _fvalue;
|
||||
//DEBUG_PRINTF("<22>س<EFBFBD>[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[string]: %s\r\n<>س<EFBFBD>[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[float]: %f\r\n",i,_fstr,_fvalue);
|
||||
i++;
|
||||
isneg=0;
|
||||
*_fstr = NULL;
|
||||
_model -> realength = _larr; //_larr<72><72><EFBFBD><EFBFBD>ֵΪģ<CEAA><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if(_larr >= _model -> maxlength)break;
|
||||
}
|
||||
else if(fatbuf[i] == 0x2d)isneg = 1;
|
||||
else{
|
||||
sprintf(_sstr, "%c", fatbuf[i]);
|
||||
strcat(_fstr, _sstr);
|
||||
//DEBUG_PRINTF("[%d]_fstr is[%s], _sstr is[%s], fatbuf is [%c]\r\n",i,_fstr,_sstr,fatbuf[i]);
|
||||
}
|
||||
}
|
||||
if(_model -> maxlength >= 73728 && (_larr >= (_model -> maxlength/10)*_times)){
|
||||
progress = _larr >= _model -> maxlength ? 100 : _times++ == 0 ? 0 : progress + 10;
|
||||
DEBUG_PRINTF("\r\n[");
|
||||
for(u16 j=0; j<50;j++){
|
||||
if(j < progress/2) DEBUG_PRINTF("=");
|
||||
else DEBUG_PRINTF(" ");
|
||||
}
|
||||
DEBUG_PRINTF("] %d%%", progress);
|
||||
}
|
||||
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);
|
||||
return 1;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
u8 model_read(char* model_name, u32 start, u32 end, u32 gap){
|
||||
if(strcmp(model_name, "all") == 0){
|
||||
model_read("conv1_bias", start, end, gap);
|
||||
model_read("conv1_weight", start, end, gap);
|
||||
model_read("conv2_bias", start, end, gap);
|
||||
model_read("conv2_weight", start, end, gap);
|
||||
model_read("conv3_bias", start, end, gap);
|
||||
model_read("conv3_weight", start, end, gap);
|
||||
model_read("fc1_bias", start, end, gap);
|
||||
model_read("fc1_weight", start, end, gap);
|
||||
model_read("fc2_bias", start, end, gap);
|
||||
model_read("fc2_weight", start, end, gap);
|
||||
model_read("data", start, end, gap);
|
||||
}else{
|
||||
Model *_model = model(model_name);
|
||||
if(_model == NULL || end == 0 || start > _model -> realength || end > _model -> realength)return NULL;
|
||||
if(_model -> realength){
|
||||
for (u32 i=0;i<((end > (_model -> realength) ? _model -> realength : (end-start))+(end > (_model -> realength) ? _model -> realength : (end-start)%gap ? 2 : 1));i+=gap)
|
||||
printf("\r\n%s_floatArray[%d]: %f",_model->name,(i+start)<_model->realength ? i+start : _model->realength-1,(i+start)<_model->realength ? _model->array[i+start] : _model->array[_model -> realength-1]);
|
||||
printf("\r\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
u8 model_switchdata(char* data_name){
|
||||
u8 _len = strlen(data_name);
|
||||
char _path[_len+1+7];
|
||||
if(data.array != NULL)modelmym_free("data");
|
||||
sprintf(_path, "0:/%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);
|
||||
return NULL;
|
||||
}else{
|
||||
u8 _res = model_write(data_name);
|
||||
if (_res == NULL) {
|
||||
DEBUG_PRINTF("Data<EFBFBD><EFBFBD><EFBFBD>ݼ<EFBFBD>[%s]<5D>л<EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>\r\n",data_name);
|
||||
return NULL;
|
||||
}
|
||||
else 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);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
void model_dataset(){
|
||||
printf("\r\ndataset is: %s\r\n",data.dname);
|
||||
}
|
||||
|
||||
u8 model_info(char* model_name){
|
||||
if(strcmp(model_name, "all") == 0){
|
||||
model_info("conv1_bias");
|
||||
model_info("conv1_weight");
|
||||
model_info("conv2_bias");
|
||||
model_info("conv2_weight");
|
||||
model_info("conv3_bias");
|
||||
model_info("conv3_weight");
|
||||
model_info("fc1_bias");
|
||||
model_info("fc1_weight");
|
||||
model_info("fc2_bias");
|
||||
model_info("fc2_weight");
|
||||
model_info("data");
|
||||
return 1;
|
||||
}else if(model(model_name)){
|
||||
Model *_model = model(model_name);
|
||||
printf("\r\nmodel.name is: %s\r\n",_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); <20>⺯<EFBFBD><E2BAAF><EFBFBD><EFBFBD>BUG<55><47><EFBFBD><EFBFBD>model_dataset<65><74><EFBFBD><EFBFBD>
|
||||
return 1;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void* model(char* model_name){
|
||||
if(strcmp(model_name, "conv1_bias") == 0)return &conv1_bias;
|
||||
else if(strcmp(model_name, "conv1_weight") == 0)return &conv1_weight;
|
||||
else if(strcmp(model_name, "conv2_bias") == 0)return &conv2_bias;
|
||||
else if(strcmp(model_name, "conv2_weight") == 0)return &conv2_weight;
|
||||
else if(strcmp(model_name, "conv3_bias") == 0)return &conv3_bias;
|
||||
else if(strcmp(model_name, "conv3_weight") == 0)return &conv3_weight;
|
||||
else if(strcmp(model_name, "fc1_bias") == 0)return &fc1_bias;
|
||||
else if(strcmp(model_name, "fc1_weight") == 0)return &fc1_weight;
|
||||
else if(strcmp(model_name, "fc2_bias") == 0)return &fc2_bias;
|
||||
else if(strcmp(model_name, "fc2_weight") == 0)return &fc2_weight;
|
||||
else if(strcmp(model_name, "data") == 0)return &data;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void model_init(){
|
||||
|
||||
conv1_bias.name = "conv1_bias";
|
||||
conv1_bias.array = modelmym_init(conv1_bias.name);
|
||||
conv1_bias.maxlength = CONV1_BIAS_ARRSIZE;
|
||||
|
||||
conv1_weight.name = "conv1_weight";
|
||||
conv1_weight.array = modelmym_init(conv1_weight.name);
|
||||
conv1_weight.maxlength = CONV1_WEIGHT_ARRSIZE;
|
||||
|
||||
conv2_bias.name = "conv2_bias";
|
||||
conv2_bias.array = modelmym_init(conv2_bias.name);
|
||||
conv2_bias.maxlength = CONV2_BIAS_ARRSIZE;
|
||||
|
||||
conv2_weight.name = "conv2_weight";
|
||||
conv2_weight.array = modelmym_init(conv2_weight.name);
|
||||
conv2_weight.maxlength = CONV2_WEIGHT_ARRSIZE;
|
||||
|
||||
conv3_bias.name = "conv3_bias";
|
||||
conv3_bias.array = modelmym_init(conv3_bias.name);
|
||||
conv3_bias.maxlength = CONV3_BIAS_ARRSIZE;
|
||||
|
||||
conv3_weight.name = "conv3_weight";
|
||||
conv3_weight.array = modelmym_init(conv3_weight.name);
|
||||
conv3_weight.maxlength = CONV3_WEIGHT_ARRSIZE;
|
||||
|
||||
fc1_bias.name = "fc1_bias";
|
||||
fc1_bias.array = modelmym_init(fc1_bias.name);
|
||||
fc1_bias.maxlength = FC1_BIAS_ARRSIZE;
|
||||
|
||||
fc1_weight.name = "fc1_weight";
|
||||
fc1_weight.array = modelmym_init(fc1_weight.name);
|
||||
fc1_weight.maxlength = FC1_WEIGHT_ARRSIZE;
|
||||
|
||||
fc2_bias.name = "fc2_bias";
|
||||
fc2_bias.array = modelmym_init(fc2_bias.name);
|
||||
fc2_bias.maxlength = FC2_BIAS_ARRSIZE;
|
||||
|
||||
fc2_weight.name = "fc2_weight";
|
||||
fc2_weight.array = modelmym_init(fc2_weight.name);
|
||||
fc2_weight.maxlength = FC2_WEIGHT_ARRSIZE;
|
||||
|
||||
data.name = "data";
|
||||
data.array = modelmym_init(data.name);
|
||||
data.maxlength = DATA_ARRSIZE;
|
||||
data.dname = "data";
|
||||
}
|
||||
|
||||
190
PORTING/CNN/cnn_model.h
Normal file
190
PORTING/CNN/cnn_model.h
Normal file
@@ -0,0 +1,190 @@
|
||||
#ifndef _CNNMODEL_H_
|
||||
#define _CNNMODEL_H_
|
||||
|
||||
|
||||
|
||||
#include "exfuns.h"
|
||||
#include "malloc.h"
|
||||
#include "ff.h"
|
||||
#include "debug.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
char* name;
|
||||
char* dname;
|
||||
float* array;
|
||||
u32 maxlength;
|
||||
u32 realength;
|
||||
} Model;
|
||||
|
||||
|
||||
|
||||
#define READLENGTH 11*10
|
||||
#define CONV1_BIAS_ARRSIZE 32
|
||||
#define CONV1_WEIGHT_ARRSIZE 32*1*3*3 //288
|
||||
#define CONV2_BIAS_ARRSIZE 64
|
||||
#define CONV2_WEIGHT_ARRSIZE 64*32*3*3 //18432
|
||||
#define CONV3_BIAS_ARRSIZE 128
|
||||
#define CONV3_WEIGHT_ARRSIZE 128*64*3*3 //73728
|
||||
#define FC1_BIAS_ARRSIZE 128
|
||||
#define FC1_WEIGHT_ARRSIZE 128*18432 //2359296
|
||||
#define FC2_BIAS_ARRSIZE 7
|
||||
#define FC2_WEIGHT_ARRSIZE 7*128 //896
|
||||
#define DATA_ARRSIZE 1250000 //1250000
|
||||
|
||||
|
||||
|
||||
extern Model conv1_bias;
|
||||
extern Model conv1_weight;
|
||||
extern Model conv2_bias;
|
||||
extern Model conv2_weight;
|
||||
extern Model conv3_bias;
|
||||
extern Model conv3_weight;
|
||||
extern Model fc1_bias;
|
||||
extern Model fc1_weight;
|
||||
extern Model fc2_bias;
|
||||
extern Model fc2_weight;
|
||||
extern Model data;
|
||||
|
||||
|
||||
|
||||
float* modelmym_init(char* model_name);
|
||||
u8 modelmym_free(char* model_name);
|
||||
u8 model_write(char* model_name);
|
||||
u8 model_read(char* model_name, u32 start, u32 end, u32 gap);
|
||||
u8 model_switchdata(char* model_name);
|
||||
void model_dataset(void);
|
||||
u8 model_info(char* model_name);
|
||||
void* model(char* model_name);
|
||||
void model_init(void);
|
||||
u8 sd_read(u32 length, char* model_name,u32 gap);
|
||||
|
||||
|
||||
|
||||
//conv1_bias[a*1] a:0~31
|
||||
//conv1_weight[a*9+b*9+c*3+d*1] a:0~31 b:0 c:0~2 d:0~2
|
||||
//conv2_bias[a*1] a:0~63
|
||||
//conv2_weight[a*288+b*9+c*3+d*1] a:0~63 b:0~31 c:0~2 d:0~2
|
||||
//conv3_bias[a*1] a:0~127
|
||||
//conv3_weight[a*576+b*9+c*3+d*1] a:0~127 b:0~63 c:0~2 d:0~2
|
||||
//fc1_bias[a*1] a:0~127
|
||||
//fc1_weight[a*18432+b*1] a:0~127 b:0~18431
|
||||
//fc2_bias[a*1] a:0~6
|
||||
//fc2_weight[a*128+b*1] a:0~6 b:0~127
|
||||
/*--------------------------------
|
||||
|
||||
for(u8 a; a<?; a++)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
--------------------------------*/
|
||||
|
||||
|
||||
//u8 sd_read(u16 length)
|
||||
//{
|
||||
// u8 res=0;
|
||||
|
||||
// char _tmp[11] = "";
|
||||
// float floatArray[32] = {0};
|
||||
// int _larr = 0;
|
||||
|
||||
// printf("\r\nRead file data is:\r\n");
|
||||
// res=f_read(file,fatbuf,length,&br);
|
||||
// if(res) //<2F><><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD><EFBFBD>
|
||||
// {
|
||||
// printf("\r\n<><6E><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD><EFBFBD>:%d\r\n",res);
|
||||
// }else
|
||||
// {
|
||||
// for(int i=0;i<length;i++){
|
||||
// if(fatbuf[i]==0x0d){
|
||||
// DEBUG_PRINTF("<22>س<EFBFBD>[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[string]: %s\r\n",i,_tmp);
|
||||
// i++;
|
||||
// float value = atof(_tmp);
|
||||
// memset(_tmp, 0, sizeof(_tmp));
|
||||
// floatArray[_larr++] = value;
|
||||
// DEBUG_PRINTF("<22>س<EFBFBD>[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[float]: %f\r\n",i,value);
|
||||
// }else{
|
||||
// char buffer[2];
|
||||
// sprintf(buffer, "%c", fatbuf[i]);
|
||||
// strcat(_tmp, buffer);
|
||||
// DEBUG_PRINTF("[%d]: %c\r\n",i,fatbuf[i]);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// for (int i=0;i<_larr;i++){
|
||||
// DEBUG_PRINTF("floatArray[%d]: %f\r\n",i,floatArray[i]);
|
||||
// }
|
||||
// return res;
|
||||
//}
|
||||
|
||||
//u8 sd_read(u16 length, char* model)
|
||||
//{
|
||||
// float* floatArray = NULL;
|
||||
// if((floatArray = model_init(model)) == NULL)printf("<22><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
||||
|
||||
// u8 res=0;
|
||||
// char _tmp[11] = "";
|
||||
// u32 _larr = 0;
|
||||
// length = length*11;
|
||||
|
||||
// printf("\r\nRead file data is:\r\n");
|
||||
|
||||
// for(int i=0;i<length/512;i++){
|
||||
// res=f_read(file,fatbuf,512,&br);
|
||||
// if(res)printf("\r\n<><6E><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD><EFBFBD>:%d\r\n",res);
|
||||
// else{
|
||||
// for(int i=0;i<br;i++){
|
||||
// if(fatbuf[i]==0x0d){
|
||||
// DEBUG_PRINTF("<22>س<EFBFBD>[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[string]: %s\r\n",i,_tmp);
|
||||
// i++;
|
||||
// float value = atof(_tmp);
|
||||
// memset(_tmp, 0, sizeof(_tmp));
|
||||
// floatArray[_larr++] = value;
|
||||
// DEBUG_PRINTF("<22>س<EFBFBD>[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[float]: %f\r\n",i,value);
|
||||
// }else{
|
||||
// char buffer[2];
|
||||
// sprintf(buffer, "%c", fatbuf[i]);
|
||||
// strcat(_tmp, buffer);
|
||||
// DEBUG_PRINTF("[%d]: %c\r\n",i,fatbuf[i]);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// if(length%512){
|
||||
// res=f_read(file,fatbuf,length%512,&br);
|
||||
// if(res)printf("\r\nRead Error:%d\r\n",res);
|
||||
// else{
|
||||
// for(int i=0;i<br;i++){
|
||||
// if(fatbuf[i]==0x0d){
|
||||
// DEBUG_PRINTF("<22>س<EFBFBD>[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[string]: %s\r\n",i,_tmp);
|
||||
// i++;
|
||||
// float value = atof(_tmp);
|
||||
// memset(_tmp, 0, sizeof(_tmp));
|
||||
// floatArray[_larr++] = value;
|
||||
// DEBUG_PRINTF("<22>س<EFBFBD>[%d] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[float]: %f\r\n",i,value);
|
||||
// }else{
|
||||
// char buffer[2];
|
||||
// sprintf(buffer, "%c", fatbuf[i]);
|
||||
// strcat(_tmp, buffer);
|
||||
// DEBUG_PRINTF("[%d]: %c\r\n",i,fatbuf[i]);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// for (int i=0;i<_larr/10;i++){
|
||||
// printf("floatArray[%d]: %f\r\n",i*10,floatArray[i*10]);
|
||||
// }
|
||||
|
||||
// return res;
|
||||
//}
|
||||
#endif
|
||||
84
PORTING/CNN/debug.c
Normal file
84
PORTING/CNN/debug.c
Normal file
@@ -0,0 +1,84 @@
|
||||
#include "debug.h"
|
||||
#include "led.h"
|
||||
|
||||
|
||||
u8 _DEBUG = 0;
|
||||
|
||||
|
||||
|
||||
void DEBUG(){
|
||||
_DEBUG = !_DEBUG;
|
||||
printf("DEBUG IS: %s",(_DEBUG ? "ON" : "OFF"));
|
||||
}
|
||||
|
||||
|
||||
|
||||
void DEBUG_PRINTF(const char *fmt, ...) {
|
||||
if(_DEBUG){
|
||||
va_list args;
|
||||
va_start(args, fmt);
|
||||
vprintf(fmt, args);
|
||||
va_end(args);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SDRAM_USED(){
|
||||
u16 memused = 0;
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
TIM_HandleTypeDef TIM3_Handler; //<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
//ͨ<>ö<EFBFBD>ʱ<EFBFBD><CAB1>3<EFBFBD>жϳ<D0B6>ʼ<EFBFBD><CABC>
|
||||
//arr<72><72><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>װֵ<D7B0><D6B5>
|
||||
//psc<73><63>ʱ<EFBFBD><CAB1>Ԥ<EFBFBD><D4A4>Ƶ<EFBFBD><C6B5>
|
||||
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>㷽<EFBFBD><E3B7BD>:Tout=((arr+1)*(psc+1))/Ft us.
|
||||
//Ft=<3D><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>,<2C><>λ:Mhz
|
||||
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5>Ƕ<EFBFBD>ʱ<EFBFBD><CAB1>3!(<28><>ʱ<EFBFBD><CAB1>3<EFBFBD><33><EFBFBD><EFBFBD>APB1<42>ϣ<EFBFBD>ʱ<EFBFBD><CAB1>ΪHCLK/2)
|
||||
void TIM3_Init(u16 arr,u16 psc)
|
||||
{
|
||||
TIM3_Handler.Instance=TIM3; //ͨ<>ö<EFBFBD>ʱ<EFBFBD><CAB1>3
|
||||
TIM3_Handler.Init.Prescaler=psc; //<2F><>Ƶϵ<C6B5><CFB5>
|
||||
TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //<2F><><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD><EFBFBD><EFBFBD>
|
||||
TIM3_Handler.Init.Period=arr; //<2F>Զ<EFBFBD>װ<EFBFBD><D7B0>ֵ
|
||||
TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//ʱ<>ӷ<EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>
|
||||
HAL_TIM_Base_Init(&TIM3_Handler);
|
||||
|
||||
HAL_TIM_Base_Start_IT(&TIM3_Handler); //ʹ<>ܶ<EFBFBD>ʱ<EFBFBD><CAB1>3<EFBFBD>Ͷ<EFBFBD>ʱ<EFBFBD><CAB1>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6>TIM_IT_UPDATE
|
||||
}
|
||||
|
||||
|
||||
//<2F><>ʱ<EFBFBD><CAB1><EFBFBD>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ȼ<EFBFBD>
|
||||
//<2F>˺<EFBFBD><CBBA><EFBFBD><EFBFBD>ᱻHAL_TIM_Base_Init()<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
|
||||
{
|
||||
if(htim->Instance==TIM3)
|
||||
{
|
||||
__HAL_RCC_TIM3_CLK_ENABLE(); //ʹ<><CAB9>TIM3ʱ<33><CAB1>
|
||||
HAL_NVIC_SetPriority(TIM3_IRQn,1,3); //<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>ȼ<EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>3
|
||||
HAL_NVIC_EnableIRQ(TIM3_IRQn); //<2F><><EFBFBD><EFBFBD>ITM3<4D>ж<EFBFBD>
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//<2F><>ʱ<EFBFBD><CAB1>3<EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void TIM3_IRQHandler(void)
|
||||
{
|
||||
HAL_TIM_IRQHandler(&TIM3_Handler);
|
||||
}
|
||||
|
||||
|
||||
//<2F>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
||||
{
|
||||
if(htim==(&TIM3_Handler))
|
||||
{
|
||||
LED1=!LED1; //LED1<44><31>ת
|
||||
}
|
||||
}
|
||||
15
PORTING/CNN/debug.h
Normal file
15
PORTING/CNN/debug.h
Normal file
@@ -0,0 +1,15 @@
|
||||
#ifndef _DEBUG_H_
|
||||
#define _DEBUG_H_
|
||||
#include <sys.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "malloc.h"
|
||||
|
||||
void DEBUG(void);
|
||||
void DEBUG_PRINTF(const char *fmt, ...);
|
||||
void SDRAM_USED(void);
|
||||
void TIM3_Init(u16 arr,u16 psc);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user