本帖最后由 Neyzoter 于 2017-7-31 10:47 编辑
我想通过结构体把本次的数据存储下来,显得清楚一些。又由于下次调用时,不会再采用,所以我认为只要不采用static类型,上次的结构体会自动消失。
但是实际情况是,在函数体内定义结构体会死机;在函数体前面定义则不会。这是为什么?
[mw_shl_code=c,true]extern u8 ov_sta; //在exit.c里面定义
typedef struct CD
{
u16 X;
u16 Y;
u8 FLAG;
}_CD;//用于存储红点的坐标
#define DELTA -4
#define BuffNum 40
extern u8 PhotoFlag;//需要发送图片到串口的标志位
_CD coordinates[BuffNum] = {0,0,0};//定义二十个坐标数组
void camera_refresh(void)
{
u32 j=0;
u16 color;
u8 CDi = 0;//红点的数组坐标
u32 Axis_X=0,Axis_Y=0;
u32 GreenTemp=0,RedTemp=0,BlueTemp=0;
int gm_red,gm_green,gm_blue;
int delta=0;
/*0:没有开始转化;1:转化开始,存入FIFO;2:转化结束,可以开始读取*/
if(ov_sta==2)
{
// LCD_Scan_Dir(U2D_L2R); //从上到下,从左到右
// LCD_SetCursor(0x00,0x0000); //设置光标位置
// LCD_WriteRAM_Prepare(); //开始写入GRAM
OV7670_RRST = 0; //开始复位读指针
OV7670_RCK = 0;
OV7670_RCK = 1;
OV7670_RCK = 0;
OV7670_RRST = 1; //复位读指针结束
OV7670_RCK = 1;
for(j = 0;j < 76800;j ++)
{
OV7670_RCK = 0;
color = GPIOC->IDR & 0XFF; //读数据
OV7670_RCK = 1;
color <<= 8;
OV7670_RCK = 0;
color |= GPIOC->IDR&0XFF; //读数据
OV7670_RCK = 1;
// ili9320_SetPoint(j%320,j/320,color);//比下面的慢很多
LCD_WriteRAM(color);
gm_red = (color & 0xF800) >> 11;//1111 1000 0000 0000
gm_green = (color & 0x07E0) >> 5; //0000 0111 1110 0000
gm_blue = (color & 0x001F);//0000 0000 0001 1111
delta = gm_red - sqrt(gm_green*gm_green + gm_blue*gm_blue);
if(PhotoFlag)//当有按键1按下,把图像发送到电脑上
{
//提取出RGB
if(j%320 == 0)
printf("
%d ",delta);
else
printf("%d ",delta);
}
if(delta > DELTA)
{
coordinates[CDi].X = j%320;
Axis_X += coordinates[CDi].X;//存储下标
coordinates[CDi].Y = j/320;
Axis_Y += coordinates[CDi].Y;
coordinates[CDi].FLAG = 1;//说明该坐标已经采用
CDi++;
}
//十六个提取一个
// if((j/320%4==0)&&(j%320%4==0))//膈四行取一行
// {
// ili9320_SetPoint(j%320/4,j/1280,color);
// gm_red = (color & 0xF800) >> 11;//1111 1000 0000 0000
// RedTemp += gm_red;
// gm_green = (color & 0x07E0) >> 5; //0000 0111 1110 0000
// GreenTemp += gm_green;
// gm_blue = (color & 0x001F);//0000 0000 0001 1111
// BlueTemp += gm_blue;
// LCD_WriteRAM(color);
// ili9320_SetPoint(j%320/4,j/1280,color);
// }
}
Axis_X /= CDi;
Axis_Y /= CDi;
printf("
Axis_X = %d
",Axis_X);
printf("
Axis_Y = %d
",Axis_Y);
printf("
NUM = %d
",CDi);
for(;CDi<BuffNum;CDi++)
{
coordinates[CDi].FLAG = 0;
}
// GUI_Circle(Axis_X,Axis_Y,10,Green,1);
LED0 = 0;
PhotoFlag = 0;
ov_sta = 0; //开始下一次采集
}
}
[/mw_shl_code]
以上代码中的
_CD coordinates[BuffNum] = {0,0,0};//定义二十个坐标数组
就是问题所在。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
另外提问:在函数体内定义的结构体,编译时是怎么处理的?也是编译完把内存分配方案存到符号表?
一周热门 更多>