mdk错误记录(持续更新)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuhenyouyuyouyu/article/details/78921184

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缓存,然后输出的

时候做过滤,但是实时性最高,不影响实际程序;不建议加延时,影响代码实时性。

猜你喜欢

转载自blog.csdn.net/wuhenyouyuyouyu/article/details/78921184