当前位置: 首页 > news >正文

Linux踩坑:arm下gcc编译添加 -Ox 优化后,程序无法正常运行

arm下gcc编译添加 -Ox 优化后,程序无法正常运行

一、问题描述

今天学习正点原子的阿尔法开发板裸机开发的时候,遇到了一个问题,在没有使用 -Ox 优化的时候,编译出来的程序能够正常运行,但是添加了-Ox之后,程序运行就出了问题。

二、问题查找与解决

最开始还以为是自己敲的代码和视频中的代码出入比较大,影响到了程序的运行,不过事实证明(发现过程比较复杂,这里就不详写了),也确实是,下面是两者的差异代码,前者是我自己写的,后者是视屏中的:

//我写的
void Delay(volatile unsigned int n) {unsigned int n_s = 0;while(n --) {n_s = 0x7FF;while(n_s --);}
}
//官方例程
void Delay_Short(volatile unsigned int n)
{while(n--){}
}void Delay(volatile unsigned int n) {while(n--) {Delay_Short(0x7ff);}
}

在逻辑上确实没啥大问题,但是编译出来的效果却截然不同,后者能够正常运行,前者运行就是异常的,最终发现,差异就在一个平时很少见的关键词 volatile,我写的 unsigned int n_s = 0; 就没有添加 volatile 前缀,后面把前缀加上,问题就解决了,程序也能正常运行了。

//以下代码能够正常运行
void Delay(volatile unsigned int n) {volatile unsigned int n_s = 0;while(n --) {n_s = 0x7FF;while(n_s --);}
}

三、总结

本次问题的最终问题就出在一个关键词上边,做了三年的嵌入式开发了,遇到使用 volatile 关键词来修饰的变量屈指可数,一直觉得这个关键词不重要,唯一影响深刻的就是在学习 stm32 的时候,正点原子介绍一种叫做位带操作的时候出现过一次,其他时候出现的概率都很小,不过最主要还是没遇到过 -Ox 这种编译优化,今天也是无意中遇到了,然后特意学习了一下,明白了大致原因,经过 -Ox 编译优化处理过后的一些数据会被一直放在寄存器中,内存不会对其进行再次写入操作,所以他的值得不到改变,所以最终导致了程序运行异常,这种操作叫做 内存覆盖,所以程序会运行异常。
在这里插入图片描述
在这里插入图片描述

参考博文:
1.《C语言关键字详解(五)带你全面了解 volatile 关键字》
https://blog.csdn.net/m0_62391199/article/details/123746218
2.《C语言丨深入理解volatile关键字》
https://blog.csdn.net/m0_53157173/article/details/129344954

学习分享,一起成长!以上为小编的经验分享,若存在不当之处,请批评指正!

相关文章:

Linux踩坑:arm下gcc编译添加 -Ox 优化后,程序无法正常运行

arm下gcc编译添加 -Ox 优化后,程序无法正常运行 一、问题描述 今天学习正点原子的阿尔法开发板裸机开发的时候,遇到了一个问题,在没有使用 -Ox 优化的时候,编译出来的程序能够正常运行,但是添加了-Ox之后&#xff0c…...

Vue3中Composition API介绍

在Vue 3中,引入了Composition API,它是一种新的组合式函数API,用于更灵活地组织和重用组件逻辑。Composition API相比于Vue 2中的Options API,提供了更好的可组合性和代码复用性。下面是对Vue 3中Composition API的介绍和用法&…...

虚拟机系列:(VMware Workstation Pro)Centos7下搭建Android开发环境及Android真机调试

一、Android SDK 安装配置 1、环境 Linux系统为:Red Hat Enterprise Linux 7 64 位 ; 当然还需要Java环境,java 环境这里不叙述; 2、Android Studio 安装 (1)下载位置: http://www.android-studio.org/ 我这里下载的:android-studio-ide-191.5977832-linux.tar.gz …...

全面(16万字)深入探索深度学习:基础原理到经典模型网络的全面解析

前言 Stacking(堆叠) 网页调试 学习率:它决定了模型在每一次迭代中更新参数的幅度激活函数-更加详细 激活函数的意义: 激活函数主要是让模型具有非线性数据拟合的能力,也就是能够对非线性数据进行分割/建模 如果没有激活函数: 第一个隐层: l…...

openEuler Linux 部署 FineBi

openEuler Linux 部署 FineBi 部署环境 环境版本openEuler Linux22.03MySQL8.0.35JDK1.8FineBi6.0 环境准备 升级系统内核和软件 yum -y updatereboot安装常用工具软件 yum -y install vim tar net-tools 安装MySQL8 将 MySQL Yum 存储库添加到系统的存储库列表中 sudo…...

QThreadStorage使用介绍

作者:令狐掌门 技术交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/ 文章目录 什么是线程数据存储Qt中的线程数据存储`QThreadStorage` 的用法:代码示例什么是线程数据存储 线程数据存储是指为每个线程在程序中分配和管理数据的过程。它主要用于并发编程…...

AI和人工智能与机器学习全景报告

今天分享的是AI系列深度研究报告:《AI和人工智能与机器学习全景报告》。 (报告出品方:appen) 报告共计:30页 获取 数据获取仍是AI应用构建团队的主要瓶颈。 原因各不相同。例如,特定用例的数据可能不足…...

【计算机网络】(网络层)定长掩码和变长掩码

目录 1、IPV4地址的应用规划 2、例题分析 2.1、定长的子网掩码 2.2、变长的子网掩码 1、IPV4地址的应用规划 定长的子网掩码(FLSM): 使用同一个子网掩码划分子网,每个子网所分配的IP地址数量相同,造成IP地址的浪费…...

008 OpenCV matchTemplate 模板匹配

目录 一、环境 二、模板匹配算法原理 三、代码演示 一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、模板匹配算法原理 cv.matchTemplate是OpenCV库中的一个函数,用于在图像中查找与模板匹配的特征。它的主要应用场景…...

PTA 海盗分赃

P 个海盗偷了 D 颗钻石后来到公海分赃,一致同意如下分赃策略: 首先,P 个海盗通过抽签决定 1 - P 的序号。然后由第 1 号海盗提出一个分配方案(方案应给出每个海盗分得的具体数量),如果能够得到包括 1 号在…...

零基础学Linux内核:1、Linux源码组织架构

文章目录 前言一、Linux内核的特征二、Linux操作系统结构1.Linux在系统中的位置2.Linux内核的主要子系统3、Linux系统主要数据结构 三、linux内核源码组织1、下载Linux源码2、Linux版本号3、linux源码架构目录讲解 前言 这里将是我们从零开始学习Linux的第一节,这节…...

STM32中Msp函数的意义

msp(MCU Support Package) 举个例子:串口初始化函数HAL_UART_Init()与串口底层初始化函数HAL_UART_MspInit() HAL_UART_Init()用于初始化串口通讯协议如波特率、有效位等 HAL_UART_MspInit()用于初始化于MCU相关的配置比如时钟、NVIC、GPI…...

PTA NeuDs_数据库题目

二.单选题 1.数据库应用程序的编写是基于数据库三级模式中的。 A.模式 B.外模式 C.内模式 D.逻辑模式 用户应用程序根据外模式进行数据操作,通过外模式一模式映射,定义和建立某个外模式与模式间的对应关系 2.对创建数据库模式一类的数据库对象的授权…...

pulseaudio是如何测试出音频延迟的

通常专业的音频设备生产厂商都有专业的设备来测试精确的音频链路延时。 那么没有专业设备怎么测试出音频延迟呢?如下图,我们可以看到pulseaudio可以测试出硬件音频延迟。 那么,他是怎么测试出硬件延迟的呢?他的理论依据是什么呢?接下来我带大伙一起探索一下。 /*占位…...

【docker】docker的基础命令

基础操作 docker info #查看docker的基本信息docker version #查看docker版本信息一、镜像操作 1、搜索镜像 docker search nginx2、下载镜像 docker pull nginx#从仓库中下载镜像,若没有指定标签,则下载最新的版本,也就是标签为: lat…...

RocketMq 主题(TOPIC)生产级应用

RocketMq是阿里出品(基于MetaQ)的开源中间件,已捐赠给Apache基金会并成为Apache的顶级项目。基于java语言实现,十万级数据吞吐量,ms级处理速度,分布式架构,功能强大,扩展性强。 官方…...

队列实现栈VS栈实现队列

目录 【1】用队列实现栈 思路分析 ​ 易错总结 Queue.c&Queue.h手撕队列 声明栈MyStack 创建&初始化栈myStackCreate 压栈myStackPush 出栈&返回栈顶元素myStackPop 返回栈顶元素myStackTop 判断栈空否myStackEmpty 释放空间myStackFree MyStack总代码…...

C/C++: 统计整数

【问题描述】 输入若干个整数,统计出现次数最多的那个整数。如果出现最多的整数有两个以上,打印最早输入的那个整数。 【输入形式】 从标准输入读取输入。第一行只有一个数字N(1≤N≤10000),代表整数的个数。以后的N行…...

docker容器生成镜像并上传个人账户

登录到 Docker Hub 账户&#xff1a; docker login这将提示你输入你的 Docker Hub 账户名和密码。 为容器创建镜像 docker commit <容器名或容器ID> <你的用户名>/<镜像名:标签>例子 docker commit my_container yourusername/my_image:latest推送镜像到…...

hdlbits系列verilog解答(exams/m2014_q4g)-48

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 本次我们将一次创建多个逻辑门,对两个输入a和b通过组合逻辑实现七种不同的输出: out_and: a and bout_or: a or bout_xor: a xor bout_nand: a nand bout_nor: a nor bout_xnor: a xnor bout_anotb: a and-no…...

配置 PyCharm(汉化版操作指南)

本文详细介绍了PyCharm汉化版配置Python 3.13.13环境的完整步骤。首先通过"文件→设置→Python解释器"路径进入配置界面&#xff0c;选择"添加本地解释器"并创建Virtualenv虚拟环境&#xff0c;指定Python3.13.13安装路径中的python.exe作为基础解释器。重…...

冷镦机常见故障原因及解决方法大全(实用版)

冷镦机作为金属成形领域的核心设备&#xff0c;其运行稳定性直接关系到生产效率和产品质量。随着行业向高速化、多工位化与智能化发展&#xff0c;设备故障的预防与高效解决变得更为关键。掌握系统性的故障排查与维护知识&#xff0c;是保障生产连续性的基础。本文将梳理常见故…...

HC-SR04超声波模块避坑指南:STM32双边沿中断捕获Echo信号的完整流程与常见问题

HC-SR04超声波模块避坑指南&#xff1a;STM32双边沿中断捕获Echo信号的完整流程与常见问题 超声波测距在嵌入式开发中应用广泛&#xff0c;而HC-SR04因其性价比高、接口简单成为最常用的模块之一。但在实际项目中&#xff0c;不少开发者会遇到中断误触发、计时不准、代码逻辑混…...

【毕设】毕业生实习与就业管理系统

&#x1f49f;博主&#xff1a;程序员俊星&#xff1a;CSDN作者、博客专家、全栈领域优质创作者 &#x1f49f;专注于计算机毕业设计&#xff0c;大数据、深度学习、Java、小程序、python、安卓等技术领域 &#x1f4f2;文章末尾获取源码数据库 &#x1f308;还有大家在毕设选题…...

从mescroll到z-paging:一位开发者的实战迁移心路与性能跃迁

1. 为什么我要从mescroll迁移到z-paging 作为一个在uni-app生态中摸爬滚打多年的老手&#xff0c;我几乎用过所有主流的分页组件。mescroll曾经是我的首选&#xff0c;直到我遇到了z-paging。这个转变不是一时兴起&#xff0c;而是经历了三个项目的实战检验后做出的决定。 记得…...

创建Controller HTTP测试脚本

创建Controller HTTP测试脚本 任务概述 为fastbee-open-api模块下的103个Controller创建对应的HTTP测试脚本文件,确保测试覆盖所有主要接口。 测试脚本规范 文件格式 文件名: {ControllerName}.http (如: DeviceController.http, SysUserController.http)存放位置: f:/project/…...

百度搜索算法逆向思考

百度搜索算法逆向思考技术文章大纲 搜索引擎算法基础架构分析 百度搜索算法的核心组件包括爬虫系统、索引系统、排序系统。爬虫系统负责抓取网页内容&#xff0c;索引系统对内容进行结构化处理&#xff0c;排序系统根据用户查询匹配最相关结果。 排序算法涉及数百种因素&…...

计及风光不确定性的基于IGDT信息间隙决策的综合能源系统优化调度 摘要:代码构建了含光热电站、...

计及风光不确定性的基于IGDT信息间隙决策的综合能源系统优化调度 摘要&#xff1a;代码构建了含光热电站、储气、储碳、碳捕集装置的综合能源系统优化调度模型&#xff0c;并考虑P2G装置与碳捕集装置联合运行&#xff0c;从而实现碳经济的最大化&#xff0c;与此同时&#xff0…...

从One-Hot到Target Encoding:category_encoders编码方法演进史

从One-Hot到Target Encoding&#xff1a;category_encoders编码方法演进史 【免费下载链接】category_encoders A library of sklearn compatible categorical variable encoders 项目地址: https://gitcode.com/gh_mirrors/ca/category_encoders category_encoders是一…...

现在不看就晚了:2026奇点大会刚公布的多模态对话系统“实时语义蒸馏”专利技术,6个月内将成行业准入门槛

第一章&#xff1a;2026奇点智能技术大会&#xff1a;多模态对话系统 2026奇点智能技术大会(https://ml-summit.org) 多模态对话系统正从实验室走向高保真工业部署&#xff0c;2026奇点智能技术大会首次将语音、视觉、文本与触觉信号的联合对齐建模设为技术主线。本届大会展示…...