STM32函数体中创建结构体死机的问题。

2019-08-15 16:28发布

本帖最后由 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};//定义二十个坐标数组
就是问题所在。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
Theone
1楼-- · 2019-08-16 04:44
你试试把初始化赋值去掉
bayga456
2楼-- · 2019-08-15 21:22
typedef struct CD 想问一下,这后面的“CD”,是不是可以不要了。
Owen
3楼-- · 2019-08-16 02:44
关注一下。
另外提问:在函数体内定义的结构体,编译时是怎么处理的?也是编译完把内存分配方案存到符号表?

一周热门 更多>