mdk错误记录(持续更新)

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

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

6、如果提示下面这个信息,则可能是你的C文件有重名字的。

7、“窥孔优化”惹的祸

有段代码这样写的:

测试中发现有类似“死机”的现象,最后追到是上面那段代码while(1)里面死循环,原因就是局部优化的问题,pchBuffer和hwSize

前面加volatile解决。

8、没有用到的变量影响

代码如下:

其中tServiceProtocolLoginProcess变量没有用到,测试中发现如果优化级别O0则正常,如果是O3,则在某些情况下会“死机”,最后定位到程序跑到:

然后我就把没有用到的变量屏蔽掉,问题解决;

然后给大家一个忠告:mdk armcc编译器不要把O3和 optimize for time 同时打开,armclang编译器则没有问题。

9、非对齐访问问题

在调试m0+内核时候,发现进入HardFault_Handler。最后追到是

再往下看:

这个逻辑一直在用,而且在407,103等上面都跑的正常。

再追,用断言判断指针是否为空指针:

assert_param((&(ptRoutingTableItem->ptNext)));

发现指针都飞空。这就奇怪了,把地址打印出来,发现有非对齐指针,难道因为这个?

原定定义为:

static uint8_t  s_chRoutingTableBuffer[50*sizeof(routing_table_t)];

修改为:

static uint32_t  s_chRoutingTableBuffer[(50*sizeof(routing_table_t))>>2];

发现正常了。。。。。欲哭无泪啊!

10、browse information of one or more files is not available

今天新建工程提示如下(图是盗的,不影响):

 解决方法:

 注释再取消注释文件
①全选文件中的代码,按下注释键,编译
②再全选,按下取消注释,问题就解决了
在这里插入图片描述

 经过实际测试,问题解决。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值