有一个问题在这:
最近使用arm裸机在ads平台上编译一个工程,有若干个文件组成。
由于各个文件中函数传递数据,所以需要很多全局变量。于是我想到使用结构体把这些全局变量放到一起,然后再各个工程文件中使用关键字extern来引用。
我的步骤如下,我首先在main'函数外面使用 Estruct * pcstruct来定义这样一个指向全局变量结构体的指针,期中Estruct是我定义的
全局变量结构体类型。
然后我在man函数里面初始化了另一个全局变量结构体 Q 总共有四个成员,全是unsigned char 类型
(*Q).sel=0;
(*Q).sev=0;
(*Q).flag=0;
(*Q).q=0;
全初始化为0,然后 对全局变量指针 pcstruc里面的成员unsigned char n_buf[10]数组进行初始化:
具体如下:
Globle->n_buff[1] = ((((*Q).sel )<< 6)|(((*Q).sess) << 4)|(((*Q).flag) << 3)|(((*Q).q) >> 1));
然后我编译代码,下载到arm板子上,使用串口打印n_buff[1]的值,和全局变量Q的值
如下:
Q->sel=131
Q->sess=192
Q->q=0
Q->flag=120
n_buf[1]=192;
打印出啦的值跟所设想的值完全不一样。打印出来Q的所有值应该都没有改变
然后n_buf[1]的值应该也是0才对,为何会变成192呢?
我想不通,我准备从程序入手,看看是什么影响了n_buff 以及数据结构Q里面的值,终于我找到了,是这样一句话。
timer1_mask();//不能屏蔽所有中断,否则容易出错哈
EINT4_mask();//屏蔽外部中断4
Uart0_Printf("enter epc_query\n");
Uart0_Printf("Q->sel=%d\n",(Q->sel));
Uart0_Printf("Q->sess=%d\n",(Q->sess));
Uart0_Printf("Q->q=%d\n",(Q->q));
Uart0_Printf("Q->flag=%d\n",(Q->flag));
//Globle->n_buff[0] = (0x80 | (EPC_FMN_FACTOR_DR << 3) | (EPC_QUERY_M << 1) | (EPC_QUERY_TRext)); // DR = 0b
Uart0_Printf("Globle->n_buff[1]=%x\n",(Globle->n_buff[1]));
Globle->n_buff[1] =(U8)((*Q).sel);
Uart0_Printf("Globle->n_buff[1]=%x\n",(Globle->n_buff[1]));
Globle->n_buff[2] = (((*Q).q) << 7);
//Globle->n_buff[2] |= (crc5((Globle->n_buff),2,1) << 2);
Uart0_Printf("enter epc_query\n");
上面画红线的这一句,有点问题,如果不是因为这一句话,那么下面的都是对的哦,太蛋疼了吧
不仅程序错乱,而且启动不了定时器1.发送不了命令。原因未知。所以考虑还是从全局变量入手