OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2285|回复: 3

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

[复制链接]

5

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2016-2-5
在线时间
17 小时
发表于 2017-7-31 10:45:27 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 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("\r\n%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("\r\nAxis_X = %d\r\n",Axis_X);
                printf("\r\nAxis_Y = %d\r\n",Axis_Y);
                printf("\r\nNUM = %d\r\n",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};//定义二十个坐标数组
就是问题所在。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

40

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3532
金钱
3532
注册时间
2017-5-23
在线时间
256 小时
发表于 2017-7-31 11:18:53 | 显示全部楼层
typedef struct CD 想问一下,这后面的“CD”,是不是可以不要了。
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-7-31 11:41:49 | 显示全部楼层
关注一下。
另外提问:在函数体内定义的结构体,编译时是怎么处理的?也是编译完把内存分配方案存到符号表?
回复

使用道具 举报

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2014-8-16
在线时间
193 小时
发表于 2017-7-31 11:55:35 | 显示全部楼层
你试试把初始化赋值去掉
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-19 22:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表