1、 warning: #61-D: integer operation result is out of range
由于编译器默认signed int即32位有符号整数类型,而1<<31实际为0x80000000,
这样就有可能改写了符号位(最高位)
依此类推,(2<<30),(3<<29)...等都会出现编译警告问题.
解决办法为: ((unsigned int)1<<31),((unsigned int)2<<30),...
2、warning: #3048-D: inline assembly not permitted when generating Thumb1 code
原文地址::http://www.openedv.com/posts/list/0/55803.htm;jsessionid=BF32A849CB8EF733FEEC85010EBCE48C
void WFI_SET(void)
{
__ASM volatile("wfi");
}
//关闭所有中断
void INTX_DISABLE(void)
{
__ASM volatile("cpsid i");
}
//开启所有中断
void INTX_ENABLE(void)
{
__ASM volatile("cpsie i");
}
//设置栈顶地址
//addr:栈顶地址
__asm void MSR_MSP(u32 addr)
{
MSR MSP, r0 //set Main Stack value
BX r14
}
//===========修改如下就可以了==============//
01 |
//THUMB指令不支持汇编内联 |
02 |
//采用如下方法实现执行汇编指令WFI |
03 |
__asm void WFI_SET( void ) |
04 |
{ |
05 |
WFI; |
06 |
} |
07 |
//关闭所有中断 |
08 |
__asm void INTX_DISABLE( void ) |
09 |
{ |
10 |
CPSID I; |
11 |
} |
12 |
//开启所有中断 |
13 |
__asm void INTX_ENABLE( void ) |
14 |
{ |
15 |
CPSIE I; |
16 |
} |
17 |
//设置栈顶地址 |
18 |
//addr:栈顶地址 |
19 |
__asm void MSR_MSP(u32 addr) |
20 |
{ |
21 |
MSR MSP, r0 //set Main Stack value |
22 |
BX r14 |
23 |
} |
3、提示查找不到AT91SAM9G45的驱动文件
我看了下在ARM的ATMEL的INC文件下有这颗芯片的文件,为什么找不到呢?
我猜想可能是由于我先安装的MDK,后安装的C51,由于版本或者软件本身的bug
导致的。重装MDK,解决。
4、const
以前一直用PIC和瑞萨,以为静态局部变量+const还是存贮在RAM里面,今天
分析了MDK的map文件,发现是存贮在ROM里面。
5、字符串显示bug
以前一直习惯于用十六进制打印log,分析协议。最近在调试AT指令,改为字符输出log。
期间发现一个很奇怪的问题,下面这段代码如果单步执行没有问题,可以打印输出,全速执行就不行。
{
uint16_t j=0;
//delay_ms(50);
TRACE_DEBUG("\r\nJZQ_AT_CMD_MYNETWRITE %d \r\n",hwSize);
for(j=0;j<hwSize;j++){
printf("%02X",pchBuffer[j]);
}
printf("\r\n");
}
加上优化级别为0,也不行。但是其他地方的Log都正常啊,这是为什么呢?
经过前后的log输出,和改为16进制输出,最后得到结论,根本原因是字符串结束符问题。
前面的Log是直接打印的通信协议,是16进制,并咩有做格式化,同时由于log输出太快,这就导致
字符显示时候缓存里面有好几个log包,但是串口助手就当做一个字符串,但是这几个log包当中又正好包含
\0,这个恰巧也是字符串结束符,因此字符显示时候当遇到\0就认为字符串结束了,后面再有也不显示了。
如果换位16进制,后面是有打印的。
解决方法:
1)同时开启串口监视助手和串口调试助手,一个16进制显示,一个字符显示;
2)每个log输出后面都加延时;
3)过滤掉\0结束符;
结合实际调试,我采用的1和3的方法,1是最笨的,但是查看Log真的头大;3需要有个log缓存,然后输出的
时候做过滤,但是实时性最高,不影响实际程序;不建议加延时,影响代码实时性。