VS2005过度优化的陷阱(二)

简介: 目前还没有新的发现,先把所有现象再次整理如下,望牛人帮忙指正。       完整代码: 1 int _tmain(int argc, _TCHAR* argv[]) 2 { 3     volatile PS3C6410_GPIO_REG pGPIO1;   // 注意:与vol...

       目前还没有新的发现,先把所有现象再次整理如下,望牛人帮忙指正。

       完整代码:

 1  int _tmain( int argc, _TCHAR* argv[])
 2 {
 3      volatile  PS3C6410_GPIO_REG pGPIO1;   // 注意:与 volatile S3C6410_GPIO_REG* pGPIO1;效果是不同的
 4 
 5     pGPIO1 = (PS3C6410_GPIO_REG)GetVirtual(S3C6410_BASE_REG_PA_GPIO,  sizeof(S3C6410_GPIO_REG));
 6 
 7     pGPIO1->GPBCON =  0x22222222;
 8     printf( " \r\n(%08x) ", pGPIO1->GPBCON);
 9      pGPIO1->GPBCON &=  0xFFFF ;   // 替换该行代码,查看其对应的汇编代码
10     printf( " -->(%08x) ", pGPIO1->GPBCON);
11      return  0;
12 }

      下面逐一替换第9行代码,并查看其对应的汇编代码。

      代码1:pGPIO1->GPBCON &= 0xFFFF;被优化掉了

     pGPIO1->GPBCON &=  0xFFFF ;
00011078  ldr         r3, pGPIO1 
    printf( " \r\n(%08x) ", pGPIO1->GPBCON);
0001107C  ldr         r2, pGPIO1 
00011080  ldr         r0, [pc, # 0x14
00011084  strh        r5, [r3, # 0x22
00011088  ldr         r1, [r2, # 0x20
0001108C  bl           00011498

       代码2:pGPIO1->GPBCON &= 0xFFFF<<16;也被优化掉了

     pGPIO1->GPBCON &=  0xFFFF << 16 ;
00011078  ldr         r3, pGPIO1 
    printf( " \r\n(%08x) ", pGPIO1->GPBCON);
0001107C  ldr         r2, pGPIO1 
00011080  ldr         r0, [pc, # 0x14
00011084  strh        r5, [r3, # 0x20
00011088  ldr         r1, [r2, # 0x20
0001108C  bl           00011498

       代码3:pGPIO1->GPBCON &= ~0xFFFF;还是被优化掉了,与代码2的汇编代码完全一样

     pGPIO1->GPBCON &= ~ 0xFFFF ;
00011078  ldr         r3, pGPIO1 
    printf( " \r\n(%08x) ", pGPIO1->GPBCON);
0001107C  ldr         r2, pGPIO1 
00011080  ldr         r0, [pc, # 0x14
00011084  strh        r5, [r3, # 0x20
00011088  ldr         r1, [r2, # 0x20
0001108C  bl           00011498

       代码4:pGPIO1->GPBCON &= ~(0xFFFF<<16);也未能幸免,与代码1的汇编代码完全一样

     pGPIO1->GPBCON &= ~( 0xFFFF << 16 );
00011078  ldr         r3, pGPIO1 
    printf( " \r\n(%08x) ", pGPIO1->GPBCON);
0001107C  ldr         r2, pGPIO1 
00011080  ldr         r0, [pc, # 0x14
00011084  strh        r5, [r3, # 0x22
00011088  ldr         r1, [r2, # 0x20
0001108C  bl           00011498

       代码5:pGPIO1->GPBCON &= 0xFF;这么写没问题!

     pGPIO1->GPBCON &=  0xFF ;
00011078  ldr         r2, pGPIO1 
    printf( " \r\n(%08x) ", pGPIO1->GPBCON);
0001107C  ldr         r1, pGPIO1 
00011080  ldr         r0, [pc, # 0x1C
00011084  ldr         r3, [r2, # 0x20]! 
00011088   and         r3, r3, # 0xFF 
0001108C  str         r3, [r2] 
00011090  ldr         r1, [r1, # 0x20
00011094  bl          000114A0

       代码6:pGPIO1->GPBCON &= 0xFF<<16;这么写也没问题!难道0xFF就没问题了?

     pGPIO1->GPBCON &=  0xFF << 16 ;
00011078  ldr         r2, pGPIO1 
    printf( " \r\n(%08x) ", pGPIO1->GPBCON);
0001107C  ldr         r1, pGPIO1 
00011080  ldr         r0, [pc, # 0x1C
00011084  ldr         r3, [r2, # 0x20]! 
00011088  and         r3, r3, # 0xFF16 
0001108C  str         r3, [r2] 
00011090  ldr         r1, [r1, # 0x20
00011094  bl          000114A0

       代码7:pGPIO1->GPBCON &= ~0xFF;又不对了!

     pGPIO1->GPBCON &= ~ 0xFF ;
00011078  ldr         r3, pGPIO1 
    printf( " \r\n(%08x) ", pGPIO1->GPBCON);
0001107C  ldr         r2, pGPIO1 
00011080  ldr         r0, [pc, # 0x14
00011084  strb        r5, [r3, # 0x20
00011088  ldr         r1, [r2, # 0x20
0001108C  bl           00011498

       代码8:pGPIO1->GPBCON &= ~(0xFF<<16);也被优化掉了。

     pGPIO1->GPBCON &= ~( 0xFF << 16 );
00011078  ldr         r3, pGPIO1 
    printf( " \r\n(%08x) ", pGPIO1->GPBCON);
0001107C  ldr         r2, pGPIO1 
00011080  ldr         r0, [pc, # 0x14
00011084  strb        r5, [r3, # 0x22
00011088  ldr         r1, [r2, # 0x20
0001108C  bl           00011498

       以上8段代码,仅2段代码正常运行,其余都有问题。已经不是运气的事了,肯定某个地方出了问题,在哪呢?

       项目的C/C++属性配置如下:

/O2 /D  " NDEBUG " /D  " _WIN32_WCE=0x600 " /D  " UNDER_CE " /D  " WINCE " /D  " _CONSOLE " /D  " ARM " /D  " _ARM_ " /D  " _UNICODE " /D  " UNICODE " /FD /EHsc /MT /fp:fast /GR- /Yu " stdafx.h " /Fp " CHSINT SDK For WinCE 6.0 (ARMV4I)\Release/GPIOApp.pch " /Fo " CHSINT SDK For WinCE 6.0 (ARMV4I)\Release/ " /Fd " CHSINT SDK For WinCE 6.0 (ARMV4I)\Release/vc80.pdb " /W3 /nologo /c /Zi /TP

       以上代码,均已“最大化速度”优化。如以“最小化大小”优化,代码如下,也有问题。

    pGPIO1->GPBCON &=  0xFFFF;
000110B0  ldr         r3, [sp] 
    printf( " -->(%08x) ", pGPIO1->GPBCON);
000110B4  ldr         r2, [sp] 
000110B8  mov         r1, # 0 
000110BC  ldr         r0, [pc, # 0x14
000110C0  strh        r1, [r3, # 0x22
000110C4  ldr         r1, [r2, # 0x20
000110C8  bl          000114D4

      若“禁用优化”,对应的代码如下,运行结果也正确。

     pGPIO1->GPBCON &=  0xFFFF ;
000110F8  ldr         r3, [sp] 
000110FC  add         r3, r3, # 0x20 
00011100  str         r3, [sp, # 0xC
00011104  ldr         r3, [sp, # 0xC
00011108  ldr         r2, [r3] 
0001110C  mov         r3, # 0xFF24 
00011110  orr         r3, r3, # 0xFF 
00011114  and         r2, r2, r3 
00011118  ldr         r3, [sp, # 0xC
0001111C  str         r2, [r3] 
    printf( " -->(%08x) ", pGPIO1->GPBCON);
00011120  ldr         r3, [sp] 
00011124  add         r3, r3, # 0x20 
00011128  ldr         r1, [r3] 
0001112C  ldr         r0, [pc, # 0x14
00011130  bl           00011544

       如果全部禁用优化,有点因噎废食的味道,还是希望能找出点原因,以免将来再次触雷。 

目录
相关文章
|
1天前
|
人工智能 运维 安全
|
3天前
|
SpringCloudAlibaba 负载均衡 Dubbo
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
本文对比分析了SpringCloudAlibaba框架下Feign与Dubbo的服务调用性能及差异。Feign基于HTTP协议,使用简单,适合轻量级微服务架构;Dubbo采用RPC通信,性能更优,支持丰富的服务治理功能。通过实际测试,Dubbo在调用性能、负载均衡和服务发现方面表现更出色。两者各有适用场景,可根据项目需求灵活选择。
368 123
微服务架构下Feign和Dubbo的性能大比拼,到底鹿死谁手?
|
6天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
574 107
|
2天前
|
Java 数据库 数据安全/隐私保护
Spring 微服务和多租户:处理多个客户端
本文介绍了如何在 Spring Boot 微服务架构中实现多租户。多租户允许单个应用实例为多个客户提供独立服务,尤其适用于 SaaS 应用。文章探讨了多租户的类型、优势与挑战,并详细说明了如何通过 Spring Boot 的灵活配置实现租户隔离、动态租户管理及数据源路由,同时确保数据安全与系统可扩展性。结合微服务的优势,开发者可以构建高效、可维护的多租户系统。
191 127
|
2天前
|
Web App开发 前端开发 API
在折叠屏应用中,如何处理不同屏幕尺寸和设备类型的样式兼容性?
在折叠屏应用中,如何处理不同屏幕尺寸和设备类型的样式兼容性?
222 124
|
2天前
|
人工智能 数据可视化 测试技术
Coze平台指南(3):核心功能-创建智能体与设计角色
Coze 智能体是由大语言模型驱动,通过提示词设定角色,并借助知识库、插件和工作流扩展能力,以执行特定任务的AI助手。对测试工程师而言,精心设计的智能体可显著提升测试效率与质量,关键是要准确理解测试需求,并将其转化为智能体的角色设定和功能配置。建议进一步学习知识库与工作流,以深化应用。
|
6天前
|
JSON fastjson Java
FastJson 完全学习指南(初学者从零入门)
摘要:本文是FastJson的入门学习指南,主要内容包括: JSON基础:介绍JSON格式特点、键值对规则、数组和对象格式,以及嵌套结构的访问方式。FastJson是阿里巴巴开源的高性能JSON解析库,具有速度快、功能全、使用简单等优势,并介绍如何引入依赖,如何替换Springboot默认的JackJson。 核心API: 序列化:将Java对象转换为JSON字符串,演示对象、List和Map的序列化方法; 反序列化:将JSON字符串转回Java对象,展示基本对象转换方法;

热门文章

最新文章